ArcGIS पायथन स्क्रिप्ट टूल के लिए ड्रॉप-डाउन बॉक्स में चयनित परत का पूर्ण पथ प्राप्त करना?


11

मेरे पास ArcGIS में पायथन स्क्रिप्ट-आधारित टूल है। उपकरण के लिए मापदंडों में से एक एक इनपुट रेखापुंज फ़ाइल है, जिसे मैंने Raster Layer होने के लिए (टूलबॉक्स के भीतर टूल के गुणों का उपयोग करके) सेट किया है। इसका मतलब यह है कि जब मैं उस उपकरण को निष्पादित करता हूं तो मुझे उस पैरामीटर को चुनने के लिए विकल्प मिलता है, जो वर्तमान में भरी हुई रेखापुंज परतों की ड्रॉपडाउन सूची में से है, या फाइलसिस्टम के भीतर एक नई रेखापुंज परत को खोजने के लिए नेविगेट करके।

फिर मैं arcpy.GetParameterAsText(0)अपने पायथन लिपि में पैरामीटर प्राप्त करने के लिए मानक कोड का उपयोग कर रहा हूं । यह ठीक काम करता है जब मैं फाइलसिस्टम के माध्यम से ब्राउज़ करके किसी फ़ाइल का चयन करता हूं, क्योंकि संवाद में पाठ फ़ाइल के लिए पूर्ण पथ है, लेकिन जब मैं ड्रॉपडाउन सूची से चयन करता हूं तो मुझे जो पाठ वापस मिलता है वह सिर्फ फ़ाइल नाम (उदाहरण के लिए file.tif) है । ।

मैं जिस कोड को चला रहा हूं, उसे फ़ाइल का पूरा रास्ता पता होना चाहिए - मुझे यह कैसे मिलेगा?

अगर मुझे लगता है कि फ़ाइल हमेशा कार्यक्षेत्र में थी, तो मैं फ़ाइल नाम को जोड़ सकता हूं arcpy.env.workspace, लेकिन मैं यह नहीं मान सकता। क्या मुझे उन सभी परतों के माध्यम से पुनरावृति करने की आवश्यकता है जो तब तक लोड होती हैं जब तक कि मैं एक ही नाम के साथ एक नहीं पाता, और फिर इसका पूरा रास्ता ढूंढता हूं, या क्या कोई आसान तरीका है?


3
मैं सोच रहा हूं कि आप पुलडाउन सूची में से जो चुन रहे हैं, वह आपके TOC से एक परत का नाम है (जो इसके फ़ाइलनाम के समान होता है)। एक विचार के रूप में शायद आप उस परत नाम को खोजने के लिए ListLayers के माध्यम से पुनरावृति कर सकते हैं और एक बार अपनी डेटा स्रोत संपत्ति को एक्सेस करने के लिए कार्यक्षेत्रपाथ और डेटासेटनाम गुण संयुक्त प्राप्त कर सकते हैं।
PolyGeo

आपको पूर्ण पथ की आवश्यकता क्यों है? प्रश्न का यह महत्वपूर्ण हिस्सा किसी व्यक्ति को आपके काम का उत्तर देने में मदद कर सकता है।
माइकल मार्किटा

@MichaelMarkieta: मैं अपनी पायथन लिपि में कुछ कोड चला रहा हूं जो कि पूरी तरह से अलग लाइब्रेरी (किसी भी चीज़ के बाहर जो आर्कपी प्रदान करता है) का उपयोग कर रहा है और इसके लिए इसके प्रसंस्करण के लिए इनपुट फ़ाइल के पूर्ण पथ की आवश्यकता है।
रोबिन

जवाबों:


13

मैं थोड़ी देर पहले एक ही मुद्दा था। यह एक बहुत आसान तय है, बस वर्णन उपकरण का उपयोग करें।

आपके पहले से ही अपने मापदंडों से परत नाम हो रहा है। तो आपको केवल परत का वर्णन करना है, रास्ता ढूंढना है और फिर दोनों को मिलाना है।

layer = arcpy.GetParameterAsText(0)
desc = arcpy.Describe(layer)
path = desc.path
layersource = str(path) + "/" + layer

कि यह कोई समस्या नहीं होनी चाहिए।

उम्मीद है की यह मदद करेगा


1
बस ध्यान रखें कि टीओसी में लेयर का नाम फ़ीचर क्लास के समान नहीं है, तो आपको उपरोक्त उदाहरण में desc.name का उपयोग करना होगा।
1

उस मामले के बारे में जो आपको पता नहीं है कि क्या परत है या पूर्ण पथ नहीं है? मेरा समाधान है लेयरसोर्स = ओएसपीथ.जॉइन (आर्कपी.डाइज (परत) .path, os.path.basename (लेयर)) - पथ के कुछ हिस्सों में शामिल होने के लिए स्लैश का उपयोग करने के बारे में भी निश्चित नहीं है, मुझे ओएसपी। पीथ.जे.एन. सुरक्षित ... शीर्ष पर आयात ओएस जोड़ने की आवश्यकता है।
Miro

आप सर एक जीवन रक्षक हैं। मैं अपने कंप्यूटर के खिलाफ पिछले कई घंटों से यह जानने की कोशिश कर रहा हूं कि चर के साथ काम करने के लिए मेरे इनपुट रास्ते कैसे प्राप्त करें। जिस ओरिजिनल कोड पर मैं काम कर रहा था, मैं उस प्रोजेक्ट पर काम कर रहा था जिस पर मैंने उसे चलाया था, लेकिन तब मुझे 000732 मिला "दूसरे प्रोजेक्ट पर" नहीं है या सपोर्ट नहीं है "। मैंने पायथन विंडो में मैन्युअल रूप से (पूर्ण पथ के साथ) कोड का परीक्षण किया और यह काम किया। इस समाधान ने मुझे अपने चर और सही स्वरूपण के साथ चापलूसी करने के लिए पूर्ण पथ पारित करने की अनुमति दी। TableToTable_conversion () टूल। इस समाधान को खोजना मुश्किल था! धन्यवाद!
ज़ाचरी ऑरडो - जीआईएसपी

3

यदि आप इस संभावना पर ध्यान देना चाहते हैं कि उपयोगकर्ता फाइल सिस्टम के भीतर एक रेखापुंज निर्दिष्ट कर सकता है:

from os.path import split, join
layer = arcpy.GetParameterAsText(0)

#Check if there is a path on the input parameter. If not, prepend the path.
if not split(layer)[0]:
    layer = join(arcpy.Describe(layer).path, "{}.tif".format(layer))

3

ऐसा करने के लिए थोड़ा छोटा तरीका है। डेटा ऑब्जेक्ट का वर्णन करने के लिए एक कैटलॉगपैथ प्रॉपर्टी है जो फ़ाइल का पूर्ण पथ है।

10.1 संस्करण जिसका हम उपयोग कर रहे हैं, आप कर सकते हैं:

layer = arcpy.GetParameterAsText(0)
desc = arcpy.Describe(layer)
layersource = desc.catalogPath

2

आप इसके arcpy.GetParameter(0)बजाय उपयोग कर सकते हैं arcpy.GetParameterAsText(0)क्योंकि यह परत नाम के साथ सिर्फ एक स्ट्रिंग के बजाय परत वस्तु प्राप्त करेगा।

यदि आप एक लेयर ऑब्जेक्ट प्राप्त कर सकते हैं तो आप Layerसीधे प्रॉपर्टी प्राप्त कर सकते हैं और ए करने से बचा सकते हैं Describe

कुछ इस तरह आपको मिल सकता है कि आप क्या चाहते हैं:

import arcpy, os

lyr = arcpy.GetParameter(0)

# Check this is a Layer Object
if hasattr(lyr, "dataSource"): 
    arcpy.AddMessage("Datasource = {}".format(lyr.dataSource))
    filepath = lyr.dataSource
else:
    arcpy.AddMessage("Datasource = {}".format(str(lyr)))
    filepath = str(lyr)

0

यहाँ मैंने जो प्रयोग किया वह समाप्त हो गया। यह एक सम्मोहन की तरह काम करता है।

lyr = arcpy.mapping.ListLayers(mxd)[0]
desc = arcpy.Describe(lyr)
layersource = desc.catalogPath
print layersource
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.