使用PostGIS将栅格与多边形相交-Artefact Error


15

我正在使用PostGIS2.0进行一些栅格/多边形相交。我很难理解应该使用哪种操作以及执行此操作最快的方法是什么。我的问题如下:

  • 我有一个多边形和一个栅格
  • 我想找到落在多边形内的所有像素,并获取像素值的总和
  • 并且(已更新的问题):执行查询时,我正在获取原始栅格中不存在的一些像素的大量值

我难以理解应该使用ST_Intersects()还是ST_Intersection()。我也不知道对像素求和的最佳方法是什么。这是我尝试过的第一种方法(#1):

SELECT 
    r.rast 
FROM
    raster as r, 
    polygon as p
WHERE
    ST_Intersects(r.rast, p.geom)

这将返回一个rast值列表,我不确定该怎么做。我尝试使用计算汇总统计信息,ST_SummaryStats()但不确定这是否是多边形内所有像素的加权和。

SELECT  
        (result).count,
        (result).sum    
FROM (  
         SELECT 
            ST_SummaryStats(r.rast) As result
         FROM
            raster As r, 
            polygon As p
         WHERE
            ST_Intersects(r.rast, p.geom)    
    ) As tmp

我尝试过的另一种方法(#2)使用ST_Intersection()

 SELECT
        (gv).geom,         
        (gv).val
 FROM 
 (
    SELECT 
        ST_Intersection(r.rast, p.geom) AS gv
    FROM 
        raster as r, 
        polygon as p           
    WHERE 
        ST_Intersects(r.rast, p.geom)

      ) as foo;

这将返回一个几何列表,我将对其进行进一步分析,但是我认为这样做的效率较低。

我不清楚哪个也是最快的操作顺序。我应该总是选择raster, polygonpolygon, raster,还是将多边形转换成栅格以使之成为栅格raster, raster

编辑:我使用R.K.的链接中的一些详细信息更新了方法#2 。

使用方法2,我注意到结果中存在以下错误,这是为什么我不理解输出的部分原因。这是我原始栅格的图像,以及用于与其相交的多边形的轮廓,该轮廓覆盖在顶部:

在此处输入图片说明

这是使用PostGIS相交的结果:

在此处输入图片说明

结果的问题是返回了21474836的值,这些值不在原始栅格中。我不知道为什么会这样。我怀疑它与某个地方的小数有关(几乎除以0),但是它返回错误的结果。


关于第二点,您想获得与多边形相交的像素值的总和吗?
RK 2012年

是的,我曾经使用ST_SummaryStats()过#1,但不确定如何使用#2。
djq 2012年

发表了参考链接。希望对您有所帮助。
RK 2012年

2
地图中比例尺的最大值是32位有符号整数的最大值。我不知道这对您而言意味着什么,但可能与NA值有关。查询中的范围可能包含未正确处理的空值。en.wikipedia.org/wiki/2147483#2147483647_in_computing
Yellowcap

6
FWIW 21474836 不是 32位有符号整数的最大值。但是,最大 2 ^ 31-1 = 2147483647 ,请注意21474836 = 2147483647/100(整数除法)。这暗示在内部生成了一些NA(可能沿着边界单元),它们表示为2 ^ 31-1,然后代码“忘记”了这些NA,并且(可能是在重采样过程中)将它们除以100。

Answers:


6

我找到了一个使用PostGIS WKT Raster进行矢量栅格相交的教程,该矢量多边形具有较大的栅格覆盖率。可能会找到您想要的答案。

本教程使用了两个数据集,一个点形文件(已缓冲以生成多边形)和一系列13个SRTM高程栅格。两者之间有很多步骤,但是用于与栅格和矢量相交的查询如下所示:

 CREATE TABLE caribou_srtm_inter AS
 SELECT id, 
        (gv).geom AS the_geom, 
        (gv).val
 FROM (SELECT id, 
              ST_Intersection(rast, the_geom) AS gv
       FROM srtm_tiled,
            cariboupoint_buffers_wgs
       WHERE ST_Intersects(rast, the_geom)
      ) foo;

然后使用以下内容汇总值:

 CREATE TABLE result01 AS
 SELECT id, 
        sum(ST_Area(ST_Transform(the_geom, 32198)) * val) / 
        sum(ST_Area(ST_Transform(the_geom, 32198))) AS meanelev
 FROM caribou_srtm_inter
 GROUP BY id
 ORDER BY id;

我对PostGIS的了解并不多,但确实听起来像您要完成的任务。本教程应阐明中间步骤。祝好运 :)


谢谢@RK,我确实阅读了该教程。我认为我的计算更为基础,但我仍在找出这一基本步骤!
djq 2012年

2

关于原始问题中的第2点-一些postgis 2.0开发版本使用了GDAL库版本,该版本将float转换为int。如果您的栅格中包含浮点值,并且您使用的GDAL版本低于1.9.0,或者PostGIS 2.0预发行版本未正确调用GDALFPolygonize(),则您可能遇到此错误。已提交并关闭了PostGISGDAL错误跟踪器中的票证。这个错误在最初提出问题的时候是活跃的。

在性能方面,您会发现使用ST_Intersects(raster, geom)比使用快得多ST_Intersects(geom, raster)。第一个版本栅格化几何图形,并进行栅格空间相交。第二个版本将几何矢量化,并进行矢量-空间相交,这可能是更昂贵的过程。


0

我也有使用奇怪的问题ST_SummaryStatsST_Clip。查询数据的方式不同,告诉我栅格的最小值是32,然后是最大值300,但ST_SummaryStats对于目标多边形中的像素值却返回-32700。

我最终就这样解决了这个问题:

WITH first AS (
   SELECT id, (ST_Intersection(geom, rast)).val
   FROM raster_table
   INNER JOIN vector_table ON ST_Intersects(rast, geom)
)
SELECT id, COUNT(val), SUM(val), AVG(val), stddev(val), MIN(val), MAX(val)
FROM first
GROUP BY id
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.