python的靈活性不言而喻,因此一直想嘗試用python快速訪問geodatabase。
開發環境:ArcGIS 9.3 + python 2.5
# -*- coding: cp936 -*-
def GetAoModule(moduleName):
import comtypes
from comtypes.client import GetModule
GetModule('C:\\Program Files (x86)\\ArcGIS\\com\\'+moduleName)
def AoObj(MyClass,MyInterface):
from comtypes.client import CreateObject
try:
obj = CreateObject(MyClass,None,None,MyInterface,False)
return obj
except Exception,ex:
print ex.message
return None
def InitialAo():
GetAoModule('esriSystem.olb')
import comtypes.gen.esriSystem as esriSystem
aoInit = AoObj(esriSystem.AoInitialize,esriSystem.IAoInitialize)
if(aoInit):
pCode = esriSystem.esriLicenseProductCodeArcInfo
status = aoInit.IsProductCodeAvailable(pCode)
if status==esriSystem.esriLicenseAvailable:
aoInit.Initialize(pCode)
else:
print "aoInit is null"
def SearchFeatureClass():
GetAoModule('esriGeoDatabase.olb')
GetAoModule('esriDataSourcesGDB.olb')
import comtypes.gen.esriDataSourcesGDB as esriDataSourcesGDB
import comtypes.gen.esriGeoDatabase as esriGeoDatabase
pWorkspaceFactory = AoObj(esriDataSourcesGDB.AccessWorkspaceFactory,esriGeoDatabase.IWorkspaceFactory)
pWorkspace = pWorkspaceFactory.OpenFromFile('D:\\DataMaps.mdb',0)
pFeatureWorkspace = pWorkspace.QueryInterface(esriGeoDatabase.IFeatureWorkspace)
print pFeatureWorkspace
pFeatureClass = pFeatureWorkspace.OpenFeatureClass("Euler")
pFeatureCursor = pFeatureClass.Search(None,False);
pFeature=pFeatureCursor.NextFeature()
while(pFeature):
print pFeature.OID
pFeature=pFeatureCursor.NextFeature()
if __name__=='__main__':
InitialAo()
SearchFeatureClass()
raw_input("按回車鍵退出程序...")
趁早上頭腦清醒,把之前的幾個bug也改掉了,不枉早上起那麼早。
參考資料: