【问题标题】:How to calculate nearest point to a linestring in PostGIS?如何计算 PostGIS 中离线串最近的点?
【发布时间】:2016-06-21 05:15:16
【问题描述】:

我正在关注question 来计算最接近道路的 POI(线串)。我能够计算线串中的最近点,但我无法找到从 POI 到线串上最近点(顶点)的距离。

这是我查找最近 POI 的代码。

CREATE TABLE road(id serial PRIMARY KEY, the_geog geography(LINESTRING,4326) );

CREATE TABLE poi(gid serial PRIMARY KEY, name varchar, city varchar, the_geog geography(POINT,4326) )

值是:

INSERT INTO road (id, the_geog) VALUES (123, ST_GeographyFromText('SRID=4326;LINESTRING(85.280194 23.296728,85.281572 23.297479)') );

计算最近点:

SELECT 
    poi.name,
    poi.city,
    ST_AsTEXT(poi.the_geog),
    ST_Distance(road.the_geog, poi.the_geog)/1000.0 AS distance_km,
    ST_AsTEXT(road.the_geog::geometry)
FROM road, poi
WHERE
    road.id = 123
    AND ST_DWithin(road.the_geog, poi.the_geog, 10000.0)
ORDER BY
    ST_LineLocatePoint(road.the_geog::geometry, poi.the_geog::geometry),
    ST_Distance(road.the_geog, poi.the_geog)
;

如果线串是这样表示的:[85.280194 23.296728,85.281572 23.297479],我想要这样的结果:

poi                   vertex                 distance_km
85.280194 23.296728   85.280001 23.299876    3
85.289673 23.291987   85.281572 23.297479    5

【问题讨论】:

    标签: postgresql geometry postgis nearest-neighbor geography


    【解决方案1】:

    使用ST_DumpPoints()提取直线的顶点:

    SELECT id,the_geog, (ST_dumppoints(road.the_geog::GEOMETRY)).geom AS vertex FROM road;
    

    您必须将 GEOGRAPHY 转换为 GEOMETRY,否则 st_dumppoints 不起作用。

    您的整个查询可能如下所示:

    SELECT road.id AS road_id, 
           ST_Astext(poi.the_geog) AS poi, 
           ST_astext(road.vertex) AS vertex,
           ST_AsText(road.the_geog) AS line, 
           ST_Distance(vertex, poi.the_geog) AS distance
    FROM (SELECT id,the_geog, (ST_dumppoints(road.the_geog::GEOMETRY)).geom AS vertex 
              FROM road
          ) as road, 
          poi 
    WHERE road.id = 123
    ORDER by ST_Distance(vertex, poi.the_geog);
    

    【讨论】:

      猜你喜欢
      • 2021-10-16
      • 2014-05-15
      • 2018-12-02
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 2021-03-31
      相关资源
      最近更新 更多