当前位置: 首页 > 知识库问答 >
问题:

当几何图形几乎不相交时,光栅ST_Clip失败

司马狐若
2023-03-14

我正在尝试使用postgis执行空间统计。偶尔我会ST_Clip粉碎并停止查询。我认为当面几乎不与栅格相交时会发生这种情况。请参阅下面的示例。

SELECT ST_Summary(
        ST_Clip(
                ST_AddBand(
                        ST_MakeEmptyRaster(16, 16, 0, 0, 1, 1, 0, 0),
                        ARRAY[
                        ROW(1, '8BUI'::text, 0, 255),
                        ROW(2, '8BUI'::text, 0, 255),
                        ROW(3, '8BUI'::text, 0, 255)
                        ]::addbandarg[]
                )
                -- this works
                --, ST_GeomFromText('POLYGON((15.999999 15.999999, 15.999999 17, 17 17, 17 15.999999, 15.999999 15.999999))')
                -- this fails
                , ST_GeomFromText('POLYGON((15.9999999 15.9999999, 15.9999999 17, 17 17, 17 15.9999999, 15.9999999 15.9999999))')
        )
);

通过上述查询,我收到以下错误。

psql:demo_clip_fail_barelyintersects.sql:16: ERROR:  RASTER_clip: Could not get band from working raster 
CONTEXT:  PL/pgSQL function st_clip(raster,integer[],geometry,double precision[],boolean) line 8 at RETURN

我希望不返回任何记录,或者某种空栅格。在我的生产代码中,几何/栅格对是通过面表和栅格表之间的ST_Intersects(r.rast, p.geom)找到的。我想过为栅格制作边界框的一种方式,它比栅格的范围略小,但这很丑陋......

我的postgres和postgis版本是

  • x86_64-pc-linux-gnu上的PostgreSQL 9.6.1,由gcc(gcc)4.9.1编译,64位
  • POSTGIS=“2.3.1 r15264”GEOS=“3.6.0-CAPI-1.10.0 r0”PROJ=“版本4.9.32016年8月15日”GDAL=“GDAL 2.1.2,发布日期20 16/10/24”LIBXML=“2.9.4”LIBJSON=“0.12.1”RASTER

谢谢!

共有1个答案

云卓
2023-03-14

我的暂定解决方案是用开始/异常/结束块包裹,让异常部分返回空栅格。性能受到影响(~两次)。它会产生假阴性,但不确定要寻找什么......

-- function to work around bug in st_clip (fails when polygon barely intersects with raster)
-- not sure how much damage this has on performance
create or replace function st_clip_fuzzy(
        rast raster, nband integer[],
        geom geometry,
        nodataval double precision[] DEFAULT NULL, crop boolean DEFAULT TRUE
)
        returns raster
        as $$
        declare
        rec record;
        g geometry;
        begin
                return st_clip($1, $2, $3, $4, $5);
        exception
        when others then
                select st_intersection(st_envelope(rast), geom) into g;
                raise warning 'st_clip_fuzzy: intersection %', st_astext(g);
                raise warning 'st_clip_fuzzy: area intersection %', st_area(g);
                raise warning 'st_clip_fuzzy: area pixel %', abs(ST_ScaleX(rast) * ST_ScaleY(rast));
                raise warning 'st_clip_fuzzy: area ratio %', st_area(g) / abs(ST_ScaleX(rast) * ST_ScaleY(rast));

                return ST_MakeEmptyRaster(0, 0, ST_UpperLeftX(rast), ST_UpperLeftY(rast), ST_ScaleX(rast), ST_ScaleY(rast), ST_SkewX(rast), ST_SkewY(rast), ST_SRID(rast));
        end;
        $$ language 'plpgsql' immutable;

CREATE OR REPLACE FUNCTION st_clip_fuzzy(
        rast raster, nband integer,
        geom geometry,
        nodataval double precision, crop boolean DEFAULT TRUE
)
-- four more interfaces with different set of arguments
 类似资料:
  • 用Pixi绘制几何图形 使用图片纹理是制作精灵最有效的方式之一,但是Pixi也提供了自己低级的绘画工具。你可以使用它们来创造矩形、线段、复杂的多边形以及文本。并且它使用和Canvas Drawing API几乎一致的api,所以如果你熟悉canvas的话,那么几乎没有什么新东西需要学习。当然另一个巨大的优势在于,不同于Canvas的绘画api,你使用Pixi绘制的图形是通过WebGL在GPU上渲染

  • 在此处输入图像描述 grafico(){const bgColor={id:'bgColor', beforeDraw:(图表,步骤,选项)= }

  • 我在一个板上有几个对象,我想通过坐标获取这些对象的索引。我尝试过制作一个处理程序,并使用与相结合,但没有成功。这些方法给了我不同的坐标,无法匹配它们。 我是否应该用光标的坐标画一个矩形,并使用< code > getBoundInParent()。intersects方法? 有什么建议吗?

  • 下面的代码在我的图像上生成两个框。我正计划进一步分析这些框内的像素。 在下面的例子中,在红色方块的情况下,我不想继续下去,因为它的右上角有黑色像素。而我想继续在绿色方块的情况下,因为它没有一个黑色像素沿着它的边缘。

  • 我在这个表中存储了一些几何图形(140k) CREATE TABLE缓冲区(pk整数NOT NULL,geom几何体(MultiPolygon,4326),) 我想(如果可能的话)创建一个新表(buffersmerged),该表将包含生成的几何图形,其中预览在彼此相交时进行分组。 我预期的输出,就像在QGIS中使用缓冲区工具检查“溶解缓冲区结果”时一样,但我希望,而不仅仅是一个大的独特几何作为输出

  • 本教程将向您介绍提供使用Primitive API的几何图形和外观系统。这是一个高级主题,用于扩展具有自定义网格、形状、体积和外观的CesiumJS,而不是面向通用的Cesium用户。如果您有兴趣学习如何在地球上绘制各种形状和体积,请查看创建实体教程。 CesiumJS可以使用实体(如多边形和椭圆体)创建不同的几何类型。例如,将以下代码复制并粘贴到Hello World Sandcastle示例中