ไวยากรณ์เครื่องคิดเลข gdal_calc แรสเตอร์สำหรับผู้ประกอบการตรรกะและฟังก์ชั่นอื่น ๆ


13

ในเอกสาร gdal_calcแต่มันคือคำสั่งเครื่องคิดเลขบรรทัดแรสเตอร์มีไวยากรณ์ numpy ต่อมามีตัวอย่างบางส่วนที่หนึ่งในนั้นคือ

gdal_calc.py -A input.tif --outfile = result.tif --calc = "A * (A> 0)" --NoDataValue = 0 - หมายถึงการตั้งค่าศูนย์และด้านล่างเป็นโมฆะ

น่าเสียดายที่ไม่มีตัวอย่างเกี่ยวกับตัวดำเนินการเชิงตรรกะเช่น:

--calc = "A * (A> 0 และ A> B)" - หมายถึงการรักษาถ้า A ที่ใหญ่กว่าศูนย์และใหญ่กว่า B และตั้งค่าที่เหลือเป็นโมฆะ

จากฟังก์ชั่นลอจิก Numpy / Scipyฉันคาดว่าจะเขียนตัวดำเนินการเชิงตรรกะเป็น:

--calc = "A * logical_and (A> 0 A> B)"

ฉันลองและดูเหมือนว่าจะใช้งานได้ แต่ฉันต้องการมั่นใจว่าถูกต้อง

ในทำนองเดียวกันถ้าคุณต้องการค่า A และ B ขั้นต่ำ:

--calc = "A * (A <= B) + B * (A> B)"

คุณสามารถเขียน:

--calc = "ขั้นต่ำ (A, B)"

ปัญหาของฉันคือฉันไม่สามารถหาตำราอาหารใด ๆ เพื่อให้แน่ใจว่าฉันได้รับสิทธิ์นี้ มีตำราอาหารที่ดีพร้อมตัวอย่างขั้นสูงของสิ่งที่เป็นและไม่สามารถทำได้ด้วย gdal_calc?

คำตอบ:


10

ในแหล่งข้อมูลสำหรับ gdal_calc.py การคำนวณจะทำโดยตรงโดยใช้eval:

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

นั่นจะแนะนำว่านิพจน์ที่มีรูปแบบที่ดีใด ๆ ที่ประเมินบนบรรทัดคำสั่งจะทำงานได้เช่นกัน ตามเอกสารคุณอาจใช้ไวยากรณ์ gdalnumeric กับ+-/*และ / หรือnumpyฟังก์ชั่น คุณสามารถทดสอบการทำงานของคุณโดยใช้อาร์เรย์จำลองขนาดเล็กในเชลล์เชิงโต้ตอบจากนั้นใช้สายเดียวกันใน gdal_calc

โปรดทราบว่าการผูกมัดหลาย ๆnumpyฟังก์ชั่นเข้าด้วยกันนั้นมีแนวโน้มที่จะสร้างอาร์เรย์ในหน่วยความจำชั่วคราวซึ่งสามารถเพิ่มการใช้หน่วยความจำได้อย่างมากโดยเฉพาะเมื่อต้องรับมือกับภาพขนาดใหญ่

คุณสามารถดูเอกสาร numpy สำหรับรายชื่อของฟังก์ชั่นทั้งหมด: กิจวัตร คนที่คุณมีอยู่หลังจากที่มีแนวโน้มที่นี่: คณิตศาสตร์หรือนี่: routines.logic

นี่คือสิ่งที่ฟังก์ชั่นอย่างน้อยมาจากมันเป็นเพียงว่า namespace จะถูกนำเข้าแล้ว จริงๆมันเป็นจำนวนน้อยที่สุดขั้นต่ำ ฯลฯ


1
ขอบคุณเบ็นนั่นเป็นอีกวิธีที่ฉันไม่มีเงื่อนงำ ยังคงอยู่หลังจากตำราอาหารบางอย่างที่จะอธิบายสิ่งที่เป็นไปได้ที่จะใช้เพราะ Eval ไม่รวมฟังก์ชั่นขั้นต่ำ () ฯลฯ ซึ่งเป็นไปได้จริงที่จะใช้ในการแสดงออก
มิโร

8

ต่อจากคำตอบของเบนจามินคุณสามารถใช้ logical_or () หรือ logical_and () ดูhttp://docs.scipy.org/doc/numpy/reference/routines.logic.html ตัวอย่างต่อไปนี้ทำงานได้ดีสำหรับฉัน ตั้งค่าทั้งหมดระหว่าง 177 และ 185 (รวม) เป็น 0 ซึ่งจะถือว่าเป็น nodata

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

1

ฉันมีแรสเตอร์ที่มีค่าอยู่ระหว่าง -1 ถึง 3 โดยที่ 0 คือเลขศูนย์ที่ถูกต้อง ฉันมีปัญหาบางอย่างในการสร้างนิพจน์ 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.