如何按点从栅格中提取值?
我宁愿不在Arcgis中。
我更喜欢Qgis或Mapwindow或其他开源gis。
如何按点从栅格中提取值?
我宁愿不在Arcgis中。
我更喜欢Qgis或Mapwindow或其他开源gis。
Answers:
QGIS“点采样工具”应该是您要寻找的插件。
这是如何使用它的详细说明:http : //pvanb.wordpress.com/2010/02/15/sampling-raster-values-at-point-locations-in-qgis/
根据Paolo的评论进行更新:
插件不是唯一的解决方案,也不再总是最简单的解决方案。另一种解决方案是处理工具箱中的Saga函数“将栅格值添加到点”。有关详细信息,请参见http://pvanb.wordpress.com/2014/07/01/sampling-raster-values-at-point-locations-in-qgis-an-update/
我在此线程中提到的QGIS和SAGA GUI工具遇到了问题(Raster values to points
由于某种原因失败并抛出了无用的错误,GRASS v.sample
创建了一个全新的无用层)。在使用GUI工具一段时间后,我尝试在Field Calculator中执行此操作。它运行得非常好,我能够比GUI更好地控制流程,并在此过程中进行了一些其他计算。
假设您在同一坐标系中都有一个名为的图层pts
,另一个名为rast
,您想rast
在中代表的每个X,Y对处进行采样pts
。
如果您以前没有使用过字段计算器,那将非常简单。您将在“表达式”(Expression)框中输入计算,Q在中间列为您提供许多变量和运算,在右列中显示帮助文本。我将这个过程分为四个步骤:
打开pts
您要采样的图层的属性表。
一旦你身在外地计算器对话框中,选择是否要创建一个新的领域或修改现有场在你的pts
层。
接下来,构建一个表达式以填充新的或现有的pts
属性列。您可以先修改对我有用的表达式代码:
raster_value('rast', 1, make_point($x, $y))
raster_value()
栅格图层名称'rast'
,波段编号1
和点几何make_point()
。$x
和$y
依赖于所述属性表的每一行中的点的位置的几何形状的变量。此方法还允许进行算术运算,例如减去另一个名为other_rast
from的栅格图层的值rast
,这节省了我大量的GUI工具时间。下面的例子:
raster_value('rast', 1, make_point($x, $y)) - raster_value('other_rast', 1, make_point($x, $y))
再次注意,三层pts
,rast
和other_rast
必须在同一坐标系中才能起作用。
Hawthorne Beyer的GME工具可以通过命令行很好地做到这一点,并允许使用“ for”循环轻松进行批处理。
isectpntrst(in="path/to/shapefile", raster="path/to/raster", field="fieldname")
在GRASS GIS中,您可以在GUI中查询地图,也可以使用http://grass.osgeo.org/gdp/html_grass64/r.what.html
http://gis-techniques.blogspot.com/2012/10/extract-raster-values-from-points.html 包含使用R栅格数据包从点提取栅格值的逐步指南。
您可以使用以下网址:http : //www.saga-gis.org/saga_module_doc/2.1.3/shapes_grid_3.html
它在Qgis的SAGA工具箱中!它一步就能完成所有事情:)
这是我使用python和gdal编写的函数。该函数获取栅格列表和包含点坐标的pandas数据框,并返回具有点坐标,各个栅格像元的质心和各个像元值的pandas数据框。该功能是under development包chorospy包(在此处找到)的一部分。
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
假设栅格位于当前工作目录中,如何运行它的示例:
rasDf = getValuesAtPoint('.', ['raster1', 'raster2'], inPoints, 'x', 'y')
如果可以访问FME,则可以在FME Workbench中使用两个变压器之一。
所述RasterCellCoercer (“所有会分解输入的数字光栅特征为单独的点或面,一个向量的特征是在每个光栅单元输出”。)
所述PointOnRasterValueExtractor (“发生在点特征和一个单一的参考光栅。输出由在每个点处的位置的频带和调色板值(一个或多个)的”。)
快速思考: