En esta oportunidad hablaremos con un ejemplo cómo interactúan el Python y el ArcObjects. Para esto vamos a leer un archivo shapefile y extraer sus datos para un análisis posterior. Se uso el Python 2.5 y el ArcObjects para ArcGis 9.3.
Para esto usamos principalmente los métodos Describe y SearchCursor que para nuestro ejemplo serán necesarios. En este enlace (http://www.gis.unbc.ca/help/software/esri/Geoprocessor_93.pdf) podemos ver los métodos (tales como Describe, SearchCursor, ListFields, etc)y objetos(SpatialReference, FieldInfo, ValueTable, FieldMappings, FieldMap, Point, Field, Array, NetCDFFileProperties, ArcSDESQLExecute, Result, RecordSet, FeatureSet, Geometry y Extent) que usa el Geoproccesor de manera de guía para realizar más aplicaciones
El código es el siguiente:
import sys, string, os, arcgisscripting
gp = arcgisscripting.create(9.3)
ShapeaLeer = "C:\TEMP\ArcGis\PERU_DEPARTAMENTOS_1Millon.shp"
DatosShape = gp.describe(ShapeaLeer) #uso describe para leer datos generales del shape y lo guardo en DatosShape
rows = gp.SearchCursor(ShapeaLeer) #uso SearchCursor para leer los regustros del shape y lo guardo en rows
row = rows.Next() #posiciono el cursor en el primer registro para leerlos (el 1er registro esta en row)
### CONTAR REGISTROS DE UN SHAPE ###
i = 0
while row:
row = rows.Next()
i = i + 1
### LEER DATOS DE UN SHAPE ###
print "Nombre del Shape:" , DatosShape.Name
print "Ruta del Shape:" , DatosShape.Path
print "Tipo de Shape:" , DatosShape.ShapeType
print "Tipo de Proyección: ", DatosShape.SpatialReference.Type
print "Referencia Espacial (Datum): ", DatosShape.SpatialReference.Name
print "Número de columnas: " , len(DatosShape.fields)
print "Número de Registros:" , i
### LEER DATOS DE LAS COLUMNAS DE UN SHAPE ###
j = 1 #inicializo un contador para que lea las columnas uno por uno
for field in DatosShape.fields: #creo una variable field que leera cada fields contenida en DatosShape.fields
print "Columna Nº", j, ": " , field.name , " Tipo: " , field.Type #leo el nombre y el tipo de cada field
j = j + 1 #aumento en una unidad el contador
###LEER LOS DATOS DE UNA COLUMNA DE UN SHAPE###
Campo = raw_input("Ingrese Campo a extraer datos: ")
print "los datos del campo " , Campo , " son: "
rows = gp.SearchCursor(ShapeaLeer) #PARA LOS REGISTROS O ENTIDADES DEL SHAPE
row = rows.Next() #POSICIONO EL CURSOR EN EL PRIMER REGISTRO / ENTIDAD
while row:
print row.GetValue(Campo)
row = rows.Next()
Ahora la explicación:
-Para leer los módulos que necesitaremos para realizar nuestro programa, debemos poner:
import sys, string, os, arcgisscripting # importamos los modulos siguiente y el arcgisscripting principalmente
-Creamos el objecto gp que nos permitirá hacer nuestro trabajo de leer los datos del shape
gp = arcgisscripting.create(9.3)
-Luego leemos directamente el shape que queremos trabajar y lo guardamos en la variable ShapeaLeer :
ShapeaLeer = "C:\TEMP\ArcGis\PERU_DEPARTAMENTOS_1Millon.shp"
-Para leer ahora los “datos generales del shape”, usamos el método describe y para los registros del shape usamos SearchCursor de esta manera:
DatosShape = gp.describe(ShapeaLeer) #uso describe para leer datos generales del shape y lo guardo en DatosShape
rows = gp.SearchCursor(ShapeaLeer) #uso SearchCursor para leer los regustros del shape y lo guardo en rows
row = rows.Next() #posiciono el cursor en el primer registro para leerlos (el 1er registro esta en row)
-Si queremos contar cuantos registros hay, usamos esta sentencia…
i = 0
while row:
row = rows.Next()
i = i + 1
-Para leer los datos usamos la variable DatosShape:
print "Nombre del Shape:" , DatosShape.Name
print "Ruta del Shape:" , DatosShape.Path
print "Tipo de Shape:" , DatosShape.ShapeType
print "Tipo de Proyección: ", DatosShape.SpatialReference.Type
print "Referencia Espacial (Datum): ", DatosShape.SpatialReference.Name
print "Número de columnas: " , len(DatosShape.fields)
print "Número de Registros:" , i
-Para el caso de las columnas o fields, hacemos esto:
j = 1 #inicializo un contador para que lea las columnas uno por uno
for field in DatosShape.fields: #creo una variable field que leera cada fields contenida en DatosShape.fields
print "Columna Nº", j, ": " , field.name , " Tipo: " , field.Type #leo el nombre y el tipo de cada field
j = j + 1 #aumento en una unidad el contador
-Ahora, si queremos leer los datos de una columna, usamos:
Campo = raw_input("Ingrese Campo a extraer datos: ") #en Campo pido que el usuario entre el nombre de una columna
print "los datos del campo " , Campo , " son: " #un print que me indica el inicio de la operación de leer los datos
rows = gp.SearchCursor(ShapeaLeer) #leo de nuevo los registros del shape
row = rows.Next() #posiciono el cursor en el primer registro para leerlos
while row:
print row.GetValue(Campo) #aca visualize los datos de la columna
row = rows.Next()
Esperando que sea útil este post, nos vemos en el próximo. Saludos.