Привязывать линии к точкам автоматически?

19

У меня есть два векторных шейп-файла: один файл представляет собой точки, представляющие люки, а другой - файл ломаной линии, представляющий трубы, ведущие к и из люков. Мне нужно привязать линии на указанном расстоянии до ближайшего колодца.

Есть ли простой способ сделать это, не делая это вручную?

линии -> точки

Обновить

Согласно Александру, я экспортировал свои шейп-файлы в пространственный формат. Не уверен, что дальше.

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

Обновление № 2 Я создал новый файл БД и импортировал шейп-файлы в новый БД, используя пространственный-GUI, я скорректировал свой запрос SQL, но, как вы можете видеть, я получаю сообщение об ошибке «нет такого столбца: f.geom»

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

GreyHippo
источник
В пространственной таблице (слое) Spatialite геометрия объектов сохраняется в атрибуте. Имена могут быть разными. В таблице «pipe» этот атрибут называется геометрией. Я обновлю свой ответ, предполагая, что mh также является атрибутом Geometry.
Александр Нето
Я получил ошибку "нет такой функции: ST_Snap". Я использую QGIS 1.8 на Windows 7 64bit.
GreyHippo
Какой у вас Spatialite? Вы можете проверить это в QGIS> Справка> О программе
Alexandre Neto
"нет такого столбца: f.geom" - попробуйте с помощью f.Geometry
vinayan
Моя версия
Spatialite

Ответы:

26

Если вы хотите поместить свои данные в Postgis (или Spatialite ), вы можете использовать ST_Snap, чтобы делать то, что вы хотите.

Просто используйте линии layer \ table в качестве входных данных, а слой точек в качестве эталона и установите допуск. Что-то вроде этого:

SELECT
    f.gid as gid,
    ST_Snap(f.Geometry, g.Geometry, 2) as geom
FROM
    pipe as f,
    (SELECT ST_Collect(Geometry) as Geometry
     FROM mh) as g

Результат таков:

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

Затем вы можете обновить свою геометрию, используя идентификатор объекта.

Александр Нето
источник
Куда бы я положил код "Выбрать ... Из ..."? Что означает «использование идентификатора функции»?
GreyHippo
После импорта файлов в базу данных (postgis или пространственный) вы можете использовать DB Manager, чтобы просмотреть таблицы базы данных и выполнить SQL-запрос (код) в окне SQL, а затем загрузить его на холст. Скажите, если это работает для вас, и тогда мы сделаем обновление части.
Александр Нето
Александр, смотрите обновление выше. Я экспортировал файл в два файла spatiallite.
GreyHippo
Вы должны поместить оба файла в одну базу данных Spatialite, просто перетащите «pipe» в базу данных «mh.sqlite». После этого обновите код SQL, чтобы изменить «точки» на «mh», а «линии» на «труба». Также приспособьте "gid" к своему идентификатору "pipe". После этого вы можете выполнить и загрузить результаты.
Александр Нето
3

Я не знаю много о QGIS или GRASS, но некоторые быстрые поиски в Google привели к v.clean в GRASS.

Посмотрите на этот пост и этот .

Альтернативы QGIS и GRASS:

Если бы я делал это в ArcGIS, я бы, вероятно, сохранил бы свои данные в наборе классов объектов в файловой базе геоданных и создал бы топологию, чтобы определить области, где точечный слой не находится на конечных точках линий. Затем вы можете исправить ошибки с помощью Инспектора ошибок .

Но, вероятно, самое быстрое и простое решение будет в FME. Вы можете попробовать использовать Snapper Tool или, еще лучше, AnchoredSnapper Tool . Если вы используете AnchoredSnapper, убедитесь, что ваш тип привязки - привязка к конечной точке. Конечно, вам понадобится лицензия для FME. Но вы можете скачать 14-дневную пробную версию, если у вас ее нет.

Фезтер
источник
Я посмотрел на v.clean, но он использует только один слой, мне нужно сравнить один слой с другим. Кроме того, я больше искал вариант QGIS / opensource.
GreyHippo
1
@GreyHippo, GRASS с открытым исходным кодом
artwork21
1
Я знаю, что GRASS с открытым исходным кодом, но другие ваши варианты не являются.
GreyHippo
-1

Ручной способ

Qgis -> Настройки -> Параметры привязки (и я не уверен, но для этого может потребоваться расширение CadTools) и включить топологическое редактирование.

Автоматический способ

v.clean, который находится в инструментах GRASS в наборе инструментов SEXTANTE в QGIS. Если у вас есть PostGIS 2.0, тогда ST_Snap и ST_SnapToGrid () (и нет никаких причин, почему вы не можете его использовать, это очень хороший пространственный инструмент)

Коммерческий путь

Инструмент FME и MRF (коммерческое расширение, у меня была оценочная версия. Это было очень хорошо).

Также меня интересует управление водопроводом / канализацией с помощью инструментов с открытым исходным кодом. Есть ли у вас какие-либо советы?

simplexio
источник
Я думаю, что это означает, что GreyHippo означает «делать это вручную». Просто используя опции Snapping, вам нужно будет переместить каждый свисающий узел вручную, чтобы активировать привязку. Или я что-то упустил?
Джейк
нет. я был слепым
симплексио
Simplexio, я не хочу делать это вручную. Я надеялся на плагин или процесс, о котором я не знаю.
GreyHippo
Я не думал, что вы можете использовать GRASS v.clean на двух слоях?
GreyHippo
1
если я правильно помню, это может исправить слишком короткие строки. Видите ли, проблема у вас не в том, что ваши колодцы находятся не в нужных местах, а в том, что ваша канализационная сеть не топологически корректна. А для этого нужен только слой труб. Каждая система коммунальных сетей, которую я видел, предполагает наличие люка на каждом перекрестке канализации. Это предположение предполагает, что вы хотите иметь правильную топологию.
симплексио