He comenzado recientemente a través de algunos de los ArcObjects dentro de mi módulos de Python. Tener todos los útiles posts e ideas compartidas por @matt wilkie et al, yo era capaz de conseguir comenzó muy rápidamente (la instalación de la comtypes con el pip y la descarga de la 10.2 fragmento de Pierssen y cambiar "10.2" a "10.3" en todas partes).
Estoy tratando de recorrer IFeatureCursor
y obtener todas las características dentro de una clase de entidad. Sin embargo, me estoy volviendo sólo la última función (con el mayor valor de ObjectID).
Hay 6 características de la clase de entidad de ahí xrange(6)
de mantenerlo simple.
from comtypes.client import GetModule, CreateObject
from snippets102 import GetStandaloneModules, InitStandalone
# First time through, need to import the "StandaloneModules". Can comment out later.
#GetStandaloneModules()
InitStandalone()
def iterate_features():
# Get the GDB module
esriGeodatabase = GetModule(r"C:\Program Files (x86)\ArcGIS\Desktop10.3\com\esriGeoDatabase.olb")
esriDataSourcesGDB = GetModule(r"C:\Program Files (x86)\ArcGIS\Desktop10.3\com\esriDataSourcesGDB.olb")
# Create a file geodatabase pointer
file_gdb_pointer = CreateObject(progid=esriDataSourcesGDB.FileGDBWorkspaceFactory,
interface=esriGeodatabase.IWorkspaceFactory)
file_gdb = file_gdb_pointer.OpenFromFile(r"C:\GIS\arcobjects\MyData.gdb",hWnd=0)
#access contents inside gdb
feature_workspace = file_gdb.QueryInterface(esriGeodatabase.IFeatureWorkspace)
in_fc = feature_workspace.OpenFeatureClass("Warehouses")
def enum_features(in_fc):
"""returns pointers to IFeature objects inside Feature Class"""
cur = in_fc.Search(None,True)
for i in xrange(6):
feature_obj = yield cur.NextFeature()
feats = [feat for feat in enum_features(in_fc)]
print [f.OID for f in feats]
iterate_features()
La línea print [f.OID for f in feats]
devuelve [6, 6, 6, 6, 6, 6]
.
¿Qué estoy haciendo mal? La misma lógica con generador/rendimiento (def enum_features()
) funciona bien cuando se itera clases de entidad dentro del dataset de entidades.
el feats_OIDs = [feat.OID for feat in enum_features(in_fc)]
va a dar resultados correctos, [1, 2, 3, 4, 5, 6]
, sin realizar ninguna modificación en el código. El problema parece estar en que cuando hago una lista de características [feat for feat in enum_features(in_fc)]
, todos ellos se refieren a la misma función (porque cuando voy a explorar cada uno de ellos más tarde, cada uno de ellos tienen el mismo OID).