ฉันมีไฟล์แรสเตอร์ที่เซลล์ทั้งหมดมีค่าระหว่าง -3 และ 7 ไม่มีค่าข้อมูลคือ -9999 ฉันจะคำนวณจำนวนเซลล์ด้วยค่าเฉพาะเช่น 6 ได้อย่างไร ฉันสามารถใช้เครื่องคิดเลขได้ไหม
ฉันมีไฟล์แรสเตอร์ที่เซลล์ทั้งหมดมีค่าระหว่าง -3 และ 7 ไม่มีค่าข้อมูลคือ -9999 ฉันจะคำนวณจำนวนเซลล์ด้วยค่าเฉพาะเช่น 6 ได้อย่างไร ฉันสามารถใช้เครื่องคิดเลขได้ไหม
คำตอบ:
สองวิธีง่าย ๆ ที่เป็นไปได้:
1. )
"Corine@1" = 23
แรสเตอร์ที่มีสูตรเช่นนี้ สิ่งนี้จะแยกเซลล์ทั้งหมดด้วยค่า 23 ลงในแรสเตอร์ใหม่2. ) หากคุณต้องการภาพรวมที่ซับซ้อนยิ่งกว่าจำนวนเซลล์แรสเตอร์คุณสามารถใช้ปลั๊กอิน LecoS สำหรับ QGIS
แก้ไข 3 : ฉันแปลงรหัสด้านล่างเป็นสคริปต์ SEXTANTE ที่ใช้งานได้ดีซึ่งให้ผลลัพธ์ต่อไปนี้:
คำแนะนำรายละเอียดและลิงค์ดาวน์โหลดที่สามารถพบได้ที่นี่
คุณสามารถใช้ python console สำหรับงานนี้ คัดลอกโค้ดด้านล่างวางลงในไฟล์ข้อความและบันทึกเป็น "some_script.py" ตัวอย่างเช่น ครั้งต่อไปคุณจะต้องนับจำนวนเซลล์ที่เปิดคอนโซล python ใน QGIS กดปุ่ม 'show editor' และเปิดสคริปต์นี้ที่นั่น จากนั้นแทนที่ 'raster_path' ในแถวที่สี่ในสคริปต์ด้วยพา ธ ที่แท้จริงไปยัง raster ของคุณและบันทึกการเปลี่ยนแปลง จากนั้นเรียกใช้สคริปต์และในเอาต์พุตคอนโซล (ทางด้านซ้ายจากโปรแกรมแก้ไขบนหน้าจอด้านล่าง) คุณจะเห็นจำนวนเซลล์สำหรับทุกค่าที่คุณมีในแรสเตอร์
โปรดทราบว่าคุณจะต้องติดตั้ง python-numpy เพื่อให้สคริปต์นี้ทำงานได้
แก้ไข:นอกจากนี้ถ้าคุณไม่จำเป็นต้องมีค่าที่แน่นอน แต่คุณค่อนข้างจะต้องการที่จะเห็นการกระจายของค่าคุณอาจใช้วิธีการอธิบายที่นี่
แก้ไข 2:มีเวอร์ชันสคริปต์ล่วงหน้ามากขึ้น ตอนนี้มันใช้งานได้กับหลายแถบแรสเตอร์และประมวลผลค่า NaN
from osgeo import gdal
import sys
import math
path = "raster_path"
gdalData = gdal.Open(path)
if gdalData is None:
sys.exit( "ERROR: can't open raster" )
# get width and heights of the raster
xsize = gdalData.RasterXSize
ysize = gdalData.RasterYSize
# get number of bands
bands = gdalData.RasterCount
# process the raster
for i in xrange(1, bands + 1):
band_i = gdalData.GetRasterBand(i)
raster = band_i.ReadAsArray()
# create dictionary for unique values count
count = {}
# count unique values for the given band
for col in range( xsize ):
for row in range( ysize ):
cell_value = raster[row, col]
# check if cell_value is NaN
if math.isnan(cell_value):
cell_value = 'Null'
# add cell_value to dictionary
try:
count[cell_value] += 1
except:
count[cell_value] = 1
# print results sorted by cell_value
for key in sorted(count.iterkeys()):
print "band #%s - %s: %s" %(i, key, count[key])
count = dict(zip(*numpy.unique(a, return_counts=True)))
: คุณอาจต้องตรวจสอบให้แน่ใจว่าคุณกำลังเรียกใช้ Python 64- บิตเพื่อหลีกเลี่ยงข้อผิดพลาดของหน่วยความจำ แม้ว่าฉันจะไม่ได้ทดสอบวิธีการจัดการNaN
นั้น