PythonのArcobject:フィーチャ(形状)ジオメトリを持つオブジェクトにインターフェイスを割り当てます


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

あなたはいくつかのヘルパー関数でそれを少しきれいにすることができます
blah238

どうやらCOMとPythonはうまく組み合わせられていないようですが、Pythonはプログラミングを始めるのに最適な場所だと思っていました。このタスクを完了したら、C#またはC ++を調べ始めます。みんなありがとう。
Tomek

回答:


4

IZインターフェイスだけに実装されているPolygonPolylineあなたから取得するクラス、ShapeまたはShapeCopyの性質IFeature。オブジェクトによってサポートされていない(実装または継承されていない)インターフェイス間でQIを実行することはできません。ArcObjects SDKの 1つのドキュメントを使用して、各クラスが実装するインターフェースを確認します。オブジェクトモデルダイアグラム(ヘルプの例の各名前空間の下にリストされている)を読むことも、さまざまなクラスとインターフェース間の継承/実装関係を確認するのに非常に役立ちます。

実際のワークフローについては、フィーチャクラスUpdateでの代わりにSearchメソッドを使用して更新カーソルを取得しShape、機能のプロパティをInterpolateZsBetweenメソッドの結果に設定して、最後にを呼び出す必要がありますIFeatureCursor.UpdateFeature(修正@Ragiに感謝) )。


2
UpdateCursorを使用してIFeature :: Storeを呼び出したくない場合を除いて、すべてが正しいです(UpdateCursorを使用する目的に反します)。代わりにUpdateFeatureを呼び出します。help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/...
Ragi Yaser Burhum
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.