লজিকাল অপারেটর এবং অন্যান্য ফাংশনের জন্য gdal_calc রাস্টার ক্যালকুলেটর সিনট্যাক্স


13

Gdal_calc এর ডকুমেন্টেশনে এটি নম্পি সিনট্যাক্স সহ কমান্ড লাইন রাস্টার ক্যালকুলেটর হিসাবে উল্লেখ করা হয়েছে । পরবর্তীতে এখানে কয়েকটি উদাহরণ রয়েছে যেখানে তার একটিতে:

gdal_calc.py -A ইনপুট.টিউফ - আউটফাইল = ফলাফল.টিফ - ক্যালক = "এ * (এ> 0)" --নোডাটাভ্যালু = 0 - মানে শূন্য এবং নীচের মান নির্ধারণ করা

দুর্ভাগ্যক্রমে লজিক্যাল অপারেটরগুলির মতো উদাহরণ নেই:

--calc = "এ * (এ> 0 এবং এ> বি)" - এর অর্থ একটি বড় শূন্য এবং বড় বি হলে এ রাখুন এবং বাকিগুলি শূন্য করে রাখুন

নম্পি / স্কিপি লজিক ফাংশনের উপর ভিত্তি করে আমি লজিকাল অপারেটরগুলি লিখতে আশা করব:

--calc = "একটি * logical_and (একটি> 0, একটি> b)"

আমি এটি চেষ্টা করেছি এবং এটি কাজ করছে বলে মনে হচ্ছে তবে আমি নিশ্চিত হতে চাই যে এটি সঠিক।

একইভাবে আপনি যদি ন্যূনতম এ এবং বি চান:

--calc = "একটি * (একটি <= বি) + + বি * (একটি> b)"

আপনি কেবল লিখতে পারেন:

--calc = "ন্যূনতম (এ, বি)"

আমার সমস্যাটি হ'ল আমি এই অধিকারটি পেয়েছি তা নিশ্চিত করার জন্য আমি কোনও কুকবুক খুঁজে পাই না। Gdal_calc দিয়ে কী সম্ভব এবং সম্ভব নয় তার উন্নত উদাহরণ সহ কিছু ভাল কুকবুক আছে কি?

উত্তর:


10

Gdal_calc.py এর উত্সে, গণনাটি সরাসরি ব্যবহার করে তৈরি করা হয় eval:

myResult = eval(opts.calc, global_namespace, local_namespace)

এটি সুপারিশ করবে যে কমান্ড লাইনে মূল্যায়ন করে যে কোনও সু-গঠনযুক্ত অভিব্যক্তি কাজ করবে। ডকুমেন্টেশন অনুসারে, আপনি +-/*এবং / অথবা numpyফাংশন সহ gdalnumeric বাক্য গঠন ব্যবহার করতে পারেন । ইন্টারেক্টিভ শেলটিতে আপনি ছোট ডামি অ্যারে ব্যবহার করে আপনার ফাংশনগুলি পরীক্ষা করতে পারেন, তারপরে gdal_calc এ একই কলগুলি ব্যবহার করুন।

মনে রাখবেন যে একসাথে একাধিক numpyক্রিয়াকলাপ করার ফলে অস্থায়ী ইন-মেমরি অ্যারে তৈরি হতে পারে যা মেমরির ব্যবহারকে যথেষ্ট পরিমাণে বাড়িয়ে তুলতে পারে, বিশেষত বড় ছবিগুলির সাথে ডিল করার সময়।

সমস্ত ফাংশন: রুটিনের একটি তালিকার জন্য আপনি নির্লজ্জ ডকুমেন্টেশনটি দেখতে পারেন । আপনি যার পরে আছেন সম্ভবত তারা এখানে রয়েছে: গণিত বা এখানে: রুটিন.লগিক

এটি হ'ল ন্যূনতমের মতো ফাংশনগুলি থেকে আসে, নেমস্পেসটি ইতিমধ্যে আমদানি করা হয়েছে। সত্যই, এটি numpy.minimum, ইত্যাদি


1
আপনাকে ধন্যবাদ বেন, এটি সম্পর্কে আমার কোনও ধারণা ছিল না another তবুও কিছু কুকবুকের পরে যা ব্যবহার করা সম্ভব তা ব্যাখ্যা করবে, কারণ এভালটিতে ন্যূনতম () ইত্যাদি ফাংশন অন্তর্ভুক্ত নয় যা প্রকৃতপক্ষে এক্সপ্রেশনটিতে ব্যবহার করা সম্ভব।
মিরো

8

বেঞ্জামিনের উত্তর অনুসরণ করে, আপনি লজিক্যাল_আর () বা লজিক্যাল_আ্যান্ড () ব্যবহার করতে পারেন। Http://docs.scipy.org/doc/numpy/references/routines.logic.html দেখুন । নিম্নলিখিত উদাহরণটি আমার পক্ষে দুর্দান্তভাবে কাজ করেছে। এটি 177 এবং 185 (সমেত) থেকে 0 এর মধ্যে সমস্ত মান সেট করে যা পরে নোডাটা হিসাবে গণ্য হয়।

gdal_calc.py -A input.tif --outfile=output.tif --calc="A*logical_or(A<=177,A>=185)" --NoDataValue=0

1

আমার একটি রাস্টার ছিল যেখানে মানগুলি -1 এবং 3 এর মধ্যে থাকে যেখানে শূন্য একটি বৈধ সংখ্যা। আমার একটি gdal_calc এক্সপ্রেশন তৈরি করতে কিছু সমস্যা হয়েছিল তাই এই দ্রুত এবং উগ্র সমাধানটি তৈরি করে।

#!/usr/bin/env python3

fileNameIn = "/tmp/geotiff/Global_taxonomic_richness_of_soil_fungi.tif"
fileNameOut = "/tmp/geotiff/Global_taxonomic_richness_of_soil_fungi.tiff"
dst_options = ['COMPRESS=DEFLATE',"PREDICTOR=3","TILED=YES"]
noDataValue = -3.4028234663852886e+38

from osgeo import gdal
import numpy

src_ds = gdal.Open(fileNameIn)
format = "GTiff"
driver = gdal.GetDriverByName(format)
dst_ds = driver.CreateCopy(fileNameOut, src_ds, False ,dst_options)

# Set location
dst_ds.SetGeoTransform(src_ds.GetGeoTransform())
# Set projection
dst_ds.SetProjection(src_ds.GetProjection())
srcband = src_ds.GetRasterBand(1)

dataraster = srcband.ReadAsArray().astype(numpy.float)
#Rplace the nan value with the predefiend noDataValue
dataraster[numpy.isnan(dataraster)]=noDataValue

dst_ds.GetRasterBand(1).WriteArray(dataraster)
dst_ds.GetRasterBand(1).SetNoDataValue(noDataValue)

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