পাইথন থেকে আরকঅবজেক্টগুলি অ্যাক্সেস করছেন?


132

আমি এমন কিছু জিনিস স্ক্রিপ্ট করতে সক্ষম হতে চাই যা arcgisscriptingআর্কপাইয়ের মাধ্যমে প্রকাশ করা হয়নি।

আমি পাইথন থেকে আরকঅবজেক্টগুলি কীভাবে অ্যাক্সেস করব ?


3
উত্পাদনের পরিবেশে এই পদ্ধতিগুলি ব্যবহার করার বিষয়ে কারও ধারণা আছে? কয়েক বছর আগে ইউসিতে আমি এমন একটি ইএসআরআই সি ++ দেবের সাথে কথা বললাম যারা তাদের বেশিরভাগ পাইথন মডিউল লেখেন এবং তিনি উত্পাদনের পরিবেশে আয়রন পাইথন ব্যবহারের বিরোধিতা করেছিলেন - তবে এটি কয়েক বছর আগে ছিল।
চাদ কুপার

উত্তর:


113

ডাউনলোড করে ইনস্টল করুন comtypes *, করা Snippetsকোনো PYTHONPATH মার্ক Cederholm থেকে মডিউল, এবং আপনি পুরোপুরি তৈরি।

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

পটভূমির জন্য "পাইথনের আর্কওবেক্টস ব্যবহার করে " উপর উবারপাইগিক্সের জন্য মার্ক সিডারহোলমের উপস্থাপনাগুলি দেখুন । ভিবিএ এবং সি ++ বিকাশকারী দৃষ্টিভঙ্গির জন্য আলাদা আলাদা রয়েছে। তারা ভিজ্যুয়াল স্টুডিও (হ্যাঁ এক্সপ্রেস ঠিক আছে) এবং উইন্ডোজ এসডিকে ব্যবহার করে তবে এগুলি প্রয়োজন হয় না, কেবল আর্কজিআইএস, পাইথন এবং কমপিপগুলি যথেষ্ট।

স্নিপেটস মডিউলটি পাওয়া

* 10.1+ এর জন্য দ্রষ্টব্য আপনাকে automation.pyকমপ্লেস মডিউলে একটি ছোট পরিবর্তন করতে হবে । আরকোবজেক্টস + কমপিপগুলি 10.1 এ দেখুন ।


পরবর্তী পদক্ষেপ

... বা: মস্তিস্কে কি বেহালতা ? সি # কোড উদাহরণগুলি দেখে আপনার চোখটি সাঁতার কাটবে, এবং এমন চেষ্টা করুন যা আপনি কেবল ক্রেনের মতো ভাবতে পারেন না ? এখানে দেখুন:


10
এই থ্রেডটি আমার নজরে আনা হয়েছে এবং দেখে মনে হচ্ছে চারদিকে কিছু ভুল ধারণা রয়েছে। পাইথনে আরকোবজেক্টগুলি ব্যবহার করার জন্য আপনার ভিজ্যুয়াল স্টুডিও বা এমআইডিএল সংকলক প্রয়োজন নেই; আপনার যা দরকার তা হ'ল কমপাইট প্যাকেজ। আমার উপস্থাপনাটিতে পাইথন ব্যবহার করে একটি সিওএম উপাদান তৈরি করার ক্ষেত্রে একটি উন্নত অনুশীলন অন্তর্ভুক্ত ছিল, তবে এটি উবারপাইগিক্সের জন্য বোঝানো হয়েছিল। Snippets.py ফাইলটিতে আপনার প্রয়োজনীয় সমস্ত উদাহরণ রয়েছে।

1
@ মার্ক, সংশোধন করার জন্য অনেক ধন্যবাদ। পরিষ্কার হতে হবে: উপরের রেসিপিটিতে সিটিপস ইতিমধ্যে ইনস্টল হওয়া অবধি কেউ 1,3,4 টি পদক্ষেপ সরিয়ে ফেলতে পারে ?
ম্যাট উইলকি

2
হ্যাঁ। এটি পরীক্ষাগারে পরীক্ষিত। আপনাকে কেবল কমপিপগুলি ইনস্টল করতে হবে।
আর কে

@ আরকে, দুর্দান্ত! যাচাইকরণ এবং উত্তরটি আপ টু ডেট করার জন্য ধন্যবাদ।
ম্যাট উইলকি

1
স্নিপেটস মডিউলটি এখানে ইনস্টলযোগ্য আও মডিউল হিসাবে পুনঃস্থাপন করুন: github.com/maphew/arcplus/tree/master/arcplus/ao (10.3-র জন্য আপডেট হয়েছে, 10.2-র জন্য ফাইলের পূর্ববর্তী সংস্করণগুলি দেখুন)। আমি কিছু বাগ মুছে ফেলার পরে প্রধান উত্তরটি আপডেট করব।
ম্যাট উইলকি

32

হ্যাঁ, ম্যাট উইলকি উপরে উল্লেখ করেছেন যে মার্ক সিডারহোলমের উপস্থাপনাটি শুরু করার জন্য দুর্দান্ত জায়গা। ম্যাট যে রেসিপি / কোডটি উপস্থাপন করছে তা অবশ্যই জিনিসগুলির মধ্যে যাওয়ার জন্য সম্ভবত একটি চতুর এবং সম্ভবত সেরা উপায়। আমি উল্লেখ করতে চেয়েছিলাম, তবে, বরং আমি বলছিলাম বরং আরজিজিআইএস 10.0-তে ব্যবহার করা উচিত ru আমার বেশ কয়েকটি অটোমেশন স্ক্রিপ্ট রয়েছে (স্ট্যান্ডআলোন, অ্যাপ্লিকেশন সীমার বাইরে) যা আমি এইভাবে চালাই এবং সেগুলি ঠিক কাজ করে। সর্বাধিক গতি যদি উদ্বেগের বিষয়, তবে, আপনি কেবল ম্যাট এর সমাধান নিয়ে যেতে পারেন এবং এটি দিয়ে সম্পন্ন করতে পারেন।

আমি সমস্ত আরকোবজেক্ট লাইব্রেরি (.olb) মোড়ানোর জন্য কমপাইটস প্যাকেজটি ব্যবহার করি। তারপরে পাইথনের সমস্ত আরকোবজেক্টে অ্যাক্সেস রয়েছে। আমি একটি ইএসআরআই ফোরাম পোস্টের মাধ্যমে ফ্র্যাঙ্ক পার্কের কাছ থেকে মোড়কের কোড পেয়েছি । আমার নিজস্ব কোড ছিল যা মূলত একই জিনিসটি করেছিল, তবে এটি ফুলে ওঠে এবং কেবল কার্যকরী ছিল, যখন তার অনেক সুন্দর ছিল। তাই:

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

এটাই. অ্যাপআরএফ অবজেক্টে আইপ্লিকেশন হ'ল পিপ্পিজ অবজেক্ট দিয়ে শুরু হওয়া আপনার আর্কওবজেক্টগুলিতে সম্পূর্ণ অ্যাক্সেস থাকা উচিত। আমার অভিজ্ঞতায়, প্রথম রান করে আরকোবজেক্টস লাইব্রেরি মোড়ানো আপত্তিজনকভাবে ধীর নয় এবং পরবর্তী রানগুলির জন্য মোড়কটি ঘটবে না। গ্রন্থাগারগুলি ইতিমধ্যে মোড়ানো এবং সংকলিত রয়েছে, তাই জিনিসগুলি আরও দ্রুততর হয়।

যোগ করা হয়েছে: এটির সাথে একটি বড় সতর্কতা রয়েছে। এখানে দেওয়া নিউওবিজে ফাংশন ধরে নিয়েছে পাইথন স্ক্রিপ্টটি প্রক্রিয়াধীন চলছে। যদি তা না হয় তবে এই ফাংশনটি পাইথন প্রক্রিয়াতে (যেমন প্রসেস অফ আউট প্রসেস) তৈরি করবে এবং অবজেক্টের রেফারেন্সগুলি ভুল হবে। বাহ্যিক পাইথন স্ক্রিপ্ট থেকে প্রক্রিয়া অবজেক্ট তৈরি করতে আপনার আইওবজেক্টফ্যাক্টরি ব্যবহার করা উচিত। আরও তথ্যের জন্য এই স্ট্যাকেক্সচেঞ্জ পোস্টে কার্ক কুইকেনডালের মন্তব্য এবং টিপস দেখুন।


1
এই পদ্ধতির সুন্দর জিনিসটি হ'ল এটির জন্য ভিজ্যুয়াল স্টুডিও ইনস্টল করার দরকার নেই, এটির জন্য ভারী ভারী ওজন যদি কেবলমাত্র আপনি এটির সাথে কাজ করেন তবে কম বিষয়গুলি নিবন্ধ করুন। আমি যদি এই খাঁটি অজগর পদ্ধতিটি সম্পর্কে জানতাম তবে আমি সম্ভবত সিডারহোলমের রুটটি চেষ্টা করতাম না। ;-)
ম্যাট উইলকি

1
আমি এই উত্তরে এই ধারণাকে কিছুটা প্রসারিত করেছি, আমদানি করে এবং প্রকারের লাইব্রেরিগুলিকে এক-পদক্ষেপ প্রক্রিয়া মোড়ানো: gis.stackexchange.com/questions/5017/…
blah238

20

অজগর থেকে আমি কীভাবে আরকোবজেক্টগুলি অ্যাক্সেস করব?

আপনি যা সন্ধান করছেন তা যদি সুনির্দিষ্ট কার্যকারিতা যা বিদ্যমান এবং এটি C ++ আরকোবজেক্টস কোডে রয়েছে, তবে আপনার সেরা বেট হবে তাদের কল করার জন্য সি ++ পদ্ধতি তৈরি করা .... এবং তারপরে সেই সি ++ পদ্ধতিগুলি অ্যাক্সেস করার জন্য একটি পাইথন মোড়ক তৈরি করা।

পাইথন থেকে সি ++ পদ্ধতি অ্যাক্সেস করার বেশ কয়েকটি উপায় রয়েছে এবং এর ফলে প্রচুর লোক সি ++ পদ্ধতির স্বাক্ষর থেকে পাইথন ক্লাসগুলি স্বয়ংক্রিয়ভাবে জেনারেট করতে এসডাব্লুআইজি -এর মতো একটি সরঞ্জাম ব্যবহার করে । আমার অভিজ্ঞতা হয়েছে যে এই অটো-জেনারেটেড এপিআইগুলি নন-নেটিভ সি ++ টাইপগুলি (ইনট, ফ্লোটস) পাস করার সময় বেশ খারাপ লাগে এবং কখনই খুব ' পাইথোনিক ' হয় না ।

আমার প্রস্তাবিত সমাধানটি হবে সিটিপিএস এপিআই ব্যবহার করা। একটি দুর্দান্ত টিউটোরিয়ালটি এখানে রয়েছে: http://python.net/crew/theller/ctypes/tutorial.html

প্রাথমিক পদক্ষেপগুলি হ'ল:

  1. আপনার কয়েকটি মূল যুক্তি সি ++ তে লিখুন, যেখানে আপনি বিশ্বাস করেন পাইথন পারফরম্যান্স একটি সমস্যা হতে পারে
  2. সিস্টেম সংকলক (এনমেক, মেক ইত্যাদি) ব্যবহার করে অবজেক্ট ফাইল থেকে একটি মূল যুক্তিকে (আরকোবজেক্ট সি ++ এপিআই পদ্ধতি কলগুলি ব্যবহার করে) একটি ভাগ করা (.so) বা ডায়নামিক লাইব্রেরি (.dll) তে সংকলন করুন)
  3. পাইথন ক্লাস এবং সি ++ পদ্ধতির স্বাক্ষরের মধ্যে একটি টাইপ ম্যাপিং লিখুন [এসডব্লিউআইজি এটি স্বয়ংক্রিয় করার চেষ্টা করে, তবে এটি সহজ, এমনকি ক্রেজি অবজেক্টের প্রকারগুলি ব্যবহার করে]
  4. আপনার পাইথন প্রোগ্রামে সংকলিত গ্রন্থাগারটি আমদানি করুন এবং আবদ্ধ শ্রেণি / পদ্ধতি বাইন্ডিংগুলি অন্য অজগর শ্রেণীর মতো ব্যবহার করুন!

পাইথনের মধ্যে থেকে সি / সি ++ কোডটি উল্লেখ করার পক্ষে এটি সম্ভবত আরও সাধারণ উপায়, আপনাকে যদি COM অবজেক্টের সাথে ডিল করতে না হয় তবে দীর্ঘমেয়াদে এটি সম্ভবত আরও সহজ হতে চলেছে। এটি লিঙ্কযুক্ত লাইব্রেরি অবজেক্টের সংকলনে সিস্টেম নির্দিষ্ট সমস্ত কার্যকারিতাও মঞ্জুরি দেয় (যাতে পাইথন সিস্টেম / পাইথন বাস্তবায়ন নির্দিষ্ট হবে না)।


3
এটি আর্কওবজেক্টসের সাথে ইন্টারঅ্যাক্ট করার সবচেয়ে ভাল পদ্ধতি and প্রোটোটাইপিংয়ের জন্য কমটাইপের ব্যবহার দুর্দান্ত তবে নিজের সি এক্সটেনশান লেখার ফলস্বরূপ পাইথোনিক ডিজাইনের (কারণ আপনাকে এটি সম্পর্কে ভাবতে হবে) এবং আরও ভাল পারফরম্যান্স আসবে কারণ আপনি সি ++ / পাইথন অবজেক্ট বাধাটিকে ততটা অতিক্রম করেননি। যদিও ব্যবহারিক উদ্দেশ্যে, এটি নকশা করা / বিকাশ / ডিবাগ করা আরও শক্ত তাই দ্রুত এবং ময়লা উইন্ডোটির বাইরে চলে যায়।
জেসন শিয়েরার

18

অন্য বিকল্পটি। নেট জন্য পাইথন ব্যবহার করা - এটি সেটআপ করা খুব সহজ, এবং আরকোবজেক্টস সহ যে কোনও নেট নেটএলএল এর সাথে কাজ করতে পারে।

আমি প্রক্রিয়াধীন পর্যবেক্ষণগুলির সাথে কোনও সমস্যা অনুভব করি নি, এবং আর্কেম্যাপের একটি উদাহরণ খোলার জন্য এবং স্তরগুলি সংযোজন ও পরিচালনা করে আমার পক্ষে ভাল কাজ করে।

কেবলমাত্র প্রয়োজনীয়তাগুলি .NET লাইব্রেরির জন্য পাইথনযুক্ত একটি ফোল্ডার এবং একটি স্ট্যান্ডার্ড পাইথন ইনস্টল।

আরও বিশদ এবং নমুনা স্ক্রিপ্ট এখানে । নমুনা স্ক্রিপ্টটি সরাসরি http://gist.github.com/923954 এও দেখা যাবে

দুর্ভাগ্যক্রমে, যদিও এটি কোনও স্থানীয় বিকাশ মেশিনে সমস্যা ছাড়াই কাজ করে, অন্য কোথাও এটি মোতায়েনের জন্য আরকোবজেক্টস এসডিকে এবং ভিজ্যুয়াল স্টুডিও (ফ্রি এক্সপ্রেস সংস্করণ সহ) ইনস্টল করা দরকার। আরাকোবজেক্ট মোতায়েন দেখুন। নেট ডিএলএল


রেসিপিটি পরিষ্কার, লুসিড এবং ভালভাবে উপস্থাপন করা হয়েছে। ধন্যবাদ জিওগ্রাফিক! আমি আপনাকে আপনার উত্তরে একটি ন্যূনতম স্ক্রিপ্ট স্নিপেট অন্তর্ভুক্ত করার জন্য উত্সাহিত করব, যাতে ইভেন্টে আপনার সাইটটি সংস্কারের মধ্য দিয়ে যায় তবে উত্তরটি নিজের মতো করে দাঁড়াতে পারে।
ম্যাট উইলকি

1
এই পুরাতন ব্লগপোস্টে আমি ঠিক এটিই করেছি ( gissolve.blogspot.com/2009/06/python-toolbox-3-pythonnet.html ) এবং এটি প্রত্যাশার মতো কাজ করে তবে ফলাফলটি নিশ্চিত করতে নিশ্চিত করুন যে আপনার পাইথন স্ক্রিপ্ট বুঝতে পারে (স্ট্রিংস, সংখ্যাগুলি) বা অকার্যকর)।
স্যামুয়েল

লিঙ্ক geographichika.co.uk/using-arcobjects- এবং- নেট- ইন- পঠন ভাঙা।
এসআইস্লাম

5

আমি অন্য জবাবগুলিতে উল্লিখিত দেখতে পাই না এমন একটি পদ্ধতি হ'ল আরকি লাইব্রেরিগুলি নিজেরাই ব্যবহার করে এমন পদ্ধতিগুলি ব্যবহার করে। যেমন সি: \ প্রোগ্রাম ফাইলস \ আর্কজিআইএস \ ডেস্কটপ ১০.০ \ আরকিপি \ আরকিপি \ কার্টোগ্রাফি.পি, আমরা পাইথন কলিং আর্কওবজেক্টস সরঞ্জামগুলি কিছু ফিক্সার্গস এবং অবজেক্ট রূপান্তর ফাংশন ব্যবহার করে দেখি।

কোডটি "ট্রেড সিক্রেটস: ইএসআরআই স্বত্বাধিকারী এবং গোপনীয়" বলে যেহেতু এখানে এটি পোস্ট করা কতটা ঠিক আছে তা আমি জানি না; তবে আপনি এটি ওয়েবে অন্য কোথাও খুঁজে পাবেন। যাইহোক, SimplifyBuilding_cartography()এটি কমপিপস বা অন্য কোনও অতিরিক্ত লাইব্রেরি ইনস্টল না করে ফাংশনগুলিতে কল করার তুলনামূলক সহজ উপায় বলে মনে হচ্ছে ।

সম্পাদনা:

নীচে জেসন এর মন্তব্য দেখুন। উপরের মতো করার মতো শব্দগুলি আপনাকে বেশি দামে কিনবে না।


আমি এটিও লক্ষ্য করেছিলাম, যদিও খুব বেশি ভুডু লাগছে।
blah238

1
এটি আরকোবজেক্টগুলির সম্পূর্ণ উন্মুক্ত সেটকে কল করছে না।
জেসন শিয়েরার

@ জেসনশায়ার, এটি যেভাবেই হোক না কেন, এটি স্পষ্টত আরকিপিআইপি থেকে আরকোবজেক্টগুলিতে (আমার মনে হয়) কিছু বৃহত্তর অ্যাক্সেসের অনুমতি দেয় এবং অন্য লাইব্রেরি স্থাপনের প্রয়োজন না পড়ার সুবিধা রয়েছে। যদি আপনি অন্যান্য লোকেরা ব্যবহারের জন্য সরঞ্জাম বিকাশ করেন তবে আধুনিকতা গুরুত্বপূর্ণ। এই পদ্ধতির মাধ্যমে আপনি কীভাবে অ্যাক্সেস পেতে পারেন তার পুরো সীমাটি জানতে চাই - এটি নির্দিষ্ট উদ্দেশ্যে যথেষ্ট হতে পারে। (যদিও আমি এখনই চেক করতে পারছি না - আমি ল্যান সংস্থায় নেই।)
লার্শ

1
আমি আপনাকে এমন একটি সত্যের জন্য আশ্বাস দিতে পারি যা তা করে না। আমি এর অনেকটা বিকাশ করেছি।
জেসন শিয়েরার

1
তুমি পার না. "আরকঅবজেক্ট" এই উদাহরণে কিছুটা মিসনোমার। অন্তর্নিহিত অবজেক্টগুলিতে পৌঁছানোর কোনও উপায় নেই এবং আরকিসিস্ক্রিপ্টিং / আরকিপি-র যে কোনও জায়গাতেই সমস্ত আর্কওবজেক্টগুলি প্রকাশ করার কোনও সিওএম বাঁধাই নেই।
জেসন শিয়েরার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.