Konversi shapefile ke CSV termasuk atribut DAN geometri?

21

Saya memiliki shapefile dengan entri 60k +, yang semuanya adalah poligon dengan atribut yang sesuai (total luas tanah, nama pemilik tanah, nomor pajak #s, dll.). Apa yang saya butuhkan adalah file CSV dengan semua atribut ini dan geometri yang sesuai (dalam format xyz yang kompatibel dengan KML, yaitu, BUKAN format WKT).

Saya tahu bahwa saya bisa membuka file .dbf di Excel dan mendapatkan atributnya. Saya juga tahu bahwa saya bisa membuka shapefile di QGIS dan menyalin data ke Excel, yang memberi saya atribut dan geometri WKT.

Apakah ada cara sederhana untuk mengonversi shapefile ke CSV (dapat dibuka di Excel) dengan atribut dan geometri ramah Google Earth?

Rikk
sumber
Untuk memenuhi spesifikasi Anda, aplikasi atau skrip harus dibangun. Saya tidak berpikir itu sulit, tetapi saya juga berpikir itu tidak sepele. Jika saya tugas untuk melakukannya, saya mungkin akan memperkirakan 1 minggu penuh waktu untuk pekerjaan seperti itu.
Stephen Quan
3
Terima kasih, ini sangat membantu. Ini agak gila. Jika ukuran file saya tidak terlalu besar, saya bisa melakukannya secara otomatis melalui Google. Cara saya biasanya melakukan ini adalah dengan mengimpor .shp ke Google Earth dan menyimpan sebagai .kml. Saya kemudian mengunggah .kml ke Google Fusion Tables (FYI: Google Fusion Tables memiliki batas unggahan 100 mb) dan mengekspor ke .csv. Saya kemudian dapat bermain-main dengan .csv namun saya ingin - mengubah atribut, menambahkan poligon baru yang saya punya koordinatnya, dll., Dll. - dan kemudian saya mengunggah kembali .csv yang baru disimpan ke Google Fusion Tables, ekspor ke .kml , dan buka di Google Earth.
Rikk
Jadi saya kira pertanyaannya kemudian menjadi ... bagaimana cara membagi file .shp menjadi dua bagian? Ini akan memungkinkan saya untuk mendapatkan file .kml individu di bawah batas 100 mb dan saya dapat menggunakan metode yang disebutkan di atas untuk mengkonversi.
Rikk
1
Saya telah menjawab pertanyaan seperti yang diajukan di bawah ini, tetapi baru melihat komentar Anda. Mengapa Anda perlu csv sama sekali? Mengapa tidak mengedit atribut Anda, menambahkan poligon baru, dll di GIS (Anda mengatakan Anda memiliki QGIS) dan kemudian mengekspornya ke KML akhir Anda?
user2856
@Rikk - sebagai jawaban atas pertanyaan dalam komentar Anda: Cara sederhana untuk membagi shapefile adalah dengan melakukan seleksi spasial pada bagian shapefile Anda dan kemudian mengklik kanan layer Anda dan memilih "Ekspor". Anda kemudian dapat mengekspor fitur yang dipilih ke shapefile baru yang lebih kecil. Ini sama sekali tidak ilmiah, tetapi sederhana. Atau Anda dapat memilih dengan beberapa atribut jika Anda menginginkan pendekatan yang lebih terorganisir.
Radar

Jawaban:

28

Berikut ini skrip sederhana yang menggunakan 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: dan skrip lain untuk dikonversi dari CSV ke 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
pengguna2856
sumber
Dapatkah Anda menjelaskan lebih lanjut tentang bagaimana menggunakan ikatan-ikatan itu karena hal itu menyoroti informasi penting yang perlu diketahui pembaca Anda.
Andrew S
8

Jika Anda mengonversi shapefile Anda ke spasial, Anda harus dapat melakukan hal berikut:

1) Eksperimen dengan SQL untuk menguji output:

ex.

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

2) Setelah Anda puas dengan hasilnya, Anda dapat mengekspornya ke format CSV:

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

Untuk informasi lebih lanjut tentang Spatialite:

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

Fungsi SQL spasial:

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

Brent Edwards
sumber
3

Jika Anda bekerja pada QGIS, Anda dapat langsung menghasilkan dokumen CSV dengan mengklik kanan pada layer -> Save as -> CSV.

Jika Anda bekerja dengan ArcMap, maka Anda dapat mengekspor KML dengan menggunakan alat Layer ke KML (Pergi ke opsi Pencarian di program). Untuk beberapa alasan ia menghasilkan KMZ dan bukan KML (setidaknya itulah yang terjadi pada kasus saya).

Untuk mengonversi KMZ ke KML:

  • Impor file KMZ Anda ke Google Earth dan klik kanan pada layer Anda dan simpan sebagai KML
  • Buka QGIS dan seret dan jatuhkan file KML - itu akan secara otomatis memuat layer (> QGIS 2.10 PISA)
  • Klik kanan pada file dan simpan sebagai CSV

Prosedur ini lebih lama jika Anda bekerja dengan ArcGIS tetapi di QGIS dapat dilakukan dalam waktu singkat. Anda harus menginstal QGIS dalam hal apa pun.

Menelaos Kotsollaris
sumber
Menguji solusi Anda untuk QGIS dan tidak berfungsi. Simpan sebagai csv tidak mempertahankan komponen spasial.
Philipp Schwarz
QGIS memberi Anda opsi untuk memilih WKT selama ekspor - ini mengekspor geometri (komponen spasial) dalam format WKT bersama dengan sisa fitur dalam file bentuk.
kozyr
Dari QGIS 3.0 Anda akan mencari daftar tarik turun "geometri" di bawah "Opsi Lapisan" dalam dialog ekspor, dan pilih AS_XY, AS_XYZatauAS_WKT
leo
2

Di baris perintah yang dapat Anda gunakan ogr2ogr, seperti ini:

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

lcoadalah untuk "opsi pembuatan lapisan", saya pikir. Opsi lain yang tersedia didokumentasikan di sini: http://www.gdal.org/drv_csv.html

Leo
sumber
Leo, saya mendapatkan "Kesalahan 1 tidak dapat mengambil lapisan yang diminta 'GEOMETRY = AS_XYZ'. Saya dapat membawa file di QGIS dan dengan jelas melihat vektor yang berisi garis besar negara.
Andrew S
-1

cukup buka alat konversi di arc map. lalu pergi ke meja untuk unggul. file excel akan dibuat. konversikan excel doc tersebut menjadi file .csv

ruqaia shabir
sumber