Нужен путь в виде лат, долго использующий pgrouting - PullRequest
1 голос
/ 06 января 2020

Я использую этот запрос для поиска пути с использованием postgresql, postgis, pgrouting, postgis_topology с использованием nodejs

client.query(
"WITH dijkstra AS (
  SELECT * 
  FROM pgr_dijkstra('SELECT id,source,target,distance AS cost 
     FROM edges_noded',230965,3338,false)) 
 SELECT seq, 
   CASE WHEN dijkstra.node = edges_noded.source THEN edges_noded.the_geom 
   ELSE ST_Reverse(edges_noded.the_geom) END AS route_geom 
 FROM dijkstra JOIN edges_noded ON(edge = id) 
 ORDER BY seq",(err,res)=>{ var data = res.rows;})

Теперь проблема в том, что этот запрос возвращает два столбца, которые

enter image description here

Я думаю, что в столбце route_geom на приведенном выше изображении есть информация о пути.

Как изменить указанный выше запрос, чтобы получить путь в форме широты и долготы.

Мне нужен полный путь в виде широты и долготы.

1 Ответ

1 голос
/ 06 января 2020

Если я вас правильно понял, вам просто нужно преобразовать уже существующие координаты в формат, который может прочитать ваше приложение. Существует множество форматов, которые вы можете получить непосредственно из PostGIS. Вот некоторые из них, которые могут вас заинтересовать:

Пример данных

CREATE TEMPORARY TABLE t (seq INT, the_geom GEOMETRY);
INSERT INTO t VALUES (1,'POINT(1 2)'),(2,'POINT(2 3)');

Геометрии в формате геометрии PostGIS - как вы делали до сих пор.

SELECT seq, the_geom FROM t;
 seq |                  the_geom                  
-----+--------------------------------------------
   1 | 0101000000000000000000F03F0000000000000040
   2 | 010100000000000000000000400000000000000840
(2 Zeilen)

Получение данных в виде широты и долготы в отдельных столбцах - ST_X, ST_Y

SELECT seq, ST_X(the_geom), ST_Y(the_geom) FROM t;
 seq | st_x | st_y 
-----+------+------
   1 |    1 |    2
   2 |    2 |    3
(2 Zeilen)

As WKT - ST_AsText

SELECT seq, ST_AsText(the_geom) FROM t;
 seq | st_astext  
-----+------------
   1 | POINT(1 2)
   2 | POINT(2 3)
(2 Zeilen)

.. или Geo JSON - ST_AsGeoJSON

SELECT seq, ST_AsGeoJSON(the_geom) FROM t;
 seq |             st_asgeojson             
-----+--------------------------------------
   1 | {"type":"Point","coordinates":[1,2]}
   2 | {"type":"Point","coordinates":[2,3]}
(2 Zeilen)

Так что ваши CTE, скорее всего, будут выглядеть как это

WITH dijkstra AS (
  SELECT *
  FROM pgr_dijkstra('SELECT id,source,target,distance AS cost 
    FROM edges_noded',230965,3338,false)) 
SELECT seq, 
  CASE WHEN dijkstra.node = edges_noded.source THEN ST_X(edges_noded.the_geom)
  ELSE ST_X(ST_Reverse(edges_noded.the_geom)) END AS route_geom_x,
  CASE WHEN dijkstra.node = edges_noded.source THEN ST_Y(edges_noded.the_geom)
  ELSE ST_Y(ST_Reverse(edges_noded.the_geom)) END AS route_geom_y 
FROM dijkstra JOIN edges_noded ON(edge = id) 
ORDER BY seq
...