2016-06-21 21 views
1

Ich verfolge diese question, um POI am nächsten zu einer Straße zu berechnen (Linienfolge). Ich bin in der Lage, die nächsten Punkte in der Linienfolge zu berechnen, aber ich kann die Entfernung vom POI zum nächsten Punkt (Scheitelpunkt) in der Linienfolge nicht finden.Wie berechnet man den nächsten Punkt zu einer Linienfolge in PostGIS?

Hier ist mein Code für die Suche nach dem nächsten 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)) 

Werte sind:

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

nächsten Punkt zu berechnen:

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

Wenn der Linienzug durch diese dargestellt wird: [85.280194 23.296728,85.281572 23.297479], möchte ich das Ergebnis wie:

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

Antwort

2

U ST_DumpPoints() sich die Eckpunkte der Linie zu extrahieren:

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

Sie haben GEOGRAPHY zu werfen, auf die Geometrie sonst st_dumppoints funktioniert nicht.

Ihre ganze Abfrage könnte wie so aussehen:

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