Я хотел бы иметь возможность написать некоторые вещи, которые не доступны через arcgisscripting
ArcPy или ArcPy.
Как мне получить доступ к ArcObjects из Python?
python
arcobjects
comtypes
Мэтт Уилки
источник
источник
Ответы:
Скачайте и установите комтипы *, поместите
Snippets
модуль от Марка Седерхолма в PYTHONPATH, и все готово.Для справки см. Презентации Марка Седерхольма для UberPyGeeks на тему «Использование ArcObjects в Python» . Есть отдельные для перспектив разработчиков VBA и C ++. Они используют Visual Studio (да, Express в порядке) и Windows SDK , но они не обязательны, достаточно только ArcGIS, Python и compepes.
Получение модуля Snippets
* Обратите внимание, что для версии 10.1+ необходимо внести небольшое изменение
automation.py
в модуль comtypes. Смотрите ArcObjects + comtypes в 10.1 .Следующие шаги
... или: мозг сошел с ума ? Глядя на примеры кода на c #, вы поплываете в глаза и стараетесь, как можете, просто не думать как журавль ? Смотри сюда:
источник
Да, презентация Марка Седерхольма, о которой упоминал Мэтт Уилки, - отличное место для начала. Рецепт / код, который представляет Мэтт, безусловно, является хитрым и, вероятно, лучшим способом решения проблем. Я хотел упомянуть, однако, довольно грубый метод, который я использую в ArcGIS 10.0. У меня есть несколько сценариев автоматизации (автономных, вне границ приложения), которые я запускаю таким образом, и они работают просто отлично. Если максимальная скорость вызывает беспокойство, вы можете просто воспользоваться решением Мэтта и покончить с ним.
Я использую пакет comtypes для принудительного переноса всех библиотек ArcObjects (.olb). Затем Python имеет доступ ко всем объектам ArcObject. Я получил упаковочный код от Фрэнка Перкса через публикацию на форуме ESRI . У меня был свой собственный код, который по сути делал то же самое, но он был раздутым и просто функциональным, в то время как его код намного красивее. Так:
Затем, в значительной степени прямо из презентации Марка Седерхольма:
Вот и все. У вас должен быть полный доступ к объектам ArcObject, начиная с объекта pApp, который является IApplication для объекта AppRef. По моему опыту, оборачивание библиотек ArcObjects при первом запуске не является неожиданно медленным, и для последующих запусков обертывание не происходит. Библиотеки уже упакованы и скомпилированы, так что все намного быстрее.
Добавлено: с этим связана большая осторожность. Функция NewObj, приведенная здесь, предполагает, что скрипт Python выполняется в процессе. Если нет, эта функция будет создавать объекты в процессе Python (т.е. вне процесса), и ссылки на объекты будут неправильными. Для создания в процессе объектов из внешнего скрипта Python вы должны использовать IObjectFactory. См. Комментарии и советы Кирка Куйкендалла в этом стековом сообщении для получения дополнительной информации.
источник
Если вам нужна конкретная функциональность, которая существует и присутствует в коде C ++ Arcobjects, то лучше всего было бы создать методы C ++ для их вызова ..., а затем создать оболочку Python для доступа к этим методам C ++.
Существует довольно много способов получить доступ к методам C ++ из python, и многие люди, которые делают это, используют такой инструмент, как SWIG, для автоматической генерации классов python из сигнатур методов C ++. По моему опыту, эти автоматически сгенерированные API-интерфейсы становятся довольно неприятными при передаче не родных типов C ++ (int, float) и никогда не бывают « питонными ».
Мое рекомендуемое решение было бы использовать API ctypes. Отличное учебное пособие здесь: http://python.net/crew/theller/ctypes/tutorial.html
Основные шаги:
Вероятно, это более общий способ ссылаться на код C / C ++ изнутри python, в долгосрочной перспективе, вероятно, будет намного проще, если вам не придется иметь дело с COM-объектами. Это также позволит использовать все специфические для системы функции при компиляции связанного библиотечного объекта (поэтому python не будет зависеть от реализации системы / python).
источник
Другой вариант - использовать Python для .NET - его очень легко настроить, и он может работать с любыми .NET DLL, включая ArcObjects.
У меня не было никаких проблем с внутрипроцессными объектами, и открытие экземпляра ArcMap, добавление и управление слоями работало для меня нормально.
Единственными требованиями являются папка, содержащая библиотеку Python for .NET, и стандартная установка Python.
Более подробная информация и образец сценария здесь . Пример сценария также можно увидеть по адресу http://gist.github.com/923954.
К сожалению, хотя это работает без проблем на локальном компьютере разработки, для его развертывания в другом месте требуется установить ArcObjects SDK и Visual Studio (включая бесплатную редакцию Express). См. Развертывание DLL-библиотек ArcObject .NET.
источник
Один из подходов, о которых я не упоминал в других ответах, - это использование тех же методов, которые используют сами библиотеки arcpy. Например, в C: \ Program Files \ ArcGIS \ Desktop10.0 \ arcpy \ arcpy \ cartography.py, мы видим, что Python вызывает инструменты ArcObjects, используя некоторые фиксаторы и функции преобразования объектов.
Я не знаю, насколько это нормально, чтобы публиковать об этом здесь, так как в коде написано "СЕКРЕТЫ ТОРГОВЛИ: СОБСТВЕННОСТЬ И КОНФИДЕНЦИАЛЬНОСТЬ ESRI"; но вы найдете это и в других местах в Интернете. В любом случае, это выглядит как относительно простой способ вызова функций, например,
SimplifyBuilding_cartography()
без установки comtypes или каких-либо других дополнительных библиотек.Редактировать:
Смотрите комментарии Джейсона ниже. Похоже, что выполнение вышеупомянутого не купит вам много.
источник