设为首页 收藏本站
查看: 1501|回复: 0

[经验分享] 在Python中使用ArcObjects对象

[复制链接]

尚未签到

发表于 2017-4-29 06:15:03 | 显示全部楼层 |阅读模式
  在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下的安装界面是这个样子的:
DSC0000.gif

  在这步完成以后,所有对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()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370531-1-1.html 上篇帖子: 学习python的一点小知识 下篇帖子: 使用vim开发python及graphviz绘图
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表