¿Convertir shapefile a CSV incluyendo atributos Y geometría?

21

Tengo un archivo de forma con 60k + entradas, todas las cuales son polígonos con los atributos correspondientes (totales de superficie, nombres de propietarios, números de identificación fiscal, etc.). Lo que finalmente necesito es un archivo CSV con todos estos atributos y su geometría correspondiente (en el formato xyz compatible con KML, es decir, NO el formato WKT).

Sé que puedo abrir el archivo .dbf en Excel y obtener los atributos. También sé que puedo abrir el archivo de forma en QGIS y copiar los datos en Excel, lo que me da atributos y geometría WKT.

¿Hay una manera simple de convertir el archivo de forma a CSV (que se puede abrir en Excel) con atributo y geometría amigable de Google Earth?

Rikk
fuente
Para cumplir con sus especificaciones, habría que crear una aplicación o un script. No creo que sea difícil, pero tampoco creo que sea trivial. Si tuviera la tarea de hacerlo, probablemente estimaría 1 semana a tiempo completo para tal trabajo.
Stephen Quan el
3
Gracias, esto es útil. Sin embargo, esto es un poco loco. Si el tamaño de mi archivo no fuera tan grande, podría hacerlo automáticamente a través de Google. Lo que normalmente hago es importar un .shp a Google Earth y guardarlo como .kml. Luego cargo el .kml en Google Fusion Tables (FYI: Google Fusion Tables tiene un límite de carga de 100 mb) y lo exporto a .csv. Luego puedo jugar con el .csv como quiera: cambiar los atributos, agregar nuevos polígonos para los que tengo las coordenadas, etc., etc., y luego volver a cargar el .csv recién guardado en Google Fusion Tables, exportar a .kml y abrir en Google Earth.
Rikk
Entonces supongo que la pregunta es ... ¿cómo divido un archivo .shp en dos partes? Esto me permitiría obtener los archivos .kml individuales por debajo del límite de 100 mb y puedo usar el método mencionado anteriormente para convertir.
Rikk
1
Respondí la pregunta que se hace a continuación, pero acabo de ver tu comentario. ¿Por qué necesitas csv? ¿Por qué no editas tus atributos, agregas nuevos polígonos, etc. en el SIG (dijiste que tenías QGIS) y luego los exportas a tu KML final?
usuario2856
@Rikk - en respuesta a la pregunta en su comentario: Una forma simple de dividir un archivo de forma sería hacer una selección espacial en parte de su archivo de forma y luego hacer clic derecho en su capa y seleccionar "Exportar". Luego, simplemente podría exportar las características seleccionadas a un nuevo archivo de forma más pequeño. Esto no es en absoluto científico, pero es simple. Alternativamente, puede seleccionar algunos atributos si desea un enfoque más organizado.
Radar

Respuestas:

28

Aquí hay un script simple que utiliza los enlaces de Python de OGR :

import ogr,csv,sys

shpfile=r'C:\Temp\test.shp' #sys.argv[1]
csvfile=r'C:\Temp\test.csv' #sys.argv[2]

#Open files
csvfile=open(csvfile,'wb')
ds=ogr.Open(shpfile)
lyr=ds.GetLayer()

#Get field names
dfn=lyr.GetLayerDefn()
nfields=dfn.GetFieldCount()
fields=[]
for i in range(nfields):
    fields.append(dfn.GetFieldDefn(i).GetName())
fields.append('kmlgeometry')
csvwriter = csv.DictWriter(csvfile, fields)
try:csvwriter.writeheader() #python 2.7+
except:csvfile.write(','.join(fields)+'\n')

# Write attributes and kml out to csv
for feat in lyr:
    attributes=feat.items()
    geom=feat.GetGeometryRef()
    attributes['kmlgeometry']=geom.ExportToKML()
    csvwriter.writerow(attributes)

#clean up
del csvwriter,lyr,ds
csvfile.close()

EDITAR: y otro script para convertir de su CSV a KML

import ogr,csv,sys,os
ogr.UseExceptions()

csvfile=r'C:\temp\test.csv' #sys.argv[1]
kmlfile=r'C:\temp\test.kml' #sys.argv[2]

csvreader=csv.reader(open(csvfile,'rb'))
headers=csvreader.next()

ds = ogr.GetDriverByName('KML').CreateDataSource(kmlfile)
lyr = ds.CreateLayer(os.path.splitext(os.path.basename(kmlfile))[0])

for field in headers[:-1]: #skip kmlgeometry
    field_def = ogr.FieldDefn(field)
    print lyr.CreateField(field_def)

for rec in csvreader:
    feat = ogr.Feature(lyr.GetLayerDefn())
    for i,field in enumerate(headers[:-1]): #skip kmlgeometry
        feat.SetField(field, rec[i])
    feat.SetGeometry(ogr.CreateGeometryFromGML(rec[-1]))
    lyr.CreateFeature(feat)

del lyr,ds
usuario2856
fuente
¿Puede describir más acerca de cómo usar esos enlaces ya que pasa por alto información importante que sus lectores necesitarían saber?
Andrew S
8

Si convierte su shapefile a spaceialite, debería poder hacer lo siguiente:

1) Experimente con SQL para probar la salida:

ex.

SELECCIONE col1, col2, col3, AsKml (geometry_column) FROM tab

2) Una vez que esté satisfecho con el resultado, puede exportarlo a formato CSV:

/programming/5776660/export-from-sqlite-to-csv-using-shell-script

Para más información sobre Spatialite:

https://www.gaia-gis.it/fossil/libspatialite/index

Funciones de Spatialite SQL:

http://www.gaia-gis.it/gaia-sins/spatialite-sql-3.0.0.html

Brent Edwards
fuente
3

Si está trabajando en QGIS, puede generar instantáneamente un documento CSV haciendo clic derecho en la capa -> Guardar como -> CSV.

Si está trabajando con ArcMap, puede exportar el KML utilizando la herramienta Capa a KML (opción Ir a búsqueda en el programa). Por alguna razón, genera un KMZ en lugar de un KML (al menos eso es lo que sucedió en mi caso).

Para convertir un KMZ a KML:

  • Importe su archivo KMZ a Google Earth y haga clic derecho en su capa y guárdelo como KML
  • Abra QGIS y arrastre y suelte el archivo KML; cargará automáticamente la capa (> QGIS 2.10 PISA)
  • Haga clic derecho en el archivo y guárdelo como CSV

Este procedimiento es más largo si está trabajando con ArcGIS pero en QGIS se puede hacer en poco tiempo. Deberá instalar QGIS en cualquier caso.

Menelaos Kotsollaris
fuente
Probamos su solución para QGIS y no funciona. Guardar como csv no conserva el componente espacial.
Philipp Schwarz el
QGIS le ofrece una opción para seleccionar WKT durante la exportación; esto exporta la geometría (componente espacial) en formato WKT junto con el resto de las características en el archivo de forma.
kozyr
Desde QGIS 3.0 buscará la lista desplegable "geometría" en "Opciones de capa" en el diálogo de exportación, y seleccionará AS_XY, AS_XYZoAS_WKT
leo
2

En la línea de comando puedes usar ogr2ogr, así:

ogr2ogr -f CSV output.csv input.shp -lco GEOMETRY=AS_XYZ

lcoes para "opciones de creación de capas", creo. Otras opciones disponibles se documentan aquí: http://www.gdal.org/drv_csv.html

León
fuente
Leo, obtengo el "Error 1 no pudo obtener la capa solicitada 'GEOMETRY = AS_XYZ'. Puedo mostrar el archivo en QGIS y ver claramente un vector que contiene los contornos de los países.
Andrew S
-1

simplemente vaya a la herramienta de conversión en el mapa de arco. luego ve a la mesa para sobresalir. Se hará un archivo de Excel. convertir ese documento de Excel a un archivo .csv

ruqaia shabir
fuente