จะคำนวณจำนวนเซลล์ด้วยค่าที่กำหนดได้อย่างไร


11

ฉันมีไฟล์แรสเตอร์ที่เซลล์ทั้งหมดมีค่าระหว่าง -3 และ 7 ไม่มีค่าข้อมูลคือ -9999 ฉันจะคำนวณจำนวนเซลล์ด้วยค่าเฉพาะเช่น 6 ได้อย่างไร ฉันสามารถใช้เครื่องคิดเลขได้ไหม

คำตอบ:


16

สองวิธีง่าย ๆ ที่เป็นไปได้:
1. )

  • ติดตั้งเครื่องคำนวณแรสเตอร์ QGIS หากยังไม่พร้อมใช้งาน (คุณไม่ได้ระบุเวอร์ชัน QGIS ที่คุณใช้)
  • ใช้เครื่องคิดเลข QGIS "Corine@1" = 23แรสเตอร์ที่มีสูตรเช่นนี้ สิ่งนี้จะแยกเซลล์ทั้งหมดด้วยค่า 23 ลงในแรสเตอร์ใหม่
  • จากนั้นใช้เครื่องมือ "สถิติเลเยอร์แรสเตอร์" ภายในกล่องเครื่องมือ SEXTANTE สำหรับ QGIS เพื่อคำนวณผลรวมทั้งหมดของเซลล์

ป้อนคำอธิบายรูปภาพที่นี่

2. ) หากคุณต้องการภาพรวมที่ซับซ้อนยิ่งกว่าจำนวนเซลล์แรสเตอร์คุณสามารถใช้ปลั๊กอิน LecoS สำหรับ QGIS

  • ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Numpy, Scipy และ PIL บนคอมพิวเตอร์ของคุณ ค้นหาคำแนะนำและวิธีการที่จะทำมันบน Windows บนของบล็อกหรือนี่
  • ดาวน์โหลด LecoS จากตัวติดตั้งปลั๊กอินและเปิดใช้งาน ไม่ควรมีข้อผิดพลาดปรากฏขึ้น
  • เรียกใช้เครื่องมือสถิติ Landcover (เมนู Raster -> นิเวศวิทยาภูมิทัศน์ -> สถิติ Landcover) ด้วยรูปแบบแรสเตอร์ของคุณ ตรวจสอบให้แน่ใจว่ารูปร่างของคุณมีการฉายภาพที่ถูกต้องค่าที่ไม่มีข้อมูลและเซลล์สี่เหลี่ยมแรสเตอร์
  • เลือกตัวเลือกตามที่แสดงด้านล่าง คุณสามารถบันทึกผลลัพธ์ในไฟล์. csv ผลลัพธ์ประกอบด้วย Landland ทั้งหมด (cellnumber * raster Cellize ^ 2) สำหรับชั้นเรียน Landcover ทั้งหมดของคุณ ป้อนคำอธิบายรูปภาพที่นี่

1
เพียงเพื่อให้ทราบว่าวันนี้กล่องเครื่องมือที่เรียกว่าการประมวลผล
Luís de Sousa

9

แก้ไข 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])

ป้อนคำอธิบายรูปภาพที่นี่


จริงๆแล้วมันง่ายกว่าการใช้วง คุณสามารถได้รับการนับโดยตรงโดยใช้ numpycount = dict(zip(*numpy.unique(a, return_counts=True))) : คุณอาจต้องตรวจสอบให้แน่ใจว่าคุณกำลังเรียกใช้ Python 64- บิตเพื่อหลีกเลี่ยงข้อผิดพลาดของหน่วยความจำ แม้ว่าฉันจะไม่ได้ทดสอบวิธีการจัดการNaNนั้น
jpmc26
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.