Arcobjects trong Python: gán giao diện cho các đối tượng có hình dạng đặc trưng (hình dạng)


10

Tôi đang cố gắng sử dụng ArcObject trong Python. Tôi có vấn đề với việc gán một giao diện (tức là IZ.InterpolateZsB between) cho đối tượng của tôi với dữ liệu hình học, mã là:

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)

Tại sao điều này không hoạt động? Đầu ra là:

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

Vì vậy, tôi đã cố gắng:

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

Và điều này đang làm việc. Nhưng làm thế nào để dán lại và lưu nó trong tính năng của tôi? Tôi đang học Python và ArcObjects, vì vậy hãy hiểu. Bất kỳ trợ giúp sẽ được đánh giá cao.


1
COM và Python trông không đẹp lắm, nhưng đây là tuyến đường sẽ mang lại cho bạn những gì bạn muốn. +1 để có được điều này quá nhanh!
Ragi Yaser Burhum

Bạn có thể tăng nó lên một chút với một số chức năng trợ giúp .
blah238

Aparently COM và Python không kết hợp tốt với nhau, nhưng tôi đã nghĩ rằng Python sẽ là nơi tốt để bắt đầu cuộc phiêu lưu của tôi với lập trình vì nó có vẻ khá thân thiện với người dùng. Khi tôi hoàn thành nhiệm vụ này, tôi sẽ bắt đầu xem xét C # hoặc C ++. Cám ơn mấy đứa nhiều.
Tomek

Câu trả lời:


4

Các IZgiao diện được thực hiện chỉ trên PolygonPolylinelớp học, mà bạn có được từ Shapehoặc ShapeCopytính chất của một IFeature. Bạn không thể QI giữa các giao diện không được hỗ trợ (được triển khai hoặc kế thừa) bởi một đối tượng. Sử dụng tài liệu cho một trong các SDK ArcObjects để xem các giao diện mà mỗi lớp thực hiện. Đọc sơ đồ mô hình đối tượng (được liệt kê dưới mỗi không gian tên trong ví dụ trợ giúp ) cũng có thể rất hữu ích để xem mối quan hệ kế thừa / thực hiện giữa các lớp và giao diện khác nhau.

Đối với quy trình làm việc thực tế của bạn, bạn sẽ cần sử dụng phương thức Updatethay vì Searchphương thức trên lớp tính năng của mình để lấy con trỏ cập nhật , sau đó đặt thuộc Shapetính của tính năng thành kết quả của InterpolateZsBetweenphương thức và cuối cùng gọi IFeatureCursor.UpdateFeature(cảm ơn vì đã sửa @Ragi ).


2
Mọi thứ đều chính xác, ngoại trừ bạn không muốn gọi IFeature :: Store bằng cách sử dụng UpdateCoder (nó đánh bại mục đích sử dụng UpdateCoder). Bạn muốn gọi UpdateFeature thay thế. help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/ Kẻ
Ragi Yaser Burhum
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.