तार्किक ऑपरेटरों और अन्य कार्यों के लिए gdal_calc रेखापुंज कैलकुलेटर वाक्यविन्यास


13

में gdal_calc के लिए प्रलेखन यह कहा गया है numpy वाक्य रचना के साथ कमांड लाइन रेखापुंज कैलकुलेटर । बाद में कुछ उदाहरण हैं जहां उनमें से एक में:

gdal_calc.py -एक input.tif --outfile = result.tif --calc = "ए * (ए> 0)" --NoDataValue = 0 - साधन सेट नीचे शून्य के मूल्यों और अशक्त करने के लिए

दुर्भाग्य से तार्किक ऑपरेटरों पर कोई उदाहरण नहीं है जैसे:

--calc = "A * (A> 0 और A> B)" - का अर्थ है A रखें यदि एक बड़ा शून्य और बड़ा B और शेष को शून्य करने के लिए सेट करें

Numpy / Scipy तर्क कार्यों के आधार पर मैं तार्किक ऑपरेटरों को लिखने की उम्मीद करूंगा:

--calc = "ए * logical_and (ए> 0, A> बी)"

मैंने यह कोशिश की और यह काम करने लगता है लेकिन मैं आश्वस्त होना चाहूंगा कि यह सही है।

इसी तरह से यदि आप A और B में से न्यूनतम चाहते हैं:

--calc = "ए * (ए <= बी) + बी * (ए> बी)"

आप बस लिख सकते हैं:

--calc = "न्यूनतम (ए, बी)"

मेरा मुद्दा यह है कि मुझे यह सुनिश्चित करने के लिए कोई कुकबुक नहीं मिल रही है। क्या उन्नत उदाहरणों के साथ कुछ अच्छी कुकबुक है जो कि gdal_calc के साथ संभव नहीं है और संभव नहीं है?

जवाबों:


10

Gdal_calc.py के स्रोत में, गणना सीधे उपयोग की जाती है eval:

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

यह सुझाव देगा कि कमांड लाइन पर मूल्यांकन करने वाली कोई भी अच्छी तरह से बनाई गई अभिव्यक्ति काम करेगी। प्रलेखन के अनुसार, आप gdalnumeric syntax का उपयोग कर सकते हैं +-/*, और / या numpyफ़ंक्शंस। आप इंटरैक्टिव शेल में छोटे डमी सरणियों का उपयोग करके अपने कार्यों का परीक्षण कर सकते हैं, फिर उसी कॉल का उपयोग gdal_calc में कर सकते हैं।

ध्यान रखें कि कई numpyकार्यों को एक साथ करने से अस्थायी इन-मेमोरी सरणियों का उत्पादन होने की संभावना है जो स्मृति उपयोग को काफी बढ़ा सकती हैं, खासकर जब बड़ी छवियों से निपटना।

आप सभी कार्यों की एक सूची के लिए संख्यात्मक दस्तावेज को देख सकते हैं: दिनचर्या । जिन लोगों के बाद आप हैं, वे यहां हैं: गणित या यहां: routines.logic

यह वह जगह है जहां न्यूनतम जैसे कार्य किए जा रहे हैं, बस यह है कि नाम स्थान पहले से ही आयात किया गया है। वास्तव में, यह numpy.minimum, आदि है


1
धन्यवाद बेन, यह एक और तरीका है जिसके बारे में मुझे कोई सुराग नहीं था। फिर भी कुछ कुकबुक के बाद जो यह बताएगा कि क्या उपयोग करना संभव है, क्योंकि eval में न्यूनतम () आदि फ़ंक्शन शामिल नहीं हैं जो वास्तव में अभिव्यक्ति में उपयोग करना संभव है।
Miro

8

बेंजामिन के उत्तर के बाद, आप तार्किक_ () या तार्किक_ और () का उपयोग कर सकते हैं। Http://docs.scipy.org/doc/numpy/reference/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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.