Metode untuk Mengonversi File .SVG ke GeoJSON

12

Pertanyaan

Bagaimana cara mengonversi file SVG ke format GeoJSON?

Hasil yang diinginkan:

Saya ingin membuat peta choropleth menggunakan sesuatu seperti D3.js, atau perpustakaan lain di luar sana.

Tantangan:

Saya memiliki file SVG yang dapat saya peroleh dari domain publik di wilayah administratif untuk provinsi tertentu di negara tertentu. Saya percaya saya perlu mengonversinya ke GeoJSON sebelum dapat menggunakannya di perpustakaan yang saya ketahui.

Michael Pell
sumber
2
Apa tepatnya wilayah administratif dari provinsi tertentu dari negara tertentu? Kami dapat membantu menemukan SHP atau GeoJSON file yang tersedia alih-alih berjuang untuk menyelesaikan masalah yang salah.
ThomasG77

Jawaban:

5

Saya baru saja menulis perpustakaan yang mengubah gambar SVG menjadi (sedikit-salah) GeoJSON.

svg2geojson

Ini mengharuskan Anda mengedit SVG Anda secara manual untuk menambahkan dua tag XML yang mengaitkan lokasi SVG dengan lat / panjang, dan itu menyediakan alat baris perintah untuk mengonversi file. Bahkan, jika Anda mau, mengambil semua grup tingkat atas (yang merupakan tujuan Illustrator mengekspor layer-nya) dan mengekspornya sebagai file terpisah.

Pemakaian

# 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

Keterbatasan

  • Menggunakan teknik un-proyeksi yang naif / tidak benar yang mengasumsikan bahwa daerah persegi panjang gambar sesuai dengan daerah lat / panjang persegi panjang. Misalnya, pada persegi panjang sekitar 1 mil lebar setengah mil di dekat San Francisco, tepi bawah sekitar 4 inci lebih panjang dari tepi atas. Ini cukup dekat dengan kebutuhan saya.

  • Saat ini tidak mendukung SVG yang menggunakan jalur dengan Bézier kuadrat atau perintah busur elips. (Saya sedang berusaha menambahkan ini.)

Phrogz
sumber
Versi dari Des 2017 dalam permintaan penarikan dari repositori itu juga berfungsi jika Anda ingin / perlu melakukan georeferensi dengan 3 poin alih-alih 2. Saya masih mengalami kesulitan untuk mencari tahu ke mana jalan dengan kedua versi, dan poligon yang dihasilkan saya dicerminkan. terbalik. Ini juga akan membutuhkan sedikit lebih banyak pekerjaan untuk menggabungkan properti dari SVG ke GeoJSON. Nantikan untuk digunakan di masa depan. Terima kasih untuk modul kerennya.
thadk
Ini mungkin tidak ideal tetapi saya menggunakan plugin georeferens QGIS pada PNG yang dikonversi dari SVG Anda untuk membantu Anda membuat tabel poin dan memeriksa apakah pergeseran persegi panjang linier bahkan masuk akal, meskipun saya tidak yakin bagaimana mencari menunjuk ruang SVG dengan benar.
thadk
Saya sudah memeriksa perpustakaan. Saya mengerti bahwa konversi terjadi melalui transformasi titik SVG dalam persegi panjang yang terikat geocoordinate. Tetapi itu menghasilkan 4 poin (yaitu leftLongitude = "0.1617178" topLatitude = "23.4999998" rightLongitude = "15.9990339" bottomLatitude = "11.694295"). Dua tag XML, semuanya menyiratkan 8 bit data dan dokumentasi untuk Prognoz membuat saya benar-benar bingung. <p5:GeoItem Longitude="22.1471203091967" Latitude="44.2498454806746" X="0" Y="1" /> Bagaimana 4 geoordinat itu dapat diterjemahkan ke dalam kumpulan data 8 item ini?
Jerome
4

Ada alat baris perintah oleh Phrogz yang disebutkan di bawah ini yang belum saya periksa:

/gis//a/245085/35596


Bagi siapa pun yang datang ke sini, jawabannya adalah: "itu cukup sulit (setidaknya untuk seorang programmer berpengalaman tetapi kartografer yang tidak berpengalaman)." Dibutuhkan pemahaman yang lebih dangkal tentang bagaimana Sistem Referensi Spasial (SRS) bekerja. Anda kurang lebih perlu melakukan geocode .SVG Anda menggunakan sesuatu seperti QGIS. Bagaimana itu dilakukan? Masih tidak ada petunjuk. Tetapi jawabannya adalah:

"Anda tidak bisa begitu saja mengubah SVG ke GeoJSON, karena SVG tidak memiliki referensi geo mendasar."

Jika Anda ingin melanjutkan, mulailah mencari cara georeferensi file DXF.

Bagaimana cara menghitung parameter untuk transformasi Affine QGIS?

Jawaban Germán Carrillo di sana sangat berguna.

Michael Pell
sumber
1
Mungkin informasi ini harus dimasukkan dalam pertanyaan, yaitu, bahwa file svg tidak di-georeferensi. Atau mungkin pertanyaannya adalah: bagaimana saya bisa melakukan geocode a .SVG menggunakan sesuatu seperti QGIS?
user55937
Apakah georeferensi mungkin dalam format SVG?
Michael Pell
2
Saya tidak tahu persis. Kedengarannya bagi saya seperti Anda memiliki peta dalam format SVG yang untuk skala tetapi tidak dalam srs. Jadi sepertinya Anda akan membutuhkan beberapa titik kontrol tanah dengan koordinat yang diketahui, dan kemudian menerapkan beberapa transformasi ke data untuk melakukan georeferensi di beberapa sistem koordinat nyata. Mungkin ini akan membantu ?: gis.stackexchange.com/questions/33208/… gisforthought.com/…
user55937
1

Alat baris perintah ogr2ogr harus dapat melakukan itu. Sesuatu seperti:

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

Kedua format tersebut didukung http://www.gdal.org/ogr_formats.html . Jika Anda tidak terbiasa dengan ogr2ogr, cara termudah untuk mengunduh dan menginstalnya mungkin melalui https://trac.osgeo.org/osgeo4w/ .

pengguna55937
sumber
3
Ini tidak langsung, pengandar OGR SVG hanya mendukung jenis khusus SVG yang dibuat oleh "Cloudmade Vector Stream Server" dan dalam EPSG: 3857.
AndrewHarvey
1

Anda tidak perlu mengonversi dari SVG ke GeoJSON untuk menggunakan gambar untuk choropleth di d3, meskipun mungkin diperlukan untuk perpustakaan lain.

Informasi jalur pada file SVG (harus ada setidaknya satu jalur untuk setiap negara bagian / negara / negara bagian / subdivisi di peta Anda) sudah cukup untuk memetakan data ke gambar SVG Anda di d3.

Biarkan saya katakan dengan cara lain: jika Anda bisa melakukan d3. Pilih pada svg asli Anda yang akan mengembalikan hanya satu jalur per negara / negara / wilayah maka Anda dapat menggunakan d3 untuk membangun choropleth. Ini biasanya terjadi ketika Anda memiliki peta di SVG. Ini sebenarnya lebih sederhana daripada menggunakan file GeoJSON karena Anda tidak perlu khawatir tentang lokasi ruang, proyeksi dll. Anda bahkan mungkin ingin mengubah SVG asli untuk menambahkan informasi yang hilang (seperti nama negara, yang dapat Anda tambahkan sebagai ID DOM atau Kelas) sebelum menggunakannya dengan D3 tapi itu biasanya tidak perlu.

Di sisi lain, seperti yang dikatakan sebelumnya, SVG hanya memiliki informasi jalur / garis, bukan informasi geografis / spasial, jadi jika Anda ingin mengonversi dari SVG ke GeoJSON maka Anda perlu ADD / MAP informasi geolokasi ke gambar SVG Anda. Misalnya, Anda dapat mengonversi dari svg ke JSON terlebih dahulu, lalu menghitung / menambahkan informasi geolokasi (ini akan tergantung pada wilayah yang Anda pemetaan) dan menghasilkan GeoJSON dari situ. Sejauh yang saya tahu tidak ada alat di luar kotak untuk melakukan pekerjaan ini untuk Anda sekalipun.

Roberto Stelling
sumber
0

Saya akan mencoba sumber format bukan SVG untuk provinsi yang Anda cari. Karena datanya kemungkinan domain publik bagus, Anda dapat menemukannya. Coba http://www.naturalearthdata.com/ atau ajukan pertanyaan di sini. Kemudian konversikan dari Shapefile ke GeoJSON atau TopoJSON; MapShaper adalah teman Anda. Dari titik ini D3 harus dalam jangkauan (tutorial yang sangat baik Mari Membuat Peta )

matt wilkie
sumber