Учитывая таблицу с геометрией линии и одну или несколько точек, которые привязаны к этой линии в отдельной таблице, я хотел бы разбить каждую линию с одной или несколькими пересекающимися точками в каждом из мест, где линия пересекает точку.
Например, есть линия L с тремя пересекающимися точками A, B и C по порядку вдоль геометрии линии. Я хотел бы вернуть L в виде четырех различных геометрий: от начала L до A, от A до B вдоль L, от B до C вдоль L и от C до конца L.
В прошлом я использовал стройные для этой задачи, которая является проблемой линейных ссылок ( http://sgillies.net/blog/1040/shapely-recipes/ ). Тем не менее, это не может быть осуществимо в этом случае, который имеет много миллионов линий и точек. Вместо этого я ищу решение, использующее PostgreSQL / PostGIS.
Обратите внимание, что точки должны находиться на одной линии. Кроме того, точка может действительно находиться в начале или конце линии, и в этом случае линия не должна быть разделена (если нет других точек, которые не совпадают с начальной или конечной точками той же линии). Линии подмножества должны сохранять свое направление и свои атрибуты, но атрибуты точечных объектов не имеют значения.
источник
IF geom_geometry_type NOT ILIKE '%LINESTRING' THEN
- я отредактировал это.ST_Split
поддерживает мультитач * Лопасти вpostgis 2.2
и выше postgis.net/docs/ST_Split.htmlОбновление до PostGIS 2.2 , где ST_Split был расширен для поддержки разделения по многолинейной, многоточечной или (много) полигональной границе.
источник
У меня нет полного ответа для вас, но ST_Line_Locate_Point принимает линию и точку в качестве аргументов и возвращает число от 0 до 1, представляющее расстояние вдоль линии до позиции, ближайшей к этой точке.
ST_Line_Substring принимает в качестве аргументов строку и два числа, каждое от 0 до 1. Числа представляют позиции на линии в виде дробных расстояний. Функция возвращает отрезок, который проходит между этими двумя позициями.
Работая с этими двумя функциями, вы сможете достичь того, чего хотите.
источник
Меня уже дважды просили об этом, извините за задержку. Это вряд ли можно считать кратким решением; Я написал это, когда чуть дальше по кривой обучения, чем сейчас. Любые советы приветствуются, даже стилистические.
источник
Я хочу расширить ответы выше с точки зрения начинающего. В этом сценарии у вас есть ряд точек, и вы смотрите, чтобы использовать их как «лезвие», чтобы разрезать линии на сегменты. Весь этот пример предполагает, что вы сначала привязали свои точки к линии и что точки имеют атрибут уникального идентификатора из их привязанной линии. Я использую «column_id» для представления уникального идентификатора строки.
Во-первых , вы хотите сгруппировать свои точки в несколько точек, когда на линию выпадает более одного лезвия. В противном случае функция split_line_multipoint действует как функция ST_Split, что не является желаемым результатом.
Затем вы хотите разделить свою сеть на основе этих многоточечных.
Повторите шаги 1 и 2 со своими линиями, которые имеют только одну точку пересечения. Для этого необходимо обновить код с шага 1 до «HAVING COUNT (*) = 1». Переименуйте таблицы соответственно.
Затем создайте дубликат таблицы строк и удалите записи с точками на них.
Наконец , объедините три таблицы вместе, используя
UNION ALL
:BAM!
источник