แปลง shapefile เป็น CSV รวมถึงคุณลักษณะและรูปทรงเรขาคณิตหรือไม่


21

ฉันมี shapefile พร้อมรายการ 60k + ซึ่งทั้งหมดเป็นรูปหลายเหลี่ยมที่มีแอตทริบิวต์ที่สอดคล้องกัน (ยอดรวมเอเคอร์ชื่อเจ้าของที่ดินหมายเลขประจำตัวผู้เสียภาษี # ฯลฯ ) สิ่งที่ฉันต้องการในที่สุดคือไฟล์ CSV ที่มีแอตทริบิวต์เหล่านี้ทั้งหมดและรูปทรงเรขาคณิตที่สอดคล้องกัน (ในรูปแบบ xyz ที่รองรับ KML นั่นคือไม่ใช่รูปแบบ WKT)

ฉันรู้ว่าฉันสามารถเปิดไฟล์. dbf ใน Excel และรับคุณลักษณะได้ ฉันยังรู้ว่าฉันสามารถเปิด shapefile ใน QGIS และคัดลอกข้อมูลไปยัง Excel ซึ่งทำให้ฉันมีคุณสมบัติและรูปทรงเรขาคณิต WKT

มีวิธีง่าย ๆ ในการแปลง shapefile เป็น CSV (openable ใน Excel) ด้วยแอตทริบิวต์และเรขาคณิตที่เป็นมิตรของ Google Earth หรือไม่


เพื่อให้เป็นไปตามข้อกำหนดของคุณจะต้องมีการสร้างแอปพลิเคชันหรือสคริปต์ ฉันไม่คิดว่ามันยาก แต่ฉันไม่คิดว่ามันไม่สำคัญ ถ้าฉันเป็นงานที่ต้องทำฉันอาจจะประมาณงานเต็มเวลา 1 สัปดาห์สำหรับงานดังกล่าว
Stephen Quan

3
ขอบคุณสิ่งนี้มีประโยชน์ แม้ว่ามันจะบ้าไปแล้วก็ตาม หากขนาดไฟล์ของฉันไม่ใหญ่มากฉันสามารถทำได้โดยอัตโนมัติผ่าน Google โดยทั่วไปแล้วฉันจะทำสิ่งนี้ได้อย่างไรโดยการนำเข้า. shp ไปยัง Google Earth และบันทึกเป็น. kml จากนั้นฉันจะอัปโหลด. kml ไปยัง Google Fusion Tables (FYI: Google Fusion Tables มีขีด จำกัด การอัปโหลดที่ 100 mb) และส่งออกไปยัง. csv จากนั้นฉันสามารถเล่นกับ. csv ได้ตามต้องการ - เปลี่ยนคุณลักษณะเพิ่มรูปหลายเหลี่ยมใหม่ที่ฉันมีพิกัดสำหรับ ฯลฯ และจากนั้นฉันอัปโหลด. csv ไปยังตารางฟิวชั่นของ Google ที่บันทึกใหม่แล้วส่งออกเป็น. kml และเปิดใน Google Earth
Rikk

ดังนั้นฉันจึงเดาว่าคำถามจะกลายเป็น ... ฉันจะแบ่งไฟล์. shp เป็นสองส่วนได้อย่างไร สิ่งนี้จะทำให้ฉันได้รับไฟล์. kml แต่ละไฟล์ภายใต้ขีด จำกัด 100 mb และฉันสามารถใช้วิธีการดังกล่าวเพื่อแปลง
Rikk

1
ฉันตอบคำถามตามที่ถามด้านล่าง แต่เพิ่งเห็นความคิดเห็นของคุณ ทำไมคุณต้องการ csv เลย ทำไมไม่แก้ไขแอตทริบิวต์เพิ่มรูปหลายเหลี่ยมใหม่ ฯลฯ ใน GIS (คุณบอกว่าคุณมี QGIS) แล้วส่งออกสิ่งนั้นไปยัง KML สุดท้ายของคุณ
2856

@Rikk - เพื่อตอบคำถามในความคิดเห็นของคุณ: วิธีง่ายๆในการแยก Shapefile คือทำการเลือกเชิงพื้นที่ในส่วนของ Shapefile ของคุณแล้วคลิกขวาที่เลเยอร์แล้วเลือก "ส่งออก" จากนั้นคุณสามารถส่งออกคุณสมบัติที่เลือกไปยังรูปร่างใหม่ที่เล็กลง นี่ไม่ใช่วิทยาศาสตร์ แต่มันง่าย หรือคุณสามารถเลือกตามคุณสมบัติบางอย่างหากคุณต้องการแนวทางที่เป็นระเบียบมากขึ้น
เรดาร์

คำตอบ:


28

นี่เป็นสคริปต์ง่าย ๆ ที่ใช้การโยงOGR python :

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()

แก้ไข: และสคริปต์อื่นที่จะแปลงจาก CSV ของคุณเป็น 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

คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับวิธีการใช้การเชื่อมโยงเหล่านั้นได้อย่างไรเมื่อทำการคัดลอกข้อมูลที่สำคัญที่ผู้อ่านต้องรู้
Andrew S

8

ถ้าคุณแปลง shapefile ของคุณเป็น spatialite คุณควรจะทำสิ่งต่อไปนี้:

1) การทดลองกับ SQL เพื่อทดสอบผลลัพธ์:

อดีต

SELECT col1, col2, col3, AsKml (รูปเรขาคณิต _ คอลัมน์) จากแท็บ

2) เมื่อคุณพอใจกับผลลัพธ์แล้วคุณสามารถส่งออกเป็นรูปแบบ CSV:

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Spatialite:

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

ฟังก์ชัน SQL เชิงพื้นที่:

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


3

หากคุณกำลังทำงานกับ QGIS คุณสามารถสร้างเอกสาร CSV ได้ทันทีโดยคลิกขวาที่เลเยอร์ -> บันทึกเป็น -> CSV

หากคุณทำงานกับ ArcMap คุณสามารถส่งออก KML โดยใช้เครื่องมือเลเยอร์เป็น KML (ไปที่ตัวเลือกการค้นหาในโปรแกรม) ด้วยเหตุผลบางอย่างมันสร้าง KMZ แทน KML (อย่างน้อยนั่นคือสิ่งที่เกิดขึ้นในกรณีของฉัน)

ในการแปลง KMZ เป็น KML:

  • นำเข้าไฟล์ KMZ ของคุณไปยัง Google Earth และคลิกขวาที่เลเยอร์ของคุณและบันทึกเป็น KML
  • เปิด QGIS แล้วลากและวางไฟล์ KML - มันจะโหลดเลเยอร์โดยอัตโนมัติ (> QGIS 2.10 PISA)
  • คลิกขวาที่ไฟล์และบันทึกเป็น CSV

ขั้นตอนนี้จะใช้เวลานานขึ้นหากคุณทำงานกับ ArcGIS แต่ใน QGIS นั้นสามารถทำได้ในเวลาไม่นาน คุณจะต้องติดตั้ง QGIS ในทุกกรณี


ทดสอบวิธีแก้ปัญหาของคุณสำหรับ QGIS และไม่ทำงาน บันทึกเป็น csv ไม่รักษาองค์ประกอบเชิงพื้นที่
Philipp Schwarz

QGIS ให้ทางเลือกแก่คุณในการเลือก WKT ในระหว่างการส่งออกซึ่งเป็นการส่งออกรูปทรงเรขาคณิต (องค์ประกอบเชิงพื้นที่) ในรูปแบบ WKT พร้อมกับคุณสมบัติที่เหลือในไฟล์รูปร่าง
kozyr

จาก QGIS 3.0 คุณจะมองหา“เรขาคณิต” รายการแบบเลื่อนลงใต้“เลเยอร์ตัวเลือก” ในการเจรจาการส่งออกและเลือกAS_XY, AS_XYZหรือAS_WKT
สิงห์

2

ที่บรรทัดคำสั่งคุณสามารถใช้ogr2ogrเช่นนี้

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

lcoสำหรับ“ ตัวเลือกการสร้างเลเยอร์” ฉันคิดว่า ตัวเลือกอื่น ๆ ที่มีอยู่มีการจัดทำเอกสารไว้ที่นี่: http://www.gdal.org/drv_csv.html


เลโอฉันได้รับ "ข้อผิดพลาด 1 ไม่สามารถดึงเลเยอร์ที่ร้องขอ 'GEOMETRY = AS_XYZ' ฉันสามารถนำไฟล์ขึ้นมาใน QGIS และเห็นเวกเตอร์ที่มีโครงร่างของประเทศชัดเจน
Andrew S

-1

มีเครื่องมือใน 'แบบจำลองกระบวนการทางภูมิศาสตร์และคลังเครื่องมือสคริปต์' ที่ทำในสิ่งที่คุณกำลังมองหา มันสามารถส่งออกไปยัง excel หรือ csv

http://resources.arcgis.com/gallery/file/geoprocessing/details?entryID=95009B25-1422-2418-7FB5-B8638ECB2FA9


1
ฉันได้ดูแล้วว่ามันไม่ส่งออกรูปเรขาคณิตในรูปแบบใด ๆ KML นับประสา
2856

-1

เพียงไปที่เครื่องมือแปลงในแผนที่อาร์ค จากนั้นไปที่ตารางเพื่อ excel ไฟล์ excel จะทำ แปลง excel doc เป็นไฟล์. csv

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.