4

使用arcpy,我的目的是在列表中存储一个要素类以供进一步处理。每行将是 dict {'field name': value},包括几何。

完成此任务的最 Pythonic 方式应该是使用列表推导:

fc = '/path/to/fc'
fields = [f.name for f in arcpy.ListFields(fc)]   # get field list
features = [[row.getValue(f) for f in fields] for row in arcpy.SearchCursor(fc)]

此方法适用于数据,但列表中的几何图形都是相同的(在 fc 中检索到的最后一个几何图形)。SearchCursor 的这种行为已经在 StackOverflow 上进行了评论

我尝试了另一种方法:

fc = '/path/to/fc'
shape_field = arcpy.Describe(fc).shapeFieldName

# load geometry in a list
geom = arcpy.Geometry()
feat = [{shape_field: f} for f in arcpy.CopyFeatures_management(fc, geom)] # slow

# load data in a list
fields = [f.name for f in arcpy.ListFields(fc)]
data = [dict([(f, row.getValue(f)) for f in fields if f != shape_field]) for row in arcpy.SearchCursor(fc)] # slow

# merge
merge = zip(feat, data)
merge = [dict([(k, v) for adict in line for (k, v) in adict.items()]) for line in merge] # sorry for that...

它适用于我的数据集,但是:

  • 它很慢。
  • 我不确定断言数据和壮举的顺序相同是否安全。

对此有何看法?

4

1 回答 1

5

如果可能的话,迁移到使用 10.1 的地方arcpy.da,这是一个性能显着提高的游标 API。我已经写了一篇关于取回字典这个主题的日志帖子。几何图形都是一样的,因为它在内部使用了一个回收游标,所以在 10.0 中,您需要抓取shape.__geo_interface__并使用AsShape它来将其恢复为几何对象。

取回行的顺序是相当随意的:您可以期望它在没有where 子句的 shapefile 中每次都相同,仅此而已,因此您的两遍方法实际上并不可靠。

考虑到所有这些,您可以执行以下操作:

def cursor_to_dicts(cursor, field_names):
    for row in cursor:
        row_dict = {}
        for field in field_names:
            val = row.getValue(field)
            row_dict[field] = getattr(val, '__geo_interface__', val)
        yield row_dict

fc = '/path/to/fc'
fields = [f.name for f in arcpy.ListFields(fc)]   # get field list
features = list(cursor_to_dicts(arcpy.SearchCursor(fc), fields))

神奇的是调用——如果存在就getattr()尝试抓取,否则默认为.value.__geo_interface__value

由于这个问题实际上并不是关于 Python 语言,而是一个arcpy特定于 GIS 的 API ( ),因此您将来最好在 gis.stackexchange 上问这样的问题。

于 2012-08-08T22:26:22.423 回答