11 votos

¿Cómo dividir una línea en un número específico de partes?

He visto muchas preguntas que implican la división de una línea con la ayuda de una capa de puntos. Quiero dividir una línea en fracciones de su longitud. Por ejemplo, tengo una línea de 400 metros de largo, quiero dividirla en cuatro líneas de 100 metros de largo cada una. Está el módulo de hierba v.split, pero recibo un mensaje de error cuando lo inicio desde la caja de herramientas qgis :

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

Así que no estoy seguro, si consigo que funcione, si esto sería una solución.

0 votos

Por favor, aclárelo: ¿Quiere dividir por longitud, es decir, cada 100 metros, o en un número específico de partes?

0 votos

En un número específico de partes. Joseph, a continuación, ha dado una buena solución.

10voto

Mue Puntos 2469

El v.split.length de GRASS debería hacer exactamente lo que quieres, dividiendo la línea en segmentos iguales definidos por el usuario sin necesidad de una capa de puntos. Aquí hay un ejemplo simple de una línea recta (también funciona en líneas no rectas y múltiples):

Simple line

He añadido una columna para calcular su longitud utilizando $length en la expresión:

Line attribute

Utilizando el v.split.length de GRASS a través de la función Caja de herramientas de procesamiento En este caso, he optado por dividir la línea en segmentos de 25 metros, lo que supondría un total de 4 partes:

v.split.length function

A continuación, actualicé la columna Longitud de la capa de salida y utilicé el mismo comando anterior para volver a calcular la longitud:

Attribute result

No estoy seguro de por qué está recibiendo el error, ¿podría compartir su capa de línea para que la gente lo pruebe?

0 votos

Hola, gracias por su respuesta. Ya funciona. Sin embargo, no está dividiendo la línea en fracciones de la longitud, ya que todavía tengo que calcular el número de segmentos de la longitud medida, pero es una buena solución. Gracias.

0 votos

Disculpa por no darte una respuesta definitiva, pero me alegro de que al menos sea una solución. De nada, amigo.

2 votos

Si la "Longitud máxima del segmento" está ajustada a 25, ¿por qué se obtienen 4 segmentos más largos que 25 (25,465) y no 5 segmentos (4 de 25 y uno de 1,86 o 5 de 20,372 si la herramienta produce la misma longitud)?

2voto

ARUNBALAN NV Puntos 101

Probado en QGIS 2.18 y QGIS 3.4

Supongamos que existe una capa de polilíneas llamada "lines" .

input

Puedo sugerir el uso de una "capa virtual" a través de Layer > Add Layer > Add/Edit Virtual Layer...


Hay varios casos posibles:


Caso 1. Dividir la línea en segmentos iguales, básicamente de la misma longitud que define el usuario.

Con la siguiente consulta, es posible obtener el resultado. Para aumentar/disminuir la longitud del segmento, por favor, ajuste el 1000 AS step_length en -- 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

La capa virtual de salida tendrá el siguiente aspecto

output_1

Nota: Si "delta (por ejemplo, el último segmento más corto) no debe incluirse, entonces inserte WHERE sec_length >= step_length en -- query Ver más abajo

-- 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

Caso 2. Dividir la línea en un número determinado de segmentos

Con la siguiente consulta, es posible conseguir el resultado. Para aumentar/disminuir el número de segmentos, ajuste el 8 AS sections en -- 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

La capa virtual de salida tendrá el siguiente aspecto

output_2

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X