Поиск псевдоузлов в бесплатном программном обеспечении ГИС?


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 for QGIS»?
HasT

да, вы можете использовать их в QGIS в любом инструменте, который позволяет запускать запрос PostGIS, например, в DB Manager (который поддерживает подсветку синтаксиса и автозаполнение).
Джованни Манги

красная точка на втором рисунке - это пересечение двух правильных геометрий .. верно?
Винаян

Ответы:


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;

  • у каждого сегмента линии есть (идентификатор геометрии) гид и (идентификатор цвета) 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 FROM». Я заменяю «как цвета, geom FROM» на «как цвета, the_geom FROM», но я снова получаю сообщение «столбец« the_geom »не существует».
HasT

Хорошо, изменил (см. Отредактированный ответ) geomна the_geom. (ST_Dump (x)) оставаться как geom, не является атрибутом базы данных.
Питер Краусс

Благодарность! Запрос работает. Я заменил ST_DWithin на ST_equals, а для ST_Buffer выдал допуск 0,00002 DD. В результате я получил правильные узлы (где в одном узле пересекаются 3 и более линейных объекта). Я хочу получить результат, где в одном узле пересекается 2 линейных объекта (ОТ vw_joinnodes_full WHERE ncolors = 2;), но получен точечный слой, где в одном узле пересекается 2 и более линейных объекта. Как получить результат, где в одном узле пересекаются только 2 линейных объекта?
HasT

7

Компания Refractions Research разработала инструмент Line Cleaner, который, кажется, делает то, что вы хотите.

Line Cleaner очищает сети, упрощая сложные, циклические, очень короткие и нулевой длины геометрии, а также удаляя псевдо-узлы и незначительные вершины. Что наиболее важно, на этапе очистки, он может гарантировать, что совпадения признаков могут рассматриваться автоматически

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

Исходный код можно найти на GitHub.


Спасибо за ответ. Но в результате ошибок псевдоузлу необходим точечный слой. Эти ошибки должны быть исправлены пользователями вручную, поскольку бывают случаи, когда в одном узле должны пересекаться три линии, но одна из линий пропускается или не привязывается к вершине.
HasT

Похоже, это должно работать. Трудно понять, что именно вы пытаетесь сказать здесь. «В результате ошибок псевдоузлу нужен точечный слой». Я не понимаю, что вы подразумеваете под этим. Вам нужен точечный слой с точками, привязанными к концу каждой линии, чтобы это работало?
Рэйнер

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

Хорошо, я понимаю B и C. Когда вы говорите «A - добавить недостающую геометрию», что это значит? Нужно ли добавить точку, где встречаются две строки?
Райнер

@Rayner, это означает, что в 'A' должна быть добавлена ​​линейная функция (улица / дорога в соответствии с изображениями). В А - узел был подготовлен для добавления новой геометрии в соответствии с изображениями, но геометрия не добавлена ​​(используйте псевдоузлы слоя, которые я нахожу
неокрашенной

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 на наличие ошибок». В оглавление добавлен новый слой, слой с ошибками не загружен.
HasT

1
В GRASS существует команда v.build.polylines - я получаю одну из двух линий, которые пересекаются в одной вершине (удаленный псевдоузел), но эту команду я не нахожу в плагине
SEXTANTE

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

2

Вот шаги, чтобы найти ваши псевдоузлы, используя OpenJump бесплатную ГИС.
QGIS и gvSIG имеют плагин Sextante, поэтому те же самые шаги должны работать так же,
пространственное соединение может немного отличаться.
Я использовал версию 1.2 для тестирования.

- сохранить
набор инструментов Sextante для конечных точек линий, Топология, Извлечь конечные точки линий -> endpt_0

-
удалить набор инструментов для линий Sextante, Инструменты для слоев линий, Соединить соседние линии

- сохранить
набор инструментов Отключить конечные точки линий для инструментов Sextante, Топология, извлечь конечные точки line -> endpt_1

- конечные точки, удаляемые с помощью «Объединить соседние линии», являются псевдоузлами.

Инструменты, Запросы, Пространственный запрос, слой маски «endpt_1» включают или нажимают Результат дополнения.
Исходный слой «endpt_0»
Отношение «Пересекается»




Спасибо за ответ! Я попытаюсь выполнить эти шаги в 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.