আরকজিআইএস ডেস্কটপ ব্যবহার করে রাস্টারগুলিতে সর্বোচ্চ মানের অবস্থানগুলি সন্ধান করছেন?


12

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

আমি কল্পনা করি যে এটি পাইথন স্ক্রিপ্টটি ব্যবহার করে খুব সহজেই করা হয়ে উঠতে পারে তবে এর থেকে আরও ভাল উপায় থাকলে আমি অন্যান্য ধারণাগুলির জন্য উন্মুক্ত।


আপনি গ্রিডকে বিন্দুতে রূপান্তরিত করার পরে এক্স, ওয়াই ক্ষেত্র যুক্ত করে বাছাই করার চেষ্টা করেছেন?
জাকুব সিসাক জিওগ্রাফিকস

রাস্টার মানগুলি কি ভাসমান বা পূর্ণসংখ্যা?
whuber

@ জাকুব - না আমার নেই। আমি সম্ভবত কেবল শীর্ষ 1% বা তার চেয়ে বেশি পয়েন্টগুলিতে আগ্রহী হতে চলেছি তাই আমি জানি না যে এটি সমস্ত পয়েন্টের জন্য x, y ক্ষেত্র যুক্ত করে রাখার পরে বাছাই করা ভাল কিনা I সম্ভবত আরও কার্যকর বিকল্প না থাকলে?
mga

@ শুভ - রাস্টার মানগুলি ভাসমান।
mga

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

উত্তর:


5

আপনি যদি আর ব্যবহার করে খুশি হন তবে রাস্টার নামে একটি প্যাকেজ রয়েছে । আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে একটি রাস্টারটিতে পড়তে পারেন:

install.packages('raster')
library(raster)
test <- raster('F:/myraster')

তারপরে, আপনি এটি দেখতে (টাইপ করে test) যেতে গেলে , আপনি নিম্নলিখিত তথ্যটি দেখতে পারেন:

class       : RasterLayer 
dimensions  : 494, 427, 210938  (nrow, ncol, ncell)
resolution  : 200, 200  (x, y)
extent      : 1022155, 1107555, 1220237, 1319037  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 
values      : F:/myraster 
min value   : 0 
max value   : 1 

রাস্টারকে চালিত করার আরও ভাল উপায় থাকতে পারে তবে আপনি যে তথ্য চান সেটি সন্ধানের একটি উপায় সর্বাধিক মান খুঁজে পাওয়া এবং এটির ম্যাট্রিক্সের অবস্থান পাওয়া এবং তারপরে এটি নিম্ন সীমাতে যুক্ত করা যেতে পারে।


1
এই রেফারেন্সের জন্য +1। একবার আপনি রাস্টারটি পড়ার পরে R, আপনি সেল মানগুলি অ্যাক্সেসের জন্য স্ট্যান্ডার্ড Rফাংশন বা getValuesপদ্ধতিটি ব্যবহার করতে পারেন । সেখান থেকে সর্বোচ্চ মান এবং তাদের অবস্থানগুলি সনাক্ত করা সহজ।
হোবার

1
আপনার সুপারিশের জন্য ধন্যবাদ এটি আমি শেষ করে শেষ করেছি। আরকেজিএসে এটি চেষ্টা করার তুলনায় আর-তে রাস্টার প্যাকেজটি ব্যবহার করা বাতাসের মতো। আমি আর-তে অন্যান্য স্থানিক বিশ্লেষণগুলি ব্যবহার করা চালিয়ে গিয়েছি এবং ফলাফলগুলি নিয়ে খুব খুশি হয়েছি। দুর্দান্ত পরামর্শ!
এমগা

8

অক্ষাংশ এবং দ্রাঘিমাংশের গ্রিডের সাথে শীর্ষের 1% মানের একটি সূচক গ্রিড একত্রিত করে উত্তরটি পাওয়া যাবে । কৌশলটি এই সূচক গ্রিড তৈরিতে নিহিত, কারণ আর্কজিআইএস (এখনও! 40 বছর পরে!) রাস্টার ডেটা রেঙ্ক করার কোনও পদ্ধতি নেই have

ভাসমান-পয়েন্ট রাস্টারগুলির জন্য একটি সমাধান পুনরাবৃত্ত হয়, তবে করুণার সাথে দ্রুত । যাক এন তথ্য কোষ সংখ্যা হতে। গবেষণামূলক ক্রমবর্ধমান বণ্টনের (য, এন (য)) মূল্যবোধের সবকিছুর যুগল নিয়ে গঠিত যেখানে z- র গ্রিড এবং একটি মান এন (য) কম মান গ্রিড কোষ সংখ্যা বা সমান z- রZ দ্বারা অর্ডার করা এই অনুভূমিকের অনুক্রমের বাইরে আমরা একটি বক্ররেখা (-infinity, 0) থেকে (+ infinity, n) সংযুক্ত করি । এটা তোলে যার ফলে একটি ফাংশন সংজ্ঞায়িত , যেখানে (য, চ (য)) সবসময় বক্ররেখা উপর ব্যবস্থার সবচেয়ে গুরত্বপূর্ণ। আপনি এই বক্ররেখার একটি বিন্দু (z0, 0.99 * n) সন্ধান করতে চান।

অন্য কথায়, টাস্কটি f (z) - (1-0.01) * n এর শূন্য খুঁজে বের করা । যে কোনও শূন্য-অনুসন্ধানের রুটিন দিয়ে এটি করুন (যা স্বেচ্ছাসেবী ফাংশনগুলি পরিচালনা করতে পারে: এটি পৃথক নয়)। সর্বাধিক সহজ, যা প্রায়শই দক্ষ, তা অনুমান এবং পরীক্ষা করা হয়: প্রাথমিকভাবে আপনি জানেন যে ন্যূনতম মান zMin এবং সর্বাধিক zMax এর মধ্যে z0 রয়েছে। এই দুটিয়ের মধ্যে কোনও যুক্তিসঙ্গত মান কঠোরভাবে অনুমান করুন। যদি অনুমান খুব কম হয় তবে zMin = z0 সেট করুন; অন্যথায় zMax = z0 সেট করুন। এখন পুনরাবৃত্তি। আপনি দ্রুত সমাধানে রূপান্তর করবেন; জেডম্যাক্স এবং জেডমিন যথেষ্ট পরিমাণে কাছে থাকলে আপনি যথেষ্ট হন close রক্ষণশীল হতে, সমাধান হিসাবে zMin এর চূড়ান্ত মানটি চয়ন করুন: এটি আপনাকে আরও কিছু পয়েন্ট বেছে নিতে পারে যা আপনি পরে বাতিল করতে পারেন। আরও পরিশীলিত পদ্ধতির জন্য, সংখ্যার রেসিপিগুলির 9 নং অধ্যায়টি দেখুন (লিঙ্কটি একটি পুরানো ফ্রি সংস্করণে যায়)।

এই অ্যালগরিদমের দিকে ফিরে তাকাতে আপনাকে কেবল মাত্র দুটি ধরণের রাস্টার অপারেশন করতে হবে তা প্রকাশ করে : (1) কয়েকটি লক্ষ্যমাত্রার চেয়ে কম বা সমান সমস্ত কক্ষ নির্বাচন করুন এবং (2) নির্বাচিত ঘর গণনা করুন। এগুলি প্রায় সহজ এবং দ্রুততম অপারেশনগুলির মধ্যে। (২) জোনাল কাউন্ট হিসাবে বা সিলেকশন গ্রিডের অ্যাট্রিবিউট টেবিল থেকে একটি রেকর্ড পড়ে be


7

আমি কিছু সময় আগে এটি করেছি, যদিও আমার সমাধানটি জিডিএল ব্যবহার করছে (সুতরাং, এটি কেবল আর্কজিআইএসের জন্য নয়)। আমি মনে করি আপনি আর্কজিআইএস 10 এর রাস্টার থেকে একটি নুমপি অ্যারে পেতে পারেন, তবে আমি নিশ্চিতভাবে জানি না। NumPy সাধারণ এবং শক্তিশালী অ্যারে সূচক সরবরাহ করে, argsortএবং অন্যান্য। এই উদাহরণটি নোডাটা পরিচালনা করে না বা প্রজেক্ট থেকে ল্যাট / লম্বা স্থানাঙ্কগুলিকে রূপান্তর করে না (তবে জিডিএল সরবরাহ করা ওসজেও.ওএসআর দিয়ে এটি করা কঠিন নয়))

import numpy as np
from osgeo import gdal

# Open raster file, and get GeoTransform
rast_src = gdal.Open(rast_fname)
rast_gt = rast_src.GetGeoTransform()

def get_xy(r, c):
    '''Get (x, y) raster centre coordinate at row, column'''
    x0, dx, rx, y0, ry, dy = rast_gt
    return(x0 + r*dx + dx/2.0, y0 + c*dy + dy/2.0)

# Get first raster band
rast_band = rast_src.GetRasterBand(1)

# Retrieve as NumPy array to do the serious work
rast = rast_band.ReadAsArray()

# Sort raster pixels from highest to lowest
sorted_ind = rast.argsort(axis=None)[::-1]

# Show highest top 10 values
for ind in sorted_ind[:10]:
    # Get row, column for index
    r, c = np.unravel_index(ind, rast.shape)
    # Get [projected] X and Y coordinates
    x, y = get_xy(r, c)
    print('[%3i, %3i] (%.3f, %.3f) = %.3f'%
          (r, c, x, y, rast[r, c]))

আমার পরীক্ষার রাস্টার ফাইলের জন্য নিম্নলিখিতগুলি দেখায়:

[467, 169] (2813700.000, 6353100.000) = 844.538
[467, 168] (2813700.000, 6353200.000) = 841.067
[469, 168] (2813900.000, 6353200.000) = 840.705
[468, 168] (2813800.000, 6353200.000) = 840.192
[470, 167] (2814000.000, 6353300.000) = 837.063
[468, 169] (2813800.000, 6353100.000) = 837.063
[482, 166] (2815200.000, 6353400.000) = 833.038
[469, 167] (2813900.000, 6353300.000) = 832.825
[451, 181] (2812100.000, 6351900.000) = 828.064
[469, 169] (2813900.000, 6353100.000) = 827.514

+1 এ ভাগ করে নেওয়ার জন্য ধন্যবাদ। আমি নোডাটা কে সীমাবদ্ধতা হিসাবে পরিচালনা করতে অক্ষমতা দেখছি না: এগিয়ে যাওয়ার আগে সমস্ত নোটাটাকে অত্যন্ত নেতিবাচক মানগুলিতে রূপান্তর করুন। আরও মনে রাখবেন, গ্রিডটির যদি কোনও পুনরায় প্রত্যাশা ঘটে থাকে তবে গ্রিডটি পুনঃনির্মাণের কারণে উত্তরগুলি সম্ভবত পরিবর্তিত হবে, সুতরাং সাধারণত কেউ এই জাতীয় গণনার সময় স্বয়ংক্রিয়ভাবে পুনরায় প্রত্যাশা ঘটতে চায় না। পরিবর্তে, রিপোর্ট করা স্থানাঙ্কগুলি পরে পুনঃপ্রজেক্ট করা যেতে পারে। সুতরাং আপনার সমাধান পুরোপুরি সাধারণ।
হুশিয়ার

নোডাটা হ্যান্ডলিং প্রথমে রাস্টার থেকে মান পেয়ে NODATA = rast_band.GetNoDataValue(), তারপরে একটি এনএএন মান ( rast[rast == NODATA] = np.nan) ব্যবহার করে বা একটি মুখোশযুক্ত অ্যারে ( rast = np.ma.array(rast, mask=(rast == NODATA))) ব্যবহার করে প্রয়োগ করা যেতে পারে । আরও জটিল কৌশলটি argsortকোনওভাবে এনডিয়া বিশ্লেষণ থেকে নোডাটা মানগুলি সরিয়ে ফেলতে পারে বা কেবল এনএএন / মুখোশযুক্ত হলে কেবল লুপের মধ্যে এগুলি ছেড়ে যায়।
মাইক টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.