Methoden zum Konvertieren von .SVG-Dateien in GeoJSON

12

Frage

Wie konvertiere ich eine SVG-Datei in das GeoJSON-Format?

Gewünschtes Ergebnis:

Ich möchte eine Choropleth-Map mit etwas wie D3.js oder einer der anderen Bibliotheken da draußen erstellen.

Herausforderung:

Ich habe eine SVG-Datei, die ich für eine bestimmte Provinz eines bestimmten Landes aus dem öffentlichen Bereich der Verwaltungsregionen erhalten konnte. Ich glaube, ich muss das in GeoJSON konvertieren, bevor ich es in den mir bekannten Bibliotheken verwenden kann.

Michael Pell
quelle
1
Was genau sind die Verwaltungsregionen der jeweiligen Provinz des jeweiligen Landes? Wir könnten helfen, SHP- oder GeoJSON-Dateien zu finden, anstatt zu kämpfen, um das falsche Problem zu lösen.
ThomasG77

Antworten:

5

Ich habe gerade eine Bibliothek geschrieben, die ein SVG-Bild in ein (leicht falsches) GeoJSON konvertiert.

svg2geojson

Sie müssen Ihre SVG-Datei manuell bearbeiten, um zwei XML-Tags hinzuzufügen, die einen SVG-Speicherort mit einem Lat / Long-Wert verknüpfen. Außerdem wird ein Befehlszeilentool zum Konvertieren der Datei bereitgestellt. Wenn Sie möchten, werden sogar alle Gruppen der obersten Ebene (als was Illustrator die Ebenen exportiert) und als separate Dateien exportiert.

Verwendung

# 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

Einschränkungen

  • Verwendet eine naive / inkorrekte Entprojektionstechnik, bei der angenommen wird, dass ein rechteckiger Bereich des Bildes einem rechteckigen Lat / Long-Bereich entspricht. Beispielsweise ist bei einem Rechteck in der Nähe von San Francisco, das etwa 1,6 km breit und 1,5 km hoch ist, die Unterkante etwa 5 cm länger als die Oberkante. Dies war nah genug für meine Bedürfnisse.

  • Derzeit wird SVG nicht unterstützt, das Pfade mit quadratischen Bézier- oder elliptischen Bogenbefehlen verwendet. (Ich arbeite daran, diese hinzuzufügen.)

Phrogz
quelle
Die Version vom Dezember 2017 in einem Pull-Request dieses Repositorys funktioniert auch, wenn Sie mit 3 statt 2 Punkten georeferenzieren möchten / müssen. Ich hatte immer noch Probleme, mir vorzustellen, in welche Richtung beide Versionen weisen, und mein resultierendes Polygon wurde gespiegelt kopfüber. Es hätte auch etwas mehr Arbeit gekostet, die Eigenschaften aus der SVG in die GeoJSON zu integrieren. Freuen Sie sich jedoch auf die zukünftige Verwendung. Danke für das coole Modul.
Thadk
Dies ist wahrscheinlich nicht ideal, aber ich habe das QGIS-Georeferenzierungs-Plugin in einem konvertierten PNG Ihres SVG verwendet, um eine Punktetabelle zu erstellen und zu überprüfen, ob eine lineare rechteckige Verschiebung überhaupt plausibel war, obwohl ich nicht sicher bin, wie ich die nachschlagen soll Punkte im SVG-Raum richtig.
Thadk
Ich habe die Bibliothek untersucht. Ich verstehe, dass die Konvertierung über eine Transformation der SVG-Punkte in einem geokoordinierten Begrenzungsrechteck erfolgt. Dies ergibt jedoch 4 Punkte (dh leftLongitude = "0.1617178" topLatitude = "23.4999998" rightLongitude = "15.9990339" bottomLatitude = "11.694295"). Die beiden XML-Tags bedeuten insgesamt 8 Datenbits, und die Dokumentation für Prognoz hat mich gründlich verwirrt. <p5:GeoItem Longitude="22.1471203091967" Latitude="44.2498454806746" X="0" Y="1" /> Wie können diese 4 Geokoordinaten in diesen 8-Artikel-Datensatz übersetzt werden?
Hieronymus
4

Es gibt ein Kommandozeilen-Tool von Phrogz, das ich nicht ausgecheckt habe:

/gis//a/245085/35596


Für jeden, der hierher kommt, lautet die Antwort: "Es ist ziemlich schwierig (zumindest für einen erfahrenen Programmierer, aber unerfahrenen Kartografen)." Es erfordert ein mehr als oberflächliches Verständnis der Funktionsweise der Spacial Reference Systems (SRS). Sie müssen Ihre .SVG mehr oder weniger mit etwas wie QGIS geokodieren. Wie geht das? Immer noch keine Ahnung. Aber die Antwort lautet:

"Sie können SVG nicht einfach in GeoJSON konvertieren, da in SVG die grundlegenden Geoverweise fehlen."

Wenn Sie fortfahren möchten, suchen Sie nach einer Georeferenzierungsmethode für eine DXF-Datei.

Wie berechnet man Parameter für die QGIS-Affintransformation?

Die Antwort von Germán Carrillo ist sehr nützlich.

Michael Pell
quelle
1
Vielleicht sollte diese Information in die Frage aufgenommen werden, dh dass die SVG-Datei nicht georeferenziert ist. Oder vielleicht sollte die Frage lauten: Wie kann ich eine .SVG mit so etwas wie QGIS geocodieren?
user55937
Ist Georeferenzierung im SVG-Format möglich?
Michael Pell
2
Ich weiß es nicht genau. Es klingt für mich so, als hättest du eine Karte im SVG-Format, die maßstabsgetreu ist, aber nicht in einer srs. Es hört sich also so an, als würden Sie einige Bodenkontrollpunkte mit bekannten Koordinaten benötigen und dann eine Transformation auf Daten anwenden, um sie in einem realen Koordinatensystem zu georeferenzieren. Vielleicht helfen diese ?: gis.stackexchange.com/questions/33208/… gisforthought.com/…
user55937
2

Das Kommandozeilen-Tool ogr2ogr sollte das können. Etwas wie:

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

Beide Formate werden unterstützt http://www.gdal.org/ogr_formats.html . Wenn Sie mit ogr2ogr nicht vertraut sind, können Sie es am einfachsten über https://trac.osgeo.org/osgeo4w/ herunterladen und installieren .

user55937
quelle
2
Es ist nicht so einfach, der OGR-SVG-Treiber unterstützt nur eine spezielle Art von SVG, die vom "Cloudmade Vector Stream Server" und in EPSG: 3857 erstellt wurden.
Andrew Harvey
1

Sie müssen nicht von SVG nach GeoJSON konvertieren, um das Bild für ein Choroplethen in d3 zu verwenden, obwohl dies für andere Bibliotheken erforderlich sein kann.

Die Pfadinformationen in der SVG-Datei (es muss mindestens einen Pfad für jedes Bundesland / Land / Bundesland / Untergebiet in Ihrer Karte geben) reichen aus, um Daten auf Ihr SVG-Bild in d3 abzubilden.

Lassen Sie es mich anders sagen: Wenn Sie in Ihrem Original-SVG eine d3.select ausführen können, die nur einen Pfad pro Bundesstaat / Land / Region zurückgibt, können Sie mit d3 ein Choroplethen erstellen. Dies ist normalerweise der Fall, wenn Sie eine Karte in SVG haben. Es ist tatsächlich einfacher als die Verwendung einer GeoJSON-Datei, da Sie sich nicht um den Speicherort, die Projektion usw. kümmern müssen. Möglicherweise möchten Sie sogar die ursprüngliche SVG-Datei optimieren, um fehlende Informationen hinzuzufügen (z. B. Statusnamen, die Sie als DOM-IDs oder hinzufügen können Klassen) vor der Verwendung mit D3, aber das ist in der Regel nicht erforderlich.

Auf der anderen Seite enthält SVG, wie bereits erwähnt, nur Pfad- / Linieninformationen, keine geografischen / räumlichen Informationen. Wenn Sie also von SVG zu GeoJSON konvertieren möchten, müssen Sie Geolocation-Informationen zu Ihrem SVG-Bild HINZUFÜGEN / MAPEN. Zum Beispiel können Sie zuerst von svg nach JSON konvertieren, dann Geolocation-Informationen berechnen / hinzufügen (dies hängt von der Region ab, die Sie zuordnen) und daraus ein GeoJSON generieren. Soweit ich weiß, gibt es kein sofort einsatzbereites Tool, um diesen Job für Sie zu erledigen.

Roberto Stelling
quelle
0

Ich würde versuchen, das Format anstelle von SVG für die Provinz zu verwenden. Da die Daten gemeinfrei sind, sind die Chancen gut, dass Sie sie finden. Versuchen Sie http://www.naturalearthdata.com/ oder stellen Sie hier eine Frage. Konvertieren Sie dann von Shapefile nach GeoJSON oder TopoJSON. MapShaper ist dein Freund. Ab diesem Punkt sollte D3 in Reichweite sein (exzellentes Tutorial Let's Make a Map )

Matt Wilkie
quelle