8 votos

Etiquetado de líneas que no están dentro de polígonos utilizando la calculadora de campo

Tengo dos características. Una característica de línea y otra de polígono. Quiero que la etiqueta de la característica de línea no aparezca cuando esté dentro de un polígono similar al de la figura. Es decir, quiero que la etiqueta sólo aparezca cuando la línea esté fuera del polígono. ¿Es posible hacer esto en QGIS 3?

He probado la calculadora de campo con el within pero no funcionó muy bien.

example

A continuación se muestra el código que intenté hacer en la calculadora de campos de QGIS:

CASE
   WHEN within('Lines_4e1a1089_ba02_495e_8c79_d32b79cf3b54','polygon_406a7fae_06b4_45a1_a20e_d64b8682e501') THEN " "
   ELSE "Label"
END

12voto

Oto Kaláb Puntos 121

Estás tratando de llamar a within en una cadena que representa una capa, no su geometría. Pero de todos modos no funcionará así. De este modo, se etiquetaría/no se etiquetaría toda la característica, no los segmentos. Con within etiquetaría la característica con " " en caso de que toda la línea esté en el polígono. En caso de intersects etiquetará la característica que de alguna manera interactúa con cualquier polígono.

Tal vez hay opción de cómo resolver esto con la expresión de Label with pero creo que esto es primario para formatear el texto de la etiqueta para la característica, no para la colocación de la etiqueta. No he descubierto cómo dividir la geometría de la línea en esta expresión para el resultado deseado.

En QGIS 3.8, hay Geometry generator en Colocación en las propiedades de las etiquetas. Con esto puede generar una nueva geometría de origen sólo para las etiquetas, en su caso líneas que no son polígonos de intersección. Las etiquetas se renderizan sólo sobre esta geometría (es decir, se suprime la renderización de etiquetas sobre polígonos):

example1

if(
    intersects(
        $geometry,
        aggregate('poly','collect',$geometry,intersects($geometry, geometry()))
    ),
    difference(
        $geometry,
        aggregate('poly','collect',buffer($geometry,0.1),intersects($geometry, geometry()))
    ),
    $geometry
)

Fíjese en el buffer Esto da espacio alrededor del polígono para suprimir la representación de la etiqueta. Esto evita que las etiquetas largas se superpongan a los polígonos.

Que en Ficha de renderización compruebe el Label every part of multi-part features . Esto mantiene la representación de etiquetas en toda la parte de una línea (líneas que se superponen al polígono y continúa).

example2

example3

11voto

Sushant23 Puntos 329

O de forma muy sencilla, puede utilizar el polígono para bloquear las etiquetas de la polilínea.

Etiquetar la polilínea normalmente:

enter image description here

Después de utilizar el polígono como característica de bloqueo, la etiqueta se desplazará automáticamente fuera del polígono:

enter image description here

4voto

DBM Puntos 51

Su enfoque no funciona porque

  • las uniones espaciales sobre las capas (no las pruebas de las relaciones de las geometrías individuales) no pueden realizarse en el diálogo de expresión
  • within sólo es cierto cuando una geometría entera cae enteramente en otra geometría, lo que no es el hecho en su caso
  • las comillas dobles son para los nombres de los atributos, para las cadenas utilice las comillas simples

Con todo, dudo que esto se pueda conseguir utilizando expresiones en la simbología o el etiquetado, recomiendo utilizar el Diferencia para calcular las secciones de su capa de líneas que se encuentran fuera del polígono (Caja de herramientas de procesamiento > Superposición de vectores > Diferencia):

enter image description here

Etiquetado para la capa original de la cadena de líneas:

enter image description here

Etiquetado de la capa de diferencia:

enter image description here

Si desea mostrar su capa original de líneas (sin etiquetas) y utilizar las etiquetas de la capa de diferencia, le sugiero que configure un estilo "Sin símbolo" para la capa de diferencia, la etiquete y muestre ambas.

2voto

Jeremy White Puntos 381

También puede utilizar un datos definidos anular para la representación de etiquetas, pero requiere dividir la capa de líneas.

  1. Desde la caja de herramientas de procesamiento, ejecute el programa Clip para recortar la capa de líneas con la capa de polígonos.

  2. Ejecutar el Diferencia para extraer las partes de la característica de línea que caen fuera del polígono.

  3. Ejecutar el Fusionar capas vectoriales en los resultados recortados y de diferencia.

  4. Añada un nuevo campo entero a la capa combinada y llámelo, por ejemplo, "Etiqueta".

  5. Seleccione la característica dentro del polígono. Abra la tabla de atributos y, con la capa en modo de edición, déle un valor de 0 en el campo "Etiqueta". Dé a la característica o características fuera del polígono valores de 1.

  6. En las propiedades de la capa, etiquete la capa de la línea con el campo deseado, en la pestaña de renderizado marque "Etiquetar cada parte de las características de varias partes", luego haga clic en "datos definidos" para mostrar la etiqueta, y seleccione el campo "Etiqueta".

Ajustes de la etiqueta:

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