Làm thế nào để tính toán thống kê raster cho đa giác?


14

làm thế nào tôi có thể tính tổng, trung bình vv của các điểm raster (đa băng tần) trên mỗi đa giác của một lớp vectơ. Tôi đã nói rằng điều này được gọi là "thống kê khu vực". Tôi đã thử điều đó với QGIS trước.

Có một cách để làm điều đó nhưng quá chậm (chuyển đổi raster thành vector, giao với lớp vectơ thứ hai, tính toán hình học, xuất số, tính toán thống kê với bảng tính hoặc chương trình khác, nhập lại kết quả, mất mãi mãi cho tôi 350.000 điểm raster).

Tôi cũng đã được gợi ý để sử dụng saga-gis. Điều đó có "số liệu thống kê khu vực" nhưng những số liệu này dựa trên các danh mục từ băng raster, không phải trên đa giác từ lớp vectơ. Vì vậy, để sử dụng điều này, tôi sẽ phải chuyển đổi lớp vectơ của mình sang raster và sau đó tính toán các số liệu thống kê.

Đây dường như là cách sai để giải quyết điều này. Sẽ không có cách nào để tính đến các điểm raster thuộc về 2 hoặc nhiều đa giác vì chúng được giao nhau bởi ranh giới đa giác. Tôi giả định rằng số liệu thống kê dựa trên đa giác sẽ có thể xử lý việc này vì vậy tôi cũng cho rằng tôi chưa tìm thấy mô-đun chính xác.

Saga-gis thực sự có nhiều mô-đun. Xin vui lòng cho tôi biết cái nào là đúng cho ứng dụng này.


Tôi đang thử giải pháp của Rudivonstaden và các thông báo lỗi sau xuất hiện khi tôi nhập hai lệnh cuối cùng: >>> zonalstats = qgis.analysis.QgsZonalStatistic (vectorlayer, rasterfile) TracBack (cuộc gọi gần đây nhất): Tệp "<input>" , dòng 1, trong <module> AttributionError: 'module' object không có thuộc tính 'phân tích' >>> zonalstats.calculateStatistic (Không có) TracBack (cuộc gọi gần đây nhất cuối cùng): Tệp "<input>", dòng 1, trong <module > NameError: tên 'zonalstats' không được xác định Tôi đang tự hỏi liệu các lệnh có đúng không hoặc liệu tệp raster tôi đang sử dụng có đúng định dạng không? Cảm ơn!
Dan Wolf

Chào Dân. Stackexchange hoạt động hơi khác so với một diễn đàn. Mục đích là để có một tương tác loại Q & A chứ không phải là một cuộc thảo luận đang diễn ra. Nếu câu trả lời cho câu hỏi ban đầu không giải quyết được những gì bạn cần biết, bạn nên yêu cầu làm rõ trong phần bình luận hoặc xem xét hỏi một câu hỏi mới.
Jay Guarneri

Cảm ơn bình luận của bạn, Dan. Câu trả lời của tôi đã thiếu một báo cáo nhập khẩu cần thiết, mà bây giờ sẽ được sửa.
rudivonstaden

Câu trả lời:


22

Tôi đã vật lộn để làm chính xác điều tương tự, nhưng vì nhiều lý do tôi cam kết sử dụng QGIS. Tôi đã thử sử dụng v.rast.stats bằng cách sử dụng plugin GRASS và cũng thông qua plugin Sextante. Cách tiếp cận thứ hai đã thất bại, bởi vì nó dường như gắn các số liệu thống kê vào một lớp vectơ tạm thời mà sau đó nó sẽ xóa. Plugin GRASS hoạt động, nhưng nó không xử lý các đa giác chồng chéo.

Sau khi thực hiện một số thao tác tìm kiếm (trong nguồn của plugin ZonalStats nghe có vẻ hứa hẹn), tôi thấy rằng QGIS thực sự có các phương pháp thống kê khu vực được tích hợp trong API và chúng cũng có các ràng buộc Python. Vì vậy, miễn là bạn chỉ tìm kiếm count, summeanthống kê cho các tính năng đa giác của bạn, Python Console (Plugins> Python Console) hiện đang là cách dễ nhất để đính kèm các số liệu thống kê vào bảng thuộc tính đa giác.

  1. Chọn lớp raster của bạn trong TOC và nhập dòng sau vào bảng điều khiển (nó lấy tên tệp nguồn của lớp raster của bạn)

    >>> rasterfile = qgis.utils.iface.mapCanvas().currentLayer().source()

  2. Chọn lớp vectơ của bạn và thực hiện lệnh sau trong bàn điều khiển (nó tự lấy lớp vectơ)

    >>> vectorlayer = qgis.utils.iface.mapCanvas().currentLayer()

  3. Thực hiện ba lệnh sau trong bảng điều khiển (chúng chuyển lớp vectơ và tệp raster sang máy tính thống kê khu vực tích hợp của QGIS)

    >>> import qgis.analysis

    >>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)

    >>> zonalstats.calculateStatistics(None)

Các kết quả sẽ được thêm vào dưới dạng các trường bổ sung trong lớp đa giác.

Thống kê khu vực

Lưu ý rằng nếu bạn muốn nối thêm tiền tố vào các trường mới (thay vì chỉ lấy chúng dưới dạng tổng, trung bình và đếm), thì bạn sẽ thay thế lệnh đầu tiên trong bước 3 bằng cách sau (giả sử bạn muốn sử dụng 'zonal_' như tiền tố:

>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile,"zonal_")

1
+1 qgis.analysis.QssZonalStatistic ()
Aaron

Có plugin Zonal Statistics trong QGIS, vì vậy có lẽ bạn không cần phải tự thực hiện các lệnh được đề cập: docs.qgis.org/2.2/en/docs/user_manual/plugins/, tôi tự hỏi, tại sao không có khả năng tính toán tối đa và tối thiểu giá trị là tốt.
matandked

Tôi đã sử dụng kỹ thuật của bạn nhưng nó xóa một số đa giác :(
niahoo

6

Cuối cùng cũng tìm thấy nó: Trong thể loại mở đa dạng Saga-GIS và lưới dữ liệu, sau đó định hình-> lưới-> giá trị lưới-> thống kê lưới cho đa giác



3

Vấn đề này dường như đã được giải quyết cách đây một thời gian, nhưng dù sao tôi cũng sẽ thêm thìa vào súp vì gần đây tôi cần một số chỉ số raster.

Phương pháp của QGIS được mô tả bởi rudivonstaden hoạt động như một lá bùa, cảm ơn vì tiền boa. Tuy nhiên, trong trường hợp của tôi, tôi cũng muốn biết các giá trị tối thiểu và tối đa cho các giá trị raster trong đa giác của mình và chức năng mà tôi có thể tìm thấy trong QGIS. Tôi đã tìm thấy một giải pháp thông qua chức năng isectpolyrst trong GME , một công cụ yêu thích của tôi để giải quyết các vấn đề về GIS. Chức năng này cung cấp cho tôi các số liệu thống kê tôi cần và cũng khá nhanh chóng.

Tái bút GME có một chút phụ thuộc đáng tiếc (ArcGIS). Vì vậy, mặc dù bản thân chương trình có sẵn miễn phí cho mọi người, bạn cần ArcGIS để chạy nó. Nhưng nếu bạn có ArcGIS (bất kỳ cấp giấy phép nào), tôi khuyên bạn nên dùng thử.

BIÊN TẬP:

Tôi đã có được số liệu thống kê tôi muốn, nhưng sau đó tôi phát hiện ra rằng tôi đã vội vàng kết luận một chút vội vàng sau khi nhìn vào con số thực tế. Bạn có được số liệu thống kê, có, nhưng chỉ cho ban nhạc đầu tiên trong một raster. Vì vậy, nếu bạn hoạt động với hình ảnh raster 3 băng tần, các số liệu thống kê không đầy đủ. Tôi nên đã chỉ ra số lượng các kênh trong bài viết gốc của tôi. Tốt nhất để sử dụng SAGA-GIS như stn đề xuất ở trên nếu bạn làm việc với hình ảnh raster đa băng tần.


3
zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)
zonalstats.calculateStatistics(None)

tính toán theo mặc định chỉ là Đếm, Tổng và Trung bình (như bạn có thể biết Raster -> Zonal Statisticstrong Bàn làm việc của QGIS, nó có thể làm được nhiều hơn thế).

Ví dụ, nếu bạn muốn tính toán Chỉ số trung bình bạn phải sử dụng:

zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer, rasterfile, QgsZonalStatistics.Mean)
zonalstats.calculateStatistics(None)

xem API cho tất cả các tùy chọn.

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.