Bei weitem Zugriff auf ArcObjects von Python? ist meine am häufigsten gelesene und referenzierte Frage und Antwort zu GIS Stack Exchange. Trotz dieses Erfolgs ist es wahrscheinlich einer meiner schwächsten Bereiche, wenn es um die tatsächliche Nutzung geht. Ein großer Teil dieser schlechten Darstellung ist auf meine schlechte Fähigkeit zurückzuführen, die ArcObjects-Dokumente zu lesen und zu verstehen .
Welche Richtlinien gibt es für eine bestimmte Aufgabe, um .net / c ++ / java / ... -Dokumente und -Beispiele in ihre Python-Entsprechungen zu übersetzen? (Aus welcher Sprache kann man am besten arbeiten?) und von welchem Index oder welcher Zielseite aus kann man am besten beginnen? Auf welche Dinge sollte man sich konzentrieren und wahrscheinlich mindestens genauso wichtig, was kann frei ignoriert werden?
Angenommen, Ihr Publikum verfügt zumindest über etwas Python-Kenntnisse und ist in anderen Entwicklungssprachen Analphabeten. Führen Sie uns durch eine kleine Codierungsübung, von der ersten Idee und Forschung bis hin zu funktionierenden Python-Ergebnissen.
quelle
Antworten:
Ich bin auch in diesem Bereich nicht sehr stark, aber ich habe das Snippets-Modul modifiziert und ein paar Wrapper für sehr einfache Aufgaben erstellt. Ich habe ein Beispiel für das Hinzufügen von Linienelementen. Das Beispiel unter dem Hauptblock bildet ein Dreieck mit der Layout - Ansicht gerade außerhalb des Dokuments.
Ich verwende dieses Skript in Verbindung mit einem anderen und bogenförmigen Suchcursor, um aus einzelnen Zeilen und Textelementen grafische Tabellen im Layout zu erstellen, aber das entfernt sich schnell vom "einfachen" Beispiel. Der folgende Code ist ziemlich einfach und verwendet eine modifizierte Version von Snippets:
Bearbeiten:
@ Matt Wilkie
Um die Importe herauszufinden, müssen Sie in den ArcObjects-Modelldiagrammen nachsehen, von welchem Namespace eine bestimmte Klasse oder Schnittstelle in den .NET SDK-Hilfedokumenten aufgerufen wird. In einigen Fällen kann aufgrund der Vererbung mehr als ein Namespace verwendet werden.
Ich bin kein Experte für ArcObjects, daher brauche ich normalerweise eine Weile, um herauszufinden, wann ich Dinge mit CType () umsetzen soll. Das meiste davon habe ich online von Proben abgeholt. Auch die Syntax aus den VB.NET-Beispielen scheint näher an der in Python zu sein, aber die C # -Beispiele sind für mich in Bezug auf die Lesbarkeit sinnvoller (wenn dies sinnvoll ist). Als Faustregel befolge ich normalerweise die folgenden Schritte:
Ich bin mir nicht sicher, ob ich die richtige Terminologie verwende oder nicht ... Ich bin in erster Linie ein Python-Entwickler, der sich in einigen ArcObjects "versucht" ... Ich habe jedoch nur die Spitze des Eisbergs berührt.
Diese Hilfsfunktion lädt auch alle ArcObjects-Objektbibliotheken (.olb):
quelle
import comtypes.gen.esriArcMapUI as esriArcMapUI
später verwendenpMxDoc = CType(pDoc, esriArcMapUI.IMxDocument)
(und die Syntax in dieser Anweisung aufdecken)?In einem anderen, verwandten, aber etwas anderen Beitrag habe ich eine Antwort gegeben, die für Python-Benutzer von Interesse sein könnte, die versuchen, ihre Köpfe um die Hilfedokumente von Esri ArcObjects zu wickeln.
Ich kam von der anderen Seite: Ich kannte ArcObjects schon lange (lange, lange), bevor ich überhaupt von Python gehört hatte, und dank solcher Beiträge kann ich einige wichtige ArcObjects in die einfache Skripterstellung von Python einbeziehen ( ein Beispiel finden Sie in diesem Beitrag ). Ich erinnere mich an die Frustration, Vererbung, Methoden und Eigenschaften zu verstehen. Dilemmata wie ich habe X, das irgendwie mit Y zusammenhängt ... also wie komme ich von X zu Y.Method ()?
Die Antwort besteht darin, sich die CoClasses anzusehen, die die Schnittstelle implementieren (siehe Volltext hier ). Ein grundlegendes Beispiel, wenn ich sehen möchte, ob eine Ebene eine Definitionsabfrage hat, und wenn ja, was ist das?
In C #:
Anstelle von
ctype
C # verwendet (was in VB prominent ist)()
oderas
zum Gießen, zum BeispielIObject x = (IObject)y;
ist (grundsätzlich) die gleiche wieIObject x = y as IObject;
der wäredim x as IObject = ctype(y,IObject)
in VB.Ich kann sagen, dass ich einen IFeatureLayer benötige , um zu IFeatureLayerDefinition zu gelangen, weil:
Und wenn Sie das Hilfedokument für IFeatureLayer lesen, sehen Sie:
Dies zeigt an, dass es sicher ist, ILayer-> IFeatureLayer-> IFeatureLayerDef zu wählen, vorausgesetzt, der ILayer ist vom Typ FeatureLayer (oder einer der anderen CoClasses).
Also, was ist los mit dem Ich und nein Ich? Das I bedeutet Schnittstelle, es ist das Bit, das die Arbeit erledigt, ohne dass ein I eine CoClass (ein Typ ) ist. Alles, was Sie tatsächlich verwenden möchten, sollte mit einem I beginnen und wenn Sie ein neues erstellen oder den Typ überprüfen Überspringen Sie dann das I. Eine Schnittstelle kann viele CoClasses haben und eine CoClass kann viele Schnittstellen unterstützen, aber es ist die Schnittstelle, die tatsächlich die Arbeit erledigt.
In Python:
Dieses Beispiel macht etwas mehr als das C, da es den Weg zur aktuellen Anwendung findet, die nur im Python-Fenster oder in einem Add-In verfügbar wäre. Wenn Sie versuchen, dies über die Befehlszeile auszuführen, ist die Anwendung Null und das Skript würde dann Absturz mit einer Nullreferenzausnahme.
quelle