将shapefile转换为CSV,包括属性和几何?


21

我有一个shapefile,其中包含60k多个条目,所有这些条目都是具有相应属性(总计,土地所有者名称,税ID#等)的多边形。我最终需要的是一个具有所有这些属性及其对应几何形状的CSV文件(采用KML兼容的xyz格式,而不是WKT格式)。

我知道我可以在Excel中打开.dbf文件并获取属性。我也知道我可以在QGIS中打开shapefile并将数据复制到Excel,这可以获取属性和WKT几何形状。

是否有一种简单的方法可以将shapefile转换为具有属性和Google Earth友好几何图形的CSV(可在Excel中打开)?


为了满足您的规范,必须构建一个应用程序或脚本。我不认为这很困难,但我也不认为这也不是小事。如果我有任务要做,我可能会估计这样一份工作的全职工作时间为一周。
Stephen Quan

3
谢谢,这是有帮助的。不过,这有点疯狂。如果我的文件大小不是很大,我可以通过Google自动进行。通常,我是通过将.shp导入Google Earth并另存为.kml来实现的。然后,我将.kml上传到Google Fusion Tables(仅供参考:Google Fusion Tables的上传限制为100 mb)并导出到.csv。然后,我可以随心所欲地使用.csv,更改属性,添加具有坐标的新多边形,等等,等等,然后将新保存的.csv重新上传到Google Fusion Tables,导出到.kml ,然后在Google Earth中打开。
Rikk 2012年

所以我想问题就变成了...如何将.shp文件分成两部分?这样一来,我就可以将单个.kml文件限制在100 mb以下,并且可以使用上述方法进行转换。
Rikk 2012年

1
我已经按照以下要求回答了问题,但看到了您的评论。为什么根本需要csv?为什么不在GIS中编辑属性,添加新的多边形等(您说您拥有QGIS),然后将其导出到最终的KML?
user2856 2012年

@Rikk-回答您评论中的问题:拆分shapefile的一种简单方法是在shapefile的一部分上进行空间选择,然后右键单击图层并选择“导出”。然后,您可以简单地将所选特征导出到新的较小的shapefile中。这绝不是科学的,但是很简单。另外,如果您想要一种更有条理的方法,则可以按一些属性进行选择。
雷达2012年

Answers:


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

您能否描述更多有关如何使用这些绑定的信息,因为这会掩盖读者需要知道的重要信息。
安德鲁·S

8

如果将shapefile转换为spacespaceite,则应该能够执行以下操作:

1)试用SQL来测试输出:

例如

从选项卡中选择col1,col2,col3,AsKml(geometry_column)

2)对结果满意后,可以将其导出为CSV格式:

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

有关Spatialite的更多信息:

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

Spatialite 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地球,然后右键单击图层并将其另存为KML
  • 打开QGIS并拖放KML文件-它会自动加载图层(> QGIS 2.10 PISA)
  • 右键单击该文件并将其另存为CSV

如果您使用的是ArcGIS,则此过程会更长,但在QGIS中可以立即完成。无论如何,您都必须安装QGIS。


测试了您的QGIS解决方案,它不起作用。另存为csv不会保留空间分量。
菲利普·施瓦茨

QGIS为您提供了在导出过程中选择WKT的选项-导出WKT格式的几何(空间分量)以及形状文件中的其余要素。
kozyr

在QGIS 3.0中,您将在导出对话框的“层选项”下查找“几何”下拉列表,然后选择AS_XYAS_XYZAS_WKT
leo

2

您可以在命令行中使用ogr2ogr,如下所示:

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

lco我认为是用于“图层创建选项”的。其他可用选项记录在这里:http : //www.gdal.org/drv_csv.html


狮子座,我得到“错误1个could'nt取指请求层‘几何= AS_XYZ’我可以把文件起来QGIS和清楚地看到含有国家概况的载体。
安德鲁小号


-1

只需转到弧形图中的转换工具。然后去表Excel。一个Excel文件将。将该Excel文档转换为.csv文件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.