在 ArcGIS 里面使用 Python 的 UpdateCursor 更新图形里面的坐标后,修改的 FeatureClass 是不会自动改变它的默认 Extent 的(至少我用 Shapefile 的时候它不会自动更新 Extent)。这样的话在 ArcMap 里面的 FullExtent 功能就不会缩放到适当的大小。GP 里面的对象也没有 UpdateExtent 方法,网上搜索到的方法都是使用 VBA 代码来更新 Extent。所以想要跟原有的 Python 代码集成到一起就很不方便(比如一些用于 GP 服务的 Python 程序)。
今天研究了一下,GP 里面没有提供 UpdateExtent,干脆就用 Python 直接调用 Ao 里面的 IFeatureClassManage.UpdateExtent() 方法。其实 Python 调用 Ao 对象也和 C++ 的调用没有什么差别。代码如下:
# coding:cp936 import _winreg import comtypes from comtypes.client import GetModule from comtypes.client import CreateObject # 查找 ArcGIS 10 的安装路径,我的是64位系统所以有 Wow6432Node,32位系统的话就去掉那个节点 keyESRI = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "SOFTWARE//Wow6432Node//ESRI//Desktop10.0") ArcGISPath = _winreg.QueryValueEx(keyESRI, "InstallDir")[0] + "com//" # 载入必要的库 GetModule(ArcGISPath + 'esriDataSourcesFile.olb') GetModule(ArcGISPath + 'esriGeoDatabase.olb') GetModule(ArcGISPath + 'esriSystem.olb') GetModule((comtypes.GUID("{6FCCEDE0-179D-4D12-B586-58C88D26CA78}"), 1, 0)) # esriVersion import comtypes.gen.esriDataSourcesFile as esriDataSourcesFile import comtypes.gen.esriGeoDatabase as esriGeoDatabase import comtypes.gen.esriSystem as esriSystem import comtypes.gen.ArcGISVersionLib as esriVersion # ArcGIS 10.0 以上需要先绑定版本,9.x 不用下面这两句 versionManager = CreateObject(esriVersion.VersionManager, interface = esriVersion.IArcGISVersion) versionManager.LoadVersion(esriVersion.esriArcGISDesktop, "10.0") # 初始化 Ao,和 C++ 里面一样的做法 aoInit = CreateObject(esriSystem.AoInitialize, interface = esriSystem.IAoInitialize) pCode = esriSystem.esriLicenseProductCodeArcInfo status = aoInit.IsProductCodeAvailable(pCode) if status == esriSystem.esriLicenseAvailable: aoInit.Initialize(pCode) shpFileWSFactory = CreateObject(esriDataSourcesFile.ShapefileWorkspaceFactory, interface = esriGeoDatabase.IWorkspaceFactory) shpFileWS = shpFileWSFactory.openFromFile(r'D:/Temp/p/testtooldata', 0).QueryInterface(esriGeoDatabase.IFeatureWorkspace) featureClass = shpFileWS.openFeatureClass("test1") featureManger = featureClass.QueryInterface(esriGeoDatabase.IFeatureClassManage) featureManger.UpdateExtent() del featureManger del featureClass