Как привязать начало и конец строки строки к ближайшей точке?

У меня есть точечный слой и линейный слой. Точками являются дорожные развязки, собранные с использованием DGPS, в то время как линии являются соединяющими дорогами, собранными через Handheld GPS в режиме отслеживания. В результате линии фактически не связаны с точками.

Теперь я хочу:

  • Удалите все промежуточные узлы из каждой строки строки, чтобы сделать ее прямой.

  • Привяжите начальную и конечную вершину строк к ближайшим точкам.

Я использую PostGIS 2.0. Это, безусловно, то, что я сделал:

UPDATE line
SET geom = ST_Simplify(geom, 1000);

Q. Есть ли другой лучший способ сделать это? (Поскольку я использую абсурдную терпимость)

UPDATE line
SET geom = ST_AddPoint(
(SELECT geom FROM line WHERE id = 1),
(SELECT p.geom FROM point AS p, line AS l
 ORDER BY ST_Distance(p.geom,(SELECT ST_StartPoint(l.geom) FROM lt WHERE l.id=1)) LIMIT 1),
0)
WHERE id=1;

Это расширит линию (с id = 1) до ближайшей точки (точка добавлена ​​в начале строки).

Q. Вышеприведенное выглядит несколько сложнее, есть ли другой эффективный метод/функция?

1 ответ

Кажется разумным делать обе операции по одному и тому же запросу (не проверены):

UPDATE line l
SET geom = ST_MakeLine(
 (SELECT geom FROM point p ORDER BY ST_Distance(p.geom, ST_StartPoint(l.geom) LIMIT 1),
 (SELECT geom FROM point p ORDER BY ST_Distance(p.geom, ST_EndPoint(l.geom) LIMIT 1)
);

Если набор данных мал и вы выполняете запрос только один раз, производительность не возникает, но вы можете добавить дополнительное сравнение bbox для ускорения работы:

SELECT geom FROM point p WHERE p.geom && ST_Expand(ST_StartPoint(l.geom), 100) ORDER BY ST_Distance(p.geom, ST_StartPoint(l.geom) LIMIT 1

licensed under cc by-sa 3.0 with attribution.