上下文
我在我的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...
有人知道我可以使用这个功能吗?
2条答案
按热度按时间pbgvytdp1#
您传递给ST_MinDist4ma的参数似乎有问题。该函数可能不接受您提供的类型。您是否检查了函数签名并确保数据类型匹配?
628mspwn2#
感谢您的帮助。我确实错误地使用了ST_MinDist4ma。我现在这样使用它:
字符串
这给予我一个光栅作为输出,然后我试图找到建筑物位置的相关值。然而,我得到以下错误:
型