Arcobjects dalam Python: menetapkan antarmuka ke objek dengan geometri fitur (bentuk)

10

Saya mencoba menggunakan ArcObject dengan Python. Saya memang punya masalah dengan menetapkan antarmuka (yaitu IZ.InterpolateZsBetween) ke objek saya dengan data geometri, kode adalah:

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)

Kenapa ini tidak berhasil? Outputnya adalah:

 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))

Jadi saya mencoba:

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

Dan ini berhasil. Tetapi bagaimana cara mengembalikannya dan menyimpannya di fitur saya? Saya belajar Python dan ArcObjects, jadi harap dipahami. Bantuan apa pun akan dihargai.

Tomek
sumber
1
COM dan Python tidak terlihat sangat cantik, tetapi ini adalah rute yang akan memberi Anda apa yang Anda inginkan. +1 untuk mencapai sejauh ini dengan sangat cepat!
Ragi Yaser Burhum
Anda dapat membuatnya sedikit dengan beberapa fungsi pembantu .
blah238
Aparently COM dan Python tidak berjalan berpasangan dengan baik, tetapi saya berpikir bahwa Python akan menjadi tempat yang baik untuk memulai petualangan saya dengan pemrograman karena tampaknya cukup ramah pengguna. Setelah saya menyelesaikan tugas ini, saya akan mulai melihat C # atau C ++. Terima kasih banyak kawan.
Tomek

Jawaban:

4

The IZantarmuka diimplementasikan hanya pada Polygondan Polylinekelas, yang Anda peroleh dari Shapeatau ShapeCopysifat-sifat suatu IFeature. Anda tidak bisa QI antara antarmuka yang tidak didukung (baik diimplementasikan atau diwarisi) oleh suatu objek. Gunakan dokumentasi untuk salah satu SDK ArcObjects untuk melihat antarmuka yang diterapkan setiap kelas. Membaca Diagram Model Obyek (tercantum di bawah setiap namespace dalam bantuan, contoh ) juga bisa sangat membantu untuk melihat hubungan warisan / implementasi antara berbagai kelas dan antarmuka.

Adapun alur kerja Anda yang sebenarnya, Anda harus menggunakan metode Updatealih - alih Searchpada kelas fitur Anda untuk mendapatkan kursor pembaruan , dan kemudian mengatur Shapeproperti fitur ke hasil InterpolateZsBetweenmetode dan akhirnya memanggil IFeatureCursor.UpdateFeature(terima kasih atas koreksi @Ragi ).

blah238
sumber
2
Semuanya benar, kecuali Anda tidak ingin memanggil IFeature :: Store menggunakan UpdateCursor (itu mengalahkan tujuan menggunakan UpdateCursor). Anda ingin memanggil UpdateFeature sebagai gantinya. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/…
Ragi Yaser Burhum