Metody konwersji pliku .SVG na GeoJSON


12

Pytanie

Jak przekonwertować plik SVG do formatu GeoJSON?

Pożądany wynik:

Chcę zrobić mapę choropleth przy użyciu czegoś takiego jak D3.js lub dowolnej innej biblioteki.

Wyzwanie:

Mam plik SVG, który udało mi się uzyskać z domeny publicznej regionów administracyjnych dla konkretnej prowincji danego kraju. Uważam, że muszę przekonwertować to na GeoJSON, zanim będę mógł używać go w bibliotekach, o których wiem.


2
Jakie są regiony administracyjne konkretnej prowincji danego kraju? Możemy pomóc znaleźć dostępne pliki SHP lub GeoJSON zamiast walczyć o rozwiązanie niewłaściwego problemu.
ThomasG77,

Odpowiedzi:


5

Właśnie napisałem bibliotekę, która konwertuje obraz SVG na (nieco niepoprawny) GeoJSON.

svg2geojson

Wymaga ręcznej edycji pliku SVG, aby dodać dwa tagi XML, które kojarzą lokalizację SVG z długością / długością, oraz zapewnia narzędzie wiersza polecenia do konwersji pliku. Jeśli chcesz, nawet weźmie wszystkie grupy najwyższego poziomu (tak jak program Illustrator eksportuje swoje warstwy) i wyeksportuje je jako osobne pliki.

Stosowanie

# 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

Ograniczenia

  • Wykorzystuje naiwną / niepoprawną technikę niep rzutowania, która zakłada, że ​​prostokątny obszar obrazu odpowiada prostokątnemu obszarowi lat / long. Na przykład na prostokącie o szerokości około 1 mili i wysokości pół mili w pobliżu San Francisco dolna krawędź jest około 4 cali dłuższa niż górna krawędź. To było wystarczająco blisko moich potrzeb.

  • Obecnie nie obsługuje SVG, które wykorzystuje ścieżki z kwadratowymi poleceniami Béziera lub eliptycznymi łukami. (Pracuję nad ich dodaniem).


Wersja z grudnia 2017 r. W żądaniu ściągnięcia tego repozytorium działa również, jeśli chcesz / potrzebujesz georeferencję z 3 punktami zamiast 2. Wciąż miałem problem z ustaleniem, która z tych opcji jest odpowiednia w obu wersjach, a mój powstały wielokąt został dublowany do góry nogami. Przyłączenie właściwości z SVG do GeoJSON wymagałoby także nieco więcej pracy. Czekamy na korzystanie w przyszłości. Dzięki za fajny moduł.
thadk

Prawdopodobnie nie jest to idealne, ale użyłem wtyczki georeferencji QGIS na przekonwertowanym PNG twojego SVG, aby pomóc ci stworzyć tabelę punktów i sprawdzić, czy liniowe przesunięcie prostokątne jest w ogóle możliwe, chociaż nie jestem pewien, jak sprawdzić prawidłowo wskazuje punkty w przestrzeni SVG.
thadk

Zbadałem bibliotekę. Rozumiem, że konwersja odbywa się poprzez transformację punktów SVG w obrębie prostokąta ograniczającego geokoordynację. Ale to daje 4 punkty (tj. LeftLongitude = "0.1617178" topLatitude = "23.4999998" rightLongitude = "15.9990339" bottomLatitude = "11.694295"). Dwa tagi XML, w sumie, oznaczają 8 bitów danych, a dokumentacja Prognoz doprowadziła mnie do kompletnego pomieszania. W <p5:GeoItem Longitude="22.1471203091967" Latitude="44.2498454806746" X="0" Y="1" /> jaki sposób te 4 geokoordynaty mogą zostać przetłumaczone na ten 8-elementowy zestaw danych?
Jerome

4

Istnieje narzędzie wiersza polecenia Phrogza wspomniane poniżej, którego nie sprawdziłem:

/gis//a/245085/35596


Dla każdego, kto tu przyjdzie, odpowiedź brzmi: „jest to dość trudne (przynajmniej dla doświadczonego programisty, ale niedoświadczonego kartografa)”. Wymaga to bardziej niż powierzchownego zrozumienia, jak działają kosmiczne systemy odniesienia (SRS). Mniej więcej musisz geokodować swój .SVG przy użyciu czegoś takiego jak QGIS. Jak to się robi? Nadal nie mam pojęcia. Ale odpowiedź brzmi:

„Nie można po prostu przekonwertować SVG na GeoJSON, ponieważ SVG nie ma podstawowych odniesień geograficznych”.

Jeśli chcesz kontynuować, rozpocznij wyszukiwanie georeferencji pliku DXF.

Jak obliczyć parametry transformacji afinicznej QGIS?

Odpowiedź Germána Carrillo jest bardzo przydatna.


1
Być może ta informacja powinna zostać uwzględniona w pytaniu, tzn. Że plik svg nie jest georeferencyjny. A może pytanie powinno brzmieć: jak mogę geokodować .SVG używając czegoś takiego jak QGIS?
user55937

Czy georeferencje są możliwe w formacie SVG?
Michael Pell,

2
Nie wiem dokladnie. Wydaje mi się, że masz mapę w formacie SVG, która ma być skalowana, ale nie w srs. Brzmi więc to tak, jakbyś potrzebował naziemnych punktów kontrolnych o znanych współrzędnych, a następnie zastosowałeś transformację danych w celu georeferencji w prawdziwym układzie współrzędnych. Może te pomogą ?: gis.stackexchange.com/questions/33208/… gisforthought.com/…
user55937

1

Powinno być to możliwe w narzędziu ogr2ogr z wiersza poleceń. Coś jak:

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

Oba te formaty są obsługiwane http://www.gdal.org/ogr_formats.html . Jeśli nie znasz ogr2ogr, najłatwiejszym sposobem na jego pobranie i zainstalowanie jest prawdopodobnie https://trac.osgeo.org/osgeo4w/ .


3
Nie jest to takie proste, sterownik OGR SVG obsługuje tylko specjalny rodzaj plików SVG, które są tworzone przez „Cloudmade Vector Stream Server” i w EPSG: 3857.
AndrewHarvey

1

Nie trzeba konwertować z SVG na GeoJSON, aby użyć obrazu do choropleta w d3, chociaż może być to konieczne w przypadku innych bibliotek.

Informacje o ścieżce w pliku SVG (musi istnieć co najmniej jedna ścieżka dla każdego stanu / kraju / stanu / podziału na mapie) jest wystarczająca do mapowania danych na obrazie SVG w d3.

Powiem inaczej: jeśli możesz zrobić plik d3.select na swoim oryginalnym pliku svg, który zwróci tylko jedną ścieżkę na stan / kraj / region, możesz użyć d3 do zbudowania choropletha. Zwykle dzieje się tak, gdy masz mapę w SVG. Jest to w rzeczywistości prostsze niż użycie pliku GeoJSON, ponieważ nie musisz martwić się o lokalizację miejsca, projekcję itp. Możesz nawet dostosować oryginalny plik SVG, aby dodać brakujące informacje (takie jak nazwy stanów, które możesz dodać jako identyfikatory DOM lub Klasy) przed użyciem go z D3, ale zwykle nie jest to konieczne.

Z drugiej strony, jak powiedziano wcześniej, SVG ma tylko informacje o ścieżce / liniach, a nie informacje geograficzne / przestrzenne, więc jeśli chcesz przekonwertować z SVG do GeoJSON, musisz dodać informacje geolokalizacyjne do mapy SVG. Na przykład możesz najpierw przekonwertować z svg na JSON, a następnie obliczyć / dodać informacje o geolokalizacji (będzie to zależało od regionu, na którym mapujesz) i wygenerować z tego GeoJSON. O ile wiem, nie ma gotowego narzędzia do wykonania tej pracy dla ciebie.


0

Spróbowałbym format pliku zamiast SVG dla prowincji, której szukasz. Ponieważ dane są własnością publiczną, istnieje duże prawdopodobieństwo, że je znajdziesz. Spróbuj http://www.naturalearthdata.com/ lub zadaj pytanie tutaj. Następnie przekonwertuj z Shapefile na GeoJSON lub TopoJSON; MapShaper jest twoim przyjacielem. Od tego momentu D3 powinien być w zasięgu ręki (doskonały samouczek Zróbmy mapę )

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.