Verbinden Sie eine CSV-Datei mit gdal / ogr?

11

Ich habe eine Shape - Datei mit mehreren Attributen, zum Beispiel YEAR, COUNTYund AREA. Ich habe auch eine CSV-Datei mit mehr Feldern, die ich im Shapefile haben möchte, wie z POPULATION. Sowohl das Shapefile als auch die CSV-Datei haben ein Feld GISJOIN. Ich weiß, wie man einen Beitritt zu QGIS macht. Aber wie kann ich mit ogr2ogreinem der anderen Tools in GDAL / OGR eine permanente Verknüpfung herstellen und in ein Shapefile schreiben ?

Lincoln Mullen
quelle
Hat Ihr GDAL / OGR-Build Spatialite- oder SQLite-Unterstützung?
BradHards
@BradHards: Es sieht nicht so aus. Es ist das gepackte GDAL / OGR-Build von Ubuntu 14.04.
Lincoln Mullen

Antworten:

23

Das Dienstprogramm ogr2ogr unterstützt eine eingeschränkte SQL-Syntax . Sie können Ihre CSV mit dem Shapefile wie folgt verbinden:

ogr2ogr -sql "select inshape.*, joincsv.* from inshape left join 'joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp inshape.shp
user2856
quelle
8
Oh gdal / ogr - du hörst nie auf mich zu überraschen ..
radek
@luke Das ist großartig, aber wie kann ich das tun, wenn sich mein Shapefile und meine CSV in einem Ordner auf meinem PC befinden ... wo muss ich meinen Pfad zu diesem Ordner einfügen?
@ Luke Ich habe, ABER ich habe es definitiv nicht richtig gemacht, ogr2ogr -sql "wähle C: \ Path \ inshape. *, C: \ Pathjoincsv. * Aus C: \ Path \ inshape left join 'C: \ Path \ joincsv .csv'.joincsv auf C: \ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp inshape.shp
4
ogr2ogr -sql "inshape auswählen. *, joincsv. * von inshape left join 'path / to / joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp path / to / inshape.shp
user2856
Ich erhalte die folgende Fehlermeldung: "Warnung 1: Wert 1060008100 von Feldinshape.MA von Merkmal 86 wurde nicht erfolgreich geschrieben. Möglicherweise aufgrund einer zu großen Anzahl in Bezug auf die Feldbreite" Irgendwelche Ideen, wie dies gelöst werden kann?
RutgerH
7

Die akzeptierte Antwort ist wirklich nützlich, aber ich fand, dass es mit einer großen Datenbank langsam war. Ich glaube, es schränkt auch Ihre Möglichkeiten beim Zusammenfügen der Daten ein.

Meine Methode besteht nun darin, alles in SQLite zu ziehen (mit einer Kombination aus csvkit und ogr2ogr):

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

Verbinden Sie dann alles und erstellen Sie daraus ein 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
Eric Brelsford
quelle
Hey Eric, ich bekomme eine Fehlermeldung, dass myjoindb.db bereits existiert. Soll diese zweite Zeile db genauso heißen wie die erste?
GIS Danny
Ein guter Punkt, in der zweiten Zeile möchten Sie ein -appendIn hinzufügen , um die ogr2ogrBerechtigung zum Öffnen und Hinzufügen einer vorhandenen SQLite-Datenbank zu erteilen . Ich habe die Antwort bearbeitet, um dies zu zeigen.
Eric Brelsford
Vielen Dank! Arbeitet großartig. Noch eine Frage, hoffentlich schnell. In der ersten Zeile habe ich ein Feldgeoid, das immer wieder seltsam in negative Floats umgewandelt wird. Es ist eine Volkszählungs-ID, die ich als Zeichenfolge behandeln möchte. Ich habe versucht, die Zeichenfolge mit Anführungszeichen zu versehen, und das hat nicht funktioniert. Gibt es einen Befehl wie: csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)oder so?
GIS Danny
Was seltsam ist, ist, dass die Verknüpfung auf dem Geoid korrekt erfolgt, aber die Ausgabe enthält das Geoid mit -2147184982 anstelle dessen, was darin enthalten ist.
GIS Danny
Klingt so, geoidals würde es in eine Zahl umgewandelt, aber die Zahl ist so groß, dass sie überläuft und negativ wird. Überprüfen Sie die Dokumentation für csvsql. Versuchen Sie möglicherweise, eine Tabelle anzugeben, in der Sie explizit angeben, dass geoides sich um eine Zeichenfolge handelt. Andernfalls kann dies --no-inferencehilfreich sein.
Eric Brelsford