Створення точок на заданій відстані по лінії за допомогою QGIS?


20

Я хочу використовувати QGIS для створення точок по лінії, але на вказаній відстані. Я знайшов два інструменти GRASS у панелі інструментів SEXTANTE:

  • v.to.points
  • v.сегмент

Я спробував v.to.points , встановивши максимальну відстань між точками в одиницях карти 100, і отримав це:

точки вздовж прямої

пильний погляд

Друге фото показало пильний погляд з верхнього. Результатом було те, що я хочу, але я хочу отримати менше очок , але навіть я встановив максимальну відстань до 1000, або 1000000, результат був таким самим.

Я намагався використовувати v.segment , але у мене не було файлу, що містить правила сегмента.

Underdark дав мені кілька порад, і я спробував ущільнити геометрії, задавши інтервал . Спочатку це дало мені полілінійний файл з формою так само, як я вводив, а потім я використав витяжні вузли, щоб спробувати отримати ці точки. Але результат був таким самим, як я отримав за допомогою v.to.points , незалежно від того, який я встановив інтервал відстані.

Як я можу створювати точки вздовж лінії та на вказаній відстані?


4
Погляньте на це, повідомте нам nathanw.net/2012/08/05/…
Віллі

Дякуємо, що дали мені цю корисну пораду! Якщо я хочу використовувати ваш скрипт, чи повинен я встановити python? чи у новій версії QGIS 2.0, чи вже в ньому вбудована ця функція?
Хайнц

5
Для цього зараз в плагіні QGIS 2.0 називається QChainage. Вийміть плагін і встановіть його.
Віллі

Зауважте, що панель інструментів "Sextante" називається "Обробка" в QGIS 2.2.0+, а ущільнення геометрій з заданим інтервалом "знаходиться в меню ProcessingToolbox / QGISGeoalgorithms / VectorGeometryTools. Зауважте, що це заперечує геометрію і не видаляє вершини. що ближче вибраного інтервалу
Дейв X

Це працювало для мене: plugins.qgis.org/plugins/LocatePoints
Tactopoda

Відповіді:


20

У консолі Python:

1) створити клас шару пам'яті (повний клас (без атрибутів) на crea_mem_layer.py )

class Create_vlayer(object):
    '''creation of a virtual layer''' 
     def __init__(self,nom,type):
         self.type=type
         self.name = nom
         self.layer =  QgsVectorLayer(self.type, self.name , "memory")
         self.pr =self.layer.dataProvider() 
     def create_point(self,geometry):
         # add point to the layer
         self.seg = QgsFeature()
         self.seg.setGeometry(QgsGeometry.fromPoint(geometry))
         self.pr.addFeatures([self.seg])
         self.layer.updateExtents()
     @property
     def display_layer(self):
         #end of layer and display layer 
         QgsMapLayerRegistry.instance().addMapLayers([self.couche])

2) функції векторної алгебри (від algèbre_vect_PyQGIS.py )

import math 
def mag(point):
    # magnitude of a vector
    return math.sqrt(point.x()**2 + point.y()**2)
def diff(point2, point1):
    # substraction betwen two vector
    return QgsPoint(point2.x()-point1.x(), point2.y() - point1.y())
def length(point1,point2):
    # with PyQGIS: sqrDist
    return math.sqrt(point1.sqrDist(point2))

3) косинуси напрямку

def dircos(point):
    cosa = point.x() / mag(point)
    cosb = point.y()/ mag(point)
    return cosa,cosb

4) технологічна лінія або сегмент лінії

def pairs(list):
    # list pairs iteration 
    for i in range(1, len(list)):
    yield list[i-1], list[i]

layer = qgis.utils.iface.activeLayer()
# interval between points
interval = 5 m
# create virtual layer
gen_pt  = Create_vlayer("mid5", "Point")

for elem in layer():
    line = elem.geometry()
    for seg_start, seg_end in pairs(line.asPolyline()):
       line_start = QgsPoint(seg_start)
       line_end = QgsPoint(seg_end)
       # mid point = vector coordinates [x2-x1,y2-y1]
       pointm =diff(line_end, line_start)
       # direction cosines of the segment
       cosa,cosb = dircos(pointm)
       # length of the segment
       lg = length(line_end, line_start)
       # generate and add points to the virtual layer 
       for i in range(interval,lg,interval):
           gen_pt.create_point(QgsPoint(line_start.x()  + (i * cosa), line_start.y() + (i*cosb)))

# display layer
gen_pt.display_layer

Результати

полілінія, рівновіддалена точка з Shapely або PyQGIS2, з напрямками косинусів

полілінійструнковектор_алгебра

Потім просто регулюйте інтервал


З огляду на з'єднання, схоже, він зберігає попередньо існуючі точки вузла на лінії, тому він не може розріджувати їх до роздільної здатності, меншої від вершин, які вже є на лінії. При складних, кривих лініях, як в ОП, ці процедури можуть не мати великого ефекту.
Дейв Х

ви можете ідеально адаптувати сценарій.
ген

17

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


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

1
Ласкаво просимо до GIS SE! Я думаю, що інформацію, яку ви додали сюди як коментар, було б краще включити до вашого фактичного відповіді, використовуючи кнопку редагування під ним. Це можна зробити за допомогою Копіювати / Вставити та видалити коментар, натиснувши на нього невеликий хрестик поруч.
PolyGeo

11

Я написав сценарій, який змінює інструмент геометрії Sextante Densify, щоб прийняти певну відстань. Це називається ущільнення геометрії з заданим інтервалом .

Після запуску Densify ви можете витягнути очки за допомогою інструменту « Витягнути вузли ».

Ви можете отримати його від Github, а інструкції з встановлення - у моєму блозі .

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


Здається, цей інструмент тепер доступний у QGIS без встановлення Sextante (QGIS 2.18.7). Я не бачив його в меню, але виявив його як геоалгоритм QGIS під час пошуку в панелі інструментів обробки.
Нейт Ваннер

0

Якщо ви не хочете конятись із скриптами python, ви можете просто встановити та використовувати плагін "Профіль із лінії" та проігнорувати / видалити стовпчик значення растрового значення. Ланцюжок буде тим, що ви встановите для інтервалу вибірки.


У QGIS 2.2.0 я бачу "Інструмент профілю", "qProf" та "VoGIS-ProfilTool", але не інструмент "Профіль із лінії".
Дейв Х

0

Ну не впевнений, чи є це у стабільному випуску, але в панелі інструментів sextante на 1.9 альфа під Geoalgorithims-> Vector є опція "Перетворити лінії в точки". Працює частування, чудово, якщо до нього додається поле для відстані по лінії.

Цікаво, що він додав поле NAME з мого векторного шару.

Я спробував запустити цей сценарій Python від Натана Вудроу, але я смоктав пітон. І з кодом взагалі здається.


0

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

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