пустой ответ с использованием pgr_withPoints () - PullRequest
0 голосов
/ 03 мая 2019

Я сталкиваюсь с проблемой, касающейся алгоритма маршрутизации 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-битный.

...