domingo, 4 de marzo de 2012

Python y ArcObjects – (1era Parte)

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.

ª