Я сталкиваюсь с проблемой, касающейся алгоритма маршрутизации pgr_withPoints()
.У меня есть одна таблица 'fussg_routing' со столбцами (gid, geom, название улицы, длина, источник, цель), одна таблица fussg_routing_vertices_pgr
с nodes_id
и node_geometry
(вы можете объединить таблицы с помощью node_id
иисточник).При использовании алгоритма pgr_dijkstra()
все работает нормально, и я получаю маршрут между узлами, ближайшими к моей начальной и конечной точке.Сейчас я не пытаюсь начать с ближайшего узла, а с ближайшей точки, лежащей на ближайшей улице, используя pgr_withPoints()
.
Я создал таблицу pois
, аналогичную таблице примеров, приведенной в документе :
CREATE TABLE IF NOT EXISTS pois (
pid SERIAL PRIMARY KEY,
edge_id BIGINT,
side CHAR,
fraction FLOAT,
the_geom geometry,
newPoint geometry);
На следующем шаге я вставил необходимые данные:
WITH point_data AS
(SELECT * FROM "fussg_routing" ORDER BY ST_DISTANCE(ST_TRANSFORM(ST_PointFromText('POINT(8.675555580548018 50.10969977068385)', 4326), 25832), ST_TRANSFORM("fussg_routing".geom, 25832)) LIMIT 1)
INSERT INTO "pois" (pid, edge_id, fraction, the_geom, newpoint) values
((SELECT gid FROM point_data), -- as pid
(SELECT gid FROM point_data), -- as edge_id
(SELECT ST_LineLocatePoint(
ST_TRANSFORM((ST_DUMP(geom)).geom, 25832), ST_TRANSFORM(ST_PointFromText('POINT(8.675555580548018 50.10969977068385)', 4326), 25832)) FROM point_data), -- as fraction
(SELECT ST_TRANSFORM(ST_PointFromText('POINT(8.675555580548018 50.10969977068385)', 4326), 25832)), -- as the_geom
(SELECT ST_LineInterpolatePoint(
ST_TRANSFORM((ST_DUMP(geom)).geom, 25832),
(SELECT ST_LineLocatePoint(
ST_TRANSFORM((ST_DUMP(geom)).geom, 25832), ST_TRANSFORM(ST_PointFromText('POINT(8.675555580548018 50.10969977068385)', 4326), 25832)))) FROM point_data)); -- as newPoint
Пока все работает нормально, и созданная геометрия, а также edge_id
и дробь такие, какими они должны быть.
Далее я пытаюсь применить алгоритм pgr_withPoints()
с одним из следующих запросов:
SELECT * FROM pgr_withPoints(
'SELECT "gid" AS id, streetname, source, target, length AS cost FROM "fussg_routing"',
'SELECT 9601 AS edge_id, 0.448876481757386::float as fraction from "pois"',
5529,5708);
и,
SELECT * FROM pgr_withPoints(
'SELECT "gid" AS id, streetname, source, target, length AS cost FROM "fussg_routing"',
'SELECT edge_id, fraction from "pois"',
5529,5708);
И здесь выводнуль.
Запрос обеих частей по отдельности вывод выглядит нормально.
first: (например, limit 2):
id | streetname | source | target | cost
---------------------------------------------------------------------
14365 | Parkweg | 47 | 48 | 144.668586776812
14677 | Altenhoferalle | 49 | 50 | 30.6757233003559
second:
edge_id | fraction
------------------------------
9601 | 0.448876481757386
9590 | 0.0933449381876742
Начальная и конечная вершины (5529,5708) являются ближайшими узлами к заданным координатам.Использование отрицательных начальных и / или конечных вершин также не работает.
Дробь находится между 0 и 1 и не равна 0 или 1.
Добавление столбца с ближайшим node_id
для таблицы pois не имеет значения.
Относительно алгоритма я заметил некоторые проблемы, такие как:
- При создании таблицы pois столбец дроби был определен как float, ноего нужно было переопределить как число с плавающей точкой в запросе pgr_withPoints (например,
0.448876481757386::float
как дробь).В противном случае произошла ошибка:
Неожиданный тип столбца «дробь».Ожидаемый ЛЮБОЙ ЧИСЛЕННЫЙ КОНТЕКСТ: оператор SQL "pgr_withpoints" оператор 1
- Используя примеры данных и пример , вывод создается только в том случае, если не задан EPSG при созданиитаблица точек интереса (например:
the_geom
геометрия вместо геометрии geom (Point, 25832)).Я не знаю, если проблема возникает здесь?
Я использую: PostgreSQL 10.7 (Ubuntu 10.7-0ubuntu0.18.04.1) на x86_64-pc-linux-gnu, скомпилированный gcc (Ubuntu 7.3.0-27ubuntu1 ~ 18.04) 7.3.0, 64-битный.