使用QGIS在沿线的指定距离内创建点?


20

我想使用QGIS沿直线创建点,但要指定距离。我在SEXTANTE工具箱中找到了两个GRASS工具:

  • v.to.points

我尝试了v.to.points,将地图单位中的点之间的最大距离设置为100,得到的是:

沿线的点

仔细看看

第二张照片显示了上部的近距离观察。结果是我想要的,但是我想获得更少的分数,但是即使我将最大距离设置为1000或1000000,结果也是一样。

我尝试使用v.segment,但是我没有包含细分规则的文件。

Underdark给了我一些建议,并且我尝试给定间隔一段时间使Densify几何形状成为可能。首先,它给了我与输入相同的折线shapefile,然后使用提取节点尝试获取这些点。但是无论设置距离间隔如何,结果都与使用v.to.points获得的结果相同。

如何沿直线并在指定距离内创建点?


4
看看这个,让我们知道 nathanw.net/2012/08/05/…–
Willy

感谢您给我这个有用的建议!如果要使用您的脚本,是否要安装python?还是在新版本的QGIS 2.0中,已经内置了此功能?
Heinz 2013年

5
现在QGIS 2.0中有一个名为QChainage的插件。获取插件并安装。
威利(Willy)

请注意,“ Sextante”工具箱在QGIS 2.2.0+中称为“处理”,而“给定间隔的密集化几何”位于ProcessingToolbox / QGISGeoalgorithms / VectorGeometryTools菜单下。请注意,这将使几何化,并且不会删除顶点。是比越接近所选择的时间间隔。
戴夫X

这对我
有用

Answers:


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中复杂而弯曲的线条,这些过程可能没有太大效果。
戴夫X

您可以完美地适应脚本。
基因

17

现在有一个名为QChainage的插件可以完全满足您的需求。您指定一个间隔距离,插件将以指定的间隔沿线创建点。


*请注意,这不会捕获线节点,因此,如果需要它们,则还需要使用几何工具-提取节点并附加到桩号点。
2014年

1
欢迎使用GIS SE!我认为您可以通过使用下面的“编辑”按钮将您作为注释附加的信息更好地合并到您的实际答案中。您可以通过复制/粘贴来执行此操作,然后单击旁边的小叉来删除您的评论。
PolyGeo

11

我编写了一个脚本,该脚本将Sextante Densify几何图形工具更改为接受一定距离。给定一个间隔,它称为“ 密实几何”

运行Densify后,可以使用“ 提取节点”工具提取点。

您可以从Github获得它,安装说明在我的博客上

在此处输入图片说明


似乎该工具现在无需安装Sextante(QGIS 2.18.7)就可以在QGIS中使用。我没有在菜单中看到它,但在“处理工具箱”中搜索时发现它是QGIS地理算法。
Nate Wanner

0

如果您不想使用python脚本,则可以简单地安装并使用“来自行的配置文件”插件,而忽略/删除栅格值列。桩号将是您设置的采样间隔。


在QGIS 2.2.0中,我看到了“配置文件工具”,“ qProf”和“ VoGIS-ProfilTool”,但没有看到“在线配置文件”工具。
戴夫X

0

不太确定这是否在稳定版本中,但是在Geoalgorithims-> Vector下1.9 alpha的sextante工具箱中是“将线转换为点”选项。很有效,但如果它也沿着直线增加了一个距离字段,那就太好了。

有趣的是,确实从我的矢量层添加了NAME字段。

我试过让Nathan Woodrow来工作的Python脚本,但是我对python很烂。而且一般来说,代码似乎。


0

我花了很长时间在这个问题上苦苦挣扎,但最终还是得到了我使用QChainage寻找的东西。我想分享的是可以帮助他人的东西。在生产线上使用SAGA地理处理分解工具时,QChainage会产生错误的结果。使用其他溶解工具可以使其正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.