मैं कुछ ऐसी चीजों को स्क्रिप्ट करने में सक्षम होना चाहूंगा जो कि arcgisscripting
या आर्कपी के माध्यम से उजागर नहीं होती हैं।
मैं पायथन से ArcObjects का उपयोग कैसे करूं ?
मैं कुछ ऐसी चीजों को स्क्रिप्ट करने में सक्षम होना चाहूंगा जो कि arcgisscripting
या आर्कपी के माध्यम से उजागर नहीं होती हैं।
मैं पायथन से ArcObjects का उपयोग कैसे करूं ?
जवाबों:
Comtypes * को डाउनलोड और इंस्टॉल करें , 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 के लिए मार्क सीडरहोम की प्रस्तुतियों को "पायथन में आर्कओब्जेक्ट्स का उपयोग करना" देखें । वीबीए और सी ++ डेवलपर दृष्टिकोण के लिए अलग-अलग हैं। वे विजुअल स्टूडियो (हाँ एक्सप्रेस ठीक है) और विंडोज एसडीके का उपयोग करते हैं , लेकिन इनकी आवश्यकता नहीं है, बस आर्कगिस, पायथन और कॉम्पटिप पर्याप्त हैं।
* 10.1+ के लिए ध्यान दें आपको automation.py
कॉम्पटिप मॉड्यूल में एक छोटा सा बदलाव करने की आवश्यकता है। 10.1 पर ArcObjects + comtypes देखें ।
... या: दिमाग सनक गया ? सी # कोड उदाहरणों को देखते हुए आपकी आँखें तैर जाती हैं, और कोशिश करें कि आप एक क्रेन की तरह नहीं सोच सकते ? इधर देखो:
हां, मार्क सीडरहोम की प्रस्तुति जो मैट विल्की का उल्लेख करती है, शुरू करने के लिए एक शानदार जगह है। मैट द्वारा प्रस्तुत नुस्खा / कोड निश्चित रूप से एक चालाक है और शायद चीजों के बारे में जाने का सबसे अच्छा तरीका है। मैं जिक्र करना चाहता था, हालाँकि, मैं बलगम विधि का उपयोग कर रहा हूँ जिसका उपयोग मैं आर्कगिस 10.0 में कर रहा हूँ। मेरे पास कई स्वचालन स्क्रिप्ट हैं (स्टैंडअलोन, एप्लिकेशन सीमा के बाहर) जो मैं इस तरह से चलाता हूं, और वे बस ठीक काम करते हैं। यदि अधिकतम गति एक चिंता का विषय है, हालांकि, आप सिर्फ मैट के समाधान के साथ जा सकते हैं और इसके साथ किया जा सकता है।
मैं सभी ArcObjects पुस्तकालयों (.olb) के रैपिंग को मजबूर करने के लिए comtypes पैकेज का उपयोग करता हूं। फिर पायथन की सभी आर्कोबजेक्ट्स तक पहुंच है। मुझे ईएसआरआई फोरम पोस्टिंग के माध्यम से फ्रैंक पर्क से रैपिंग कोड मिला । मेरा अपना कोड था जो अनिवार्य रूप से एक ही काम करता था, लेकिन यह फूला हुआ था और केवल कार्यात्मक था, जबकि उसका बहुत सुंदर है। इसलिए:
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
बस। आपके पास आर्कऑब्जेक्ट्स के लिए पूर्ण पहुंच होनी चाहिए जो कि PAP ऑब्जेक्ट के साथ शुरू होता है जो कि AppRef ऑब्जेक्ट पर IApplication है। मेरे अनुभव में, पहले रन पर आर्कोबजेक्ट्स लाइब्रेरी की रैपिंग आपत्तिजनक रूप से धीमी नहीं है, और बाद के रनिंग के लिए रैपिंग नहीं होती है। पुस्तकालय पहले से ही लिपटे और संकलित हैं, इसलिए चीजें बहुत तेज हैं।
जोड़ा: इसके साथ आने वाली एक बड़ी सावधानी है। यहां दिए गए NewObj फ़ंक्शन ने माना कि पायथन लिपि को प्रक्रिया में चलाया जा रहा है। यदि नहीं, तो यह फ़ंक्शन पायथन प्रक्रिया में ऑब्जेक्ट्स बनाएगा (अर्थात प्रक्रिया से बाहर), और ऑब्जेक्ट संदर्भ गलत होंगे। बाहरी पायथन स्क्रिप्ट से प्रक्रिया ऑब्जेक्ट बनाने के लिए आपको IObjectFactory का उपयोग करना चाहिए। अधिक जानकारी के लिए इस स्टैकएक्सचेंज पोस्ट में कर्क कुक्केंडल की टिप्पणियों और सुझावों को देखें ।
मैं अजगर से आर्कोबिज कैसे पहुंचता हूं?
यदि आप जिस चीज़ की तलाश कर रहे हैं, वह विशिष्ट कार्यक्षमता है जो मौजूद है और सी ++ आर्कबॉजेक्ट्स कोड में है, तो आपका सबसे अच्छा शर्त यह होगा कि आप उन्हें कॉल करने के लिए सी ++ तरीके बनाएं .... और फिर उन सी ++ विधियों का उपयोग करने के लिए एक अजगर आवरण बनाएँ।
अजगर से C ++ विधियों का उपयोग करने के लिए काफी कुछ तरीके हैं, और बहुत से लोग जो ऐसा करते हैं, जो कि C ++ विधि हस्ताक्षर से अजगर कक्षाओं को ऑटो-जनरेट करने के लिए SWIG जैसे उपकरण का उपयोग करते हैं । यह मेरा अनुभव रहा है कि इन ऑटोजेनरेटेड एपीआई को गैर-देशी सी ++ प्रकार (इंट, फ्लोट्स) पास करते समय बहुत बुरा लगता है और कभी भी बहुत ' पाइथोनिक ' नहीं होते हैं ।
मेरा अनुशंसित समाधान ctypes API का उपयोग करना होगा। एक महान ट्यूटोरियल यहाँ है: http://python.net/crew/theller/ctypes/tutorial.html
बुनियादी कदम हैं:
यह शायद अजगर के भीतर से C / C ++ कोड को संदर्भित करने के लिए अधिक सामान्य तरीका है, यह संभवत: लंबे समय में बहुत सरल होने जा रहा है यदि आपको COM ऑब्जेक्ट से निपटना नहीं है। यह सभी सिस्टम विशिष्ट कार्यक्षमता को लिंक किए गए लाइब्रेरी ऑब्जेक्ट के संकलन में भी रहने देगा (ताकि अजगर सिस्टम / पायथन कार्यान्वयन विशिष्ट नहीं होगा)।
एक और विकल्प .NET के लिए पायथन का उपयोग करना है - यह सेट करना बहुत आसान है, और आर्कओबजेक्ट सहित किसी भी .NET DLL के साथ काम कर सकते हैं।
मैंने इन-प्रोसेस ओब्सेस के साथ किसी भी समस्या का अनुभव नहीं किया है, और आर्कपेज़ का एक उदाहरण खोलना और परतों को जोड़ना और हेरफेर करना मेरे लिए ठीक काम किया है।
केवल आवश्यकताएँ .NET लाइब्रेरी के लिए पायथन से युक्त एक फ़ोल्डर हैं, और एक मानक पायथन स्थापित है।
अधिक विवरण और नमूना लिपि यहाँ । नमूना लिपि को सीधे http://gist.github.com/923954 पर भी देखा जा सकता है
दुर्भाग्य से, जब यह एक स्थानीय विकास मशीन पर समस्याओं के बिना काम करता है, तो इसे कहीं और तैनात करने के लिए ArcObjects SDK, और Visual Studio (मुक्त एक्सप्रेस संस्करण सहित) की आवश्यकता होती है। तैनात करना देखें
अन्य दृष्टिकोणों में उल्लिखित एक दृष्टिकोण मुझे उन्हीं विधियों का उपयोग करने के लिए है, जो स्वयं आर्कपी लाइब्रेरीज़ उपयोग करते हैं। उदाहरण के लिए C: \ Program Files \ ArcGIS \ Desktop10.0 \ arcpy \ arcpy \ cartography.py, हम पायथन को कुछ फिक्सार्ग और ऑब्जेक्ट रूपांतरण कार्यों का उपयोग करते हुए आर्केओबजेक्ट्स टूल बुलाते हुए देखते हैं।
मैं इसके बारे में यहां पोस्ट करने के लिए कितना ठीक हूं, क्योंकि कोड "ट्रेड सिक्रेट: ESRI PROPRIETARY AND CONFIDENTIAL" कहता है; लेकिन आप इसे वेब पर भी कहीं और पाएंगे। वैसे भी, यह SimplifyBuilding_cartography()
कॉम्पटियों या किसी अन्य अतिरिक्त पुस्तकालयों को स्थापित किए बिना कार्यों को कॉल करने के लिए अपेक्षाकृत आसान तरीका लगता है ।
संपादित करें:
नीचे जेसन की टिप्पणियाँ देखें। ऐसा लगता है कि ऊपर करने से आप बहुत कुछ नहीं खरीदेंगे।