当前位置: 首页 > news >正文

在Python中使用ArcObjects对象

在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下的安装界面是这个样子的:

image

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

相关文章:

  • C#脚本实践(二): Unity脚本机制分析
  • postgresql 数据库-密码修改
  • 解决linux oracle shell上下箭调用历史命令
  • 模板 BFS
  • 类加载器及其委托机制的深入分析
  • 《.NET 4.0面向对象编程漫谈》勘误表(2011年1月14日更新)
  • 【转】Android中的内存管理--不错不错,避免使用枚举类型
  • VisualSVN server安装及使用 转
  • Protobuf-net学习笔记
  • how to solve ORA-02293
  • (floyd+补集) poj 3275
  • 我大四了,oh,我要毕业了 _随笔
  • MeeGo handset 1.1开发环境[3]:直接使用Qemugl
  • Resharper
  • C++ VS C#(1):注释,变量,控制台输出
  • Android系统模拟器绘制实现概述
  • go语言学习初探(一)
  • JAVA_NIO系列——Channel和Buffer详解
  • Koa2 之文件上传下载
  • php面试题 汇集2
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Vue组件定义
  • 从输入URL到页面加载发生了什么
  • 高度不固定时垂直居中
  • 今年的LC3大会没了?
  • 开源地图数据可视化库——mapnik
  • 巧用 TypeScript (一)
  • 如何合理的规划jvm性能调优
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  •  一套莫尔斯电报听写、翻译系统
  • 用简单代码看卷积组块发展
  • 智能网联汽车信息安全
  • mysql面试题分组并合并列
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​低代码平台的核心价值与优势
  • # C++之functional库用法整理
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $.ajax()方法详解
  • (1)bark-ml
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (十六)串口UART
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • **PHP二维数组遍历时同时赋值
  • ..回顾17,展望18
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET Core中Emit的使用
  • .NET 反射的使用
  • /etc/fstab 只读无法修改的解决办法
  • @EnableConfigurationProperties注解使用
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [1159]adb判断手机屏幕状态并点亮屏幕