Страница 1 из 1
И вновь от чайника: пересечение концов полилинии с точками
Добавлено: 02 июн 2015, 08:12
Sviazist
Уважаемые специалисты, ткните, пожалуйста, ещё разок носом в функцию. Требуется: есть слой полилиний (именно полилиний, а не мультиполилиний) - кабельные линии связи. Есть слой точечных объектов - узлы связи. Оба слоя хранятся в пространственной БД PostgreSQL. Нужно, чтобы при нанесении нового объекта-полилинии в поля этого объекта "узел 1" и "узел 2" заносились значения индексов gid узлов, в которых полилиния начинается и заканчивается (линия связи всегда прокладывается между двумя существующими узлами без исключений). Я вижу решение таким: триггер на создание нового объекта в базе данных, функция вычисляет через геомертию, в какие точечные объекты-узлы попали начальная и конечная точки полилинии, выбирает номера этих узлов и заносит в соответствующие поля нового объекта-полилинии. Загвоздка в чём - как вытащить именно крайние точки полилинии из поля геометрии, при этом с уточнением, какая из них начальная, а какая конечная? Через питон у меня это получалось делать, представляя полилинию как пронумерованный массив точек, а через plpgsql что-то не осилил. Или, может, существует специальная функция, которая выдаёт признак совпадения начальной и конечной точек полилинии с объектами, имеющими точечную геометрию? Буду благодарен за любые советы.
Re: И вновь от чайника: пересечение концов полилинии с точка
Добавлено: 02 июн 2015, 08:58
trir
1. Никогда нельзя быть уверенным, что точки совпадут - нужно закладывать допуски!
2. Тыкаю:
6.1.6.2 Методы
⎯ StartPoint ( ): Point - первая точка Curve.
⎯ EndPoint ( ): Point - последняя точка Curve.
3. С учётом допусков, нужно просто найти точку, растояние до которой меньше допуска
6.1.2.4 Методы пространственного анализа⎯ Distance (anotherGeometry: Geometry): Double - возвращает кратчайшее расстояние между данным объектом и объектом anotherGeometry. Расстояние находится как расстояние между двумя ближайшими точками контуров объектов в системе координат данного объекта.
P.S. Как они пишутся в PostGIS - найди уж сам
Re: И вновь от чайника: пересечение концов полилинии с точка
Добавлено: 02 июн 2015, 09:48
Sviazist
Спасибо. Нашёл, как эти команды реализуются в postgis, разбираюсь дальше. Совпадение будет именно однозначным, т.к. в кугисе на эти слои установлено прилипание к вершинам.
Re: И вновь от чайника: пересечение концов полилинии с точка
Добавлено: 02 июн 2015, 10:08
trir
Не будь так уверен, всё равно остаётся проблема "вещественных чисел"!
Re: И вновь от чайника: пересечение концов полилинии с точка
Добавлено: 02 июн 2015, 12:16
Sviazist
Всё работает, за совет спасибо. Проблему погрешности точек обошёл следующим образом: на поля "узел 1" и "узел 2" таблицы с участками ставим ограничение "NOT NULL". При сохранении в базе новой линии в эти поля через триггер заносятся номера узлов (точек), с которыми совпадают точки начала и конца линии. Если же какая-либо из точек, начальная или конечная, либо обе, не совпадают ни с каким узлом, то в данные поля заносится значение NULL, и qgis выдаёт ошибку, что такое-то поле не может быть нулевым, и в базу такой объект не заносится. Соответственно, внести в базу можно только линию с правильной геометрией - у которой крайние точки однозначно попадают в имеющиеся на карте узлы.