Chuyển đổi shapefile sang CSV bao gồm các thuộc tính VÀ hình học?


21

Tôi có một shapefile với 60k + mục, tất cả đều là đa giác với các thuộc tính tương ứng (tổng diện tích, tên chủ đất, ID thuế #, v.v.). Điều cuối cùng tôi cần là một tệp CSV có tất cả các thuộc tính này và hình dạng tương ứng của chúng (ở định dạng xyz tương thích KML, nghĩa là KHÔNG phải định dạng WKT).

Tôi biết rằng tôi có thể mở tệp .dbf trong Excel và nhận các thuộc tính. Tôi cũng biết rằng tôi có thể mở shapefile trong QGIS và sao chép dữ liệu vào Excel, điều này mang lại cho tôi các thuộc tính và hình học WKT.

Có cách nào đơn giản để chuyển đổi shapefile thành CSV (có thể mở trong Excel) với thuộc tính và hình học thân thiện với Google Earth không?


Để đáp ứng thông số kỹ thuật của bạn, một ứng dụng hoặc tập lệnh sẽ phải được xây dựng. Tôi không nghĩ nó khó, nhưng tôi cũng không nghĩ nó không tầm thường. Nếu tôi được giao nhiệm vụ, tôi có thể ước tính toàn thời gian 1 tuần cho một công việc như vậy.
Stephen Quan

3
Cảm ơn, điều này rất hữu ích. Đây là loại điên mặc dù. Nếu kích thước tệp của tôi không lớn, tôi có thể tự động thực hiện thông qua Google. Cách tôi thường làm điều này là bằng cách nhập .shp vào Google Earth và lưu dưới dạng .kml. Sau đó, tôi tải lên .kml vào Google Fusion Bảng (FYI: Google Fusion Bảng có giới hạn tải lên 100 mb) và xuất sang .csv. Sau đó tôi có thể chơi xung quanh với .csv theo cách tôi muốn - thay đổi thuộc tính, thêm đa giác mới mà tôi có tọa độ, v.v. - và sau đó tôi tải lại .csv mới được lưu vào Google Fusion Bảng, xuất sang .kml và mở trong Google Earth.
Rikk

Vì vậy, tôi đoán câu hỏi sau đó trở thành ... làm cách nào để chia tệp .shp thành hai phần? Điều này sẽ cho phép tôi lấy các tệp .kml riêng lẻ dưới giới hạn 100 mb và tôi có thể sử dụng phương pháp được đề cập ở trên để chuyển đổi.
Rikk

1
Tôi đã trả lời câu hỏi như được hỏi dưới đây, nhưng chỉ thấy bình luận của bạn. Tại sao bạn cần csv cả? Tại sao không chỉnh sửa thuộc tính của bạn, thêm đa giác mới, v.v. trong GIS (bạn nói bạn đã có QGIS) và sau đó xuất nó sang KML cuối cùng của bạn?
dùng2856

@Rikk - để trả lời câu hỏi trong nhận xét của bạn: Một cách đơn giản để phân tách một shapefile sẽ là thực hiện lựa chọn không gian trên một phần của shapefile của bạn và sau đó nhấp chuột phải vào lớp của bạn và chọn "Xuất khẩu". Sau đó, bạn có thể chỉ cần xuất các tính năng đã chọn sang một shapefile mới, nhỏ hơn. Điều này không có nghĩa là khoa học, nhưng nó đơn giản. Ngoài ra, bạn có thể chọn theo một số thuộc tính nếu bạn muốn một cách tiếp cận có tổ chức hơn.
Radar

Câu trả lời:


28

Đây là một tập lệnh đơn giản sử dụng các ràng buộc 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: và một tập lệnh khác để chuyển đổi từ CSV sang KML của bạn

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

Bạn có thể mô tả thêm về cách sử dụng các ràng buộc đó vì nó che đậy thông tin quan trọng mà độc giả của bạn sẽ cần phải biết.
Andrew S

8

Nếu bạn chuyển đổi shapefile của mình thành spatialite, bạn sẽ có thể làm như sau:

1) Thử nghiệm với SQL để kiểm tra đầu ra:

ví dụ

CHỌN tab col1, col2, col3, AsKml (hình học_column)

2) Khi bạn hài lòng với kết quả, bạn có thể xuất nó sang định dạng CSV:

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

Để biết thêm thông tin về Spatialite:

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

Các hàm SQL không gian:

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


3

Nếu bạn đang làm việc trên QGIS, bạn có thể tạo ngay một tài liệu CSV bằng cách nhấp chuột phải vào lớp -> Lưu dưới dạng -> CSV.

Nếu bạn đang làm việc với ArcMap, thì bạn có thể xuất KML bằng cách sử dụng công cụ Lớp sang KML (tùy chọn Chuyển đến Tìm kiếm trong chương trình). Vì một số lý do, nó tạo ra một KMZ thay vì KML (ít nhất đó là những gì đã xảy ra trong trường hợp của tôi).

Để chuyển đổi KMZ sang KML:

  • Nhập tệp KMZ của bạn vào Google Earth và nhấp chuột phải vào lớp của bạn và lưu nó dưới dạng KML
  • Mở QGIS và kéo và thả tệp KML - nó sẽ tự động tải lớp (> QGIS 2.10 PISA)
  • Nhấp chuột phải vào tệp và lưu dưới dạng CSV

Quy trình này dài hơn nếu bạn đang làm việc với ArcGIS nhưng trong QGIS nó có thể được thực hiện nhanh chóng. Bạn sẽ phải cài đặt QGIS trong mọi trường hợp.


Đã thử nghiệm giải pháp của bạn cho QGIS và nó không hoạt động. Lưu dưới dạng csv không bảo toàn thành phần không gian.
Philipp Schwarz

QGIS cung cấp cho bạn một tùy chọn để chọn WKT trong quá trình xuất - điều này xuất hình học (thành phần không gian) ở định dạng WKT cùng với các tính năng còn lại trong tệp hình dạng.
kozyr

Từ QGIS 3.0, bạn sẽ tìm kiếm danh sách thả xuống của hình học hình học trong phần Tùy chọn lớp của người dùng trong phần hội thoại xuất khẩu và chọn AS_XY, AS_XYZhoặcAS_WKT
leo

2

Tại dòng lệnh bạn có thể sử dụng ogr2ogr, như thế này:

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

lcoTôi nghĩ là dành cho các tùy chọn tạo lớp. Các tùy chọn khả dụng khác được ghi lại ở đây: http://www.gdal.org/drv_csv.html


Leo, tôi nhận được "Lỗi 1 không thể tìm nạp lớp được yêu cầu 'GEOMETRY = AS_XYZ'. Tôi có thể đưa tệp lên trong QGIS và thấy rõ một vectơ chứa các phác thảo quốc gia.
Andrew S


-1

chỉ cần vào công cụ chuyển đổi trong bản đồ hồ quang. sau đó đi đến bàn để excel. một tập tin excel sẽ được thực hiện. chuyển đổi tài liệu excel đó thành tập tin .csv

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.