使用arcpy
,我的目的是在列表中存储要素类以供进一步处理。
每行都是{'field name': value}
的字典,包括几何。
实现此任务的最pythonic方法应该是使用list comprehension:
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中检索的最后几何图形)。 This behaviour of SearchCursor has already been commented on 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...
它适用于我的数据集但是:
对此有何意见?
答案 0 :(得分:5)
如果可能的话,在获得arcpy.da
的情况下迁移到使用10.1,这是一个性能更高的游标API。 I've written a log post on this very topic of getting dictionaries back。几何图形都是相同的,因为它在内部使用了一个回收光标,因此在10.0中你需要获取shape.__geo_interface__
而使用AsShape
将其恢复为几何对象。
你获得行的顺序是相当随意的:你可以期望它在shapefile 中没有一个where子句时都是一样的,而且几乎就是这样,所以你的双程方法赢了真的很可靠。
考虑到这一切,你可以这样做:
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语言,而是一个特定于GIS的API(arcpy
),所以最好在将来在gis.stackexchange上询问这样的事情。