歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 在Python中使用ArcObjects對象

在Python中使用ArcObjects對象

日期:2017/3/1 10:17:42   编辑:Linux編程

在Python中使用ArcObjects對象

【本文環境】ArcGIS 10,Python 2.6

在ArcGIS 10以後,VBA將退出ArcGIS產品中,由此可想而知,將來Python在ArcGIS產品中的地位將會十分重要。雖然在ArcGIS中Python已經存在了很長一段時間,但是,一般常用的可能還是將模型導出為Python腳本,然後用以和他人交換或者使用操作系統定時任務等方式供其它程序調用。而本文需要描述的是,如何通過編寫Python腳本,並在腳本中使用ArcObjects對象,來充分發揮Python膠水語言的特點,在其它程序和ArcGIS之間構造一個交互的橋梁。

我們都知道ArcGIS中的ArcObjects都是COM對象,在Python中調用COM對象需要一個開源的類庫:comtypes,我們可以從sourceforge上下載並安裝它:

http://sourceforge.net/projects/comtypes/

在Windows下的安裝界面是這個樣子的:

在這步完成以後,所有對ArcGIS的調用就都是在Python環境下處理的問題了。讓我們首先來看如何在Python中加載ArcObjects的組件庫。

我這裡寫了一個方法,用以可以方便地加載ArcGIS的OLB文件:

def GetAoModule(moduleName):
 import comtypes
 from comtypes.client import GetModule
 GetModule('C:/Program Files (x86)/ArcGIS/Desktop10.0/com/' + moduleName)

這樣,在我想使用AO中的幾何對象時,只需要通過如下的代碼把esriGeometry這個對象庫加載上即可:
GetAoModule('esriGeometry.olb')

在這裡我們可以看到我們剛才安裝的comtypes的身影,我們依靠它才可以加載ArcGIS的對象庫。同樣,在這裡我們還需要依靠comtypes幫我們創建ArcObjects對象(COM對象),為了方便我這裡還定義了一個方法:

def AoObj(MyClass, MyInterface):
 from comtypes.client import CreateObject
 try:
  obj = CreateObject(MyClass, interface=MyInterface)
  return obj
 except:
  return None
這樣,如果我想要在Python中創建一個ArcObjects對象,比如Point,我們就可以使用如下的方法:
GetAoModule('esriGeometry.olb')
import comtypes.gen.esriSystem as esriSystem
pt = AoObj(esriSystem.Point, esriSystem.IPoint)

現在,我們已經可以創建ArcObjects對象了,但是,這裡還有一個重要的問題需要解決,那就是如何進行對象接口類型轉化。比如我得到了一個對象的IWorkspace接口,但是我需要調用的是這個對象的IFeatureWorkspace接口的方法,這個時候需要一個轉化,在Python中我准備了另外一個方法去做這件事情:

def AoCType(obj, interface):
 try:
  newobj = obj.QueryInterface(interface)
  return newobj
 except:
  return None
這樣,如果我想將一個IWorkspace接口的對象轉到IFeatureWorkspace接口時,就可以這樣操刀:
GetAoModule('esriGeoDatabase.olb')
import comtypes.gen.esriGeoDatabase as esriGeoDatabase
fw = AoCType(w, esriGeoDatabase.IFeatureWorkspace)

通過上面的GetAoModule、AoObj和AoCType這3個方法,我們就可以方便地使用ArcObjects對象了。下面,讓我們通過一個從ArcSDE數據庫查詢要素的例子來再次熟悉一下Python中ArcObjects對象的使用:

GetAoModule('esriSystem.olb')
GetAoModule('esriDataSourcesGDB.olb')
GetAoModule('esriGeoDatabase.olb')

import comtypes.gen.esriSystem as esriSystem
aoInit = AoObj(esriSystem.AoInitialize, esriSystem.IAoInitialize)
pCode = esriSystem.esriLicenseProductCodeArcInfo
status = aoInit.IsProductCodeAvailable(pCode)
if status == esriSystem.esriLicenseAvailable:
 aoInit.Initialize(pCode)
props = AoObj(esriSystem.PropertySet, esriSystem.IPropertySet) props.SetProperty("server", "localhost") props.SetProperty("instance", "5151") props.SetProperty("user", "sde") props.SetProperty("password", "sde") props.SetProperty("version", "SDE.DEFAULT")


import comtypes.gen.esriDataSourcesGDB as esriDataSourcesGDB import comtypes.gen.esriGeoDatabase as esriGeoDatabase wf = AoObj(esriDataSourcesGDB.SdeWorkspaceFactory, esriGeoDatabase.IWorkspaceFactory) w = wf.Open(props, False) fw = AoCType(w, esriGeoDatabase.IFeatureWorkspace) fc = fw.OpenFeatureClass("sde.sde.cities") c = fc.Search(None, False) f = c.NextFeature() while (f != None): print(str(f.ObjectID)) f = c.NextFeature()
Copyright © Linux教程網 All Rights Reserved