Вирівнювання декількох точок до лінії в QGIS?


11

Я хотів би вирівняти кілька точок до лінії чи рядків всередині шару, використовуючи заданий допуск або буфер навколо лінійних об'єктів. Будь ласка, зверніться до прикладу ескізу.

Для цього прикладу точки, найближчі до лінії на малюнку ДО ПЕРЕД, знаходяться в межах 5 одиниць картки лінії, а самі зовнішні точки - понад 10 одиниць карт. Я хотів би перенести найближчі точки до найближчої лінії, використовуючи допуск в 5 одиниць карт, щоб досягти результату на малюнку ПІСЛЯ.

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


Таким чином, точка повинна бути 0 одиниць карти бічно від лінії, але чи хвилюєтесь ви, де точка закінчується поздовжньо лінії відносно вихідного місця точки?
Джо

Ідеальним сценарієм було б переміщення точок, використовуючи перпендикулярний шлях до прямої. Однак наміром є використання досить невеликих допусків. Якщо точки переміщуються поздовжньо чи широтньо, у напрямку до прямої, це не зможе змістити точки, що сильно, від кращого перпендикулярного положення.
Ед Камден

Не впевнений, що це найкращий спосіб, але один із способів я можу придумати - написати якийсь код python для аналізу двох наборів даних та створення деяких координат точок. Якщо це те, що ви думаєте, що хочете, то дайте мені знати, і я можу надати відповідь для вас. Наприклад, для кожної точки, якщо абсолютне значення lat відстань від рядка <= 5 одиниць, то бічне відстань = 0. Вам потрібно буде імпортувати бібліотеку gdal, щоб перетворити значення x, y у координати. Дивіться коментарі в: gis.stackexchange.com/questions/185445/…
Joe

За допомогою PyQGIS, він може створити шар пам'яті, де точки оснащуються відповідно до раніше розглянутого допуску 5 одиниць карти та перпендикулярного шляху до прямої. Дивіться мою відповідь.
xunilk

Відповіді:


15

Існує вбудований інструмент для цього у (неопублікованій) версії QGIS 3.0. Ви можете отримати нічний знімок з веб-сайту QGIS, щоб перевірити це заздалегідь.

Зробити це:

  1. Запустіть алгоритм обробки «Прив’язати геометрії до шару»
  2. Виберіть рівень точок як "вхідний шар"
  3. Виберіть рівень лінії як "еталонний шар"
  4. Введіть відповідний допуск (максимальна відстань для переміщення точок під час оснащення)
  5. Змініть поведінку на "Віддати перевагу найближчій точці"

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

Ось результат, показуючи початкові точки як "х", а оснащені точки - як зелені точки. Я тут використав допуск, щоб лише деякі точки введення були оснащені.

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


Це саме те, що мені потрібно. На жаль, мій роботодавець встановлює лише LTR-версії QGIS, і ми не маємо права завантажувати та встановлювати тестові версії. (зітхає) Я думаю, це питання очікування. Це стандартна / вбудована функція чи плагін?
Ед Камден

Стандартна функціональність, що спирається на зміни в класах c ++ - немає можливості вручну скопіювати це в старішу версію. Ви потенційно можете спробувати встановити ОСGEO4W на іншій машині, а потім скопіювати папку osgeo4w на USB-накопичувач для запуску на робочій станції. У минулому мені пощастило з таким підходом.
ndawson

1
Для старої версії дивіться цей плагін. docs.qgis.org/2.14/en/docs/user_manual/plugins/…
iRfAn

здається, що плагін не підтримує шари точок.
Микола Козир

7

Це можна дозволити за допомогою PyQGIS . Для наступної ситуації:

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

наступний код, з огляду на допуск 5 карт одиниць, був розміщений на консолі Python QGIS:

from math import sqrt

registry = QgsMapLayerRegistry.instance()

points = registry.mapLayersByName('points')
line = registry.mapLayersByName('line')

feat_points = [ feat for feat in points[0].getFeatures() ]
feat_line = line[0].getFeatures().next()

new_points = []

for feat in feat_points:
    pt = feat.geometry().asPoint()
    sqrdist, point, vertex = feat_line.geometry().closestSegmentWithContext(pt)
    if sqrt(sqrdist) <= 5:
        new_points.append(point)
    else:
        new_points.append(pt)

epsg = points[0].crs().postgisSrid()

uri = "Point?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'new_points',
                           'memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(len(new_points)) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPoint(new_points[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Було вироблено шар пам'яті, де точки відрізалися відповідно до раніше розглянутих допусків 5 одиниць карти та перпендикулярного шляху до лінії.

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


2

Ви також можете зробити це в Польовому калькуляторі за допомогою плагіна refFunctions. За допомогою калькулятора поля можна оновити геометрію шару, а також поля. refFunctions дає функцію "geomdistance", щоб знайти найближчу лінію на заданій відстані (або "geomnerely", якщо ви не хочете порогу), і поверне атрибут або геометрію, а функція "найближча_політика" знайде найближчу точка на заданій геометрії. Складіть їх разом так, щоб обчислити нові геометрії для вашого точкового шару:

closest_point(geom_from_wkt(geomdistance('snap_lines','$geometry',10)) , $geometry)

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

У цьому є деякі обмеження, обидва шари повинні бути однаковими CRS, і функція геовіддачі дасть вам помилку, якщо у вас більше 100 000 очок, але ви можете змінити цей ліміт, якщо редагувати файл плагіна refFunctions.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.