Làm thế nào để tính số lượng ô với một giá trị nhất định?


11

Tôi có một tệp raster trong đó tất cả các ô có giá trị từ -3 đến 7, không có giá trị dữ liệu nào là -9999. Làm cách nào để tính số lượng ô có giá trị cụ thể, ví dụ 6? Tôi có thể sử dụng máy tính không?

Câu trả lời:


16

Hai cách dễ dàng có thể:
1.)

  • Cài đặt máy tính raster QGIS nếu nó chưa có sẵn (bạn không chỉ định phiên bản QGIS nào bạn đang sử dụng)
  • Sử dụng máy tính raster QGIS với công thức như thế này "Corine@1" = 23. Điều này sẽ trích xuất tất cả các ô có giá trị 23 vào một raster mới
  • Sau đó, sử dụng công cụ "Số liệu thống kê lớp Raster" trong hộp công cụ SEXTANTE cho QGIS để tính tổng số ô.

nhập mô tả hình ảnh ở đây

2.) Nếu bạn muốn có một cái nhìn tổng quan tinh vi hơn về số lượng tế bào raster, bạn có thể sử dụng plugin LecoS cho QGIS.

  • Hãy chắc chắn rằng bạn đã cài đặt Numpy, Scipy và PIL trên máy tính của bạn. Tìm một hướng dẫn cách thực hiện trên Windows trên Blog của tôi hoặc tại đây .
  • Tải xuống LecoS từ trình cài đặt Plugin và kích hoạt nó. Không có lỗi nên bật lên.
  • Chạy công cụ thống kê Landcover (Menu Raster -> Sinh thái cảnh quan -> Thống kê Landpack) với hình dạng raster của bạn. Đảm bảo rằng hình dạng của bạn có hình chiếu chính xác, giá trị không có dữ liệu được đặt và các ô raster vuông.
  • Chọn các tùy chọn như hiển thị dưới đây. Bạn có thể lưu kết quả trong tệp .csv. Các kết quả đầu ra chứa tổng số vùng đất (cellnumber * raster cellize ^ 2) cho tất cả các lớp phủ đất của bạn. nhập mô tả hình ảnh ở đây

1
Chỉ cần lưu ý rằng những ngày này hộp công cụ được gọi là Xử lý .
Luís de Sousa

9

EDIT 3 : Tôi đã chuyển đổi mã bên dưới thành tập lệnh SEXTANTE khá có thể sử dụng để đưa ra kết quả sau: nhập mô tả hình ảnh ở đây

Hướng dẫn chi tiết và liên kết tải xuống có thể được tìm thấy ở đây .


Bạn có thể sử dụng bàn điều khiển python cho nhiệm vụ này. Sao chép mã được cung cấp dưới đây, dán nó vào một tệp văn bản và lưu nó dưới dạng "some_script.py" chẳng hạn. Lần tới, bạn sẽ cần đếm các giá trị ô mở bảng điều khiển python trong QGIS, nhấn nút 'hiển thị trình chỉnh sửa' và mở tập lệnh này ở đó. Sau đó thay thế 'raster_path' trong hàng tiếp theo trong tập lệnh bằng đường dẫn thực tế đến trình raster của bạn và lưu các thay đổi. Sau đó chạy tập lệnh và trong đầu ra của bàn điều khiển (ở bên trái từ trình chỉnh sửa trên ảnh chụp màn hình bên dưới), bạn sẽ thấy số lượng ô cho mỗi giá trị bạn có trong raster.

Lưu ý rằng bạn sẽ cần phải cài đặt python-numpy để tập lệnh này hoạt động.

EDIT: Ngoài ra, nếu bạn không cần các giá trị chính xác nhưng bạn muốn xem phân phối các giá trị, bạn có thể sử dụng phương pháp được mô tả ở đây .

EDIT 2: phiên bản nâng cao hơn của kịch bản được cung cấp. Bây giờ nó hoạt động với các trình quét đa băng tần và xử lý các giá trị 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])

nhập mô tả hình ảnh ở đây


Nó thực sự dễ dàng hơn nhiều so với việc sử dụng một vòng lặp. Bạn có thể lấy số lượng trực tiếp bằng cách sử dụng numpy : count = dict(zip(*numpy.unique(a, return_counts=True))). Tuy nhiên, bạn có thể cần đảm bảo rằng bạn đang chạy Python 64 bit để tránh lỗi bộ nhớ. Mặc dù tôi đã không kiểm tra làm thế nào mà xử lý NaN.
jpmc26
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.