4 votos

Expresión QGIS: Encontrar el valor DEM en el punto de intersección de dos líneas en diferentes capas

He estado trabajando un rato en esto y estoy seguro de que me estoy perdiendo algo. Tengo que conjuntos de líneas en un DEM, y tengo que llamar a un valor de trama donde se cruzan. Puedo llegar a donde estoy recibiendo el valor del centroide de la línea con esto

raster_value( 'DEM-test',
1,
make_point(
x($geometry), y($geometry)
)
)

Y entonces sé que necesito un punto en lugar de una característica de línea, y escribí esto:

raster_value( 'DEM-test',
1,
make_point(
x(intersection(collect($geometry),
             aggregate('New scratch layer2','collect',$geometry,                    intersects($geometry,geometry())))), 

y(intersection(collect($geometry),
             aggregate('New scratch layer2','collect',$geometry,
                    intersects($geometry,geometry()))))
)
)

Que no funciona. DEM-test es la trama y New scratch layer2 es la segunda capa scratch. ¿Qué me falta? Sé que puedo hacer esto a través de otros medios, pero debe ser a través de una expresión QGIS.

4voto

chhh Puntos 1154

Con esta expresión se obtiene el punto de intersección de dos líneas en la misma capa:

 intersection ($geometry,overlay_intersects(@layer,$geometry)[0])

Así que la expresión para obtener la elevación es:

raster_value('DEM', 1,  intersection ($geometry, overlay_intersects( @layer, $geometry)[0]))

Si las líneas de cruce están en capas diferentes, sustituya @layer (la variable representa la capa actual) con el nombre de la capa que contiene la segunda línea.

Utilizar la expresión como entrada para crear una etiqueta dinámica: enter image description here


Editar :

Para una línea que cruza otra línea en otra capa varias veces, utilice esta expresión para obtener una matriz de valores de elevación para cada punto de cruce, ordenados a lo largo de la línea de entrada desde el punto inicial hasta el punto final. Convertir a cadena (texto) con array_to_string() . Ten cuidado: geom_to_array() es un nueva función disponible desde QGIS 3.28 .

Línea azul etiquetada con la expresión de abajo; los puntos rojos con etiquetas muestran los puntos de intersección como capa de puntos individuales para fines de control aquí: enter image description here

array_foreach(
    with_variable(
        'points',
        geometries_to_array(  
            array_foreach(
                overlay_intersects ('line1',$geometry),
                intersection ($geometry,@element)
            )[0]
        ),
        array_sort(
            array_foreach(
                @points,
                line_locate_point ($geometry, @element)
            )
        )
    ),
    raster_value(
        'dem',
        1,
        line_interpolate_point($geometry,@element)

    )
)

4voto

Mike Puntos 473

Digamos que tenemos tres capas: lineA , lineB y DEM .

  1. En lineA aplicar una Simbología utilizando un Geometry Generator con Point / MultiPoint como tipo de Geometría.

    intersection( collect($geometry), aggregate( 'lineB', 'collect', $geometry,
    intersects($geometry,geometry()) ) )

  2. Como los Marcadores utilizan un Font Marker y un Simple Marker

  3. Para el Font Marker utilice raster_value('DEM',1,geometry_n( $geometry, @geometry_part_num )) como la expresión para la propiedad Carácter(es) - esto etiquetará en las intersecciones de cada punto basándose en el valor raster de su DEM.

enter image description here

Resultado: enter image description here

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