¿Unirse a un archivo CSV para shapefile usando gdal / ogr?

11

Tengo un archivo de formas con varios atributos, por ejemplo YEAR, COUNTYy AREA. También tengo un archivo CSV con más campos que quiero en el archivo de forma, como POPULATION. Tanto el archivo de forma como el archivo CSV tienen un campo GISJOIN. Sé cómo unirme en QGIS. Pero, ¿cómo puedo hacer una unión permanente y escribir en un shapefile usando ogr2ogruna de las otras herramientas en GDAL / OGR?

Lincoln Mullen
fuente
¿Su compilación GDAL / OGR tiene soporte espacial o sqlite?
BradHards
@BradHards: No lo parece. Es la compilación GDAL / OGR empaquetada de Ubuntu 14.04.
Lincoln Mullen

Respuestas:

23

La utilidad ogr2ogr admite una sintaxis sql limitada . Puede unir su CSV al archivo de forma usando algo como lo siguiente:

ogr2ogr -sql "select inshape.*, joincsv.* from inshape left join 'joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp inshape.shp
usuario2856
fuente
8
Oh gdal / ogr - nunca dejas de sorprenderme ..
radek
@luke Esto es brillante, pero ¿cómo puedo hacer esto si mi shapefile y csv están ubicados en una carpeta en mi PC ... ¿dónde debo incluir mi ruta a esa carpeta?
@Luke tengo, PERO definitivamente no lo hice bien, ogr2ogr -sql "seleccione C: \ Path \ inshape. *, C: \ Pathjoincsv. * De C: \ Path \ inshape izquierda unirse 'C: \ Path \ joincsv .csv'.joincsv en C: \ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp inshape.shp
44
ogr2ogr -sql "select inshape. *, joincsv. * de inshape left join 'path / to / joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp path / to / inshape.shp
user2856
Aparece el siguiente error: "Advertencia 1: el valor 1060008100 del campo inshape.MA de la característica 86 no se escribió correctamente. Posiblemente debido a un número demasiado grande con respecto al ancho del campo" ¿Alguna idea de cómo resolver esto?
RutgerH
7

La respuesta aceptada es realmente útil, pero descubrí que era lenta con una base de datos de gran tamaño. Creo que también limita sus opciones al unir los datos.

Mi método ahora es extraer todo en SQLite (usando una combinación de csvkit y ogr2ogr):

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

Luego, une todo y crea un shapefile a partir de él:

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
fuente
Hola Eric, recibo un error de que myjoindb.db ya existe. ¿Se supone que esa segunda línea de base de datos debe llamarse igual que la primera?
SIG Danny
Ah, buen punto, en la segunda línea, querrás agregar una -appendallí para dar ogr2ogrpermiso para abrir una base de datos SQLite existente y agregarla. He editado la respuesta para mostrar esto.
eric brelsford
¡Gracias! Trabajando genial Una pregunta más, con suerte rápida. La primera línea, tengo un geoide de campo que se convierte extrañamente en flotadores negativos. Es una identificación del censo que quiero tratar como una cadena, he intentado envolver la cadena con comillas y eso no funcionó. ¿Hay un comando como: csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)o algo así?
GIS Danny
Lo extraño es que la unión ocurre correctamente en el geoide, pero la salida tiene el geoide con -2147184982 en lugar de lo que entró.
SIG Danny
Parece que geoidse está convirtiendo en un número, pero el número es tan grande que se desborda y se vuelve negativo. Consulte la documentación de csvsql , puede intentar especificar una tabla donde explícitamente diga que geoides una cadena, de lo contrario --no-inferencepodría ayudar.
eric brelsford