Пошук псевдовузлів у вільному програмному забезпеченні ГІС?


16

Програмне забезпечення gvSIG OA Digital Edition 2010 має топологію інструментів для пошуку псевдовузлів у лінійній геометрії. Я встановлюю кластерну толерантність 0,00002 та максимальну кількість помилок -10000 для 20000 лінійної геометрії підрахунку посилань. Але невдалий результат.

Чи є рішення, які знаходять псевдовузли у вільному програмному забезпеченні ГІС?

Мені потрібно розшаровувати псевдовузли (одне рішення цієї проблеми - використовувати інструменти топології ArcInfo, але для мене пріоритетним є використання вільного програмного забезпечення). Лінійна геометрія створила декількох користувачів у QGIS 1.8.0 у базі даних PostGIS (v. 2.0.1).

Додайте нове зображення: 12 лінійних ознак із трьома псевдо вузлами в A (рядок 4/5), B (рядок 6/7), C (рядок 9/10). Псевдовузли мають бути замість них точками - дві лінійні ознаки із перетином в одній точці (вузол) повинні бути однією лінійною ознакою (рядок 4/5 - рядок 4, ...).

Чи можливо зробити запит у PostGIS, що призведе до шару псевдовузлів?

Додайте нове зображення прикладів псевдовузлів: якщо я отримаю для лінійного шару точкового шару псевдовузли (сині прямої лінії), я виправив такі помилки в лінійному шарі: A - додайте відсутню геометрію, B - відрізану лінію в перетині, C - видаліть псевдовузол.

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

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

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


2
У GRASS існує команда rmdangle, але в результаті shp-файл без псевдо вузлів. В результаті повинен бути shp-файл (або інший) псевдовузлів (наприклад, gvSIG OA Digital Edition 2010)
HasT

Чи використовуєте Ви PostGIS 2.0? Якщо так, спробуйте виконувати функції Is_Valid та Makevalid.
Джованні Мангі

Так, я використовую PostGIS 2.0. Як я повинен використовувати ці функції для пошуку псевдо вузлів? Чи можна їх знайти за допомогою "PgQuery для QGIS"?
HasT

так, ви можете використовувати їх у рамках QGIS в будь-якому інструменті, який дозволяє запускати PostGIS-запит, наприклад, наприклад, DB Manager (що підтримує підсвічування синтаксису та автоматичне завершення).
Джованні Мангі

червона точка на другому малюнку - це перетин двох дійсних геометрій .. правильно?
vinayan

Відповіді:


8

Тут є загальне рішення, яке ви можете використовувати з PostGIS або будь-яким іншим програмним забезпеченням, сумісним з OGC.

Примітка: як я кажу , перш , ключовим поняттям в FOSS і ГІС є стандартизація : кращі рішення прийняти стандарти, як OGC з них.


Ваша проблема полягає в тому, щоб "знайти псевдовузли" ... Але я думаю, що це трохи більше, "знайти непсевдозвукові вузли та з'єднати рядки псевдовузлів". Моє рішення можна використовувати для обох.

Стандарти OGC пропонують:

  • ST_Boundary (geom) : для виявлення вузлів ліній

  • ST_Dump (geom) : щоб помістити кожен окремий вузол у запис таблиці SQL.

  • ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap можна використовувати для толерантності до змін. Я використовую ST_DWithin.

Ми можемо припустити, що ваша основна проблема може бути вказана з цими об'єктами та властивостями,

  • є тільки відрізки (з таблиці LineSegment ), представлені геометрією LINESTRING ... Я не перевіряв з мультилінії, якщо у вас є geometrytype = MULTIPOINT, ви можете розділити і лите Multilines з ST_Dump і ST_LineMerge;

  • кожен відрізок має геометрію (ID) G і (колір ID) idline .

Отже, перший крок - отримання вузлів, що надходять від ліній з'єднання,

CREATE TABLE cache_bounds AS
  SELECT gid as gid_seg, (ST_Dump(ST_Boundary(the_geom))).geom AS the_geom,
         gid as color 
         -- if you not have something for "color label" of lines, use gid.
  FROM linesegment;
ALTER TABLE cache_bounds ADD column gid serial PRIMARY KEY;

CREATE TABLE cache_joinnodes AS
  -- Use your TOLERANCE instead "1" at ST_DWithin and ST_Buffer.
  SELECT *, array_length(colors,1) as ncolors FROM (
   SELECT gid, array_distinct(array_cat(a_colors,b_colors)) as colors, the_geom FROM (
    SELECT 
      a.gid, array_agg(a.color) as a_colors, array_agg(b.color) as b_colors
      , st_buffer(a.the_geom,1) as the_geom -- any one to represent the join point.
    FROM cache_bounds a, cache_bounds b 
    WHERE a.gid>b.gid AND ST_DWithin(a.the_geom,b.the_geom,1)
    -- use ST_equals(a.the_geom,b.the_geom) if no tolerance.
    GROUP BY a.gid, a.the_geom
   ) as t
  ) as t2;

ПРИМІТКА. Використовуйте кеші, оскільки вони швидші, ніж перегляди. Використовуйте "EXPLAIN SELECT ...", щоб перевірити час процесора, це може зайняти багато часу.

Тут цикли та безперервні (одного кольору) лінії виявляються у вигляді ncolors=1точок, а псевдовузли за ncolors=2точками, тож у вас є шар з цими точками.

Ваша таблиця "хороших вузлів" має оригінальні "обмежувальні точки" і без "псевдовузлів".

CREATE VIEW vw_joinnodes_full AS
  SELECT b.*, j.ncolors
  FROM cache_joinnodes j INNER JOIN cache_bounds b 
       ON j.gid=b.gid;

CREATE TABLE cache_good_nodes AS
  SELECT *  
  FROM vw_joinnodes_full 
  WHERE ncolors=1 OR ncolors>2;

-- IF NEED ... CREATE VIEW vw_correct_linesegment AS ... 

Дякую за рішення! Я намагаюся запустити запит (у pgAdmin), але отримую виняток: "функція array_distinct (integer []) не існує". Що я роблю неправильно?
HasT

Вибачте, не цитується array_distinctфункція з бібліотеки postgres.cz . Будь-які інші помилки, будь ласка, повідомте, я можу додати більше пояснень.
Пітер Краусс

Я додав функцію array_distinct. У лінійному шарі бази даних є ім'я стовпця "the_geom" (замість "geom" у запиті). Я заміняю "geom" на "the_geom" на "ST_Boundary (the_geom)" після запуску запиту, я отримую повідомлення "стовпчик" geom "не існує" в "як кольори, geom ВІД" місця. Я замінюю "як кольори, geom FROM" на "як кольори, the_geom ВІД", але я знову отримую повідомлення "стовпчик" the_geom "не існує".
HasT

Гаразд, змінено (див. Відредаговану відповідь) geomна the_geom. (ST_Dump (x)) залишатись геоматом, не є атрибутом бази даних.
Пітер Краусс

Спасибі! Запит працює. Я замінив ST_DWithin на ST_equals і для ST_Buffer даю 0,00002 DD допуску. В результаті я отримав правильні вузли (де в одному вузлі перетинаються 3 і більше лінійних ознак). Я хочу отримати результат, коли в одному вузлі перетинаються 2 лінійних ознаки (FROM vw_joinnodes_full WHERE ncolors = 2;), але отриманий точковий шар, де в одному вузлі перетинаються 2 і більше лінійних ознак. Як отримати результат, коли в одному вузлі перетинаються лише 2 лінійні ознаки?
HasT

7

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

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

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

Вихідний код можна знайти на GitHub.


Дякую за відповідь. Але в результаті помилок псевдо вузлу потрібен точковий шар. Ці помилки користувачі повинні виправляти вручну, оскільки трапляються випадки, коли в одному вузлі повинні перетинатися три лінії, але один з рядків пропускається або не відривається до вершини.
HasT

Схоже, це має працювати. Не вдається зрозуміти, що саме ви тут намагаєтеся сказати. "в результаті помилок псевдовузлу потрібен точковий шар" Я не розумію, що ви маєте на увазі під цим. Вам потрібен точковий шар із точками, прив’язаними до кінця кожного рядка, щоб це працювало?
Рейнер

@Rayner, додай нове зображення прикладів псевдовузлів (3): якщо я отримую псевдовузли точкового шару лінійного шару (сині прямої лінії), я виправляю вручну (не автоматично) наступні помилки в лінійному шарі: A - додаю пропущену геометрію, B - оснащений лінія в перетині, C - видалити псевдовузол. Якщо я автоматично виправляю псевдоузли, я залишив помилки в місцях A, B.
HasT

Гаразд, я розумію B і C. Коли ви говорите "A - додайте пропущену геометрію", що це означає? Чи є пункт, який потрібно додати там, де зустрічаються два рядки?
Рейнер

@Rayner, це означає, що в "A" слід додати лінійну функцію (вулиця / дорога відповідно до зображень). В А - вузол був готовий додати нову геометрію відповідно до зображень, але геометрію не додано (використовуйте псевдо вузли шару, які я вважаю геометрією не пофарбованими)
HasT

2

Безкоштовне рішення: FME + MRF + SmartCleaner-трансформатор

Безкоштовне рішення GRASS v.clean (Останній QGIS 1.8.0 з інструментами GRASS найпростіший спосіб використання) та інші засоби для очищення топології


QGIS 1.8.0. Встановіть плагін SEXTANTE в каталог C: \ Program Files \ Quantum GIS Lisboa \ apps \ qgis \ python \ plugins (1.0.7). Завантажте лінійний shp-файл у проект QGIS (рівень CRS та проект WGS1984, перетворення "на льоту"). Потім я застосовую 'Визначити область GRASS на полотні' (команди GRASS - Інструменти) і запускаю команду v.clean - rmdangle (Thershold = 0, вводимо dir / name для виводу вектора / помилок). Після запуску отримайте помилку "Не вдалося завантажити шар: D: /error.shp Перевірте журнал SEXTANTE, щоб побачити помилки". У TOC додано новий шар, шар з помилками не завантажений.
HasT

1
У GRASS існує команда v.build.polylines - я отримую один з двох рядків, який перетинається в одній вершині (видалений псевдовузол), але цю команду я не знаходжу в плагіні
SEXTANTE

@simplexio Ви можете підказати, який варіант v.clean можна використовувати для ідентифікації псевдовузлів
osmjit

2

Ось етапи пошуку псевдо вузлів за допомогою OpenJump безкоштовного ГІС.
QGIS і gvSIG мають плагін Sextante, тому ці самі кроки повинні працювати і їх,
і просторове з'єднання може дещо відрізнятися.
Я використовував версію 1.2 для тестування.

- збереження кінцевих точок лінії
Sextante, Панель інструментів, Топологія, Витяг кінцевих точок рядків -> endpt_0

- Нерозрізати рядки
Панель інструментів Sextante, Інструменти для лінійних шарів, Приєднатись до сусідніх ліній

- Зберегти кінцеві точки рядка Нерозпущений рядок
інструментів Sextante, Топологія, витягнути кінцеві точки рядок -> endpt_1

- кінцевими точками, видаленими "Приєднатись до сусідніх рядків", є псевдовузли

Інструменти, запити, просторовий запит,
вихідний рівень "endpt_0"
Відносини "Перетинає"
Шар маски "endpt_1"

увімкніть або натисніть Доповнення результату


Дякую за відповідь! Я намагаюся зробити тези кроків у QGIS Sextante, але я не знаходжу там команд "Витягнути кінцеві точки рядків" та "Приєднати суміжні рядки". Можна додати в QGIS Sextante (у командах gvSIG 1.12 існують тези) або команді v.build.polylines?
HasT

Я щойно встановив плагін QGIS sextante. Я також не бачу повних функцій, багато відсутні. Слід перевірити кроки в gvSIG на файлі форм.
klewis

Я щойно перевірив вищеописаний робочий процес у gvSIG 2.4.0.2834, і він працює чудово. Я замінив останній крок іншими двома геопроцесами на панелі інструментів: по-перше, gvSIG "Просторове з'єднання " , другий - "Фільтр-шар шару", використовуючи DIST > 0як вираз. Крім того, всі геопроцеси можуть бути зв'язані разом у моделі SEXTANTE для створення нового інструменту, наприклад, "Знайти псевдоніди" .
Антоніо Фальчіано


1

За допомогою PostGIS ви можете використовувати модифіковану версію запиту, щоб знайти звисання, обговорювані в цій темі , оскільки псевдоноди - це вузли, які перехоплюють 2 рядки, а висівки - це вузли, що перехоплюють 1 рядок.

WITH nodes AS 
(SELECT ST_StartPoint(geom) AS pt FROM
linestring_table UNION ALL 
SELECT ST_EndPoint(geom) AS pt FROM
linestring_table) 
SELECT pt FROM nodes
GROUP BY pt HAVING count(*) = 2;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.