আর্কজিআইএস পাইথন স্ক্রিপ্ট সরঞ্জামের জন্য ড্রপ-ডাউন বাক্সে নির্বাচিত স্তরটির পুরো পথ পাচ্ছেন?


11

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

আমি তখন arcpy.GetParameterAsText(0)আমার পাইথন স্ক্রিপ্টে প্যারামিটারটি পেতে মানক কোডটি ব্যবহার করছি । ডায়ালগের পাঠ্যটি ফাইলের পুরো পথ হওয়ায় ফাইল সিস্টেমের মাধ্যমে ব্রাউজ করে কোনও ফাইল নির্বাচন করা হলে এটি ঠিকঠাক কাজ করে, তবে আমি যখন ড্রপডাউন তালিকাটি থেকে নির্বাচন করি তখন আমার ফিরে আসা পাঠ্যটি কেবল ফাইলের নাম (যেমন file.tif)) ।

আমি যে কোডটি চালাচ্ছি তার ফাইলটির পুরো পথটি জানতে হবে - আমি এটি কীভাবে করব?

যদি আমি ধরে নিতে পারি যে ফাইলটি সর্বদা ওয়ার্কস্পেসে থাকে তবে আমি ফাইলের নামটি এতে যুক্ত arcpy.env.workspaceকরতে পারি, তবে আমি এটি ধরে নিতে পারি না। আমি একই নামের একটি খুঁজে না পাওয়া পর্যন্ত লোড হওয়া সমস্ত স্তরগুলির মধ্য দিয়ে পুনরাবৃত্তি করার দরকার পরে তার পুরো পথটি খুঁজে না পাওয়া, বা এর থেকে সহজতর কোনও উপায় নেই?


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

আপনার পুরো পথের দরকার কেন? প্রশ্নের এই গুরুত্বপূর্ণ অংশটি আপনার চারপাশের কাজের সাথে আপনার প্রশ্নের জবাব দিতে সহায়তা করতে পারে।
মাইকেল মারকিয়েটা

@ মিশেলমারকিটিয়া: আমি আমার পাইথন স্ক্রিপ্টে এমন কিছু কোড চালাচ্ছি যা সম্পূর্ণ পৃথক গ্রন্থাগার (আরকি সরবরাহ করে এমন কোনও কিছুর বাইরে) ব্যবহার করছে এবং এটির প্রক্রিয়াজাতকরণের জন্য ইনপুট ফাইলের পুরো পথ প্রয়োজন।
রবিন্টউ

উত্তর:


13

কিছুক্ষণ আগে আমারও একই সমস্যা ছিল। এটি একটি খুব সহজ ফিক্স, কেবল বর্ণনা সরঞ্জামটি ব্যবহার করুন।

আপনার পরামিতিগুলি থেকে ইতিমধ্যে স্তরটির নাম পাওয়া যাচ্ছে। সুতরাং আপনাকে যা করতে হবে তা হ'ল স্তরটি বর্ণনা করতে হবে, তারপথ খুঁজে দু'টি একত্রিত করুন।

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

এটি কোন সমস্যা করা উচিত।

আশাকরি এটা সাহায্য করবে


1
টিওসি-তে লেয়ারের নাম ফিচার ক্লাসের মতো না হলে কেবল আপনার মনে রাখবেন, উপরের উদাহরণে আপনাকে desc.name ব্যবহার করতে হবে।
শেঠডে

আপনি যদি স্তরটি পুরো পথটি ব্যবহার করেন না বা রাখেন না তবে আপনি কী জানেন? আমার সমাধানটি লেয়ারসোর্স = os.path.join (আরকিপি.ডেস্ক্রিপ্ট (স্তর) .পাথ, ওস.প্যাথ.বেসনেম (স্তর)) - পথের অংশগুলিতে যোগ দিতে স্ল্যাশ ব্যবহার সম্পর্কে নিশ্চিত নয়, আমি os.path.join আরও পাই নিরাপদ ... শীর্ষে আমদানি ওএস যুক্ত করা দরকার।
মিরো

আপনি স্যার একটি জীবন রক্ষাকারী। ভেরিয়েবলগুলির সাথে কাজ করার জন্য কীভাবে আমার ইনপুট পাথগুলি পেতে হয় তা নির্ধারণের চেষ্টা করার জন্য আমি গত কয়েক ঘন্টা ধরে আমার কম্পিউটারের বিরুদ্ধে মাথা ঘুরছি। যে কোডটির সাথে আমি কাজ করেছিলাম সেই প্রকল্পটিতে আমি এটি চালিয়েছিলাম, তবে দ্বিতীয় প্রকল্পটিতে আমি এটি চালিয়েছি 000732 "উপস্থিত নেই বা সমর্থিত নয়" পেয়েছি। আমি পাইথন উইন্ডোতে কোডটি ম্যানুয়ালি (পুরো পাথ সহ) পরীক্ষা করেছি এবং এটি কাজ করেছে। এই সমাধানটি আমাকে আমার ভেরিয়েবলগুলি এবং সঠিক ফর্ম্যাটিংয়ের সাহায্যে আরকিপি.সামগ্রী-টোটে_সামগ্রী () সরঞ্জামের পুরো পথটি অতিক্রম করার অনুমতি দেয়। এই সমাধান খুঁজে পাওয়া কঠিন ছিল! ধন্যবাদ!
জাচারি অর্ডো - 18:57

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.