使用开源GIS提取点上的栅格值?


21

如何按点从栅格中提取值?

我宁愿不在Arcgis中。

我更喜欢Qgis或Mapwindow或其他开源gis。


1
因此,您有一些点,您需要从这些点下的栅格中提取值,或者需要将栅格像元转换为点。在我尝试找出答案之前,先检查一下。
内森·W

首先,我有一些点,我需要从这些点下的栅格中提取值。THNX!
瓦西里斯(Vassilis)2010年

Answers:


37

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/


5
人们仍然可以通过此问答找到上述职位。但是,该插件不是唯一的解决方案,也不再总是最简单的解决方案。另一种解决方案是处理工具箱中的Saga函数“将栅格值添加到点”。有关详细信息,请参见这篇文章
Ecodiv 2014年

警告。我只是运行了点采样工具。60,000点和13个栅格。结果每年都无法通过我的30个随机样本测试。该工具在大型数据集方面存在问题。我不会用它。
如果您不知道-GIS

尽管大型数据集存在上述问题,但一次提取所有多波段值非常有用。所有其他与QGIS相关的解决方案仅支持提取一个波段(例如GRASS r.what)或禁止使用多波段栅格(例如Saga-点的栅格值)。
EikeMike

7

在PostGIS 2.0中,您可以执行以下操作:

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

装入栅格时,请确保栅格平铺很小(装入器为-t 10x10)。


6

尝试使用QGIS 3.2.2和SAGA(默认情况下已安装在QGIS中):“栅格值转换为点”功能将为您完成所有工作:它将图像文件转换为点矢量形状,以获取栅格图像中的信息。


6

我在此线程中提到的QGIS和SAGA GUI工具遇到了问题(Raster values to points由于某种原因失败并抛出了无用的错误,GRASS v.sample创建了一个全新的无用层)。在使用GUI工具一段时间后,我尝试在Field Calculator中执行此操作。它运行得非常好,我能够比GUI更好地控制流程,并在此过程中进行了一些其他计算。

假设您在同一坐标系中都有一个名为的图层pts,另一个名为rast,您想rast在中代表的每个X,Y对处进行采样pts

如果您以前没有使用过字段计算器,那将非常简单。您将在“表达式”(Expression)框中输入计算,Q在中间列为您提供许多变量和运算,在右列中显示帮助文本。我将这个过程分为四个步骤:

  1. 打开pts您要采样的图层的属性表。

  2. 一旦你身在外地计算器对话框中,选择是否要创建一个新的领域修改现有场在你的pts层。

  3. 接下来,构建一个表达式以填充新的或现有的pts属性列。您可以先修改对我有用的表达式代码:

raster_value('rast', 1, make_point($x, $y))
  1. 您必须在处提供raster_value()栅格图层名称'rast',波段编号1和点几何make_point()$x$y依赖于所述属性表的每一行中的点的位置的几何形状的变量。

此方法还允许进行算术运算,例如减去另一个名为other_rastfrom的栅格图层的值rast,这节省了我大量的GUI工具时间。下面的例子:

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

再次注意,三层ptsrastother_rast必须在同一坐标系中才能起作用。


1
这是此问题的最佳答案
BC B.

4

Hawthorne Beyer的GME工具可以通过命令行很好地做到这一点,并允许使用“ for”循环轻松进行批处理。

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

GME isectpntrst命令参考





2

这是我使用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')

1

如果可以访问FME,则可以在FME Workbench中使用两个变压器之一。

所述RasterCellCoercer (“所有会分解输入的数字光栅特征为单独的点或面,一个向量的特征是在每个光栅单元输出”。)

所述PointOnRasterValueExtractor (“发生在点特征和一个单一的参考光栅。输出由在每个点处的位置的频带和调色板值(一个或多个)的”。)


不,我没有或没有使用FME,是独立的应用程序还是插件?
瓦西里斯(Vassilis)2010年

0

快速思考:

  1. gdal_polygonize.py-将栅格要素多边形化
  2. 将点要素和面插入PostGIS数据库
  3. 使用st_intersects函数提取要素相交的所有高程值

有趣的方法,因为昨天开始学习如何使用Postgis。
瓦西里斯(Vassilis)2012年

谢谢,这相当简单,但是可以用。这就是我使用这种方法所能产生的结果:i.imgur.com/h8CGJ.png
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.