উত্তর:
এই জাতীয় সমস্যার জন্য বাছাই করা তৈরি হয়েছিল। এটিকে "কন" এর "স্যুইচ" (বা "কেস") সংস্করণ হিসাবে ভাবেন, এটি "যদি ... অন্যথায়" মানচিত্রের বীজগণিত বাস্তবায়ন।
যদি 3 টি ওভারল্যাপিং রাস্টার থাকে তবে উদাহরণস্বরূপ, (পাইথন) সিনট্যাক্সটি দেখতে পাবেন
inPositionRaster = 1 + int(3 * CreateRandomRaster())
Pick(inPositionRaster, [inRas01, inRas02, inRas03])
নোট যে pick
সূচক 1 থেকে শুরু হয়, 0 নয়।
(মন্তব্য থ্রেড দেখুন)
নোডাটা মানগুলির সাথে লড়াই করতে, আপনাকে প্রথমে আর্কজিআইএসের নোটাটা হ্যান্ডলিং বন্ধ করতে হবে। নোডাটার জায়গায় যেমন একটি বিশেষ (তবে বৈধ) মান রয়েছে এমন গ্রিড তৈরি করে এটি করুন যেমন 99999 (বা যাই হোক না কেন: তবে উপস্থিত হতে পারে এমন কোনও বৈধ সংখ্যার চেয়ে বড় যে মানটি চয়ন করবেন তা নিশ্চিত করুন : এটি পরে কার্যকর হবে) । এটি যেমন ইসনুল অনুরোধটি ব্যবহার করে তেমন প্রয়োজন
p01 = Con(IsNull(inRas01), 99999, inRas01)
p02 = Con(IsNull(inRas02), 99999, inRas01)
p03 = Con(IsNull(inRas03), 99999, inRas01)
উদাহরণস্বরূপ, এই এক-সারি গ্রিডগুলির ক্ষেত্রে বিবেচনা করুন (নোডাটা "*" হিসাবে দেখানো হয়েছে):
inRas01: 1 2 19 4 * * * *
inRas02: 9 2 * * 13 14 * *
inRas03: 17 * 3 * 21 * 23 *
ফলাফলটি প্রতিটি "*" এর জায়গায় একটি 99999 রাখে।
এরপরে, নোডাটা অনুপস্থিত ব্লকগুলি (গর্ত) এর সাথে সম্পর্কিত কাঠের ব্লকের সমতল অ্যারে হিসাবে এই সমস্ত রাস্টারদের কল্পনা করুন। আপনি যখন এই রেস্টারগুলিকে উল্লম্বভাবে স্ট্যাক করবেন তখন ব্লকগুলি তাদের নীচে যে কোনও গর্তে পড়ে যাবে। নোডাটা মানগুলি বাছাই করা এড়াতে আমাদের সেই আচরণের প্রয়োজন: আমরা ব্লকের স্ট্যাকের কোনও উল্লম্ব ফাঁক চাই না। প্রতিটি টাওয়ারের ব্লকের ক্রমটি সত্যিকার অর্থে কোনও ব্যাপার নয়। এই লক্ষ্যে, আমরা ডেটা র্যাঙ্কিংয়ের মাধ্যমে প্রতিটি টাওয়ার পেতে পারি :
q01 = Rank(1, [p01, p02, p03])
q02 = Rank(2, [p01, p02, p03])
q03 = Rank(3, [p01, p02, p03])
উদাহরণস্বরূপ, আমরা প্রাপ্ত
q01: 1 2 3 4 13 14 23 99999
q02: 9 2 19 99999 21 99999 99999 99999
q03: 17 99999 99999 99999 99999 99999 99999 99999
মনে রাখবেন যে র্যাঙ্কগুলি সর্বনিম্ন থেকে সর্বোচ্চ থেকে সর্বোচ্চ, সুতরাং Q01 প্রতিটি অবস্থানে সর্বনিম্ন মান রাখে, q02 -তে দ্বিতীয়-সর্বনিম্ন ইত্যাদি থাকে। নোডাটা কোডগুলি সমস্ত বৈধ সংখ্যা সংগ্রহ না করা পর্যন্ত দেখাতে শুরু করে না, কারণ এই কোডগুলি হয় বৃহত্তর কোনো বৈধ সংখ্যার চেয়ে।
এলোমেলো নির্বাচনের সময় এই নোডাটা কোডগুলি বাছাই এড়াতে, আপনাকে প্রতিটি স্থানে কতগুলি ব্লক স্ট্যাক করা আছে তা জানতে হবে: এটি আমাদের জানায় যে কতগুলি বৈধ মান ঘটে। এটি পরিচালনা করার একটি উপায় হ'ল নোডাটা কোডের সংখ্যা গণনা করা এবং মোট নির্বাচনের গ্রিডগুলির সংখ্যা থেকে বিয়োগ:
n0 = 3 - EqualToFrequency(99999, [q01, q02, q03])
এই ফলন
n0: 3 2 2 1 2 1 1 0
কেসগুলি হ্যান্ডেল করতে যেখানে এন = 0 (যাতে নির্বাচনের জন্য কিছুই পাওয়া যায় না), তাদের নোডাটাতে সেট করুন:
n = SetNull(n0 == 0, n0)
এখন
n: 3 2 2 1 2 1 1 *
এটি আপনার (অস্থায়ী) নোডাটা কোডগুলি চূড়ান্ত গণনায় অদৃশ্য হয়ে যাওয়ার নিশ্চয়তা দেয়। 1 এবং n এর মধ্যে এলোমেলো মান উত্পন্ন করুন:
inPositionRaster = 1 + int(n * CreateRandomRaster())
উদাহরণস্বরূপ, এই রাস্টার দেখতে লাগবে
inPositionRaster: 3 2 1 1 2 1 1 *
এর সমস্ত মান 1 এবং এর সাথে সম্পর্কিত মানের মধ্যে রয়েছে [এন]।
আগের মত ঠিক নির্বাচন করুন:
selection = Pick(inPositionRaster, [q01, q02, q03])
এর ফলে হবে
selection: 17 2 3 4 21 14 23 *
সব ঠিক আছে কিনা তা পরীক্ষা করতে, নোডাটা কোড (এই উদাহরণস্বরূপ 99999) রয়েছে এমন সমস্ত আউটপুট সেল নির্বাচন করার চেষ্টা করুন: কোনওরকম হওয়া উচিত নয়।
যদিও এই চলমান উদাহরণটি থেকে নির্বাচন করতে কেবল তিনটি গ্রিড ব্যবহার করা হয়েছে, আমি এটি এমনভাবে লিখেছি যাতে সহজেই যে কোনও সংখ্যক গ্রিডকে সাধারণীকরণ করা হয়। প্রচুর গ্রিডের সাথে একটি স্ক্রিপ্ট লেখা (পুনরাবৃত্ত ক্রিয়াকলাপগুলি লুপ করতে) অমূল্য হবে।
pick
: ইনপোজিশনস্টার এবং নির্বাচিত রাস্টার উভয়েরই কোনও ঘরে যদি মান আছে, তবে সম্ভবত ফলস্বরূপ ফলাফল সেই কক্ষটির জন্য নির্বাচিত রাস্টারটির মান হওয়া উচিত, অন্য যে কোনও রাস্টার যা থাকতে পারে তা নির্বিশেষে)। আপনি কোন বিকল্প আচরণের কথা ভাবছেন?
পাইথন এবং আরকজিআইএস 10 ব্যবহার করে এবং নিম্নলিখিত সিনট্যাক্সযুক্ত কন ফাংশন ব্যবহার করে :
Con (in_conditional_raster, in_true_raster_or_constant, {in_false_raster_or_constant}, {where_clause})
এখানে ধারণাটি দেখতে হবে যে এলোমেলো রাস্টারগুলির মান 0.5 এর চেয়ে কম, যদি এটি রাস্টার 1 চয়ন করা হয়, অন্যথায় রাস্টার 2 চয়ন করুন। NoData
+ ডেটা = NoData
সুতরাং প্রথমে NoData
0 থেকে এই মানগুলি পুনরায় শ্রেণিবদ্ধ করুন :
import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"
ras1_NoNull = Con(IsNull("elevation1"),0, "elevation1") # remove NoData
ras2_NoNull = Con(IsNull("elevation2"),0, "elevation2") # remove NoData
randRaster = CreateRandomRaster(100, 2, Extent(0, 0, 150, 150)) # raster generated between 0 and 1; 100 is seed value
outCon = Con(randRaster < 0.5, ras1_NoNull, ras2_NoNull)
outCon.save("C:/outcon.img") # save raster
সম্পাদনা: ঠিক বুঝতে পেরেছি যে আপনি NoData
মানগুলি যোগ করছেন না যাতে সেই অংশটি ছেড়ে যেতে পারে।
Con(IsNull(ras1), 0, ras2)
NoData
? এলোমেলোভাবে বাছাই করার সময় এগুলি চয়ন করা হয় না তা নিশ্চিত করার জন্য?
আমি কেবল একই পরিমাণ এবং ঘরের আকারের একটি এলোমেলো রাস্টার ( সহায়তা ) তৈরি করব । তারপরে কন ( সহায়তা ) ব্যবহার করে এটিকে প্রথম রাস্টারের কাছ থেকে মান বাছতে সেট করা যদি র্যান্ডমাইজড রাস্টার থেকে সেলটির মান থাকে <128 (যদি একটি র্যান্ডম রাস্টার হতে পারে 0 - 255) অন্যথায় ২ য় রাস্টার থেকে মান বেছে নিন।
আশা করি তা উপলব্ধি করে :)