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")
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)
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)
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
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
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.