উত্তর:
আমি নিশ্চিত gdal API সম্পর্কে, আছে আছি void* GDALWarpOptions::hCutline
মধ্যে ওয়ার্প বিকল্প থেকে উল্লেখিত ওয়ার্প এপিআই টিউটোরিয়াল , কিন্তু কোন স্পষ্ট উদাহরণ। আপনি কি নিশ্চিত যে আপনার একটি প্রোগ্রামিক উত্তর প্রয়োজন? কমান্ড লাইন ইউটিলিটিগুলি বাক্সের বাইরে এটি করতে পারে:
ogrinfo
ক্লিপিং শেফফিলের পরিমাণ নির্ধারণ করতে ব্যবহার করুনgdal_translate
আকার আকৃতির ক্লিপ ব্যবহার করুনgdalwarp
সঙ্গে ব্যবহার করুন-cutline
2 এবং 3 পদক্ষেপগুলি অপ্টিমাইজেশনের জন্য, আপনি কেবলমাত্র দিয়ে যেতে পারেন gdalwarp -cutline ...
।
দেখুন GDAL বহুভুজ ব্যবহার করে ক্লিপিং rasters লিনাক্স ভিত্তিক সমাধান সব এক লিপিতে আচ্ছন্ন জন্য Linfinity থেকে। মাইকেল কোরির টিউটোরিয়ালে ম্যাপনিকের জন্য হিল্ড শেড তৈরির আরেকটি কাটলাইন উদাহরণ দেখা যায় ।
জিওপ্যাটিয়াল পাইথনের জোয়েল ল্যাওহেডের শেপফাইল ব্যবহার করে ক্লিপ রাস্টারটিতে সম্পূর্ণ অজগর উদাহরণ রয়েছে , একটি ভাল লিখিত টিউটোরিয়াল। আপনাকে পাইথন ইমেজ লাইব্রেরি (পিআইএল) ইনস্টল করতে হবে যা ওসজিও 4 ডাব্লুতে অন্তর্ভুক্ত নেই (যার জন্য ইনস্টল প্রোগ্রামটি কাজ করতে আপনাকে উইন্ডোজ রেজিস্ট্রিতে o4w পাইথন যুক্ত করতে হবে)।
দেখে মনে হচ্ছে এই বিষয়টি সর্বদা ফিরে আসছে। আমি নিজেই জানতাম না যে জিডিএল> 1.8 এত উন্নত এটি ইতিমধ্যে আপনাকে সেই কাজটি করার জন্য ন্যায্য কমান্ড লাইন সরবরাহ করে।
মাইক টুউজের মন্তব্যটি বেশ কার্যকর তবে আপনি উদাহরণস্বরূপ এটি করতে পারেন:
gdalwarp -of GTiff -cutline DATA/area_of_interest.shp -cl area_of_interest -crop_to_cutline DATA/PCE_in_gw.asc data_masked7.tiff
আপনি এই কমান্ডটি একটি অজগর স্ক্রিপ্টের মধ্যে দুর্দান্ত সাবপ্রসেসি মডিউল দিয়ে মোড়া করতে পারেন ।
একটি জিনিস যা আমার জন্য সত্যই সমস্যাযুক্ত তা হ'ল আমাকে সেই সমস্যার একটি ন্যূনতম সমাধান সরবরাহ করা দরকার, যার অর্থ যতটা সম্ভব সহজ এবং বহিরাগত নির্ভরতার প্রয়োজন নেই। জোয়েল লাউহেডের টিউটোরিয়ালে পাইথন ইমেজিং লাইব্রেরির ব্যবহার ঝরঝরে, তবে আমি নিম্নলিখিত সমাধানটি নিয়ে এসেছি: নম্পি মুখোশযুক্ত অ্যারে ব্যবহার করে।
এটি আরও ভাল কিনা তা আমি জানি না, তবে এটিই আমি জানতাম (3 বছর আগে ...) এর চেয়ে বেশি।
মূলত আমি মূল রাস্টারের অভ্যন্তরে একটি বৈধ ডেটা অঞ্চল তৈরি করেছি (উদাহরণস্বরূপ আউটপুট রাস্টারগুলির পরিমাণ যেখানে একই) তবে আমি রাস্টারটিকে আরও ছোট (যেমন-ক্রপ_ টু_কুটলাইন) তৈরি করার ধারণাটি পছন্দ করেছি, তাই আমি world2Pixel
জোয়েল লাউহেড থেকে গ্রহণ করেছি । এখানে আমার নিজস্ব সমাধান:
def RasterClipper():
craster = MaskRaster()
contraster2 = 'PCE_in_gw.aux'
craster.reader("DATA/"+contraster2.replace('aux','asc'))
xres, yres = craster.extent[1], craster.extent[1]
craster.fillrasterpoints(xres, yres)
craster.getareaofinterest("DATA/area_of_interest.shp")
minX, maxX=craster.new_extent [0]-5,craster.new_extent[1]+5
minY, maxY= craster.new_extent [2]-5,craster.new_extent[3]+5
ulX, ulY=world2Pixel(craster.extent, minX, maxY)
lrX, lrY=world2Pixel(craster.extent, maxX, minY)
craster.getmask(craster.corners)
craster.mask=np.logical_not(craster.mask)
craster.mask.resize(craster.Yrange.size,craster.Xrange.size)
# choose all data points inside the square boundaries of the AOI,
# replace all other points with NULL
craster.cdata= np.choose(np.flipud(craster.mask), (craster.data, -9999))
# resise the data set to be the size of the squared polygon
craster.ccdata=craster.cdata[ulY:lrY, ulX:lrX]
craster.writer("ccdata2m.asc",craster.ccdata, (minX+xres*.5, maxY+yres*.5), 10,10,Flip=False)
# in second step we rechoose all the data points which are inside the
# bounding vertices of AOI
# need to re-define our raster points
craster.xllcorner, craster.yllcorner = minX, minY
craster.xurcorner, craster.yurcorner = maxX, maxY
craster.fillrasterpoints(10,10)
craster.getmask(craster.boundingvertices) # just a wrapper around matplotlib.nxutils.points_in_poly
craster.data=craster.ccdata
craster.clip2(new_extent_polygon=craster.boundingvertices)
craster.data = np.ma.MaskedArray(craster.data, mask=craster.mask)
craster.data = np.ma.filled(craster.data, fill_value=-9999)
# write the raster to disk
craster.writer("ccdata2m_clipped.asc",craster.data, (minX+xres*.5, maxY+yres*.5), 10,10,Flip=False)
class MaskRaster
এবং এর পদ্ধতিগুলির সম্পূর্ণ বিবরণের জন্য , আমার প্রকল্পের গিথুব দেখুন ।
এই কোডটি ব্যবহার করে আপনাকে এখনও জিডিএল ব্যবহার করতে হবে। তবে, পরিকল্পনাটি আমি ভবিষ্যতে খাঁটি পাইথনটি যেখানে ব্যবহার করতে পারি সেখানে ব্যবহার করার কথা, কারণ আমার সফ্টওয়্যারটির অভিযুক্ত শ্রোতাদের অনেক বেশি নির্ভরতা নিয়ে সমস্যা (আমি সফটওয়্যারটি বিকাশ করতে ডেবিয়ান ব্যবহার করি এবং ক্লায়েন্টরা উইন্ডোজ ... ... ব্যবহার করে)।