অনুমান

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

কোড এডিটর (জাভাস্ক্রিপ্ট)

// The input image has a SR-ORG:6974 (sinusoidal) projection.
var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0);

// Normalize the image and add it to the map.
var rescaled = image.unitScale(-2000, 10000);
var visParams = {min: 0.15, max: 0.7};
Map.addLayer(rescaled, visParams, 'Rescaled');

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহারের তথ্যের জন্য পাইথন এনভায়রনমেন্ট পেজটি দেখুন।

import ee
import geemap.core as geemap

কোলাব (পাইথন)

# The input image has a SR-ORG:6974 (sinusoidal) projection.
image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0)

# Normalize the image and add it to the map.
rescaled = image.unitScale(-2000, 10000)
vis_params = {'min': 0.15, 'max': 0.7}
m = geemap.Map()
m.add_layer(rescaled, vis_params, 'Rescaled')
m

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

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

আর্থ ইঞ্জিনে, কোঅর্ডিনেট রেফারেন্স সিস্টেম (CRS বা অনেক মেথডের crs প্যারামিটার) দ্বারা প্রজেকশন নির্দিষ্ট করা হয়। কোনো ইমেজের উপর projection() কল করে আপনি সেটির প্রজেকশন পরীক্ষা করতে পারেন:

কোড এডিটর (জাভাস্ক্রিপ্ট)

var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0);
print('Projection, crs, and crs_transform:', image.projection());
print('Scale in meters:', image.projection().nominalScale());

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহারের তথ্যের জন্য পাইথন এনভায়রনমেন্ট পেজটি দেখুন।

import ee
import geemap.core as geemap

কোলাব (পাইথন)

image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0)
display('Projection, crs, and crs_transform:', image.projection())
display('Scale in meters:', image.projection().nominalScale())

মনে রাখবেন যে, projection() দ্বারা রিটার্ন করা ee.Projection এর উপর nominalScale() কল করে আপনি ইমেজটির নেটিভ রেজোলিউশন নির্ধারণ করতে পারেন। নেটিভ রেজোলিউশন হলো ইমেজ পিরামিডের সর্বনিম্ন স্তরের নমিনাল পিক্সেল স্কেল, যা মিটারে পরিমাপ করা হয়। যেহেতু একটি ইমেজের প্রতিটি ব্যান্ডের আলাদা স্কেল এবং/অথবা প্রজেকশন থাকতে পারে, তাই যদি আপনি এমন একটি ইমেজের উপর projection() কল করেন যার অন্তত একটি ব্যান্ডের প্রজেকশন অন্যগুলোর মতো নয়, তাহলে আপনি এই ধরনের একটি এরর দেখতে পারেন:

ডিফল্ট প্রজেকশন

যদি আপনার গণনা একটি নির্দিষ্ট প্রজেকশনে করার প্রয়োজন না হয়, তবে সাধারণত প্রজেকশন নির্দিষ্ট করার কোনো প্রয়োজন নেই। শুধুমাত্র অস্পষ্ট আউটপুটের জন্যই আর্থ ইঞ্জিন আপনাকে একটি প্রজেকশন এবং/অথবা স্কেল নির্দিষ্ট করতে বলবে। বিভিন্ন প্রজেকশনের ছবি সম্বলিত একটি ImageCollection ছোট করার ফলে (অর্থাৎ একটি কম্পোজিট তৈরি করার ফলে ) অস্পষ্টতা দেখা দিতে পারে। যে ছবিটি বিভিন্ন প্রজেকশনের ইনপুট ছবির একটি কম্পোজিট বা মোজাইক, সেটির ডিফল্ট প্রজেকশন থাকবে, যা হলো ১-ডিগ্রি স্কেলের WGS84 । যদি এই ডিফল্ট প্রজেকশনটি আপনার বিশ্লেষণের জন্য উপযুক্ত না হয় (যেমন, এটি খুব স্থূল, অথবা ভূখণ্ড বিশ্লেষণের মতো পরবর্তী গণনায় রিস্যাম্পলিং আর্টিফ্যাক্ট প্রতিরোধ করতে চান), তবে আপনি image.setDefaultProjection(crs) ব্যবহার করে একটি ভিন্ন ডিফল্ট সেট করতে পারেন। এটি নিশ্চিত করে যে, যদি আর্থ ইঞ্জিনকে ছবিটি সম্পর্কিত কোনো গণনার জন্য একটি প্রজেকশন বেছে নিতে হয়, তবে এটি ১-ডিগ্রি স্কেলের WGS84-এর পরিবর্তে নির্দিষ্ট করা প্রজেকশনটিই ব্যবহার করবে। উদাহরণস্বরূপ:

কোড এডিটর (জাভাস্ক্রিপ্ট)

var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic();
print(mosaic.projection());

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহারের তথ্যের জন্য পাইথন এনভায়রনমেন্ট পেজটি দেখুন।

import ee
import geemap.core as geemap

কোলাব (পাইথন)

collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic()
display(mosaic.projection())

গণনার কাজে এই ধরনের কোনো ছবি ব্যবহার করার চেষ্টা করলে, আপনি এই ধরনের একটি ত্রুটি দেখতে পারেন:

সাধারণত, ১-ডিগ্রি স্কেলে সমষ্টিগতকরণ কাম্য বা উদ্দিষ্ট নয়, তাই আউটপুটের জন্য একটি সম্পূর্ণ স্পেসিফিকেশন প্রদান করতে আর্থ ইঞ্জিন এই বন্ধুত্বপূর্ণ অনুস্মারকটি দেয়।

ব্যবহারকারীরা প্রায়শই এই আচরণটি বিভ্রান্তিকর মনে করেন এবং "হারিয়ে যাওয়া" প্রজেকশন তথ্য নিয়ে চিন্তিত হন, কিন্তু পিক্সেলগুলি আসলে ততক্ষণ পর্যন্ত গণনা করা হয় না যতক্ষণ না সেগুলির প্রয়োজন হয় ( আরও জানুন ), এবং সেই মুহূর্তে, অনুরোধটির সাথে সর্বদা একটি আউটপুট প্রজেকশন থাকে যা নির্দিষ্ট করে দেয় কীভাবে কম্পোজিটটি গণনা করতে হবে।

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

যদি অপ্টিমাইজ করা প্রদর্শিত চিত্রটি কোনোভাবে যথেষ্ট না হয়, তবে পরবর্তী বিভাগে বর্ণিত পদ্ধতি অনুযায়ী আউটপুটকে রিপ্রজেক্ট করার মাধ্যমে একটি নির্দিষ্ট প্রজেকশনে গণনা করতে বাধ্য করা যেতে পারে।

পুনঃপ্রক্ষেপণ

আপনি reproject() মেথড ব্যবহার করে কোনো অপারেশনকে একটি নির্দিষ্ট প্রজেকশনে সম্পাদন করতে বাধ্য করতে পারেন। reproject() ব্যবহার করলে, ইনপুটগুলো reproject() কলে নির্দিষ্ট করা প্রজেকশনেই চাওয়া হয়। reproject() কলের আগে আপনার কোডের গণনাগুলো নির্দিষ্ট প্রজেকশনেই করা হবে। উদাহরণস্বরূপ, একটি কম্পোজিটকে একটি নির্দিষ্ট প্রজেকশনে তৈরি করতে বাধ্য করার জন্য:

কোড এডিটর (জাভাস্ক্রিপ্ট)

// Some projection that is suitable for your area of interest.
var proj = ee.Projection(...);
var output = collection.reduce(...).reproject(proj);

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহারের তথ্যের জন্য পাইথন এনভায়রনমেন্ট পেজটি দেখুন।

import ee
import geemap.core as geemap

কোলাব (পাইথন)

# Some projection that is suitable for your area of interest.
proj = ee.Projection(...)
output = collection.reduce(...).reproject(proj)

যেসব ক্ষেত্রে একটি নির্দিষ্ট প্রক্ষেপণের প্রয়োজন হয়, তার মধ্যে কয়েকটি হলো:

ee.Terrain প্যাকেজের ফাংশনগুলো (যেমন, slope , aspect , hillshade ) পার্শ্ববর্তী পিক্সেলের উপর ভিত্তি করে মান গণনা করে এবং রিপ্রোজেকশনের সময় সৃষ্ট রিস্যাম্পলিং আর্টিফ্যাক্টের প্রতি সংবেদনশীল। যখন গণনার প্রোজেকশন DEM-এর নেটিভ প্রোজেকশন থেকে ভিন্ন হয়, তখন ডিফল্ট নিকটতম-প্রতিবেশী রিস্যাম্পলিং আউটপুটে কৃত্রিম প্যাটার্ন তৈরি করতে পারে। সর্বোত্তম ফলাফলের জন্য, DEM-এর নেটিভ প্রোজেকশনে ভূখণ্ড বিশ্লেষণ করুন। যদি DEM টাইলসের একটি ImageCollection নিয়ে কাজ করেন, তাহলে একটি মোজাইক তৈরি করুন এবং ' ডিফল্ট প্রোজেকশন ' বিভাগে বর্ণিত পদ্ধতি অনুযায়ী বিশ্লেষণটি সঠিক গ্রিডে চলছে কিনা তা নিশ্চিত করতে কালেকশনটির নেটিভ প্রোজেকশন সহ setDefaultProjection() ব্যবহার করুন।

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

যদি চূড়ান্ত আউটপুটটি reproject() কলে নির্দিষ্ট করা প্রজেকশন থেকে ভিন্ন কোনো প্রজেকশনে হয়, তাহলে তার ফলে আরেকটি রিপ্রজেকশন হবে। আপনার কোডে reproject() ব্যবহার করার ক্ষেত্রে সতর্ক থাকার এটি আরেকটি কারণ। নিম্নলিখিত উদাহরণটি বিবেচনা করুন, যা MODIS ইমেজটিকে প্রথমে WGS84- এ রিপ্রজেক্ট করে, এবং তারপর কোড এডিটর ম্যাপে প্রদর্শনের জন্য ম্যাপস মারকেটরে রিপ্রজেক্ট করে:

কোড এডিটর (জাভাস্ক্রিপ্ট)

// The input image has a SR-ORG:6974 (sinusoidal) projection.
var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0);

// Operations *before* the reproject call will be done in the projection
// specified by reproject().  The output results in another reprojection.
var reprojected = image
    .unitScale(-2000, 10000)
    .reproject('EPSG:4326', null, 500);
Map.addLayer(reprojected, {min: 0.15, max: 0.7}, 'Reprojected');

পাইথন সেটআপ

পাইথন এপিআই এবং ইন্টারেক্টিভ ডেভেলপমেন্টের জন্য geemap ব্যবহারের তথ্যের জন্য পাইথন এনভায়রনমেন্ট পেজটি দেখুন।

import ee
import geemap.core as geemap

কোলাব (পাইথন)

# The input image has a SR-ORG:6974 (sinusoidal) projection.
image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0)

# Operations *before* the reproject call will be done in the projection
# specified by reproject(). The output results in another reprojection.
reprojected = image.unitScale(-2000, 10000).reproject('EPSG:4326', None, 500)
m = geemap.Map()
m.add_layer(reprojected, {'min': 0.15, 'max': 0.7}, 'Reprojected')
m

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

পুনঃপ্রক্ষেপণ
চিত্র ২। কোড এডিটর ম্যাপে একটি মোডিস (MODIS) ইমেজের পুনঃপ্রক্ষেপণ সম্পর্কিত অপারেশনগুলোর ফ্লো চার্ট। বক্ররেখাগুলো পুনঃপ্রক্ষেপণগুলোতে তথ্যের প্রবাহ নির্দেশ করে: বিশেষত, আউটপুট প্রক্ষেপণ এবং স্কেল।