Unisci un file CSV per shapefile usando gdal / ogr?


11

Ho uno shapefile con diversi attributi, per esempio YEAR, COUNTYe AREA. Ho anche un file CSV con più campi che voglio nel file di forma, ad esempio POPULATION. Sia lo shapefile che il file CSV hanno un campo GISJOIN. So come partecipare a QGIS. Ma come posso fare un join permanente e scrivere su uno shapefile usando ogr2ogro uno degli altri strumenti in GDAL / OGR?


La tua build GDAL / OGR ha il supporto di spatialite o sqlite?
BradHards,

@BradHards: non sembra. È il pacchetto GDAL / OGR compilato da Ubuntu 14.04.
Lincoln Mullen,

Risposte:


23

L' utilità ogr2ogr supporta una sintassi sql limitata . Puoi unire il tuo CSV allo shapefile usando qualcosa di simile al seguente:

ogr2ogr -sql "select inshape.*, joincsv.* from inshape left join 'joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp inshape.shp

8
Oh gdal / ogr - non smetti mai di stupirmi ..
Radek,

@luke Questo è geniale, ma come posso farlo, se il mio shapefile e CSV si trovano in una cartella nel mio PC ... dove devo includere il mio percorso per quella cartella?

@Luke che ho, MA sicuramente non l'ho fatto bene, ogr2ogr -sql "seleziona C: \ Path \ inshape. *, C: \ Pathjoincsv. * Da C: \ Path \ inshape ha lasciato unire 'C: \ Path \ joincsv .csv'.joincsv su C: \ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp inshape.shp

4
ogr2ogr -sql "seleziona inshape. *, joincsv. * da inshape ha lasciato join 'path / to / joincsv.csv'.joincsv su inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp path / to / inshape.shp
user2856

Viene visualizzato il seguente errore: "Avviso 1: valore 1060008100 del campo inshape.MA della funzione 86 non scritto correttamente. Forse a causa di un numero troppo grande rispetto alla larghezza del campo" Qualche idea su come risolverlo?
RutgerH

7

La risposta accettata è davvero utile, ma ho scoperto che era lento con un database di grandi dimensioni. Credo che limiti anche le tue opzioni quando si uniscono i dati.

Il mio metodo ora è di estrarre tutto in SQLite (usando una combinazione di csvkit e ogr2ogr):

csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv
ogr2ogr -append -f "SQLite" myjoindb.db myjoinshp.shp

Quindi unisciti a tutto e creane uno shapefile:

ogr2ogr -f "ESRI Shapefile" -sql "SELECT csv.*, shp.* FROM myjoinshp shp INNER JOIN myjoincsv csv ON csv.joinfield = shp.joinfield" joined_output.shp myjoindb.db

Ehi Eric, sto ricevendo un errore che myjoindb.db esiste già. Quel db di seconda linea dovrebbe essere chiamato come il primo?
GIS Danny,

Ah buon punto, sulla seconda riga ti consigliamo di aggiungere un -appendlì per dare il ogr2ogrpermesso di aprire un db SQLite esistente e aggiungerlo ad esso. Ho modificato la risposta per mostrarlo.
Eric Brelsford,

Grazie! Funziona benissimo. Un'altra domanda, si spera veloce. La prima riga, ho un geoide di campo che continua a essere stranamente convertito in float negativi. È un ID censimento che voglio trattare come stringa, ho provato a racchiudere la stringa tra virgolette e non ha funzionato. C'è un comando come: csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)o qualcosa del genere?
GIS Danny,

Cosa c'è di strano è l'unione avviene in modo corretto sul geoide ma l'uscita ha il geoide con -2.147,184982 millions invece di ciò che è andato in esso.
GIS Danny,

Sembra che geoidvenga convertito in un numero, ma il numero è così grande che trabocca e diventa negativo. Controlla la documentazione per csvsql , potresti provare a specificare una tabella in cui dici esplicitamente che geoidè una stringa, altrimenti --no-inferencepotrebbe essere d'aiuto.
Eric Brelsford,
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.