Jak dotąd korzystasz z ArcObjects z Pythona? to moje najczęściej czytane i wymieniane pytania i odpowiedzi na temat wymiany stosów GIS. Mimo tego sukcesu jest to prawdopodobnie jeden z moich najsłabszych obszarów, jeśli chodzi o faktyczne wykorzystanie. Duża część tego kiepskiego pokazu wynika z mojej słabej umiejętności czytania i rozumienia dokumentów ArcObjects .
Więc, dla każdego zadania, jakie są wskazówki dotyczące tłumaczenia dokumentów .net / c ++ / java / ... i przykładów na ich odpowiedniki w Pythonie? (który język jest najlepszy do pracy w tej sprawie?) i od jakiego indeksu lub strony docelowej najlepiej zacząć? na czym należy się skupić, a co najmniej tak samo ważne, co można dowolnie ignorować?
Załóżmy, że twoi odbiorcy są co najmniej w pewnym stopniu znający język Python i niepiśmienni w innych językach programowania. Przeprowadź nas przez małe ćwiczenie kodowania, od wstępnego pomysłu i badań po działające wyniki Pythona.
źródło
Odpowiedzi:
Nie jestem zbyt silny w tym obszarze, ale zmodyfikowałem moduł Snippets i stworzyłem kilka opakowań dla bardzo prostych zadań. Mam przykład dodawania elementów liniowych. Przykład pod głównym blokiem tworzy trójkąt do widoku układu tuż poza dokumentem.
Używam tego skryptu w połączeniu z innymi kursorami wyszukiwania, aby tworzyć tabele graficzne w układzie z pojedynczych linii i elementów tekstowych, ale to szybko odchodzi od „prostego” przykładu. Poniższy kod jest dość prosty i wykorzystuje zmodyfikowaną wersję fragmentów:
Edytować:
@matt wilkie
Jeśli chodzi o ustalenie importu, w tym miejscu należy przejrzeć diagramy modeli ArcObjects lub sprawdzić, z której przestrzeni nazw wywoływana jest dana klasa lub interfejs w dokumentacji pomocy .NET SDK. W niektórych przypadkach ze względu na dziedziczenie można użyć więcej niż jednej przestrzeni nazw.
Nie jestem ekspertem od ArcObjects, więc zwykle zajmuje mi trochę czasu, aby dowiedzieć się, kiedy rzucić rzeczy za pomocą CType (). Większość z nich wybrałem z próbek online. Ponadto składnia z przykładów VB.NET wydaje się być bliższa temu, co robisz w Pythonie, ale przykłady C # mają dla mnie większy sens pod względem czytelności (jeśli ma to jakiś sens). Z reguły jednak postępuję zgodnie z następującymi krokami:
Nie jestem pewien, czy używam odpowiedniej terminologii, czy nie ... Jestem przede wszystkim programistą Pythona, który „dabled” w niektórych ArcObjects… Dotknąłem tylko wierzchołka góry lodowej.
Ponadto ta funkcja pomocnicza załaduje wszystkie biblioteki obiektów ArcObjects (.olb):
źródło
import comtypes.gen.esriArcMapUI as esriArcMapUI
a następnie używałeśpMxDoc = CType(pDoc, esriArcMapUI.IMxDocument)
(i odkryłeś składnię w tej instrukcji)?W innym, pokrewnym, ale nieco innym poście podałem odpowiedź, która może być interesująca dla użytkowników Pythona, którzy próbują owinąć głowy wokół Esri ArcObjects pomocy w dokumentacji.
Przyszedłem z drugiej strony: znałem już ArcObjects długo (długo długo), zanim jeszcze usłyszałem o pythonie, a dzięki takim postom jestem w stanie uwzględnić niektóre krytyczne ArcObjects w łatwym skryptowaniu Pythona (zobacz ten post na przykład ). Pamiętam frustrację związaną z próbą zrozumienia dziedzictwa, metod i właściwości; dylematy, takie jak mam X, które są trochę związane z Y ... więc jak mogę przejść z X do Y.Method ()?
Odpowiedź brzmi: spójrz na klasy CoClasses, które implementują interfejs (patrz pełny tekst tutaj ) .. na podstawowy przykład, jeśli chcę zobaczyć, czy warstwa ma zapytanie definicji, a jeśli tak, to co to jest:
W C #:
Zamiast
ctype
(co jest widoczne w VB) C # zastosowań()
lubas
do odlewu, na przykładIObject x = (IObject)y;
jest (zasadniczo) takie same jakIObject x = y as IObject;
co byłobydim x as IObject = ctype(y,IObject)
w VB.Mogę powiedzieć, że potrzebuję IFeatureLayer, aby dostać się do IFeatureLayerDefinition, ponieważ:
A kiedy czytasz dokument pomocy dla IFeatureLayer, widzisz:
Co oznacza, że bezpiecznie jest przejść ILayer-> IFeatureLayer-> IFeatureLayerDef, pod warunkiem, że ILayer jest typu FeatureLayer (lub dowolnej innej klasy CoClasses).
Więc co jest z ja i nie ja? Interfejs I oznacza, że to bit, który działa, bez I to CoClass ( typ ), więc wszystko, czego naprawdę chcesz użyć, powinno zaczynać się od I, a jeśli tworzysz nowy lub sprawdzasz typ następnie pomiń I. Interfejs może mieć wiele klas CoClass, a CoClass może obsługiwać wiele interfejsów, ale to interfejs faktycznie działa.
W python:
Ta próbka robi nieco więcej niż C, ponieważ trafia do bieżącej aplikacji, która byłaby dostępna tylko w oknie Pythona lub dodatku, jeśli spróbowałbyś uruchomić ją z wiersza poleceń, aplikacja ma wartość Null, a skrypt wtedy awaria z wyjątkiem wyjątku odniesienia zerowego.
źródło