রাস্টার প্রসেসিং টুলস
এই উদাহরণটি রাস্টার ওয়ার্কফ্লো স্বয়ংক্রিয় করার জন্য KDRM তৈরি করা কিছু রাস্টার এবং ইমেজ-প্রসেসিং টুল দেখায়। এই টুলগুলি কাজের জন্য উপযোগী যেমন ব্যাচ ক্লিপিং রাস্টারগুলিকে আগ্রহের এলাকায়, একটি প্রয়োজনীয় আউটপুট রেজোলিউশনে রাস্টারগুলিকে পুনরায় স্যাম্পলিং করা, পরবর্তী বিশ্লেষণের জন্য রাস্টার ইনপুট প্রস্তুত করা এবং বৃহত্তর ডেলিভারি ওয়ার্কফ্লো থেকে ধীরে ধীরে পুনরাবৃত্তিমূলক ম্যানুয়াল প্রক্রিয়াকরণ পদক্ষেপগুলি সরানো।
নীচের উদাহরণগুলি শুধুমাত্র ওপেন-সোর্স পাইথন প্যাকেজগুলিতে ফোকাস করে। অনুশীলনে, ক্লায়েন্ট পরিবেশ এবং কীভাবে ওয়ার্কফ্লো পরিচালনা করা প্রয়োজন তার উপর নির্ভর করে, এই জাতীয় সরঞ্জামগুলি স্বতন্ত্র স্ক্রিপ্ট, নির্ধারিত প্রক্রিয়াকরণের কাজ বা ArcGIS Pro বা QGIS-এ বৃহত্তর ডেস্কটপ ওয়ার্কফ্লোগুলির মধ্যে এম্বেড করা যেতে পারে।
এই টুলগুলো কিসের জন্য ব্যবহার করা হয়
- ব্যাচ ক্লিপিং ডিইএম, ডিটিএম, এবং অন্যান্য রাস্টারগুলি আগ্রহের ক্ষেত্রে।
- পরবর্তী গণনা এবং মডেলিংয়ের জন্য ঘরের মাপ সারিবদ্ধ করতে রাস্টারের পুনরায় নমুনা তৈরি করা।
- ডাউনস্ট্রিম বিশ্লেষণের আগে রাস্টার ইনপুট ফিল্টারিং এবং যাচাই করা।
- স্বয়ংক্রিয় রাস্টার প্রক্রিয়াকরণ পদক্ষেপ যা অন্যথায় ম্যানুয়াল কাজের কয়েক ঘন্টা সময় নেবে।
- পুনরাবৃত্তিযোগ্য রাস্টার-প্রসেসিং পাইপলাইন তৈরি করা যা ডেস্কটপ, সার্ভার বা কমান্ড-লাইন পরিবেশে চালানো যেতে পারে।
কেন আমরা এই ধরনের টুল তৈরি করি
আমরা নিয়মিত রাস্টার-ভারী প্রকল্পগুলির জন্য কাস্টম অটোমেশন তৈরি করি কারণ কার্যক্ষমতা, পুনরাবৃত্তিযোগ্যতা এবং বহনযোগ্যতা গুরুত্বপূর্ণ। কখনও কখনও প্রয়োজন একটি ArcGIS নির্ভরতা ছাড়া একটি বিশুদ্ধ ওপেন-সোর্স ওয়ার্কফ্লো হিসাবে চালানোর জন্য। অন্যান্য ক্ষেত্রে একই যুক্তি একটি আর্কজিআইএস প্রো বা কিউজিআইএস ওয়ার্কফ্লোতে বসতে হবে যাতে বিশ্লেষকরা একটি পরিচিত ডেস্কটপ পরিবেশের মধ্যে প্রক্রিয়াটি চালাতে পারেন। অন্তর্নিহিত পদ্ধতি একই: পুনরাবৃত্তিমূলক অংশগুলিকে স্বয়ংক্রিয় করুন, যুক্তিকে স্বচ্ছ রাখুন এবং কর্মপ্রবাহকে পুনরায় চালানো এবং সমর্থন করা সহজ করুন।
নীচের ক্লিপিং উদাহরণটি একটি কর্মপ্রবাহের জন্য তৈরি করা হয়েছিল যেখানে একটি ঐতিহ্যগত ডেস্কটপ পদ্ধতির সাথে ব্যাচ ক্লিপিং রাস্টারগুলি খুব ধীর ছিল। ওপেন-সোর্স পাইথন প্যাকেজগুলির সাথে প্রক্রিয়াটি পুনর্লিখন করা কর্মপ্রবাহকে নাটকীয়ভাবে দ্রুততর এবং বড় রাস্টার সংগ্রহের জন্য আরও ব্যবহারিক করে তুলেছে। রিস্যাম্পলিং উদাহরণটি একই কারণে তৈরি করা হয়েছিল, যেখানে বড় রাস্টার ডেটাসেটগুলিকে একটি সূক্ষ্ম আউটপুট সেল আকারের সাথে সারিবদ্ধ করা প্রয়োজন যাতে পরবর্তী রাস্টার গণনাগুলি প্রয়োজনীয় রেজোলিউশনে চলতে পারে।
উদাহরণ 1. ওপেন-সোর্স পাইথন সহ ব্যাচ ক্লিপিং রাস্টার
import json
import numpy as np
import os
import rasterio
import shutil
from rasterio.mask import mask
from shapely.geometry import shape
# the input and output directories for the rasters
input_directory = "input"
output_directory = "output"
# delete and recreate the output directory
if(os.path.exists(output_directory)):
shutil.rmtree(output_directory)
os.makedirs(output_directory)
feature_collection = dict()
with open('national_park.geojson', 'r') as f:
feature_collection = json.load(f)
area_of_interest = feature_collection['features'][0]['geometry']
clip_area = shape(area_of_interest)
for file in os.listdir(input_directory):
# filter by tif files and only files with 2019 in the name
if file.endswith('.tif') and '2019' in file:
print(file)
input_raster = os.path.join(input_directory, file)
output_raster=os.path.join(output_directory, file)
with rasterio.open(input_raster) as src:
try:
out_image, out_transform = mask(src, [clip_area], crop=True)
# Set all nodata values to -99999
out_image[out_image == src.nodata] = -99999
raster_intersected = not np.all(out_image == -99999)
# Check if the clip area intersects the raster and only save the raster if the clip area intersects with it
if raster_intersected:
out_meta = src.meta.copy()
out_meta.update(
{
"driver": "GTiff",
"height": out_image.shape[1],
"width": out_image.shape[2],
"transform": out_transform,
}
)
with rasterio.open(output_raster, "w", **out_meta) as dest:
dest.write(out_image)
except Exception as err:
if ('Input shapes do not overlap raster' not in str(err)):
print('### Error with {} ###'.format(input_raster))
print(err)
pass
উদাহরণ 2. ওপেন-সোর্স পাইথনের সাথে রাস্টারের পুনরায় নমুনা তৈরি করা
import os
from osgeo import gdal
import numpy as np
import os
# the input and output directories
input_directory = 'input/DTM'
output_directory = 'output/DTM'
if not os.path.exists(output_directory):
os.makedirs(output_directory)
for root, dirs, files in os.walk(input_directory):
for file in files:
if(file.endswith('.tif')):
input_file = os.path.join(root, file)
output_file = os.path.join(output_directory, file)
print(file)
# Read the input raster file
raster = gdal.Open(input_file)
# Get the original cell size
cell_size = raster.GetGeoTransform()[1]
# print('Original cell size: {}'.format(cell_size))
# Calculate the number of cells for the output
num_cells = int(np.ceil(cell_size / 0.5))
# Create the output raster file
driver = gdal.GetDriverByName('GTiff')
out_raster = driver.Create(output_file, raster.RasterXSize * num_cells,
raster.RasterYSize * num_cells, 1,
gdal.GDT_Float32)
# Set the output raster's projection
out_raster.SetProjection(raster.GetProjection())
# Set the output raster's geotransform
out_raster_geo = list(raster.GetGeoTransform())
out_raster_geo[1] = 0.5
out_raster_geo[5] = -0.5
out_raster.SetGeoTransform(out_raster_geo)
nodata = -99999
for i in range(1, out_raster.RasterCount + 1):
# set the nodata value of the band
out_raster.GetRasterBand(i).SetNoDataValue(nodata)
# Copy the input raster data to the output raster
gdal.ReprojectImage(raster, out_raster,
raster.GetProjection(),
out_raster.GetProjection(),
gdal.GRA_NearestNeighbour)
# Close the files
out_raster = None
raster = None
ডেলিভারি অপশন
উপরের উদাহরণগুলি ইচ্ছাকৃতভাবে সহজ, কিন্তু লগিং, বৈধতা, সমান্তরাল প্রক্রিয়াকরণ, মেটাডেটা চেক, প্যাকেজিং এবং বৃহত্তর GIS বিতরণ পাইপলাইনে একীকরণ সহ বৃহত্তর উত্পাদন কর্মপ্রবাহের জন্য একই পদ্ধতি বাড়ানো যেতে পারে। ক্লায়েন্টের প্রয়োজনীয়তার উপর নির্ভর করে, আমরা এই টুলগুলিকে স্বতন্ত্র স্ক্রিপ্ট হিসাবে, ArcGIS Pro বা QGIS-এর জন্য ডেস্কটপ-ইন্টিগ্রেটেড টুলস, বা একটি বৃহত্তর স্থানিক ডেটা প্ল্যাটফর্মের অংশ হিসাবে উৎপাদন পরিষেবা প্রদান করতে পারি।