实际上标题中的问题。
有一张桌子(osm_buildings
),其中有建筑物及其多边形的地址。有一点,你需要找到最近的多边形。
找到点之间的距离非常简单且可预测,但如何正确且最重要的是快速找到从点到多边形的距离?
距离算子<->
在点和多边形之间很好地工作。
您可以这样查询:
SELECT b.*
FROM osm_buildings AS b
ORDER BY b.polygon <-> 'POINT(3.14 2.78)'::geometry
LIMIT 10;
这将使10座建筑物最接近该点。
该查询可以使用polygon
列上的索引。
您可以在点和多边形之间使用ST_DISTANCE
,它将返回最短距离。
SELECT ST_Distance(
'SRID=4326;POINT(-70 42)'::geometry,
'SRID=4326;POLYGON((-72 42, -73 42, -73 43, -72 43, -72 42))'::geometry
);
--> 2
如果你想一次只返回一个结果,那么Laurenz Albe的回答是完美的。但是,如果您想一次返回多个点的结果,我假设您将建筑物存储在某个几何/地理类型字段中,而不是文本中。
select t2.*, a.*
from target t2,
lateral (select o.*
from osm_buildings o, target t
where t2.id=t.id
order by st_distance(o.geom::geography, t.geom::geography) limit 1) a
此外,如果您的数据集很大并且您从某些点接受现在在某个可接受范围(例如1 km)内的近似多边形,则可以在侧面的where子句中添加st_dwithin(o.geom,t.geom,your_max_distance)子查询。如果要返回多个“最接近的多边形”,只需增加限制即可。