Ich versuche, ArcObject in Python zu verwenden. Ich habe Probleme beim Zuweisen einer Schnittstelle (dh IZ.InterpolateZsBetween) zu meinem Objekt mit Geometriedaten. Der Code lautet:
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)
Warum funktioniert das nicht? Die Ausgabe ist:
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))
Also habe ich versucht:
pShape = pFeat.ShapeCopy
pIZ = pShape.QueryInterface(esriGeometry.IZ2)
pShape.InterpolateZsBetween(0, 0, 0, 4)
Und das funktioniert. Aber wie kann ich es zurückkleben und in meiner Funktion speichern? Ich lerne Python und ArcObjects, bitte seien Sie verständlich. Jede Hilfe wird geschätzt.
arcobjects
python
Tomek
quelle
quelle
Antworten:
Die
IZ
Schnittstelle ist nur für die KlassenPolygon
und implementiertPolyline
, die Sie aus den EigenschaftenShape
oderShapeCopy
von erhaltenIFeature
. Sie können keine QI zwischen Schnittstellen durchführen, die von einem Objekt nicht unterstützt (entweder implementiert oder geerbt) werden. Verwenden Sie die Dokumentation für eines der ArcObjects-SDKs , um die Schnittstellen anzuzeigen , die jede Klasse implementiert. Das Objektmodell Diagramme lesen (unter jedem Namensraum in der Hilfe aufgeführten Beispiel ) kann auch sehr hilfreich sein , die Vererbung / Umsetzung Beziehungen zwischen den verschiedenen Klassen und Schnittstellen zu sehen.Für Ihren eigentlichen Workflow müssen Sie die Methode
Update
anstelle vonSearch
in Ihrer Feature-Class verwenden, um einen Aktualisierungscursor zu erhalten. Anschließend müssen Sie dieShape
Eigenschaft des Features auf das Ergebnis derInterpolateZsBetween
Methode setzen und schließlich aufrufenIFeatureCursor.UpdateFeature
(danke für die Korrektur @Ragi) ).quelle