Metodi per convertire i file .SVG in GeoJSON


12

Domanda

Come posso convertire un file SVG in formato GeoJSON?

Risultato desiderato:

Voglio creare una mappa coropletica usando qualcosa come D3.js o una qualsiasi delle altre librerie là fuori.

Sfida:

Ho un file SVG che sono stato in grado di ottenere dal pubblico dominio delle regioni amministrative per una particolare provincia di un determinato paese. Credo di aver bisogno di convertirlo in GeoJSON prima di poterlo utilizzare nelle librerie di cui sono a conoscenza.


2
Quali sono esattamente le regioni amministrative della provincia particolare del paese particolare? Potremmo aiutare a trovare i file SHP o GeoJSON disponibili invece di combattere per risolvere il problema sbagliato.
ThomasG77,

Risposte:


5

Ho appena scritto una libreria che converte un'immagine SVG in un GeoJSON (leggermente errato).

svg2geojson

Richiede la modifica manuale del file SVG per aggiungere due tag XML che associano una posizione SVG a un lat / long e fornisce uno strumento da riga di comando per convertire il file. Se lo desideri, prenderà anche tutti i gruppi di livello superiore (che è quello in cui Illustrator esporta i suoi livelli) e li esporterà come file separati.

uso

# 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

limitazioni

  • Utilizza una tecnica di non proiezione ingenua / errata che presuppone che una regione rettangolare dell'immagine corrisponda a una lat / regione rettangolare lunga. Ad esempio, su un rettangolo largo circa 1 miglio e alto mezzo miglio vicino a San Francisco, il bordo inferiore è circa 4 pollici più lungo del bordo superiore. Questo era abbastanza vicino per le mie esigenze.

  • Attualmente non supporta SVG che utilizza percorsi con comandi quadratici di Bézier o arco ellittico. (Sto lavorando per aggiungere questi.)


La versione di dicembre 2017 in una richiesta pull di quel repository funziona anche se vuoi / hai bisogno di georeferenziazione con 3 punti invece di 2. Ho ancora problemi a orientarmi su entrambe le versioni e il mio poligono risultante è stato rispecchiato sottosopra. Inoltre, ci sarebbe voluto un po 'più di lavoro per unire le proprietà dallo SVG al GeoJSON. Non vedo l'ora di utilizzarlo in futuro. Grazie per il fantastico modulo.
Thadk,

Questo probabilmente non è l'ideale, ma ho usato il plug-in georeferenziatore QGIS su un PNG convertito del tuo SVG per aiutarti a creare una tabella di punti e verificare se uno spostamento rettangolare lineare fosse persino plausibile, anche se non sono sicuro di come cercare punti nello spazio SVG correttamente.
Thadk,

Ho esaminato la biblioteca. Comprendo che la conversione avviene tramite una trasformazione dei punti SVG all'interno di un rettangolo di confine geocoordinato. Ma ciò fa 4 punti (cioè leftLongitude = "0.1617178" topLatitude = "23.4999998" rightLongitude = "15.9990339" bottomLatitude = "11.694295"). I due tag XML, nel complesso, implicano 8 bit di dati e la documentazione per Prognoz mi ha completamente confuso. <p5:GeoItem Longitude="22.1471203091967" Latitude="44.2498454806746" X="0" Y="1" /> Come possono questi 4 geocordinati essere tradotti in questo set di dati di 8 elementi?
Girolamo,

4

C'è uno strumento da riga di comando di Phrogz menzionato di seguito che non ho verificato:

/gis//a/245085/35596


Per chiunque venga qui, la risposta è: "è abbastanza difficile (almeno per un programmatore esperto ma cartografo inesperto)". Richiede una comprensione più che superficiale di come funzionano i sistemi di riferimento spaziale (SRS). Hai più o meno bisogno di geocodificare il tuo .SVG usando qualcosa come QGIS. Come si fa? Ancora nessun indizio. Ma la risposta è:

"Non puoi semplicemente convertire SVG in GeoJSON, poiché in SVG mancano i riferimenti geografici fondamentali."

Se desideri procedere, inizia a cercare su come georeferenziare un file DXF.

Come calcolare i parametri per la trasformazione dell'affine QGIS?

La risposta di Germán Carrillo è molto utile.


1
Forse questa informazione dovrebbe essere inclusa nella domanda, cioè che il file svg non è georeferenziato. O forse la domanda dovrebbe essere: come posso geocodificare un .SVG usando qualcosa come QGIS?
user55937

La georeferenziazione è possibile nel formato SVG?
Michael Pell,

2
Non lo so esattamente. Mi sembra che tu abbia una mappa in formato SVG che è in scala ma non in un srs. Quindi sembra che avresti bisogno di alcuni punti di controllo del suolo con coordinate note, e quindi applicare una trasformazione ai dati per georeferenziarli in un vero sistema di coordinate. Forse questi aiuteranno ?: gis.stackexchange.com/questions/33208/… gisforthought.com/…
user55937

1

Lo strumento da riga di comando ogr2ogr dovrebbe essere in grado di farlo. Qualcosa di simile a:

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

Entrambi questi formati sono supportati http://www.gdal.org/ogr_formats.html . Se non hai familiarità con ogr2ogr, il modo più semplice per scaricarlo e installarlo è probabilmente tramite https://trac.osgeo.org/osgeo4w/ .


3
Non è così semplice, il driver SVG OGR supporta solo un tipo speciale di SVG creato dal "Cloudmade Vector Stream Server" e in EPSG: 3857.
AndrewHarvey,

1

Non è necessario convertire da SVG a GeoJSON per utilizzare l'immagine per un coropleto in d3, anche se potrebbe essere necessario per altre librerie.

Le informazioni sul percorso nel file SVG (deve esserci almeno un percorso per ogni stato / paese / stato / suddivisione nella mappa) sono sufficienti per mappare i dati all'immagine SVG in d3.

Permettetemi di dirlo in un altro modo: se riesci a fare una d3.select sul tuo svg originale che restituirà solo un percorso per stato / paese / regione, allora puoi usare d3 per costruire un coropleth. Questo di solito è il caso quando hai una mappa in SVG. In realtà è più semplice dell'utilizzo di un file GeoJSON in quanto non è necessario preoccuparsi della posizione dello spazio, della proiezione ecc. È anche possibile modificare l'SVG originale per aggiungere informazioni mancanti (come nomi di stato, che è possibile aggiungere come ID DOM o Classi) prima di usarlo con D3 ma di solito non è necessario.

D'altra parte, come è stato detto in precedenza, SVG ha solo informazioni sul percorso / linee, non informazioni geografiche / spaziali, quindi se si desidera convertire da SVG a GeoJSON, è necessario aggiungere / mappare le informazioni di geolocalizzazione all'immagine SVG. Ad esempio, puoi prima convertire da svg a JSON, quindi calcolare / aggiungere informazioni di geolocalizzazione (questo dipenderà dalla regione che stai mappando) e generare un GeoJSON da quello. Per quanto ne so, non esiste uno strumento pronto per fare questo lavoro per te.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.