Trích xuất các giá trị raster tại các điểm bằng cách sử dụng GIS nguồn mở?


21

Làm thế nào tôi có thể trích xuất các giá trị từ một raster theo điểm?

Tôi không thích ở Arcgis.

Tôi thích trong Qgis hoặc Mapwindow hoặc gis nguồn mở khác.


1
Vì vậy, bạn có điểm và bạn cần trích xuất các giá trị từ raster theo các điểm đó hoặc bạn cần chuyển đổi các ô raster thành các điểm. Chỉ cần kiểm tra trước khi tôi cố gắng và tìm ra câu trả lời.
Nathan W

Đầu tiên, tôi có các điểm và tôi cần trích xuất các giá trị từ raster, dưới các điểm đó. THNX !!
Vassilis

Câu trả lời:


37

"Công cụ lấy mẫu điểm" của QGIS sẽ là plugin bạn đang tìm kiếm.

Dưới đây là một mô tả chi tiết về cách sử dụng nó: http://pvanb.wordpress.com/2010/02/15/sampling-raster-values-at-point-locations-in-qgis/

Cập nhật dựa trên nhận xét của Paolo:

Plugin không phải là giải pháp duy nhất và không phải lúc nào cũng là giải pháp đơn giản nhất. Một giải pháp thay thế là chức năng Saga 'Thêm giá trị raster vào điểm' trong hộp công cụ xử lý. Xem để biết chi tiết http://pvanb.wordpress.com/2014/07/01/sampling-raster-values-at-point-locations-in-qgis-an-update/


5
Mọi người vẫn đang tìm thấy bài viết được đề cập ở trên thông qua hỏi đáp này. Tuy nhiên, plugin không phải là giải pháp duy nhất và không phải lúc nào cũng là giải pháp đơn giản nhất. Một giải pháp thay thế là chức năng Saga 'Thêm giá trị lưới vào điểm' trong hộp công cụ xử lý. Xem để biết chi tiết bài này .
Ecodiv

Chú ý. Tôi vừa chạy Công cụ lấy mẫu điểm. 60.000 điểm và 13 raster. Kết quả thất bại trong 30 bài kiểm tra mẫu ngẫu nhiên của tôi mỗi năm. Công cụ này có vấn đề với bộ dữ liệu lớn. Tôi sẽ không sử dụng nó.
Nếu bạn không biết - chỉ cần GIS

Mặc dù các vấn đề được đề cập với các bộ dữ liệu lớn, nó rất hữu ích để trích xuất tất cả các giá trị multiband trong một lần. Tất cả các giải pháp khác liên quan đến QGIS chỉ hỗ trợ trích xuất một băng tần (như GRASS r.what) hoặc cấm sử dụng raster multiband (như Saga - giá trị raster cho các điểm).
EikeMike

7

Trong PostGIS 2.0, bạn có thể làm:

SELECT ST_Value(rast, geom) val
FROM yourrastertabe, yourpointtable
WHERE ST_Intersects(rast, geom)

Hãy chắc chắn rằng raster của bạn được lát rất nhỏ khi bạn tải nó (-t10 x10 với trình tải).


6

Hãy thử sử dụng QGIS 3.2.2 và SAGA (được cài đặt theo mặc định trong QGIS): Hàm "Raster Values ​​to Points" sẽ làm mọi thứ cho bạn: Nó lấy một tệp hình ảnh và chuyển đổi nó thành hình dạng vectơ lấy thông tin từ hình ảnh raster.


6

Tôi đã gặp vấn đề với các công cụ GUI của QGIS và SAGA được đề cập trong luồng này ( Raster values to pointsvì một số lý do và đã ném các lỗi không có ích và GRASS v.sampleđã tạo ra một lớp hoàn toàn mới không hữu ích). Sau một thời gian thất bại với các công cụ GUI, tôi đã thử làm điều này trong Máy tính trường. Nó hoạt động khá tốt và tôi có thể kiểm soát quá trình tốt hơn một chút so với GUI cho phép và thực hiện một số tính toán khác trên đường đi.

Giả sử bạn có một lớp được đặt tên ptsvà một lớp khác được đặt tên rast, cả hai trong cùng một hệ tọa độ. Bạn muốn lấy mẫu rastở mỗi cặp X, Y được đại diện trong pts.

Nếu trước đây bạn chưa sử dụng Máy tính Trường, điều đó khá đơn giản. Bạn sẽ nhập phép tính của mình vào ô "Biểu thức" và Q cung cấp cho bạn một số biến và thao tác ở cột giữa, với văn bản trợ giúp ở cột bên phải. Tôi sẽ chia quá trình này thành bốn bước:

  1. Mở bảng thuộc tính của ptslớp bạn muốn lấy mẫu.

  2. Khi bạn đang ở trong hộp thoại Máy tính trường, hãy chọn xem bạn muốn tạo trường mới hay Sửa đổi trường hiện có trong ptslớp của bạn .

  3. Tiếp theo, xây dựng một biểu thức để điền vào ptscột thuộc tính mới hoặc hiện có . Bạn có thể bắt đầu bằng cách sửa đổi mã biểu thức làm việc cho tôi:

raster_value('rast', 1, make_point($x, $y))
  1. Bạn phải cung cấp raster_value()tên lớp raster 'rast', số băng tần 1và hình dạng điểm tại make_point(). $x$ylà các biến hình học phụ thuộc vào vị trí của điểm trong mỗi hàng của bảng thuộc tính.

Phương pháp này cũng cho phép các hoạt động số học như trừ đi giá trị của một lớp raster khác được gọi other_rasttừ rastđó, giúp tôi tiết kiệm rất nhiều thời gian cho các công cụ GUI. Ví dụ dưới đây:

raster_value('rast', 1, make_point($x, $y)) - raster_value('other_rast', 1, make_point($x, $y))

Lưu ý một lần nữa rằng ba lớp pts, rastother_rastphải nằm trong hệ tọa độ tương tự cho phương pháp này để làm việc.


1
đây là câu trả lời tốt nhất cho câu hỏi này
BC B.

4

Các công cụ GME của Hawthorne của Beyer thực hiện điều này một cách độc đáo thông qua dòng lệnh và cho phép tạo khối dễ dàng với các vòng lặp 'cho'.

isectpntrst(in="path/to/shapefile", raster="path/to/raster", field="fieldname")

Tham chiếu lệnh GME isectpntrst





2

Đây là một chức năng tôi đã viết bằng python và gdal. Hàm này lấy một danh sách các raster và một khung dữ liệu gấu trúc chứa tọa độ điểm và trả về một khung dữ liệu gấu trúc với tọa độ điểm, tâm cho các ô raster tương ứng và các giá trị ô tương ứng. Chức năng này là một phần của gói chorospy dưới sự phát triển (tìm thấy ở đây ).

import pandas
import numpy
from osgeo import gdal

def getValuesAtPoint(indir, rasterfileList, pos, lon, lat):
    #gt(2) and gt(4) coefficients are zero, and the gt(1) is pixel width, and gt(5) is pixel height.
    #The (gt(0),gt(3)) position is the top left corner of the top left pixel of the raster.
    for i, rs in enumerate(rasterfileList):

        presValues = []
        gdata = gdal.Open('{}/{}.tif'.format(indir,rs))
        gt = gdata.GetGeoTransform()
        band = gdata.GetRasterBand(1)
        nodata = band.GetNoDataValue()

        x0, y0 , w , h = gt[0], gt[3], gt[1], gt[5]

        data = band.ReadAsArray().astype(numpy.float)
        #free memory
        del gdata

        if i == 0:
            #iterate through the points
            for p in pos.iterrows():
                x = int((p[1][lon] - x0)/w)
                Xc = x0 + x*w + w/2 #the cell center x
                y = int((p[1][lat] - y0)/h)
                Yc = y0 + y*h + h/2 #the cell center y
                try:
                    if data[y,x] != nodata:
                        presVAL = [p[1][lon],p[1][lat], '{:.6f}'.format(Xc), '{:.6f}'.format(Yc), data[y,x]]
                        presValues.append(presVAL)
                except:
                    pass
            df = pandas.DataFrame(presValues, columns=['x', 'y', 'Xc', 'Yc', rs])
        else:
            #iterate through the points
            for p in pos.iterrows():
                x = int((p[1][lon] - x0)/w)
                y = int((p[1][lat] - y0)/h)
                try:
                    if data[y,x] != nodata:
                        presValues.append(data[y,x])
                except:
                    pass
            df[rs] = pandas.Series(presValues)
    del data, band
    return df

Ví dụ về cách chạy nó với các trình quét trong thư mục làm việc hiện tại của bạn:

rasDf = getValuesAtPoint('.', ['raster1', 'raster2'], inPoints, 'x', 'y')

1

Nếu bạn có quyền truy cập vào FME thì bạn có thể sử dụng một trong hai máy biến áp trong FME Workbench.

Các RasterCellCoercer ( "phân hủy tất cả các đầu vào số tính năng raster vào điểm cá nhân hoặc đa giác. Một tính năng vector là đầu ra cho mỗi tế bào trong raster.")

Các PointOnRasterValueExtractor ( "Đưa vào đối tượng điểm và raster tham khảo duy nhất. Sản lượng bao gồm các ban nhạc và bảng giá trị (s) tại vị trí của mỗi điểm.")


Không tôi không có hoặc sử dụng FME, là một ứng dụng độc lập hay một plugin?
Vassilis

0

Suy nghĩ nhanh:

  1. gdal_polygonize.py - đa giác hóa tính năng raster của bạn
  2. Chèn các tính năng điểm và đa giác của bạn vào cơ sở dữ liệu PostGIS
  3. Sử dụng hàm st_intersects để kéo tất cả các giá trị độ cao nơi các tính năng giao nhau

Cách tiếp cận thú vị, bởi vì ngày hôm qua bắt đầu học cách sử dụng Postgis.
Vassilis

Cảm ơn, nó khá đơn giản nhưng nó hoạt động. Đây là những gì tôi có thể tạo ra với phương pháp này: i.imgur.com/h8CGJ.png
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.