.SVG Dosyasını GeoJSON'a Dönüştürme Yöntemleri


12

Soru

Bir SVG dosyasını GeoJSON formatına nasıl dönüştürebilirim?

İstenen sonuç:

D3.js veya diğer kütüphanelerden herhangi birini kullanarak bir choropleth haritası yapmak istiyorum.

Meydan okuma:

Belirli bir ülkenin belirli bir eyaletinin idari bölgelerinin kamu malı tarafından elde edebildiğim bir SVG dosyam var. Farkında olduğum kütüphanelerde kullanabilmek için bunu GeoJSON'a dönüştürmem gerektiğine inanıyorum.


2
Belirli bir ülkenin belirli ilinin idari bölgeleri tam olarak nedir? Yanlış sorunu çözmek için mücadele etmek yerine SHP veya GeoJSON kullanılabilir dosyaları bulmaya yardımcı olabiliriz.
ThomasG77

Yanıtlar:


5

Sadece bir SVG görüntüsünü (biraz yanlış) GeoJSON'a dönüştüren bir kütüphane yazdım.

svg2geojson

Bir SVG konumunu enlem / boylam ile ilişkilendiren iki XML etiketi eklemek için SVG'nizi el ile düzenlemenizi gerektirir ve dosyayı dönüştürmek için bir komut satırı aracı sağlar. İsterseniz, tüm üst düzey grupları (Illustrator'ın katmanlarını dışa aktardığı şey) alır ve ayrı dosyalar olarak dışa aktarır.

kullanım

# 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

Sınırlamalar

  • Görüntünün dikdörtgen bir bölgesinin dikdörtgen bir lat / uzun bölgeye karşılık geldiğini varsayan, hatalı / yanlış projeksiyon tekniğini kullanır. Örneğin, San Francisco yakınlarındaki yaklaşık 1 mil genişliğinde ve yarım mil yüksekliğinde bir dikdörtgende, alt kenar üst kenardan yaklaşık 4 inç daha uzundur. Bu benim ihtiyaçları için yeterince yakındı.

  • Şu anda ikinci dereceden Bézier veya eliptik ark komutlarına sahip yolları kullanan SVG'yi desteklemiyor. (Bunları eklemek için çalışıyorum.)


Aralık 2017'den bu deponun bir çekme isteğindeki sürüm, 2 yerine 3 puanla coğrafi referans almak / ihtiyaç duymanız durumunda da çalışır. Tepe taklak. Ayrıca, SVG'den GeoJSON'a mülkleri birleştirmek biraz daha fazla çalışma gerektirecekti. Gelecekte kullanmak için sabırsızlanıyoruz. Serin modül için teşekkürler.
thadk

Bu muhtemelen ideal değil, ancak puan tablosunu oluşturmanıza ve doğrusal bir dikdörtgen kaymanın makul olup olmadığını kontrol etmenize yardımcı olmak için SVG'nizin dönüştürülmüş bir PNG'sinde QGIS georeferencer eklentisini kullandım, ancak SVG uzayda doğru işaret eder.
thadk

Kütüphaneyi inceledim. Dönüşümün, coğrafi koordinat sınırlayıcı bir dikdörtgen içindeki SVG noktalarının dönüştürülmesi yoluyla gerçekleştiğini anlıyorum. Ancak bu 4 puan kazandırır (yani leftLongitude = "0.1617178" topLatitude = "23.4999998" rightLongitude = "15.9990339" bottomLatitude = "11.694295"). İki XML etiketi, toplamda 8 bitlik veri anlamına geliyor ve Prognoz'un dokümantasyonu beni tamamen karıştırdı <p5:GeoItem Longitude="22.1471203091967" Latitude="44.2498454806746" X="0" Y="1" /> Bu 4 coğrafi koordinat bu 8 öğe veri setine nasıl çevrilebilir?
Jerome

4

Phrogz tarafından aşağıda kontrol edilmediğim bir komut satırı aracı var:

/gis//a/245085/35596


Buraya gelen herkese cevap: "oldukça zor (en azından deneyimli bir programcı ama deneyimsiz haritacı için)." Spacial Reference Systems'ın (SRS) nasıl çalıştığına dair yüzeysel olmayan bir anlayış gerektirir. QGIS gibi bir şey kullanarak .SVG'nizi az çok coğrafi olarak kodlamanız gerekir. Bu nasıl yapılır? Hala ipucu yok. Ama cevap:

"SVG'nin temel coğrafi referansları olmadığı için SVG'yi GeoJSON'a dönüştüremezsiniz."

Devam etmek isterseniz, bir DXF dosyasının nasıl coğrafi olarak aranacağını araştırmaya başlayın.

QGIS Afin transformasyonu için parametreler nasıl hesaplanır?

Germán Carrillo'in cevabı çok faydalı.


1
Belki bu bilgi şu soruya dahil edilmelidir, yani svg dosyasının coğrafi referansı yoktur. Ya da belki de soru şu olmalıdır: QGIS gibi bir şey kullanarak bir .SVG'yi nasıl kodlayabilirim?
user55937

SVG formatında coğrafi referans mümkün mü?
Michael Pell

2
Tam olarak bilmiyorum. Bana öyle geliyor ki SVG formatında ölçeklenecek ama bir saniye içinde bir haritanız var. Öyleyse, bilinen koordinatları olan bazı yer kontrol noktalarına ihtiyaç duyacağınız ve daha sonra bazı gerçek koordinat sistemlerinde coğrafi referans için verilere bazı dönüşümler uygulayacağınız anlaşılıyor. Belki bunlar yardımcı olacaktır ?: gis.stackexchange.com/questions/33208/… gisforthought.com/…
user55937


1

Diğer kütüphaneler için gerekli olsa da, görüntüyü d3'te bir choletleth kullanmak için SVG'den GeoJSON'a dönüştürmeniz gerekmez.

SVG dosyasındaki yol bilgileri (haritanızdaki her eyalet / ülke / eyalet / alt bölüm için en az bir yol olmalıdır), verileri d3'teki SVG resminizle eşleştirmek için yeterlidir.

Başka bir deyişle, orijinal svg'nizde eyalet / ülke / bölge başına yalnızca bir yol döndürecek bir d3.sel seçebiliyorsanız, bir choropleth oluşturmak için d3'ü kullanabilirsiniz. Bu genellikle SVG'de bir haritanız olduğunda geçerlidir. Alan konumu, projeksiyon vb. Hakkında endişelenmenize gerek olmadığı için bir GeoJSON dosyası kullanmaktan daha kolaydır. Eksik bilgiler (eyalet adları gibi DOM kimlikleri olarak ekleyebileceğiniz veya Sınıflar) D3 ile kullanmadan önce, ancak bu genellikle gerekli değildir.

Öte yandan, daha önce de söylendiği gibi, SVG'nin coğrafi / uzamsal bilgileri değil, sadece yol / satır bilgileri vardır, bu nedenle SVG'den GeoJSON'a dönüştürmek istiyorsanız, SVG resminize ADD / MAP coğrafi konum bilgilerini eklemeniz gerekir. Örneğin, önce svg'den JSON'a dönüştürebilir, ardından coğrafi konum bilgilerini hesaplayabilir / ekleyebilirsiniz (bu, eşlediğiniz bölgeye bağlı olacaktır) ve bundan bir GeoJSON oluşturabilirsiniz. Bildiğim kadarıyla sizin için bu işi yapmak için kutudan araç yok.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.