Convertire lo shapefile in CSV inclusi attributi E geometria?


21

Ho uno shapefile con 60k + voci, che sono tutti poligoni con attributi corrispondenti (totali di superficie, nomi dei proprietari terrieri, numeri di identificazione fiscale, ecc.). Alla fine ho bisogno di un file CSV con tutti questi attributi e la loro geometria corrispondente (nel formato xyz compatibile con KML, cioè NON nel formato WKT).

So che posso aprire il file .dbf in Excel e ottenere gli attributi. So anche che posso aprire lo shapefile in QGIS e copiare i dati in Excel, il che mi dà attributi e geometria WKT.

Esiste un modo semplice per convertire lo shapefile in CSV (apribile in Excel) con attributi e geometria compatibile con Google Earth?


Per soddisfare le tue specifiche, è necessario creare un'applicazione o uno script. Non penso che sia difficile, ma non penso nemmeno che sia banale. Se avessi il compito di farlo, probabilmente stimerei 1 settimana a tempo pieno per un simile lavoro.
Stephen Quan,

3
Grazie, è utile Questo è un po 'folle però. Se la dimensione del mio file non fosse così grande, potrei farlo automaticamente tramite Google. Il modo in cui lo faccio di solito è importando un .shp in Google Earth e salvandolo come .kml. Carico quindi il .kml in Google Fusion Tables (FYI: Google Fusion Tables ha un limite di caricamento di 100 mb) ed esporto in .csv. Posso quindi giocare con il .csv come voglio - cambiare gli attributi, aggiungere nuovi poligoni per i quali ho le coordinate, ecc. Ecc. - Quindi ricaricare il .csv appena salvato su Google Fusion Tables, esportarlo in .kml e apri in Google Earth.
Rikk,

Quindi suppongo che la domanda diventi ... come faccio a dividere un file .shp in due parti? Ciò mi consentirebbe di ottenere i singoli file .kml al di sotto del limite di 100 MB e posso utilizzare il metodo sopra descritto per la conversione.
Rikk,

1
Ho risposto alla domanda come di seguito, ma ho appena visto il tuo commento. Perché hai bisogno di CSV? Perché non modificare il tuo attributo, aggiungere nuovi poligoni, ecc. Nel GIS (hai detto di avere QGIS) e quindi esportarlo nel tuo KML finale?
user2856

@Rikk - in risposta alla domanda nel tuo commento: Un modo semplice per dividere un file di forma sarebbe fare una selezione spaziale su parte del tuo file di forma e quindi fare clic con il tasto destro del mouse sul livello e selezionare "Esporta". È quindi possibile semplicemente esportare le funzionalità selezionate in un nuovo file di forma più piccolo. Questo non è affatto scientifico, ma è semplice. In alternativa, è possibile selezionare alcuni attributi se si desidera un approccio più organizzato.
Radar,

Risposte:


28

Ecco un semplice script che utilizza i binding Python 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()

EDIT: e un altro script per convertire dal tuo CSV in 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

Puoi descriverci di più su come usare quei binding in quanto sorprende su informazioni importanti che i tuoi lettori dovrebbero conoscere.
Andrew S,

8

Se converti il ​​tuo file di forma in spatialite, dovresti essere in grado di fare quanto segue:

1) Sperimenta con SQL per testare l'output:

ex.

SELEZIONA tab1, col2, col3, AsKml (geometria_colonna) DA

2) Una volta che sei soddisfatto del risultato, puoi esportarlo in formato CSV:

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

Per maggiori informazioni su Spatialite:

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

Funzioni spaziali SQL:

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


3

Se stai lavorando su QGIS, puoi generare immediatamente un documento CSV facendo clic con il pulsante destro del mouse sul livello -> Salva come -> CSV.

Se stai lavorando con ArcMap, puoi esportare il KML usando lo strumento Layer in KML (Vai all'opzione Cerca nel programma). Per alcuni motivi genera un KMZ invece di un KML (almeno questo è quello che è successo nel mio caso).

Per convertire un KMZ in KML:

  • Importa il tuo file KMZ su Google Earth e fai clic con il pulsante destro del mouse sul tuo livello e salvalo come KML
  • Apri QGIS e trascina e rilascia il file KML: caricherà automaticamente il layer (> QGIS 2.10 PISA)
  • Fare clic con il tasto destro sul file e salvarlo come CSV

Questa procedura è più lunga se si lavora con ArcGIS ma in QGIS può essere eseguita in pochissimo tempo. Dovrai installare QGIS in ogni caso.


Testato la tua soluzione per QGIS e non funziona. Salva come CSV non conserva il componente spaziale.
Philipp Schwarz,

QGIS ti offre un'opzione per selezionare WKT durante l'esportazione: questo esporta la geometria (componente spaziale) in formato WKT insieme alle altre funzioni nel file di forma.
Kozyr,

Da QGIS 3.0 cercherai l'elenco a discesa "geometria" in "Opzioni livello" nella finestra di dialogo di esportazione e selezionerai AS_XY, AS_XYZoppureAS_WKT
Leo

2

Alla riga di comando puoi usare ogr2ogr, in questo modo:

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

lcoè per "opzioni di creazione di livelli", penso. Altre opzioni disponibili sono documentate qui: http://www.gdal.org/drv_csv.html


Leo, ricevo "Errore 1: impossibile recuperare il livello richiesto" GEOMETRIA = AS_XYZ ". Posso richiamare il file in QGIS e vedere chiaramente un vettore contenente i contorni dei paesi.
Andrew S


-1

vai semplicemente allo strumento di conversione nella mappa ad arco. poi vai al tavolo per eccellere. verrà creato un file Excel. converti quel documento Excel in file .csv

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.