Прив'язка початкових та кінцевих вузлів рядків до інших рядків у PostGIS


9

Є безліч прикладів, які показують, як прив’язати рядки до точок, але я не зміг знайти жодного (швидкого!) Способу прив’язання початкових і кінцевих вузлів рядків рядків до вузлів інших рядків.

По суті, я хочу "очистити" свій шар в postgis (2.0), переміщуючи майже подібні точки разом і зашиваючи крихітні отвори між рядковими рядками.

Не має великого значення, додавати я ще один вузол, переміщувати перший / останній вузол будь-якої лінії чи переміщувати обидві точки до центру.

Я знайшов два варіанти, але не знаю, як почати з будь-якого з них:

Другий варіант звучить здійсненним, але будь-яка допомога щодо того, як дотримуватися цього методу, буде дуже вдячна.

Відповіді:


6

Мені вдалося вирішити це, не використовуючи згадані інструменти GRASS або топологічні функції.

В основному я беру всі стартові та кінцеві вузли, розміщую їх у новій, тимчасовій таблиці, розміщую навколо них буфер, об'єдную буферні об'єкти та переміщую всі знайдені вузли у кожному буфері до центральної частини буфера.

Коли це зроблено, я переміщу початкові і початкові точки на нове місце.

Легше, ніж очікувалося, та все ж швидкий, але я очікував, що PostGIS має для цього якусь вбудовану функцію - це було б ще швидше.

Редагувати: в інтересах повернутись спільноті, це мій (досить шалений) код на даний момент.

drop table if exists nodes;
drop table if exists nodes2;
drop table if exists buffers;

-- Get Start and End nodes
select ST_StartPoint(wkb_geometry) startnode,  ST_EndPoint(wkb_geometry) endnode,    ogc_fid into nodes  from sourceTable;
-- Combine all nodes into one table for easier queries
select startnode node, ogc_fid into nodes2 from nodes;
insert into nodes2 select endnode node, ogc_fid from nodes;

-- Some indexes to speed everything up
CREATE INDEX nodesstart_idx ON nodes USING gist  (startnode);
CREATE INDEX nodesend_idx ON nodes USING gist  (endnode);
CREATE INDEX nodes2_idx ON nodes2 USING gist  (node);
CREATE INDEX nodes_ogcfid_idx ON nodes USING btree (ogc_fid ASC NULLS LAST);

-- Create buffers, combine them, split combined objects again
select (ST_Dump(ST_Union(ST_Buffer(node, 1)))).geom geom into buffers from nodes2;
CREATE INDEX buffers_idx ON buffers USING gist  (geom);

-- Update start/end nodes table
UPDATE nodes SET startnode = ST_Centroid((select geom from buffers WHERE geom && startnode));
UPDATE nodes SET endnode = ST_Centroid((select geom from buffers WHERE geom && endnode));
-- Update original points
update sourceTable set wkb_geometry = ST_SetPoint(
ST_SetPoint(wkb_geometry, 0, (select startnode from nodes where ogc_fid=sourceTable.ogc_fid)), 
ST_NumPoints(wkb_geometry) - 1, (select endnode from nodes where ogc_fid=sourceTable.ogc_fid));

DROP TABLE nodes;
DROP TABLE nodes2;
DROP TABLE buffers;

Ця відповідь зовсім схожа на "нетопологічну" пропозицію з моєї відповіді. Було б добро, якби ви дали висновок або обрали відповідь. Це те, що живить громаду тут :)
katahdin

Ти правий. Я підтримав вашу відповідь і відредагую свою відповідь, щоб включити мій код.
Джелмер Баас

4

Ось три варіанти. Сподіваємось, хтось допоможе.

v.clean

За допомогою інструментів GRASS у QGIS можна очистити топологію просторового об’єкта. Користувач @RK дає хороший набір інструкцій, як це зробити у відповіді на інше запитання . Перевага, яку дає GRASS, полягає в тому, що вона може зробити висновок про топологію форм-файлів. Недоліком для вашої ситуації є те, що ваші дані не перебувають у файлі форми. Звичайно, ви можете експортувати дані з Postgres у файл формату за допомогою інструменту "Додати PostGIS шар", але це додатковий крок.

Нетопологічні функції PostGIS

У PostGIS ви можете використовувати функції ST_EndPoint та ST_StartPoint, щоб отримати кінцеву та початкову точку для рядкової рядка. Потім, використовуючи комбінацію ST_DWithi n та ST_Distance , ви можете знайти найближчу початкову або кінцеву точку на розташованій поруч геометрії. Якщо у вас багато балів, то ST_DWithin значно прискорить запит - якщо припустимо, що у вас є індекс. Звідти вам потрібно буде встановити правило, яке визначає, які точки слід змінити, а які виправити.

Перевагою тут є те, що вам не доведеться надсилати свої дані до GRASS для очищення, але є деякі підводні камені, на які слід стежити.

Топологічні функції PostGIS

Питання стосувалося топологічних функцій PostGIS. Вони чудово працюють, але, як описано у вікі , ви повинні чітко визначити краї, вузли та обличчя. Очевидно, це буде проблемою для вашого набору даних, оскільки ви знаєте проблеми з топологією.


1

PostGIS має функції оснащення .. можливо, вони допоможуть?

ST_Snap: Оснащення сегментів і вершин вхідної геометрії до вершин опорної геометрії.

ST_SnapToGrid: Прив’яжіть усі точки вхідної геометрії до звичайної сітки.


1
Дякую, я знаю про ці функції. ST_Snap перехоплює ВСІ вузли, я хочу лише вузол початку та кінця. ST_SnapToGrid насправді не підходить, оскільки він змінює всю існуючу геометрію та має шанс переміщення вузлів, які знаходяться ближче, оскільки вони ледве потрапляють в інший сегмент.
Джелмер Баас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.