lunes, 18 de agosto de 2014

Leer y copiar la simbologia de una capa del ArcMap usando Python (Comtypes)


En este mes veremos como copiar la simbología de un Shapefile o Capa hacia otra en ArcMap usando Python y Comtypes (Comtypes lee los archivos OLB que contiene los objetos del ArcObjects). Para más referencia, pueden consultar este Post: http://www.ingeografos.com.pe/2012/04/python-y-arcobjects-2da-parte.html

Para ello usamos una sola capa y la copiamos en el ArcMap (en este ejemplo se usa un Shapefile o Capa de los departamentos del Perú). La capa de abajo será la capa 1 y tendra la simbologia a copiar  y la capa de arriba será la capa 0 y asignaremos la simbología de la capa 1. Tendremos algo así:


 

 
 
 
 
 
 
 
 
 
 
 Archivos OLB usados para obtención de los módulos requeridos:

esriArcMapUI.olb, que servirá para los siguientes Objetos:

1)      IMxDocument: Leerá el documento mxd actual

esriCarto.olb, que servirá para los siguientes Objetos:

1)       IMap: leera la vista o mapa del documento mxd actual y su contenido.

2)      IGeoFeatureLayer: leerá las simbologías de las capas

3)      IActiveView: accede la vista actual del documento mxd

 

esriFramework.olb, que servirá para los siguientes Objetos:

1)      IAppROT: Leerá la aplicación ArcGIS en ejecución

El código en Python es el siguiente:



from comtypes.client import GetModule, CreateObject
#PASO 01: CARGA DE LOS MODULOS NECESARIOS:
esriArcMapUI = GetModule("C:\Program Files\ArcGIS\com\esriArcMapUI.olb")
esriCarto = GetModule("C:\Program Files\ArcGIS\com\esriCarto.olb")
esriFramework = GetModule ("C:\Program Files\ArcGIS\com\esriFramework.olb")
#PASO 02: LEEMOS LA APLICACION ARCGIS:
pAppROT = CreateObject(esriFramework.AppROT, interface=esriFramework.IAppROT)
Application = pAppROT.Item(0)
MiProyMxd_TMP = Application.Document
MiProyMxd =  MiProyMxd_TMP.QueryInterface(esriArcMapUI.IMxDocument)
#PASO 03: LEEMOS LA VISTA DE LA APLICACION ARCGIS:
MiMapa_TMP = MiProyMxd.FocusMap
MiMapa = MiMapa_TMP.QueryInterface(esriCarto.IMap)
#PASO 04: LEEMOS LA CAPA CON SIMBOLOGIA:
MiLayerConSimbologia_TMP = MiMapa.Layer(1)
MiLayerConSimbologia = MiLayerConSimbologia_TMP.QueryInterface(esriCarto.IGeoFeatureLayer)
MiLeyenda = MiLayerConSimbologia.Renderer #ACA SE OBTIENE LA LEYENDA DE LA CAPA
#PASO 05: LEEMOS LA CAPA SIN SIMBOLOGIA:
MiLayerSinSimbologia_TMP = MiMapa.Layer(0)
MiLayerSinSimbologia = MiLayerSinSimbologia_TMP.QueryInterface(esriCarto.IGeoFeatureLayer)
MiLayerSinSimbologia.Renderer = MiLeyenda #ACA SE ASIGNA LA LEYENDA DE LA CAPA ANTERIOR A LA NUEVA


#PASO 06: REFRESCA LA VISTA Y EL TOC:
ActiveView_TMP = MiProyMxd.ActiveView
ActiveView = ActiveView_TMP.QueryInterface(esriCarto.IActiveView)
ActiveView.Refresh()
MiProyMxd.UpdateContents()



La explicación está dividida en 6 pasos:

Paso 01: Carga de los módulos necesarios (explicado en la descripción de dicho paso).

Paso 02: Lectura de la aplicación ArcGIS y del documento mxd. Las dos primeras líneas leen el ArcMap y las dos últimas leen el documento mxd.

Paso 03: Lectura de la vista o del mapa actual y lo guardamos en el objeto MiMapa (de tipo IMap y previo uso del QueryInterface).

Paso 04: Acá leemos la simbología que queremos copiar. La primera línea leemos la capa con la simbología (que es la capa 1). La segunda línea usando el  QueryInterface creamos el objeto MiLayerConSimbologia (de tipo IGeoFeatureLayer), y en la tercera línea obtenemos su leyenda (guardada en el objeto MiLeyenda).

Paso 05: Asignamos la simbología obtenida en el Paso 04. En la primera línea leemos la capa que asignaremos la simbología (que es la capa 0). En la segunda línea usando el  QueryInterface creamos el objeto MiLayerSinSimbologia (de tipo IGeoFeatureLayer), y en la tercera línea asignamos en la propiedad Renderer del objeto MiLayerSinSimbologia la variable MiLeyenda (proveniente del Paso 04).

Paso 06: Refrescamos la Vista y la Tabla de Contenido (TOC). La línea 1 y 2 creamos el objeto ActiveView (del tipo IActiveView y usando el QueryInterface) para luego actualizarlo “refrescarlo” en la línea 3, esto hará que la vista o mapa se actualice, y en la línea 4 actualizamos el TOC con la simbología copiada

El resultado será así:

 

 
 
 
 
 
 
 
 
 
  
Esperando que sea útil este código, será hasta el otro mes. Saludos.



ª