我有一个点,两边有两个多边形。该方案如下所示:
现在,我想使用PostGIS查询计算两个多边形之间的垂直距离(例如,黄线)。我想知道是否有人可以建议我该怎么做?
EDIT1:
以上给出的情景就是一个例子。在有街道,点和多边形的场景中可能会出现复杂情况。例如,与街道平行的一侧可能并不总是在那里。
Scenario_2:
Scenario_3:
EDIT2
Scenario_4
我想仅在线上有点的情况下计算垂直距离。据我所知,@JGH可以有例外。
答案 0 :(得分:1)
假设您的数据是投影的,并且点与两个最接近的多边形之间的距离是您要查找的那个,您可以计算从每个点到两个多边形的距离并计算总和。
1)计算距离。将搜索限制在合理的距离,可能是预期的最大距离的两倍。确保几何图形已编入索引!!
SELECT pt.gid point_gid, plg.gid polygon_gid, ST_Distance(pt.geom, plg.geom) distance
FROM pointlayer pt, polygonlayer plg
WHERE ST_Distance(pt.geom, plg.geom) < 50
ORDER BY pt.gid, ST_Distance(pt.geom, plg.geom);
2)对于每个点,使用partition function
获取两个最接近的多边形SELECT
point_gid, polygon_gid, distance
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY point_gid ORDER BY distance asc) AS rank,
t.*
FROM
[distanceTable] t) top_n
WHERE
top_n.rank <= 2;
3)聚集结果并跟踪使用的多边形
select point_gid,
sum(distance) streetwidth,
string_agg(polygon_gid || ' - ' || distance,';') polyid_dist_info
from [top_2_dist dst]
group by dst.point_gid;
所有在一起:
SELECT
point_gid,
sum(distance) streetwidth,
string_agg(polygon_gid || ' - ' || distance,';') polyid_dist_info
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY point_gid ORDER BY distance asc) AS rank,
t.*
FROM
( SELECT pt.gid point_gid,
plg.gid polygon_gid,
ST_Distance(pt.geom, plg.geom) distance
FROM pointlayer pt, polygonlayer plg
WHERE ST_Distance(pt.geom, plg.geom) < 50
) t
) top_n
WHERE
top_n.rank <= 2
GROUP BY point_gid;