Skip to content

Instantly share code, notes, and snippets.

@AlexArcPy
Created October 24, 2017 09:47
Show Gist options
  • Save AlexArcPy/7ef5c5832ce76c4a23e5ca932a175f9e to your computer and use it in GitHub Desktop.
Save AlexArcPy/7ef5c5832ce76c4a23e5ca932a175f9e to your computer and use it in GitHub Desktop.
Python and comtypes: read map document layers and .lyr files with ArcObjects
from comtypes.client import GetModule, CreateObject
from snippets102 import GetStandaloneModules, InitStandalone
GetStandaloneModules()
InitStandalone()
esriCarto = GetModule(r"C:\Program Files (x86)\ArcGIS\Desktop10.4\com\esriCarto.olb")
layerFile = CreateObject(esriCarto.LayerFile,interface=esriCarto.ILayerFile)
lyrs = ["C:\GIS\Temp\lyrs_remote_sde_many_features\c123.lyr",
r"C:\GIS\Temp\lyrs_local_sde\Park_boundary.lyr",
"C:\GIS\Temp\lyrs_remote_sde_few_features\Data.lyr"]
for lyr_file in lyrs:
layerFile.Open(lyr_file)
lyr = layerFile.Layer
desc = lyr.QueryInterface(esriCarto.IFeatureLayer)
print desc.DataSourceType
#u'SDE Feature Class'
print desc.FeatureClass.AliasName
pMapDocument = snippetarcgis102.NewObj(esriCarto.MapDocument,esriCarto.IMapDocument)
pMapDocument.open(path) #like pDoc
pMap = pMapDocument.Map(0)
pEnumLayer = pMap.Layers(None,True)
#key = name of layer from gdb (en UPPER CASE) value =ptr to IGeoFeatureLayer layers (not group layers)
layer_ptr_dict={}
pLayer = pEnumLayer.Next()
while pLayer:
pGeoFeatureLayer = snippetarcgis102.CType(pLayer,esriCarto.IGeoFeatureLayer)
if pGeoFeatureLayer: # list of IGeofeature layers (not group layers)
en_name = pGeoFeatureLayer.FeatureClass.AliasName.encode('utf-8') # name in GDB, not in TOC
layer_ptr_dict [en_name] = pGeoFeatureLayer
else: # else it is group layer and we collapse it
group_layer = snippetarcgis102.CType(pLayer,esriCarto.IGroupLayer)
group_layer.Expanded = False #collapse group layers
pLayer = pEnumLayer.Next()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment