在Postgresql中,使用给定值计算点到最近栅格像素的距离

hyrbngr7  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(151)

上下文

我在我的Postgresql数据库中有一个表(hs_buildings),其中包含了我的建筑物的点位置(hs_buildings.coordinates)。然后我有一个栅格,其中包含了存储在Postgresql栅格表中的土地使用(名为hs_raster_values)。
光栅的分辨率为100x100,所有几何图形均为epsg 2056。

提问

我如何检索从我的建筑物位置到一个给定值的像素的最短距离(比如170005)

将栅格像素转换为点

下面的查询可以工作,但效率很低,如果在整个建筑物表上运行,将花费很长时间。

WITH hs_points AS
(
    WITH gv AS 
    (
        SELECT
            (ST_PixelAsCentroids(hs_raster_values.geometry, 1, true)).*
        FROM hs_raster_values
        WHERE hs_raster_values.raster_id = 1
    )

    SELECT
        (gv).x,
        (gv).y,
        (gv).val,
        gv.geom 
    FROM gv 
    WHERE val = 170005
)
SELECT 
    ST_Distance(hs_points.geom, hs_buildings.coordinates)
FROM hs_points, hs_buildings
WHERE hs_buildings.id = 1
ORDER BY hs_buildings.coordinates <-> hs_points.geom

LIMIT 1

字符串

内置Postgis栅格功能

通过查看文档,我看到有一个Postgis函数可以实现这个结果:ST_MinDist4ma。然而,文档非常糟糕,我发现自己无法理解我必须传递函数的适当参数。
我试过这个查询:

WITH building_pixel AS 
(
    SELECT 
        (ST_WorldToRasterCoordX(hs_raster_values.geometry, hs_buildings.coordinates),
        ST_WorldToRasterCoordY(hs_raster_values.geometry, hs_buildings.coordinates)) AS xy
    FROM hs_raster_values
    INNER JOIN hs_buildings ON ST_Intersects(hs_buildings.coordinates, hs_raster_values.geometry)
    WHERE hs_raster_values.raster_id = 1
    AND hs_buildings.egid = 1
    AND ST_Intersects(hs_buildings.coordinates, hs_raster_values.geometry)
)

SELECT 
    ST_MinDist4ma(170005, building_pixel.xy, hs_raster_values.geometry) AS min_distance
FROM hs_raster_values, building_pixel
WHERE raster_id = 1;


并得到以下错误:ERROR: function st_mindist4ma(integer, record, raster) does not exist LINE 14: ST_MinDist4ma(170005, building_pixel.xy, hs_raster_values.g...
有人知道我可以使用这个功能吗?

pbgvytdp

pbgvytdp1#

您传递给ST_MinDist4ma的参数似乎有问题。该函数可能不接受您提供的类型。您是否检查了函数签名并确保数据类型匹配?

628mspwn

628mspwn2#

感谢您的帮助。我确实错误地使用了ST_MinDist4ma。我现在这样使用它:

SELECT
        ST_Value(ST_SetSRID(ST_MapAlgebra(
            hs_raster_values.geometry, 
            ARRAY[170005]::integer[],
            'ST_MinDist4ma(double precision[], int[], text[])'::regprocedure
        ), 2056), hs_buildings.coordinates) AS min_distance
    FROM hs_buildings
    INNER JOIN hs_raster_values ON ST_Intersects(hs_raster_values.geometry, hs_buildings.coordinates)
    WHERE hs_raster_values.raster_id = 1 AND hs_buildings.id =1

字符串
这给予我一个光栅作为输出,然后我试图找到建筑物位置的相关值。然而,我得到以下错误:

NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster

ERROR:  Could not find raster band of index 1 when getting pixel value. Returning NULL 

SQL state: XX000

相关问题