Phương thức chuyển đổi tệp .SVG sang GeoJSON


12

Câu hỏi

Làm cách nào để chuyển đổi tệp SVG sang định dạng GeoJSON?

Kết quả mong muốn:

Tôi muốn tạo một bản đồ choropleth bằng cách sử dụng một cái gì đó như D3.js hoặc bất kỳ thư viện nào khác ngoài đó.

Thử thách:

Tôi có một tệp SVG mà tôi có thể lấy từ miền công cộng của các khu vực hành chính cho một tỉnh cụ thể của một quốc gia cụ thể. Tôi tin rằng tôi cần chuyển đổi nó thành GeoJSON trước khi có thể sử dụng nó trong các thư viện mà tôi biết.


1
Chính xác các khu vực hành chính của tỉnh cụ thể của quốc gia cụ thể là gì? Chúng tôi có thể giúp tìm các tệp có sẵn SHP hoặc GeoJSON thay vì chiến đấu để giải quyết vấn đề sai.
ThomasG77

Câu trả lời:


5

Tôi vừa viết một thư viện chuyển đổi hình ảnh SVG thành GeoJSON (hơi không chính xác).

svg2geojson

Nó yêu cầu bạn chỉnh sửa bằng tay SVG của mình để thêm hai thẻ XML liên kết vị trí SVG với lat / long và nó cung cấp công cụ dòng lệnh để chuyển đổi tệp. Thậm chí, nếu bạn muốn, sẽ lấy tất cả các nhóm cấp cao nhất (đó là những gì Illustrator xuất các lớp của nó) và xuất chúng dưới dạng các tệp riêng biệt.

Sử dụng

# First, install Node.js

$ npm install svg2geojson -g  # install globally for easy access to executable

$ svg2geojson -h
Usage: svg2geojson [options] file.svg

Options:
 -t, --tolerance=0.1 Distance (world meters) to sample curves to. (default: 0.1)
 -l, --layers        Split top-level groups into separate files. (default: one file)
 -o, --stdout        Output GeoJSON to stdout. (default: write files with names based on the SVG/layer)
 -m, --minimal       Make the GeoJSON as small as possible (not pretty).
 -p, --precision     Number of decimal places to format JSON numbers to. (default:6, as GeoJSON recommends)
 -d, --debug         Include ids for each SVG element in the features. (default: no properties)
 -v, --version       Output the version of svg2geojson as the first line on stdout (0.7.0).
 -h, --help          Show this help message.

$ svg2geojson my.svg
Wrote my.geojson

Hạn chế

  • Sử dụng một kỹ thuật un-chiếu ngây thơ / không chính xác giả định rằng một vùng hình chữ nhật của hình ảnh tương ứng với một vùng lat / long hình chữ nhật. Ví dụ, trên một hình chữ nhật rộng khoảng 1 dặm, cao gần nửa dặm gần San Francisco, cạnh dưới dài hơn cạnh trên 4 inch. Điều này đã đủ gần cho nhu cầu của tôi.

  • Hiện tại không hỗ trợ SVG sử dụng các đường dẫn với các lệnh vòng cung Bézier hoặc elip bậc hai. (Tôi đang làm việc để thêm những thứ này.)


Phiên bản từ tháng 12 năm 2017 trong yêu cầu kéo của kho lưu trữ đó cũng hoạt động nếu bạn muốn / cần đo địa lý với 3 điểm thay vì 2. Tôi vẫn gặp khó khăn trong việc tìm hiểu về cách thức của cả hai phiên bản và đa giác kết quả của tôi đã được nhân đôi lộn ngược. Cũng cần thêm một chút công việc để tham gia các thuộc tính từ SVG vào GeoJSON. Nhìn về phía trước để sử dụng trong tương lai. Cảm ơn các mô-đun mát mẻ.
thadk

Điều này có thể không lý tưởng nhưng tôi đã sử dụng plugin trình duyệt địa lý QGIS trên PNG được chuyển đổi của SVG để giúp bạn tạo bảng điểm và kiểm tra xem sự thay đổi hình chữ nhật tuyến tính có hợp lý hay không, mặc dù tôi không chắc cách tra cứu điểm trong không gian SVG chính xác.
thadk

Tôi đã kiểm tra thư viện. Tôi hiểu rằng việc chuyển đổi xảy ra thông qua chuyển đổi các điểm SVG trong hình chữ nhật giới hạn geocoordine. Nhưng điều đó làm cho 4 điểm (tức là leftLongitude = "0.1617178" topLatitude = "23.4999998" rightLongitude = "15.9990339" bottomLatitude = "11,694295"). Hai thẻ XML, tất cả đều ngụ ý 8 bit dữ liệu và tài liệu cho Prognoz khiến tôi bối rối hoàn toàn. <p5:GeoItem Longitude="22.1471203091967" Latitude="44.2498454806746" X="0" Y="1" /> Làm thế nào 4 4 geocoord này có thể được dịch thành tập dữ liệu 8 mục này?
Jerome

4

Có một công cụ dòng lệnh của Phrogz được đề cập dưới đây mà tôi chưa kiểm tra:

/gis//a/245085/35596


Đối với bất kỳ ai đến đây, câu trả lời là: "nó khá khó (ít nhất là đối với một lập trình viên có kinh nghiệm nhưng người vẽ bản đồ thiếu kinh nghiệm)". Nó đòi hỏi một sự hiểu biết sâu sắc hơn về cách thức hoạt động của Hệ thống tham chiếu không gian (SRS). Bạn ít nhiều cần phải mã hóa địa lý .SVG của mình bằng cách sử dụng một cái gì đó như QGIS. Làm thế nào được thực hiện? Vẫn không có manh mối. Nhưng câu trả lời là:

"Bạn không thể đơn giản chuyển đổi SVG sang GeoJSON, vì SVG đang thiếu các tham chiếu địa lý cơ bản."

Nếu bạn muốn tiếp tục, hãy bắt đầu tìm kiếm về cách định vị tệp DXF.

Làm thế nào để tính toán các tham số cho phép biến đổi affine của QGIS?

Câu trả lời của Germán Carrillo rất hữu ích.


1
Có lẽ thông tin này nên được bao gồm trong câu hỏi, nghĩa là tệp svg không được tham chiếu địa lý. Hoặc có lẽ câu hỏi nên là: làm thế nào tôi có thể mã hóa địa lý .SVG bằng cách sử dụng một cái gì đó như QGIS?
dùng55937

Là hội nghị địa lý có thể trong định dạng SVG?
Michael Pell

2
Tôi không biết chính xác. Đối với tôi có vẻ như bạn có một bản đồ ở định dạng SVG là tỷ lệ nhưng không phải là srs. Vì vậy, có vẻ như bạn sẽ cần một số điểm kiểm soát mặt đất với tọa độ đã biết và sau đó áp dụng một số chuyển đổi cho dữ liệu để định vị địa lý trong một số hệ tọa độ thực. Có lẽ những điều này sẽ giúp ích?: Gis.stackexchange.com/questions/33208/ trên gisforth think.com/ từ
user55937

2

Công cụ dòng lệnh ogr2ogr sẽ có thể làm điều đó. Cái gì đó như:

ogr2ogr -f "GeoJSON" dst.json src.svg

Cả hai định dạng này đều được hỗ trợ http://www.gdal.org/ogr_formats.html . Nếu bạn không quen thuộc với ogr2ogr, cách dễ nhất để tải xuống và cài đặt nó có lẽ là thông qua https://trac.osgeo.org/osgeo4w/ .


2
Không đơn giản như vậy, trình điều khiển OGR SVG chỉ hỗ trợ một loại SVG đặc biệt được tạo bởi "Máy chủ luồng vectơ đám mây" và trong EPSG: 3857.
AndrewHarvey

1

Bạn không cần phải chuyển đổi từ SVG sang GeoJSON để sử dụng hình ảnh cho một bản hợp xướng trong d3, mặc dù có thể cần thiết cho các thư viện khác.

Thông tin đường dẫn trên tệp SVG (phải có ít nhất một đường dẫn cho mỗi tiểu bang / quốc gia / tiểu bang / phân khu trong bản đồ của bạn) là đủ để ánh xạ dữ liệu tới hình ảnh SVG của bạn trong d3.

Hãy để tôi đặt nó theo một cách khác: nếu bạn có thể thực hiện một d3.select trên svg ban đầu của bạn sẽ trả về chỉ một đường dẫn cho mỗi tiểu bang / quốc gia / khu vực thì bạn có thể sử dụng d3 để xây dựng một bản hợp xướng. Đây thường là trường hợp khi bạn có một bản đồ trong SVG. Nó thực sự đơn giản hơn so với sử dụng tệp GeoJSON vì bạn không cần phải lo lắng về vị trí không gian, hình chiếu, v.v. Thậm chí bạn có thể muốn điều chỉnh SVG ban đầu để thêm thông tin bị thiếu (như tên trạng thái, mà bạn có thể thêm dưới dạng ID DOM hoặc Các lớp học) trước khi sử dụng nó với D3 nhưng điều đó thường không cần thiết.

Mặt khác, như đã nói trước đây, SVG chỉ có thông tin đường dẫn / dòng, không phải thông tin địa lý / không gian, vì vậy nếu bạn muốn chuyển đổi từ SVG sang GeoJSON thì bạn cần phải THÊM / MAP thông tin định vị địa lý vào hình ảnh SVG của bạn. Ví dụ: trước tiên, bạn có thể chuyển đổi từ svg sang JSON, sau đó tính toán / thêm thông tin định vị địa lý (điều này sẽ phụ thuộc vào khu vực bạn đang ánh xạ) và tạo GeoJSON từ đó. Theo như tôi biết thì không có công cụ nào phù hợp để thực hiện công việc này cho bạn cả.


0

Tôi sẽ thử nguồn định dạng thay vì SVG cho tỉnh bạn đang tìm kiếm. Vì dữ liệu là miền công cộng nên rất tốt, bạn có thể tìm thấy nó. Hãy thử http://www.naturalearthdata.com/ hoặc đặt câu hỏi tại đây. Sau đó chuyển đổi từ Shapefile sang GeoJSON hoặc TopoJSON; MapShaper là bạn của bạn. Từ thời điểm này, D3 sẽ nằm trong tầm tay (hướng dẫn tuyệt vời Hãy tạo bản đồ )

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.