একাধিক ওভারল্যাপিং রাস্টার থেকে এলোমেলোভাবে সেল মানটি বেছে নিয়ে রাস্টার তৈরি করছেন?


10

আমি এর স্পেসিয়াল অ্যানালিস্ট এক্সটেনশনের সাহায্যে আরকিজিআইএস ডেস্কটপ 10 ব্যবহার করছি।

ওভারল্যাপিং কোষের মান থেকে সর্বদা এলোমেলোভাবে বেছে আমি কীভাবে একাধিক রাস্টারকে একত্রিত করব?

আমার একটি চিত্র রয়েছে যা এটি আরও ভালভাবে ব্যাখ্যা করতে পারে:

উদাহরণ

উত্তর:


7

এই জাতীয় সমস্যার জন্য বাছাই করা তৈরি হয়েছিল। এটিকে "কন" এর "স্যুইচ" (বা "কেস") সংস্করণ হিসাবে ভাবেন, এটি "যদি ... অন্যথায়" মানচিত্রের বীজগণিত বাস্তবায়ন।

যদি 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: ইনপোজিশনস্টার এবং নির্বাচিত রাস্টার উভয়েরই কোনও ঘরে যদি মান আছে, তবে সম্ভবত ফলস্বরূপ ফলাফল সেই কক্ষটির জন্য নির্বাচিত রাস্টারটির মান হওয়া উচিত, অন্য যে কোনও রাস্টার যা থাকতে পারে তা নির্বিশেষে)। আপনি কোন বিকল্প আচরণের কথা ভাবছেন?
whuber

আমার এটি সম্পূর্ণ সংখ্যার মানগুলি থেকে নির্বাচন করতে হবে। ধরা যাক আমার কাছে তিন জন রাস্টার রয়েছে। একটি কক্ষের জন্য, তাদের মানগুলি নিম্নরূপ: 4,5, নোডেটা। আমি চাই আউটরেস্টারটির সেলে 4 বা 5 হয় তবে কখনও নোডাটা হয় না।
স্যাম

এই 1 ++ (n * ক্রিয়েট্র্যান্ডমাস্টার ()) কাজ করতে আমার সমস্যা হচ্ছে।
স্যাম

"ঝামেলা" কোন অর্থে? নির্দিষ্ট করুন!
whuber

4

পাইথন এবং আরকজিআইএস 10 ব্যবহার করে এবং নিম্নলিখিত সিনট্যাক্সযুক্ত কন ফাংশন ব্যবহার করে :

Con (in_conditional_raster, in_true_raster_or_constant, {in_false_raster_or_constant}, {where_clause})

এখানে ধারণাটি দেখতে হবে যে এলোমেলো রাস্টারগুলির মান 0.5 এর চেয়ে কম, যদি এটি রাস্টার 1 চয়ন করা হয়, অন্যথায় রাস্টার 2 চয়ন করুন। NoData+ ডেটা = NoDataসুতরাং প্রথমে NoData0 থেকে এই মানগুলি পুনরায় শ্রেণিবদ্ধ করুন :

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মানগুলি যোগ করছেন না যাতে সেই অংশটি ছেড়ে যেতে পারে।


আমি এখনও আমার পাইথন দক্ষতা নিয়ে কাজ করছি। রাস্টার ক্যালকুলেটরে এটি প্রবেশের কোনও উপায় আছে যা প্রক্রিয়া থেকে নোডাটা মানগুলিও বাদ দেবে? আমার কাছে 10 টি রাস্টার রয়েছে এবং কিছুতে নোডাটা রয়েছে যেখানে অন্যের মান রয়েছে।
স্যাম

আমি মনে করি আপনি রাস্টার ক্যালকুলেটরে এই জাতীয় কিছু ব্যবহার করে শর্ত তৈরি করতে পারেনCon(IsNull(ras1), 0, ras2)
djq

দুর্ভাগ্যক্রমে, এটি আসলে নোডাটা মানগুলি বাদ দেয় না: এটি কেবল তাদের শূন্যের সাথে প্রতিস্থাপন করে। কিছু ক্ষেত্রে এটি উপযুক্ত হতে পারে, তবে সম্ভবত এখানে না!
whuber

হুম, শুভ পয়েন্ট @ হুবার সুতরাং এটি বাদ দেওয়ার অর্থ কী NoData? এলোমেলোভাবে বাছাই করার সময় এগুলি চয়ন করা হয় না তা নিশ্চিত করার জন্য?
djq

এটিই আমি এর ব্যাখ্যা করেছি (আমার এই সম্পাদিত উত্তরটি এই থ্রেডে দেখুন) তবে এটি একটি ভাল প্রশ্ন থেকে যায়। এই ফ্যাশনে এনডি মানগুলিকে উপেক্ষা করার কারণে অবশিষ্ট গ্রিডগুলি আরও বেশি সম্ভাবনার সাথে নির্বাচন করা যায় যা একটি অনাকাঙ্ক্ষিত পার্শ্ব প্রতিক্রিয়া হতে পারে। এটি সব গণনার উদ্দেশ্য নির্ভর করে।
whuber

1

আমি কেবল একই পরিমাণ এবং ঘরের আকারের একটি এলোমেলো রাস্টার ( সহায়তা ) তৈরি করব । তারপরে কন ( সহায়তা ) ব্যবহার করে এটিকে প্রথম র‌াস্টারের কাছ থেকে মান বাছতে সেট করা যদি র্যান্ডমাইজড রাস্টার থেকে সেলটির মান থাকে <128 (যদি একটি র্যান্ডম রাস্টার হতে পারে 0 - 255) অন্যথায় ২ য় রাস্টার থেকে মান বেছে নিন।

আশা করি তা উপলব্ধি করে :)


আপনি কি জানেন যে কীভাবে কেবল মূল্য সহ রাস্টারদের থেকে নির্বাচন করতে হয়? উদাহরণস্বরূপ, আমার চিত্রটিতে নোডাটার সাথে চারটি 2 এবং 2 3 টি ওভারল্যাপ রয়েছে। আমি এটি নিশ্চিত করতে চাই যে এটি কোনও নোডেটা নয়, কেবলমাত্র কোনও কক্ষে মান সহ those রাস্টারদের থেকে নির্বাচন করে।
স্যাম

সাড়া না দেওয়ার জন্য দুঃখিত। আপনি এখনও নোডাটা সমস্যা নিয়ে লড়াই করছেন?
jareks
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.