SQL: Как получить источник/цель заданных координат в шейп-файле строки в таблице PostGIS?

Я загрузил шейп-файл строки в PostGIS и использовал pgr_createTopology в pgRouting, чтобы сделать таблицу маршрутизируемой, добавив источник и цель (назначив 2 конечных узла номера источника строки и номера цели). Следующий рисунок был частью таблицы:

введите здесь описание изображения

Теперь у меня есть некоторые координаты конечных узлов, которые принадлежат строкам в таблице, и я хочу знать, какое количество источников/целей соответствовало этим координатам.

Например, в таблице выше предположим, что 259463.392, 2737830.062 был одним из конечных узлов line id=1 и line id=2, тогда эта координата имеет source/target=175

Я новичок в SQL и попробовал какой-то запрос, но получил ошибки:

SELECT ST_AsText(geom) from source;
   FROM public.tc_line15_split;

ошибка:

ERROR:  syntax error at or near "FROM"
LINE 2:        FROM public.tc_line15_split;
               ^
********** Error **********

ERROR: syntax error at or near "FROM"
SQL state: 42601
Character: 45

ОБНОВЛЕНИЕ №1

Я думаю, что мог бы просто знать, что я хочу, если источник/цель столбца содержит информацию о координате узла, но, похоже, это не так, это просто столбец, содержащий числа.

Я получил таблицу вершин, как показано ниже:

введите здесь описание изображения

Я использовал следующий запрос, чтобы получить таблицу ниже:

select source, target, st_astext(geom) as geom from public.tc_line15_split;

введите здесь описание изображения

и я все еще ищу, могу ли я получить мою потребность через 2 таблицы выше.

Итак, я попробовал запрос ниже и получил 2 строки рядом с заданной координатой:

select id from tc_line15_split 
where st_dwithin(geom, st_setsrid(st_makepoint(259463.392, 2737830.062), 3826), 0.1);

введите здесь описание изображения

и позже я нашел из таблицы показал на первом рисунке, что координата источник/цель=54 id 170/51 соответственно, но это все еще неэффективно.

Мне интересно, есть ли способы найти один и тот же номер источника/цели, которые в данном случае содержат line id=51 и line id=170, после того, как я обнаружил, что данная координата находится между этими двумя строками?


ОБНОВЛЕНИЕ №2

Основываясь на таблице вершин, я использовал следующий запрос, чтобы получить соответствующий исходный номер, который также является идентификатором точки данной координаты:

select id from tc_line15_split_vertices_pgr 
where st_dwithin(the_geom, st_setsrid(st_makepoint(259463.392, 2737830.062), 3826), 0.1);

введите здесь описание изображения


person Heinz    schedule 01.11.2016    source источник
comment
Какова ваша конечная цель в этом случае?   -  person songololo    schedule 02.11.2016
comment
Первоначально мне нужно использовать QGIS, чтобы найти местоположение координаты и к какой строке (с идентификатором) она принадлежит, а затем использовать таблицу в сообщении, чтобы проверить, какому источнику/цели соответствует координата. Это слишком неэффективно. Так что я просто хочу, чтобы процесс был намного быстрее и эффективнее, и я думаю, что это может быть достигнуто.   -  person Heinz    schedule 02.11.2016
comment
Pg_createtopology также создает таблицу вершин, которая может уже содержать информацию, которую вы ищете?   -  person songololo    schedule 02.11.2016
comment
@shongololo Я получил таблицу вершин tc_line15_split_pgr, но она содержит только id, cnt, chk и геометрию, без подробностей о количестве источника/цели.   -  person Heinz    schedule 03.11.2016
comment
cnt — это количество ребер, у которых есть источник/цель в этой вершине.   -  person songololo    schedule 03.11.2016


Ответы (2)


Если вы пытаетесь выяснить, сколько ребер сети имеют общий узел, то самый простой способ сделать это — использовать таблицу вершин, сгенерированную pgr_createTopology(). Согласно документации, он создает таблицу с таким же именем, как и ваша таблица ребер, но с добавлением _vertices_pgr.

Если вы затем запустите метод pgr_analyzeGraph(), он заполнит пустые столбцы внутри таблицы my_table_vertices_pgr статистикой каждой вершины. Одной из таких статистических данных является столбец cnt, который показывает, сколько раз конкретная вершина является общей для любых смежных ребер.

введите здесь описание изображения

Редактировать:

Что касается некоторых других аспектов вашего вопроса:

Первый запрос в вашем вопросе возвращает ошибку из-за синтаксиса, это должно работать:

SELECT ST_AsText(geom) FROM public.tc_line15_split;

Что касается обновления № 1 -> Координаты узла не хранятся явно в таблице вершин, но вы можете получить их для определенного идентификатора узла (например, 15) с помощью этого запроса:

SELECT ST_AsText(ST_Centroid(the_geom))
    FROM tc_line15_split_vertices_pgr
    WHERE id = 15

Или, если вы просто хотите X и Y:

SELECT ST_X(the_geom), ST_Y(the_geom)
    FROM tc_line15_split_vertices_pgr
    WHERE id = 15
person songololo    schedule 02.11.2016

Чтобы перечислить таблицу:

select source, target, st_astext(geom) as geom from public.tc_line15_split;

У вас также должна быть таблица вершин со столбцами, такими как id и geom, и если вы хотите найти ближайший узел к местоположению, вы можете использовать что-то вроде:

select id from vertices where st_dwithin(geom, st_setsrid(st_makepoint(x,y), 3826), tol);

где x, y — ваши координаты, а tol — радиус поиска.

person Stephen Woodbridge    schedule 02.11.2016
comment
Спасибо за усилия! - person Heinz; 03.11.2016