Arcobjects ใน Python: กำหนดอินเตอร์เฟสให้กับวัตถุที่มีรูปทรงเรขาคณิต (รูปร่าง)


10

ฉันพยายามใช้ ArcObject ใน Python ฉันมีปัญหากับการกำหนดอินเทอร์เฟซ (เช่น 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

Aparently COM และ Python ไม่เข้าคู่กัน แต่ฉันคิดว่า Python จะเป็นสถานที่ที่ดีในการเริ่มต้นการผจญภัยของฉันด้วยการเขียนโปรแกรมเนื่องจากดูเหมือนว่าเป็นมิตรกับผู้ใช้ เมื่อฉันจะทำภารกิจนี้ให้สำเร็จฉันจะเริ่มดู C # หรือ C ++ ขอบคุณมาก ๆ
Tomek

คำตอบ:


4

IZอินเตอร์เฟซที่จะดำเนินการเฉพาะในPolygonและPolylineชั้นเรียนที่คุณได้รับจากShapeหรือคุณสมบัติของShapeCopy IFeatureคุณไม่สามารถ QI ระหว่างอินเทอร์เฟซที่ไม่ได้รับการสนับสนุน (ถูกนำมาใช้หรือสืบทอด) โดยวัตถุ ใช้เอกสารประกอบสำหรับหนึ่งในArcObjects SDKเพื่อดูอินเทอร์เฟซที่แต่ละคลาสใช้ การอ่านไดอะแกรมโมเดลวัตถุ (แสดงรายการภายใต้แต่ละเนมสเปซในวิธีใช้ตัวอย่าง ) อาจเป็นประโยชน์อย่างมากในการดูความสัมพันธ์การสืบทอด / การนำไปใช้ระหว่างคลาสและอินเตอร์เฟสที่หลากหลาย

สำหรับเวิร์กโฟลว์ที่แท้จริงของคุณคุณจะต้องใช้วิธีการUpdateแทนSearchในคลาสคุณลักษณะของคุณเพื่อรับเคอร์เซอร์อัปเดตจากนั้นตั้งค่าShapeคุณสมบัติของคุณสมบัติเป็นผลลัพธ์ของInterpolateZsBetweenวิธีและสุดท้ายเรียกIFeatureCursor.UpdateFeature(ขอบคุณสำหรับการแก้ไข @Ragi )


2
ทุกอย่างถูกต้องยกเว้นคุณไม่ต้องการโทร IFeature :: Store โดยใช้ UpdateCursor (ซึ่งเป็นจุดประสงค์ในการใช้ UpdateCursor คุณต้องการโทร UpdateFeature แทน help.arcgis.com/th/sdk/10.0/arcobjects_net/componenthelp/ …
Ragi Yaser Burhum
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.