Shapefile in CSV konvertieren, einschließlich Attributen UND Geometrie?


21

Ich habe ein Shapefile mit mehr als 60.000 Einträgen, bei denen es sich alle um Polygone mit entsprechenden Attributen handelt (Anbausummen, Grundbesitzernamen, Steuernummern usw.). Was ich letztendlich brauche, ist eine CSV-Datei mit all diesen Attributen und der entsprechenden Geometrie (im KML-kompatiblen xyz-Format, also NICHT im WKT-Format).

Ich weiß, dass ich die DBF-Datei in Excel öffnen und die Attribute erhalten kann. Ich weiß auch, dass ich das Shapefile in QGIS öffnen und die Daten in Excel kopieren kann, wodurch ich Attribute und WKT-Geometrie erhalte.

Gibt es eine einfache Möglichkeit, das Shapefile mit Attribut- und Google Earth-freundlicher Geometrie in CSV (in Excel öffnbar) zu konvertieren?


Um Ihre Spezifikationen zu erfüllen, müsste eine Anwendung oder ein Skript erstellt werden. Ich denke nicht, dass es schwierig ist, aber ich denke auch nicht, dass es nicht trivial ist. Wenn ich es tun müsste, würde ich wahrscheinlich 1 Woche Vollzeit für einen solchen Job veranschlagen.
Stephen Quan

3
Danke, das ist hilfreich. Das ist aber irgendwie verrückt. Wenn meine Datei nicht so groß wäre, könnte ich dies automatisch über Google tun. In der Regel importiere ich dazu eine .shp-Datei in Google Earth und speichere sie als .kml-Datei. Anschließend lade ich die .kml-Datei in Google Fusion Tables hoch (zu Ihrer Information: Google Fusion Tables hat ein Upload-Limit von 100 MB) und exportiere sie nach .csv. Ich kann dann mit der .csv-Datei herumspielen, wie ich möchte - Attribute ändern, neue Polygone hinzufügen, für die ich die Koordinaten habe usw. usw. - und dann die neu gespeicherte .csv-Datei erneut in Google Fusion Tables hochladen und nach .kml exportieren und in Google Earth öffnen.
Rikk

Ich schätze, die Frage wird dann ... wie teile ich eine .shp-Datei in zwei Teile auf? Dies würde es mir ermöglichen, die einzelnen .kml-Dateien unter die 100-MB-Grenze zu bringen, und ich kann die oben erwähnte Methode zum Konvertieren verwenden.
Rikk

1
Ich habe die unten gestellte Frage beantwortet, aber nur Ihren Kommentar gesehen. Warum brauchst du überhaupt csv? Warum nicht Ihre Attribute bearbeiten, neue Polygone hinzufügen usw. im GIS (Sie sagten, Sie hätten QGIS) und das dann in Ihre endgültige KML exportieren?
user2856

@Rikk - als Antwort auf die Frage in Ihrem Kommentar: Eine einfache Möglichkeit, ein Shapefile zu teilen, besteht darin, einen Teil des Shapefiles räumlich auszuwählen und dann mit der rechten Maustaste auf die Ebene zu klicken und "Exportieren" auszuwählen. Sie können die ausgewählten Features dann einfach in ein neues, kleineres Shapefile exportieren. Dies ist keineswegs wissenschaftlich, aber es ist einfach. Alternativ können Sie anhand einiger Attribute auswählen, ob Sie einen besser organisierten Ansatz wünschen.
Radar

Antworten:


28

Hier ist ein einfaches Skript, das die OGR-Python- Bindungen verwendet:

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: und ein weiteres Skript zum Konvertieren von Ihrer 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

Können Sie näher erläutern, wie diese Bindungen verwendet werden sollen, da dies wichtige Informationen überdeckt, die Ihre Leser benötigen würden?
Andrew S

8

Wenn Sie Ihr Shapefile in "Spatialite" konvertieren, sollten Sie in der Lage sein, Folgendes zu tun:

1) Experimentieren Sie mit SQL, um die Ausgabe zu testen:

Ex.

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

2) Wenn Sie mit dem Ergebnis zufrieden sind, können Sie es in das CSV-Format exportieren:

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

Weitere Informationen zu Spatialite:

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

Spatialite SQL-Funktionen:

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


3

Wenn Sie an QGIS arbeiten, können Sie sofort ein CSV-Dokument erstellen, indem Sie mit der rechten Maustaste auf die Ebene -> Speichern unter -> CSV klicken.

Wenn Sie mit ArcMap arbeiten, können Sie die KML mithilfe des Werkzeugs Layer in KML exportieren (Option Gehe zu Suche im Programm). Aus bestimmten Gründen wird eine KMZ anstelle einer KML generiert (zumindest in meinem Fall).

So konvertieren Sie eine KMZ in KML:

  • Importieren Sie Ihre KMZ-Datei in Google Earth, klicken Sie mit der rechten Maustaste auf Ihre Ebene und speichern Sie sie als KML
  • Öffne QGIS und ziehe die KML-Datei per Drag & Drop - sie lädt automatisch die Ebene (> QGIS 2.10 PISA)
  • Klicken Sie mit der rechten Maustaste auf die Datei und speichern Sie sie als CSV

Dieser Vorgang ist länger, wenn Sie mit ArcGIS arbeiten. In QGIS ist dies jedoch in kürzester Zeit möglich. Sie müssen in jedem Fall QGIS installieren.


Hat Ihre Lösung für QGIS getestet und funktioniert nicht. Speichern als csv behält keine räumliche Komponente bei.
Philipp Schwarz

In QGIS können Sie während des Exports WKT auswählen. Hierbei wird die Geometrie (räumliche Komponente) im WKT-Format zusammen mit den übrigen Features in der Formdatei exportiert.
Kosyr

Von QGIS 3.0 Sie werden für die „Geometrie“ Drop - Down - Liste unter „Ebenenoptionen“ im Export Dialog zu suchen, und wählen Sie AS_XY, AS_XYZoderAS_WKT
leo

2

In der Kommandozeile können Sie ogr2ogrwie folgt vorgehen :

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

lcoist für "Layer-Erstellungsoptionen", denke ich. Weitere verfügbare Optionen sind hier dokumentiert: http://www.gdal.org/drv_csv.html


Leo, ich erhalte die Meldung "Fehler 1 konnte den angeforderten Layer 'GEOMETRY = AS_XYZ' nicht abrufen. Ich kann die Datei in QGIS aufrufen und einen Vektor mit Länderumrissen deutlich sehen.
Andrew S


-1

Gehen Sie einfach zum Konvertierungswerkzeug in der Bogenkarte. dann geh zum Tisch um zu übertreffen. Eine Excel-Datei wird erstellt. Konvertieren Sie dieses Excel-Dokument in eine CSV-Datei

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.