v.to.points
v.segment
我尝试了v.to.points,设置以地图单位为单位的点之间的最大距离为100,并得到以下结果:一。结果就是我想要的,但是我想获得更少的分数,但是即使我将最大距离设置为1000或1000000,结果也是一样。
我尝试使用v.segment,但是我没有包含细分规则的文件。
Underdark给了我一些建议,然后尝试给定间隔给密化几何。首先,它给了我与输入相同的折线shapefile,然后我使用提取节点尝试获取这些点。但是无论设置距离间隔如何,结果都与使用v.to.points相同。
如何在指定距离内沿线创建点?
#1 楼
现在有一个名为QChainage的插件可以完全满足您的需求。您指定一个间隔距离,插件将以指定的间隔沿线创建点。评论
*请注意,这不会捕获线节点,因此,如果需要它们,则还需要使用几何工具-提取节点并附加到桩号点。
–詹森
2014年6月25日,3:15
欢迎使用GIS SE!我认为您可以通过使用其下面的编辑按钮将此处作为注释附加的信息更好地合并到您的实际答案中。您可以使用“复制/粘贴”来执行此操作,然后单击旁边的小叉来删除评论。
– PolyGeo♦
2014年6月25日在3:49
这正是我所需要的!谢谢!用例与问题不同,但是我需要找到距指定点的diff坐标距离,我使用了diff插件绘制线,然后使用它与您提到的插件创建的图层,得到了我所需要的! :D
–亚当·派恩(Adam Pine)
20年1月7日在21:21
#2 楼
在Python控制台中:您可以将Shapely模块(如“如何在QGIS中创建等距点”中所述)与功能
一起使用point = line.interpolate(currentdistance)
主版本(1.9)的新Python API具有等效的命令(如Nathan Woodrow的QGIS中的生成里程(距离)节点)
point = geom.interpolate(currentdistance)
,也可以使用矢量代数和方向余弦(如在PyQGIS中:几何,矢量,矢量代数或方向余弦,应用示例,以法语表示)
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等距的点,具有方向余弦
评论
从交界处看,它看起来像是将先前存在的节点保持在直线上,因此它无法将其细化到比该直线上的顶点还小的分辨率。对于OP中复杂而弯曲的线条,这些过程可能没有太大效果。
–戴夫X
2014年7月22日在20:01
您可以完美地适应脚本。
–基因
2014年7月22日20:32
#3 楼
我编写了一个脚本,该脚本将Sextante Densify几何形状工具更改为接受一定距离。给定一个间隔,这称为“密实化”几何。运行Densify后,可以使用“提取节点”工具提取点。 />
评论
似乎该工具现在无需安装Sextante(QGIS 2.18.7)就可以在QGIS中使用。我没有在菜单中看到它,但在“处理工具箱”中搜索时发现它是QGIS地理算法。
–内特·万纳(Nate Wanner)
18年6月4日在13:29
该工具在QGIS 3中可用吗?
– Novover
19/12/30在22:04
#4 楼
在QGIS 3中(至少在QGIS 3.10中)有一个用于此目的的处理工具:“沿几何点”#5 楼
如果您不想使用python脚本,则只需安装并使用“来自行的配置文件”插件,然后忽略/删除栅格值列即可。桩号将是您将采样间隔设置为的任何值。评论
在QGIS 2.2.0中,我看到了“配置文件工具”,“ qProf”和“ VoGIS-ProfilTool”,但没有看到“在线配置文件”工具。
–戴夫X
2014年7月22日20:05
#6 楼
不太确定这是否在稳定版本中,但是在Geoalgorithims-> Vector下1.9 alpha的sextante工具箱中是“将线转换为点”选项。很有效,但是如果它也沿着直线添加了一个距离字段,那就太好了。有趣的是它确实从我的矢量层添加了NAME字段。试图让内森·伍德罗(Nathan Woodrow)获得该Python脚本,但是我对python很满意。而且一般来说,使用代码。
评论
看看这个,让我们知道nathanw.net/2012/08/05/…感谢您给我这个有用的建议!如果要使用您的脚本,是否要安装python?或在新版本的QGIS 2.0中,它已经内置了此功能吗?
现在QGIS 2.0中有一个名为QChainage的插件。获取插件并安装。
请注意,“ Sextante”工具箱在QGIS 2.2.0+中称为“处理”,而“给定间隔的密集化几何”位于ProcessingToolbox / QGISGeoalgorithms / VectorGeometryTools菜单下。比所选间隔更近。
这对我有用:plugins.qgis.org/plugins/LocatePoints