arcgisscripting
ArcPy ya da maruz kalmadıkları bazı şeyleri kodlayabilmek istiyorum.
ArcObjects'e Python'dan nasıl erişirim ?
arcgisscripting
ArcPy ya da maruz kalmadıkları bazı şeyleri kodlayabilmek istiyorum.
ArcObjects'e Python'dan nasıl erişirim ?
Yanıtlar:
Comtype'leri indirin ve kurun *, Snippets
PYTHONPATH'deki Mark Cederholm'dan modülü yerleştirin ve hepiniz hazırsınız.
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
Arka plan için Mark Cederholm'un UberPyGeeks ile ilgili "Python'da ArcObjects Kullanımı" konulu sunumlarına bakın . VBA ve C ++ geliştirici perspektifleri için ayrı olanlar vardır. Visual Studio'yu kullanırlar (evet Express iyidir) ve Windows SDK'yı kullanırlar , ancak bunlar zorunlu değildir, sadece ArcGIS, Python ve comtypes yeterlidir.
* 10.1+ için notautomation.py
, comtypes modülünde küçük bir değişiklik yapmanız gerekir . Bkz. ArcObjects + comtypes, 10.1 .
... ya da: beyin yılan gibi mi gitti ? C # kodu örneklerine bakmak gözlerinizin yüzmesini sağlar ve bir vinç gibi düşünemeyeceğiniz gibi deneyin ? Buraya bak:
Evet, Mark Cederholm'un Matt Wilkie'nin yukarıda bahsettiği sunumu başlamak için harika bir yer. Matt'in sunduğu tarif / kod, kesinlikle kaygan ve muhtemelen işlerle ilgili en iyi yoldur. Yine de ArcGIS 10.0'da kullandığım oldukça kaba kuvvet yönteminden bahsetmek istedim. Bu şekilde çalıştırdığım birkaç otomasyon betiğim var (bağımsız, uygulama sınırının dışında) ve bunlar gayet iyi çalışıyor. Eğer maksimum hız bir endişe ise, sadece Matt'in çözümüne gidip bununla bitebilirsiniz.
Tüm ArcObjects kütüphanelerinin (.olb) sarılmasını zorlamak için comtypes paketini kullanıyorum. Sonra Python tüm ArcObjects öğelerine erişebilir. Paket kodunu Frank Perks'ten bir ESRI forum ilanı aracılığıyla aldım . Temelde aynı şeyi yapan kendi kodum vardı, ancak çok daha güzel olmasına rağmen şişirildi ve yalnızca işlevseldi. Yani:
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)
Öyleyse, Mark Cederholm'un sunumundan hemen hemen:
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
Bu kadar. AppRef nesnesinde IApplication olan pApp nesnesiyle başlayan ArcObjects öğesine tam erişiminiz olmalıdır. Tecrübelerime göre, ArcObjects kütüphanelerinin ilk çalıştırmada sarılması sakıncalı derecede yavaş değildir ve sonraki çalıştırmalar için sargı gerçekleşmez. Kütüphaneler zaten sarılmış ve derlenmiştir, bu yüzden işler çok daha hızlıdır.
Eklendi: Bununla birlikte büyük bir dikkat var. Burada verilen NewObj işlevi, Python betiğinin işlem sırasında çalıştırıldığını varsayar. Aksi takdirde, bu işlev Python işleminde nesneler yaratacaktır (işlem dışı) ve nesne referansları yanlış olacaktır. Harici bir Python betiğinden işlem nesnesi oluşturmak için IObjectFactory kullanmanız gerekir. Daha fazla bilgi için Kirk Kuykendall'ın bu stackexchange yazısındaki yorumlarını ve ipuçlarını inceleyin .
Arcobjects'e python'dan nasıl erişirim?
Eğer aradığınız şey, C ++ Arcobjects kodunda var olan ve var olan belirli bir işlevsellik ise, en iyi bahsiniz, onları çağırmak için C ++ yöntemleri oluşturmak .... ve sonra bu C ++ yöntemlerine erişmek için bir piton sarıcı oluşturmak olacaktır.
Python'dan C ++ yöntemlerine erişmenin epeyce yolu vardır ve bunu yapan birçok kişi SW ++ gibi bir aracı kullanarak python sınıflarını C ++ yöntem imzalarından otomatik olarak oluşturur. Bu otomatikleştirilmiş API'lerin yerel olmayan C ++ türlerini (int, float) geçirirken oldukça kötüye gittiği ve hiçbir zaman çok " pitonik " olmadıklarıma dair deneyimim oldu .
Önerilen çözüm, ctypes API'sini kullanmak olacaktır. Harika bir öğretici burada: http://python.net/crew/theller/ctypes/tutorial.html
Temel adımlar:
Bu muhtemelen C / C ++ koduna python içinden başvurmak için daha genel bir yoldur, COM nesnelerle uğraşmak zorunda kalmazsanız, uzun vadede muhtemelen çok daha kolay olacaktır. Ayrıca, sisteme özgü tüm işlevselliğin, bağlantılı kütüphane nesnesinin derlemesinde bulunmasına izin verecektir (dolayısıyla python, sistem / python uygulamasına özel olmayacaktır).
Diğer bir seçenek ise Python for .NET kullanmaktır - kurulumu çok kolaydır ve ArcObject'ler de dahil olmak üzere herhangi bir .NET DLL dosyası ile çalışabilir.
Süreç içi engellerle ilgili herhangi bir sorun yaşamadım ve bir ArcMap örneği açmak ve benim için işe yarayan katmanlar eklemek ve işlemek benim için iyi oldu.
Tek gereksinim, .NET kütüphanesi için Python ve standart bir Python kurulumunu içeren bir klasördür.
Daha fazla detay ve burada örnek komut dosyası . Örnek komut dosyası doğrudan http://gist.github.com/923954 adresinde de görülebilir.
Ne yazık ki, bu yerel bir geliştirme makinesinde sorunsuz çalışıyor olsa da, başka bir yere yerleştirmek için ArcObjects SDK ve Visual Studio'nun (ücretsiz Express sürümü de dahil) kurulması gerekir. ArcObject .NET DLLlerini Dağıtma bölümüne bakınız.
Diğer cevaplarda bahsetmediğim bir yaklaşım, kutup kütüphanelerinin kendilerinin kullandığı yöntemleri kullanmaktır. Örneğin, C: \ Program Files \ ArcGIS \ Desktop10.0 \ arcpy \ arcpy \ cartography.py, Python'un bazı fixargs ve nesne dönüştürme işlevlerini kullanarak ArcObjects araçlarını çağırdığını görüyoruz.
Buraya burada yayınlamak ne kadar uygun değil, çünkü kod "TİCARET GİRİŞLERİ: ESRI PROPRIETARY VE GİZLİDİR"; ama onu web üzerinde başka bir yerde bulacaksın. Neyse, bu, SimplifyBuilding_cartography()
prototip veya başka herhangi bir ekstra kütüphaneyi kurmadan yapılan fonksiyonları çağırmanın nispeten kolay bir yolu gibi görünüyor .
Düzenle:
Jason'ın aşağıdaki yorumlarına bakın. Yukarıdakileri yapmak gibi geliyor size çok fazla almaz.