如何计算PostGIS中线串的最近点?

时间:2016-06-21 05:15:16

标签: postgresql geometry postgis nearest-neighbor geography

我跟随此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

1 个答案:

答案 0 :(得分:2)

使用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);
相关问题