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.
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.
Câu trả lời:
"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/
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).
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.
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 points
vì 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 pts
và 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:
Mở bảng thuộc tính của pts
lớp bạn muốn lấy mẫu.
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 pts
lớp của bạn .
Tiếp theo, xây dựng một biểu thức để điền vào pts
cộ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))
raster_value()
tên lớp raster 'rast'
, số băng tần 1
và hình dạng điểm tại make_point()
. $x
và $y
là 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_rast
từ 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
, rast
và other_rast
phải nằm trong hệ tọa độ tương tự cho phương pháp này để làm việc.
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")
Trong GRASS GIS, bạn có thể truy vấn bản đồ trong GUI hoặc sử dụng http://grass.osgeo.org/gdp/html_grass64/r.what.html
http://gis-techniques.blogspot.com/2012/10/extract-raster-values-from-point.html từng bước hướng dẫn sử dụng gói R Raster trích xuất các giá trị raster từ các điểm.
Bạn có thể sử dụng điều này: http://www.saga-gis.org/saga_module_doc/2.1.3/shapes_grid_3.html
Nó nằm trong hộp công cụ SAGA của Qgis! Nó làm mọi thứ trong một bước :)
Đâ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')
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.")
Suy nghĩ nhanh: