Я хотів би мати можливість сценарію деяких речей, які не відкриваються через arcgisscripting
або ArcPy.
Як отримати доступ до ArcObjects з Python?
Я хотів би мати можливість сценарію деяких речей, які не відкриваються через arcgisscripting
або ArcPy.
Як отримати доступ до ArcObjects з Python?
Відповіді:
Завантажте та встановіть комтити *, поставте Snippets
модуль від Марка Седерхольма в PYTHONPATH, і все готово.
from snippets102 import GetLibPath, InitStandalone
from comtypes.client import GetModule, CreateObject
m = GetModule(GetLibPath() + "esriGeometry.olb")
InitStandalone()
p = CreateObject(m.Point, interface=m.IPoint)
p.PutCoords(2,3)
print p.X, p.Y
Для ознайомлення див. Презентації Марка Седерхольма для UberPyGeeks на тему "Використання ArcObjects в Python" . Існують окремі для перспектив розробників VBA та C ++. Вони використовують Visual Studio (так, з Express це нормально) та Windows SDK , але вони не потрібні, достатньо лише ArcGIS, Python та комтитів.
* Примітка для версії 10.1+ вам потрібно внести невеликі зміни automation.py
в модуль comtypes. Дивіться ArcObjects + comtypes в 10.1 .
... або: мозок пішов зміїним ? Дивлячись на приклади коду c #, ваші очі плавають, і спробуйте, як ви могли, просто не можете думати, як журавель ? Послухайте:
Так, презентація Марка Седерхольма, яку Метт Вілкі згадує вище, - чудове місце для початку. Рецепт / код, який Метт представляє, - це, безумовно, гладкий і, мабуть, найкращий шлях для речей. Хотілося б згадати, проте, досить жорстокий метод, який я використовую в ArcGIS 10.0. У мене є кілька сценаріїв автоматизації (автономний, поза межами програми), які я запускаю таким чином, і вони працюють чудово. Якщо максимальна швидкість викликає занепокоєння, ви можете просто піти з рішенням Метта і зробити це з ним.
Я використовую пакет comtypes для примусового обгортання всіх бібліотек ArcObjects (.olb). Тоді Python має доступ до всіх ArcObjects. Я отримав пакувальний код від Франка Перкса через розміщення на форумі ESRI . У мене був власний код, який по суті робив те саме, але він був роздутим і просто функціональним, тоді як його набагато красивіше. Тому:
import sys, os
if '[path to your Python script/module directory]' not in sys.path:
sys.path.append('[path to your Python script/module directory]')
import comtypes
#force wrapping of all ArcObjects libraries (OLBs)
import comtypes.client
# change com_dir to whatever it is for you
com_dir = r'C:\Program Files (x86)\ArcGIS\Desktop10.0\com'
coms = [os.path.join(com_dir, x) for x in os.listdir(com_dir) if os.path.splitext(x)[1].upper() == '.OLB']
map(comtypes.client.GetModule, coms)
Потім, майже прямо з презентації Марка Седерхольма:
import comtypes.gen.esriFramework
pApp = GetApp()
def GetApp():
"""Get a hook into the current session of ArcMap"""
pAppROT = NewObj(esriFramework.AppROT, esriFramework.IAppROT)
iCount = pAppROT.Count
if iCount == 0:
print 'No ArcGIS application currently running. Terminating ...'
return None
for i in range(iCount):
pApp = pAppROT.Item(i) #returns IApplication on AppRef
if pApp.Name == 'ArcMap':
return pApp
print 'No ArcMap session is running at this time.'
return None
def NewObj(MyClass, MyInterface):
"""Creates a new comtypes POINTER object where\n\
MyClass is the class to be instantiated,\n\
MyInterface is the interface to be assigned"""
from comtypes.client import CreateObject
try:
ptr = CreateObject(MyClass, interface=MyInterface)
return ptr
except:
return None
Це воно. Ви повинні мати повний доступ до ArcObjects, починаючи з об'єкта pApp, який є IApplication на об’єкт AppRef. На мій досвід, обгортання бібліотек ArcObjects під час першого запуску не є заперечно повільним, і для наступних запусків обгортання не відбувається. Бібліотеки вже завернуті і складені, тому справи набагато швидше.
Додано: Існує велика обережність, яка пов'язана з цим. Функція NewObj, наведена тут, передбачає, що сценарій Python виконується в процесі роботи. Якщо ні, ця функція створить об'єкти в процесі Python (тобто поза процесом), і посилання на об'єкти будуть неправильними. Для створення об'єктів процесу із зовнішнього скрипта Python слід використовувати IObjectFactory. Дивіться коментарі та поради Кірка Куйкендала в цій публікації про зміну ставок для отримання додаткової інформації.
Як отримати доступ до аркобектів з python?
Якщо ви шукаєте специфічну функціональність, яка існує і міститься в коді Arcobjects C ++, то найкращим варіантом буде створити методи C ++, щоб викликати їх ...., а потім створити обгортку пітона для доступу до цих методів C ++.
Існує досить багато способів отримати доступ до методів C ++ з python, і багато людей, які роблять це, використовують такий інструмент, як SWIG, щоб автоматично генерувати класи python з підписів методу C ++. З мого досвіду, ці автогенеровані API стають досить неприємними при передачі не-рідних типів C ++ (int, floats ) і ніколи не є дуже " пітонічними ".
Моїм рекомендованим рішенням було б використання API ctypes. Чудовий посібник тут: http://python.net/crew/theller/ctypes/tutorial.html
Основні етапи:
Це, мабуть, більш загальний спосіб посилання на код C / C ++ зсередини python, мабуть, у перспективі буде набагато простіше, якщо вам не доведеться мати справу з об’єктами COM. Це також дозволить усім функціональним функціям системи перебувати в компіляції пов'язаного об'єкта бібліотеки (тому python не буде специфічним для системи / python реалізації).
Іншим варіантом є використання Python для .NET - це дуже просто налаштувати, і він може працювати з будь-якими .NET DLL, включаючи ArcObjects.
У мене не виникало жодних проблем із предметами, які перебувають у процесі, і відкриття екземпляра ArcMap та додавання та маніпулювання шарами спрацювало мені добре.
Єдині вимоги - це папка, що містить бібліотеку Python для .NET, і стандартна установка Python.
Детальніше та зразок сценарію тут . Зразок сценарію також можна побачити безпосередньо на веб- сайті http://gist.github.com/923954
На жаль, хоча це працює без проблем на локальній машині розробки, для його розміщення в іншому місці потрібно встановити пакет програм ArcObjects SDK та Visual Studio (включаючи безкоштовне видання Express). Див. Розгортання DLL-файлів ArcObject .NET
Один із підходів, який я не бачу згадувати в інших відповідях, - це використовувати ті самі методи, якими користуються самі бібліотеки архпій. Наприклад, у C: \ Program Files \ ArcGIS \ Desktop10.0 \ arcpy \ arcpy \ cartography.py, ми бачимо, що Python викликає інструменти ArcObjects з використанням деяких поправок та функцій перетворення об’єктів.
Я не дуже сильно розміщувати про це тут, оскільки в коді написано: "ТРАНСПОРТНІ ТАЙНИ: ESRI ВЛАСНИЙ ТА КОНФІДЕНЦІЙНИЙ"; але ви також знайдете його в Інтернеті. У будь-якому випадку це виглядає як відносно простий спосіб викликати такі функції, як SimplifyBuilding_cartography()
без встановлення комтитів чи будь-яких інших зайвих бібліотек.
Редагувати:
Дивіться коментарі Джейсона нижче. Здається, що виконання вищезазначеного не дуже придбає вас.