2016-06-21 17 views
1

道路(線ストリング)に最も近いPOIを計算するには、このquestionに従います。私は線ストリングで最も近い点を計算することができますが、POIから線ストリング上の最も近い点(頂点)までの距離を見つけることができません。PostGISの線ストリングに最も近い点を計算するには?

ここに私の最も近い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)) 

値は次のとおりです。ラインストリングは、こので表現されている場合は

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); 

INSERT INTO road (id, the_geog) VALUES (123, ST_GeographyFromText('SRID=4326;LINESTRING(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 
[85.280194 23.296728,85.281572 23.297479]は、私のような結果が欲しいです

答えて

2

U SE ST_DumpPoints()ラインの頂点を抽出するには:

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

あなたはそうst_dumppointsが動作しない、GEOMETRYに地理をキャストする必要があります。

あなたの全体のクエリがそうのようになります。

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); 
関連する問題