PostGIS中多边形之间的正交距离

时间:2017-05-17 19:15:41

标签: postgresql postgis

我有一个点,两边有两个多边形。该方案如下所示:

Point on line scenario

现在,我想使用PostGIS查询计算两个多边形之间的垂直距离(例如,黄线)。我想知道是否有人可以建议我该怎么做?

EDIT1:

以上给出的情景就是一个例子。在有街道,点和多边形的场景中可能会出现复杂情况。例如,与街道平行的一侧可能并不总是在那里。

Scenario_2:

Scenario_2

Scenario_3:

Scenario_3

EDIT2

Scenario_4

Scenario_4

我想仅在线上有点的情况下计算垂直距离。据我所知,@JGH可以有例外。

1 个答案:

答案 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;