Python中的Arcobjects:将接口分配给具有特征(形状)几何的对象


10

我正在尝试在Python中使用ArcObject。我确实在使用几何数据为我的对象分配接口(即IZ.InterpolateZsBetween)时遇到问题,代码为:

from Comtypes.client import CreateObject, GetModule
import arcgisscripting

gp = arcgisscripting.create(9.3)
gp.setproduct("ArcInfo")

esriSystem = GetModule("C:/Program Files (x86)/ArcGIS/com/esriSystem.olb")
esriGeometry = GetModule("C:/Program Files (x86)/ArcGIS/com/esriGeometry.olb")
esriDataSourcesGDB = GetModule("C:/Program Files (x86)/ArcGIS/com/esriDataSourcesGDB.olb")
esriGeoDatabase = GetModule("C:/Program Files (x86)/ArcGIS/com/esriGeoDatabase.olb")

sPath ="c:/temp/test.gdb"
pWSF = CreateObject(esriDataSourcesGDB.FileGDBWorkspaceFactory,\
                    interface=esriGeoDatabase.IWorkspaceFactory)
pWS = pWSF.OpenFromFile(sPath, 0)
pFWS = pWS.QueryInterface(esriGeoDatabase.IFeatureWorkspace)
pFClass = pFWS.OpenFeatureClass("test_z")
pFCursor = pFClass.Search(None, True)
pFeat = pFCursor.NextFeature()
pIZ = pFeat.QueryInferface(esriGeometry.IZ2)

为什么这不起作用?输出为:

 Traceback (most recent call last):
  File "<pyshell#175>", line 1, in <module>
    pIZ = pFeat.QueryInterface(esriGeometry.IZ2)
   File "C:\Python25\lib\site-packages\comtypes\__init__.py", line 1078, in QueryInterface
 self.__com_QueryInterface(byref(iid), byref(p))
 COMError: (-2147467262, 'Taki interfejs nie jest obs\xb3ugiwany.', (None, None, None, 0, 
 None))

所以我尝试了:

pShape = pFeat.ShapeCopy
pIZ = pShape.QueryInterface(esriGeometry.IZ2)
pShape.InterpolateZsBetween(0, 0, 0, 4)

这正在工作。但是,如何将其保留并保存在我的功能中?我正在学习Python和ArcObjects,所以请理解。任何帮助将不胜感激。


1
COM和Python看起来并不漂亮,但这是可以为您提供所需内容的途径。+1可以让您走得这么快!
Ragi Yaser Burhum 2011年

您可以通过一些帮助器功能对其进行调整
blah238

显然,COM和Python不能很好地结合使用,但是我认为Python会是我开始进行编程冒险的好地方,因为它看起来非常用户友好。完成此任务后,我将开始研究C#或C ++。非常感谢。
Tomek

Answers:


4

IZ接口仅在PolygonPolyline类上实现,您可以从Shape和的ShapeCopy属性中获得IFeature。您不能在对象不支持(实现或继承)的接口之间进行QI。使用其中一个ArcObjects SDK的文档来查看每个类实现的接口。阅读对象模型图(在帮助中的example的每个名称空间下列出)对于查看各种类和接口之间的继承/实现关系也非常有帮助。

对于实际的工作流程,您需要在要素类上使用Update代替Search方法来获取更新游标,然后将Shape要素的属性设置为InterpolateZsBetween方法的结果并最终调用IFeatureCursor.UpdateFeature(感谢@Ragi的更正) )。


2
一切都正确,除非您不想使用UpdateCursor调用IFeature :: Store(这违背了使用UpdateCursor的目的)。您想改为调用UpdateFeature。help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/...
鸭脚稗亚瑟Burhum
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.