Daugiau

Metodai konvertuoti .SVG failą į GeoJSON

Metodai konvertuoti .SVG failą į GeoJSON


Klausimas

Kaip konvertuoti SVG failą į „GeoJSON“ formatą?

Norimas rezultatas:

Noriu padaryti choropleth žemėlapį naudodamas kažką panašaus į D3.js ar bet kurią kitą ten esančią biblioteką.

Iššūkis:

Turiu SVG failą, kurį galėjau gauti iš viešosios nuosavybės iš tam tikrų konkrečios šalies provincijų administracinių regionų. Manau, kad turiu tai konvertuoti į „GeoJSON“, kad galėčiau jį naudoti bibliotekose, apie kurias aš žinau.


Aš ką tik parašiau biblioteką, kuri paverčia SVG vaizdą į (šiek tiek neteisingą) „GeoJSON“.

Svg2geojson

Tai reikalauja, kad rankiniu būdu redaguotumėte savo SVG, kad pridėtumėte dvi XML žymas, kurios susieja SVG vietą su lat / long, ir tai suteikia komandinės eilutės įrankį failui konvertuoti. Net jei norite, jis paims visas aukščiausio lygio grupes (kaip „Illustrator“ eksportuoja savo sluoksnius) ir eksportuos jas kaip atskirus failus.

Naudojimas

# Pirmiausia įdiekite „Node.js“ $ npm įdiekite svg2geojson -g # įdiekite visame pasaulyje, kad galėtumėte lengvai pasiekti vykdomąjį „$ svg2geojson -h“ Naudojimas: svg2geojson [parinktys] file.svg Parinktys: -t, --tolerancija = 0,1 Atstumas (pasaulio metrai) iki mėginio kreivės iki. (numatytasis: 0.1) -l, --layers Aukščiausio lygio grupes padalija į atskirus failus. (numatytasis: vienas failas) -o, --stdout Išveskite GeoJSON į stdout. (numatytasis: rašykite failus pavadinimais pagal SVG / sluoksnį) -m, --minimal Padarykite „GeoJSON“ kuo mažesnę (ne gražią). -p, --precision Dešimtainių skaičių skaičius, į kurį galima formatuoti JSON numerius. (numatytasis: 6, kaip rekomenduoja „GeoJSON“) -d, --dugug Įtraukite kiekvieno SVG elemento ID į funkcijas. (numatytasis: nėra savybių) -v, --version Išveskite svg2geojson versiją kaip pirmąją „stdout“ eilutę (0.7.0). -h, --help Rodyti šį pagalbos pranešimą. $ svg2geojson my.svg Parašė my.geojson

Apribojimai

  • Taiko naivią / neteisingą neprojekcijos techniką, kuri daro prielaidą, kad stačiakampis vaizdo sritis atitinka stačiakampį lat / ilgio sritį. Pavyzdžiui, stačiakampyje, esančiame maždaug 1 mylios pločio ir pusės mylios aukščio šalia San Francisko, apatinis kraštas yra maždaug 4 cm ilgesnis už viršutinį kraštą. Tai buvo pakankamai arti mano poreikių.

  • Šiuo metu nepalaiko SVG, kuris naudoja kelius su kvadratinėmis Bézier arba elipsės formos lanko komandomis. (Aš stengiuosi juos pridėti.)


Yra žemiau paminėtas „Phrogz“ komandinės eilutės įrankis, kurio neišbandžiau:

https://gis.stackexchange.com/a/245085/35596


Tiems, kas čia ateina, atsakymas yra toks: „tai gana sunku (bent jau patyrusiam programuotojui, bet nepatyrusiam kartografui)“. Tam reikia daugiau nei paviršutiniško supratimo, kaip veikia erdvinės atskaitos sistemos (SRS). Daugiau ar mažiau reikia .SVG geografiškai koduoti naudojant kažką panašaus į QGIS. Kaip tai daroma? Vis dar nėra supratimo. Bet atsakymas yra toks:

"Jūs negalite tiesiog konvertuoti SVG į GeoJSON, nes SVG trūksta pagrindinių geografinių nuorodų."

Jei norite tęsti, pradėkite ieškoti, kaip georeferencijuoti DXF failą.

Kaip apskaičiuoti QGIS Affine transformacijos parametrus?

Germano Carrillo atsakymas ten yra labai naudingas.


Jei norite naudoti vaizdą choroplethui d3, jums nereikia konvertuoti iš SVG į GeoJSON, nors tai gali būti reikalinga kitoms bibliotekoms.

Informacijos apie kelią SVG faile (kiekvienoje jūsų žemėlapio valstijoje / šalyje / valstijoje / poskyryje turi būti bent vienas kelias) pakanka, kad duomenys būtų susieti su SVG atvaizdu d3.

Leiskite man pasakyti kitaip: jei jūs galite padaryti d3.select savo pradiniame svg, kuris grąžins tik vieną kelią kiekvienai valstijai / šaliai / regionui, tada jūs galite naudoti d3 choropleth sukūrimui. Paprastai tai atsitinka, kai turite žemėlapį SVG. Tai iš tikrųjų yra paprasčiau nei naudoti „GeoJSON“ failą, nes jums nereikia jaudintis dėl vietos vietos, projekcijos ir pan. Jūs netgi galbūt norėsite pakoreguoti originalų SVG, kad pridėtumėte trūkstamą informaciją (pvz., Valstybių pavadinimus, kuriuos galite pridėti kaip DOM ID arba Klasės) prieš naudojant jį su D3, tačiau to paprastai nereikia.

Kita vertus, kaip buvo sakyta anksčiau, SVG turi tik kelio / linijų informaciją, o ne geografinę / erdvinę informaciją, taigi, jei norite konvertuoti iš SVG į GeoJSON, turite pridėti / SVEIKTI geografinės vietos informaciją į savo SVG vaizdą. Pavyzdžiui, pirmiausia galite konvertuoti iš svg į JSON, tada apskaičiuoti / pridėti geografinės vietos informaciją (tai priklausys nuo regiono, kurį priskiriate) ir iš to sugeneruoti „GeoJSON“. Kiek aš žinau, nėra jokio įrankio, kuris atliktų šį darbą už jus.


Norėčiau išbandyti provincijos, kurios ieškote, vietoj SVG formato failo formatą. Kadangi duomenys yra viešosios nuosavybės galimybės, yra didelė, galite juos rasti. Išbandykite http://www.naturalearthdata.com/ arba užduokite klausimą čia. Tada konvertuokite iš „Shapefile“ į „GeoJSON“ arba „TopoJSON“; „MapShaper“ yra jūsų draugas. Nuo šio taško D3 turėtų būti pasiekiamas (puiki pamoka Padarykime žemėlapį)