Создание точек на указанном расстоянии вдоль линии с использованием QGIS?


20

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

  • v.to.points
  • v.segment

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

указывает вдоль линии

пристальный взгляд

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

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

Подземье дало мне несколько советов, и я попробовал геометрию Densify с заданным интервалом . Сначала он дал мне шейп-файл ломаной линии, такой же, как я, и затем я использовал узлы извлечения, чтобы попытаться получить эти точки. Но результат был таким же, как я использовал v.to.points , независимо от того, какой интервал расстояния я установил.

Как я могу создать точки вдоль линии и на указанном расстоянии?


4
Посмотрите на это, дайте нам знать, nathanw.net/2012/08/05/…
Вилли

Спасибо, что дали мне этот полезный совет! Если я хочу использовать ваш скрипт, я должен установить Python? или в новой версии QGIS 2.0 уже встроена эта функция?
Хайнц

5
В QGIS 2.0 теперь есть плагин для этого, который называется QChainage. Получить плагин и установить его.
Вилли

Обратите внимание, что набор инструментов "Sextante" называется "Обработка" в QGIS 2.2.0+, а геометрия Densify с интервалом "находится в меню ProcessingToolbox / QGISGeogorithms / VectorGeometryTools. Обратите внимание, что это обозначает геометрию и не удаляет вершины. которые ближе, чем выбранный интервал.
Дэйв Икс

Это сработало для меня: 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, с направленными косинусами

ломанаястройныйvector_algebra

Затем просто настройте интервал


При взгляде на соединение это выглядит так, как будто он сохраняет ранее существующие точки узлов на линии, поэтому он не может уменьшить их до разрешения меньше, чем вершины, уже находящиеся на линии. Со сложными, извилистыми линиями, как в OP, эти процедуры могут не иметь большого эффекта.
Дэйв Икс

Вы можете отлично адаптировать сценарий.
ген

17

Теперь есть плагин под названием QChainage, который делает именно то, что вы хотите. Вы указываете интервальное расстояние, и плагин создает точки вдоль вашей линии с указанным интервалом.


* Обратите внимание, что это не будет захватывать ваши линейные узлы, поэтому, если они вам нужны, вам также нужно будет использовать инструмент геометрии - извлекать узлы и добавлять к своим точкам цепочки.
Джейсон

1
Добро пожаловать в ГИС ЮВ! Я думаю, что информация, которую вы добавили здесь в качестве комментария, была бы лучше включена в ваш фактический ответ с помощью кнопки редактирования под ним. Вы можете сделать это с помощью функции «Копировать / Вставить» и удалить свой комментарий, нажав на маленький крестик рядом с ним.
PolyGeo

11

Я написал скрипт, который меняет инструмент геометрии Sextante Densify, чтобы принять определенное расстояние. Это называется Densify геометрией с заданным интервалом .

После запуска Densify, вы можете извлечь точки с помощью инструмента Извлечь узлы .

Вы можете получить его от Github и инструкции по установке находятся в моем блоге .

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


Похоже, этот инструмент теперь доступен в QGIS без установки Sextante (QGIS 2.18.7). Я не видел его в меню, но нашел его как геоалгоритм QGIS при поиске в панели инструментов обработки.
Нейт Ваннер,

0

Если вы не хотите использовать скрипты Python, вы можете просто установить и использовать плагин «Профиль из линии» и игнорировать / удалить столбец значений растра. Цепочка будет тем, что вы установили для интервала выборки.


В QGIS 2.2.0 я вижу «Инструмент профиля», «qProf» и «VoGIS-ProfilTool», но не инструмент «Профиль из линии».
Дейв Икс

0

Ну, не уверен, что это в стабильном выпуске, но в наборе инструментов sextante на 1.9 alpha под Geoalgorithims-> Vector есть опция «Преобразовать линии в точки». Работает угощение, было бы здорово, если бы оно добавило поле для расстояния вдоль линии, хотя.

Интересно, что оно добавило поле NAME из моего векторного слоя.

Я пытался заставить работать этот Python Script Нейтана Вудроу, но я сосу с Python. А с кодом вообще похоже.


0

Я долго боролся с этой проблемой, но в итоге получил более или менее то, что искал, используя QChainage. Я хотел бы поделиться тем, что может помочь другим. При использовании инструмента растворения геообработки SAGA на линии QChainage дает неверные результаты. Использование другого инструмента растворения заставляет его работать нормально.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.