Безусловно, Доступ к ArcObjects из Python? мои наиболее часто задаваемые вопросы и ответы на GIS Stack Exchange. Несмотря на этот успех, это, вероятно, одна из моих самых слабых областей, когда дело доходит до реального использования. Большая часть этого плохого показа проистекает из моей плохой способности читать и понимать документы ArcObjects .
Итак, для какой-либо конкретной задачи, каковы некоторые рекомендации по переводу .net / c ++ / java / ... документов и примеров в их эквиваленты python? (на каком языке лучше всего работать?) и с какого индекса лучше всего начинать индексную или целевую страницу? на какие вещи следует обратить внимание, и, по крайней мере, так важно, что можно свободно игнорировать?
Предположим, что ваша аудитория, по крайней мере, немного грамотна на Python и неграмотна на других языках разработки. Проведите нас через небольшое упражнение по программированию, от первоначальной идеи и исследований до результатов работы с Python.
источник
Ответы:
Я тоже не очень силен в этой области, но я изменил модуль Snippets и сделал пару упаковщиков для очень простых задач. У меня есть пример просто добавления линейных элементов. Пример под основным блоком образует треугольник с видом макета за пределами документа.
Я использую этот скрипт в сочетании с другими и дугообразными поисковыми курсорами, чтобы создавать графические таблицы в макете из отдельных строк и текстовых элементов, но это быстро отходит от «простого» примера. Код ниже довольно прост и использует модифицированную версию фрагментов:
Редактировать:
@matt Wilkie
Что касается определения импорта, то здесь вам нужно будет просмотреть диаграммы моделей ArcObjects или увидеть, из какого пространства имен вызывается конкретный класс или интерфейс в справочных документах .NET SDK. В некоторых случаях из-за наследования может использоваться более одного пространства имен.
Я не являюсь экспертом в ArcObjects, поэтому мне обычно требуется время, чтобы выяснить, когда кастовать вещи с помощью CType (). Большую часть этого я взял из образцов онлайн. Кроме того, синтаксис из примеров VB.NET, кажется, ближе к тому, что вы делаете в Python, но примеры C # имеют для меня больше смысла с точки зрения читабельности (если это имеет смысл). Но, как правило, я обычно делаю следующие шаги:
Не уверен, что я использую правильную терминологию или нет ... Я в первую очередь разработчик Python, который "балуется" в некоторых ArcObjects ... Хотя я только коснулся вершины айсберга.
Также эта вспомогательная функция загрузит все библиотеки объектов ArcObjects (.olb):
источник
import comtypes.gen.esriArcMapUI as esriArcMapUI
а затем использовалиpMxDoc = CType(pDoc, esriArcMapUI.IMxDocument)
(и раскрыли синтаксис в этом утверждении)?В другом связанном, но немного отличном посте я предоставил ответ, который может быть интересен для пользователей Python, пытающихся навести порядок в справочных документах Esri ArcObjects.
Я пришел с другой стороны: я уже знал ArcObjects задолго до того, как услышал о python, и благодаря таким публикациям я могу включить некоторые важные ArcObjects в простой сценарий python (см. Этот пост для примера ). Я помню разочарование от попыток понять наследование, методы и свойства; Дилеммы, как у меня есть X, который в некотором роде связан с Y ... так как мне перейти от X к Y.Method ()?
Ответ заключается в том, чтобы взглянуть на классы CoClasses, которые реализуют интерфейс (см. Полный текст здесь ) .. для базового примера, если я хочу посмотреть, есть ли у слоя запрос определения, и если да, то что это:
В C #:
Вместо
ctype
(что заметно в VB) C # использует()
илиas
для приведения, напримерIObject x = (IObject)y;
, (в основном) то же самое,IObject x = y as IObject;
что было быdim x as IObject = ctype(y,IObject)
в VB.Я могу сказать, что мне нужен IFeatureLayer, чтобы добраться до IFeatureLayerDefinition, потому что:
И когда вы читаете справочный документ для IFeatureLayer, вы видите:
Это указывает на то, что можно перейти в ILayer-> IFeatureLayer-> IFeatureLayerDef, при условии, что ILayer имеет тип FeatureLayer (или любой из других CoClasses).
Так что случилось с "я" и "нет"? Интерфейс I означает, что это бит, который выполняет работу, без I является CoClass ( тип ), поэтому все, что вы хотите использовать на самом деле, должно начинаться с I, и если вы создаете новый или проверяете тип затем пропустите I. Интерфейс может иметь много CoClass, и CoClass может поддерживать много интерфейсов, но это интерфейс, который на самом деле делает работу.
В питоне:
Этот пример делает немного больше, чем C в том смысле, что он находит свой путь к текущему приложению, которое будет доступно только в окне Python или надстройке, если вы попытаетесь запустить его из командной строки, приложение имеет значение Null, а сценарий затем сбой с нулевой ссылкой исключение.
источник