如何将线分成特定数量的零件?


11

我已经看到了很多问题,这些问题涉及借助点层来分割线。

我想将一条线分成长度的一部分。

例如,我有一400米长的线,我想将其分成四根各长100米的线。

有草模块v.split,但是从qgis工具箱启动它时出现错误消息:

*"TypeError: object of type 'NoneType' has no len()"*

因此,我不确定是否可以解决该问题。


请说明:您是否要按长度分开,即100米或分成特定数量的零件?
昏暗

分为特定数量的零件。下面的Joseph给出了一个很好的解决方法。
吉尔斯2014年

Answers:


10

GRASS 的v.split.length函数可以通过将线划分为用户定义的相等段而无需点层,从而完全满足您的要求。这是一条直线的简单示例(它也适用于非直线和多条直线):

简单的线条

$length在表达式中添加了一个列来计算其长度:

线属性

通过Processing Toolbox使用GRASS 的v.split.length函数,我选择将线分成25m个分段,该分段总共应由4个部分组成:

v.split.length函数

然后,我更新了输出层的“长度”列,并使用与上述相同的命令来重新计算长度:

属性结果

不知道为什么会收到错误消息,是否可以共享线层供人们测试?


您好,谢谢您的回答。这是工作。不过,由于我仍必须根据所测得的长度来计算线段数,因此不会将线分割成长度的几分之一,但这是一个很好的解决方法。谢谢。
吉尔斯2014年

2
如果将“最大段长度”设置为25,为什么为什么要得到比25(25.465)长4的段,而不是5个段(如果工具输出相等,则为25的4和1.86或5的20,372)?
JR

1
@JR-这是5年前问的一个好问题:)。我对此没有答案,考虑到它可能是旧的QGIS版本,也许这是该工具中的一个错误。另外,就像在我学习GIS的早期一样,在以米为单位测量精确距离时,我应该使用另一个CRS!
约瑟夫

1
@Joseph,我想您今天会选择PyQGIS,不是吗?=)
塔拉斯

1
@Taras-我会更倾向于,是的:)
约瑟夫

2

在QGIS 2.18和QGIS 3.4上测试

假设有一个称为的折线图层"lines"

输入

我可以建议通过以下方式使用“虚拟层” Layer > Add Layer > Add/Edit Virtual Layer...


可能有几种情况:


情况1.将线分成相等的段,长度由用户定义,长度基本相等。

通过以下查询,可以实现结果。要增加/减少段长度,请在1000 AS step_length中进行调整-- configurations

-- generate series
WITH RECURSIVE generate_sections(id, sec) AS (
SELECT conf.start + 1, conf.start
FROM conf
UNION ALL
SELECT id + conf.step, sec + conf.step_length/conf.length_line
FROM generate_sections, conf
WHERE sec + conf.step_length/conf.length_line <= 1
),

-- configurations
conf AS (
SELECT
0.0 AS start,
1.0 AS step,
1000 AS step_length,
ST_Length(l.geometry) AS length_line
FROM lines AS l
)

-- query
SELECT gs.id AS id,
        ROUND(ST_Length(ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line)),0) AS seg_length,
        ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line) AS geom
FROM generate_sections AS gs, lines AS l, conf
GROUP BY gs.id

输出虚拟层将如下所示

输出_1

注意:如果 “三角洲”(例如,最近的最短段)不应该被包括在内,然后插入WHERE sec_length >= step_length-- query,见下文

-- query
SELECT gs.id AS id,
        ROUND(ST_Length(ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line)),0) AS seg_length,
        ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line) AS geom
FROM generate_sections AS gs, lines AS l, conf
WHERE seg_length >= step_length
GROUP BY gs.id

情况2。将线分成一定数量的段

通过以下查询,可以实现结果。要增加/减少段数,请调整8 AS sections中的-- configurations

-- generate series
WITH RECURSIVE generate_sections(id, sec) AS (
SELECT conf.start + 1, conf.start
FROM conf
UNION ALL
SELECT id + conf.step, sec + conf.step
FROM generate_sections, conf
WHERE sec + conf.step < conf.sections
),

-- configurations
conf AS (
SELECT
8 AS sections,
0.0 AS start,
1.0 AS step
)

-- query
SELECT gs.id AS id,
    ST_Line_Substring(l.geometry, conf.start + sec/conf.sections, sec/conf.sections + step/conf.sections) AS geom,
    ROUND(ST_Length(ST_Line_Substring(l.geometry, conf.start + sec/conf.sections, sec/conf.sections + step/conf.sections)),2) AS seg_length
FROM generate_sections AS gs, lines AS l, conf
WHERE start + step < sections
GROUP BY gs.id

输出虚拟层将如下所示

输出_2

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.