Растворить или не разбить строки на общих атрибутах в PostGIS или GRASS?

9

У меня есть шейп-файл осевой линии дороги, у которого дороги разбиты на каждом перекрестке. Однако я хотел бы объединить LINESTRING, которые имеют общий набор атрибутов, в одну LINESTRING. Пока имя, ограничение скорости и т. Д. Не меняются, я хочу объединить их вместе. Это для возможного объединения в OpenStreetMap.

Похоже, что программное обеспечение Esri ArcGIS for Desktop позволяет это с помощью команды Dissolve и опции UNSPLIT_LINES.

Я также нашел команду Dissolve в QGIS, но она работает только с полигонами и отдельными полями.

Предполагая, что для QGIS ничего не существует, кто-нибудь знает, как это сделать в PostGIS или GRASS?

joshdoe
источник
Для PostGIS проверьте gis.stackexchange.com/questions/1387/…
Подземье
Если бы этот Вопрос задавался сегодня, я думаю, он был бы закрыт как слишком широкий. Вместо того, чтобы пытаться закрыть его сейчас, я собираюсь отредактировать его, чтобы модифицировать существующие Ответы и предотвратить более широкие Ответы.
PolyGeo

Ответы:

4

Интересный вопрос Я не считаю себя PostGIS гуру, но я поиграл с вашей проблемой и придумал следующий запрос , который растворяет шоссе LINESTRINGзапись в MULTILINESTRINGзапись , когда они имеют общие ценности в различных областях (в моем наборе данных, я соответствовал на nameи stateполей). Я использовал OGR, чтобы вставить шейп-файл шоссе (переименованный в ushwys) в PostGREsql; так называется мое поле геометрии wkb_geometry. Попробуйте взломать этот запрос, чтобы учесть ваши данные и условия поля:

SELECT 
u.name, 
u.state, 
ST_AsText( ST_Multi( ST_Collect( u.wkb_geometry ) ) ) as multilines 
FROM ushwys u
GROUP BY u.name, u.state 
ORDER BY u.state 
LIMIT 100; --########### DROP THE LIMIT WHEN YOU'RE DONE EXPERIMENTING

Если это работает, вы можете использовать ogr2ogr для выполнения этого запроса и экспортировать результаты практически в любой векторный формат, который вы предпочитаете, например, шейп-файл, GML, CSV или другой. Информацию о вызове SQL-запросов из ogr2ogr можно найти в документации по OGR SQL .

Для справки я рассмотрел инструкцию PostGIS ST_Collect , а также этот сайт, который демонстрирует группирование по нескольким полям.

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


PS Если вы не знакомы с использованием ogr2ogr для отправки геоданных в PostGIS, я использовал следующий сценарий ogr2ogr для выполнения импорта данных ( остерегайтесь копирования из Интернета и вставки непосредственно в командное окно ogr2ogr, так как я обнаружил форматирование страницы вводит разрывы строк и замену шрифтов / символов для двойных кавычек, которые нарушают скрипт ogr ):

ogr2ogr -f "PostGreSQL" PG:"host=127.0.0.1 user=postgres dbname=gisdb password=my_password" 
"E:\GISData\UnitedStates\highways.shp" -nln ushwys -nlt geometry

[Обновить]

Я хотел посмотреть, как это «выглядело» в QGIS после выполнения этого запроса, поэтому я изменил запрос, чтобы применить это WHEREпредложение (которое дает мне все варианты шоссе США 65 в штате Миссури):

where u.state = 'MO' and u.name LIKE '%US%65%'

Затем я использовал QGIS и плагин QuickWKT, чтобы визуализировать все восемь (8) моих полученных MULTILINESTRINGзаписей шоссе . Как вы можете видеть на скриншоте, окончательные результаты приводят Hwy 65 от северной границы Миссуи до Айовы до ее южной границы с Арканзасом:

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

Для меня эта визуализация показывает, что мой запрос не привел к неожиданному дублированию или устранению функций. Поэтому в следующий раз я подумал: «Хорошо, растворение вернуло восемь функций, но сколько функций в исходной таблице фактически представляет Hwy 65 в Миссури?» Мой следующий запрос ответил на этот вопрос. Кажется, что оригинальный набор данных использует тридцать восемь (38) функций для представления Hwy 65 в Миссури:

SELECT count(*) FROM ushwys WHERE state = 'MO' AND name LIKE '%US%65%';
-- returned 38

В конечном итоге, запрос сократил тридцать восемь (38) функций до восьми (8) функций, которые имели общие значения в полях имени и состояния. На данный момент, я относительно уверен, что этот запрос полезен и подходит для растворения однокомпонентных геометров в составные геометрии, когда задача растворения должна учитывать несколько полей.

Приветствия. :)

elrobis
источник
3

В PostGIS есть специальная функция для объединения строк

ST_LineMerge - возвращает (набор) LineString (s), сформированных путем сшивания MULTILINESTRING.

http://www.postgis.org/docs/ST_LineMerge.html

Подземье
источник
1

В GRASS GIS взгляните на v.build.polylines

v.build.polylines можно использовать для восстановления разбитых полилиний.

markusN
источник