¿Simboliza el contorno del polígono donde no coincide con otras características usando el generador de geometría en QGIS?

10

Me gustaría simbolizar un polígono sin convertirlos en una línea. Tengo una función de polígono (sombreada y delimitada por una línea roja) que coincide en la parte superior e inferior de la costa (línea azul). Me gustaría simbolizar el contorno de un polígono solo en dos lados y quiero eliminar el color rojo en la parte superior e inferior.

Imagen

Me gustaría ver el resultado final así.

Imagen

Raj
fuente
¿Podría proporcionar más información sobre su flujo de trabajo? Por ejemplo, si se trata de un caso de uso único, ¿o tendrá que mostrar varios polígonos de esta manera? Si hay varios polígonos, ¿están orientados de manera diferente y tienen proporciones diferentes o similares? ¿Podría la digitalización manual de las líneas laterales ser una opción adecuada?
Erik
1
Este no es un caso de uso único. Tengo varios polígonos y se actualizarían para que las formas cambien muy a menudo. Y no quiero digitalizarlos manualmente ni convertir el polígono en líneas.
Raj

Respuestas:

12

Geometry generatorLuché un poco con el como @GSienko. Para la parte de intersección también puede usar la función incorporada aggregate. También utilicé la segment_to_linesfunción que convierte polígonos en líneas.

difference(
    segments_to_lines($geometry),
    aggregate(
        layer:= 'line',
        aggregate:='collect',  
        expression:= $geometry,
        filter:=intersects($geometry, geometry(@parent))
    )
)

o

difference(
    segments_to_lines($geometry),
    aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
)

ingrese la descripción de la imagen aquí

Si tiene algún polígono "no relacionado" con las líneas, puede agregar una ifcondición para la intersección. Si las capas están en intersección, entonces se aplica la diferencia para la simbología, de lo contrario se aplica la geometría completa.

if(
    intersects(
        segments_to_lines($geometry),
        aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
    ),
    difference(
        segments_to_lines($geometry),
        aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
    ),
    segments_to_lines($geometry)
)

ingrese la descripción de la imagen aquí

editar : El uso del generador de líneas de esta manera tiene un punto débil: debe manejar el símbolo de la leyenda, porque representa la línea a través del polígono (no como un borde). Sin embargo, aún puede duplicar la capa, establecer un relleno simple y usarlo como leyenda.

ingrese la descripción de la imagen aquí

Oto Kaláb
fuente
1
Solución más compleja, y aprendo un poco más :)
GSienko
Yo también :). No necesitaba usar Geometry Generator antes, pero fue lo primero que pensé después de leer OP. Me atasqué un poco en esto tratando de combinar intersecciones, y su respuesta también me ayudó, porque olvidé por completo la función de diferencia :).
Oto Kaláb
La solución perfecta para mi caso. Aprecio mucho toda tu ayuda :)
Raj
La única desventaja de usar el generador de líneas es que debe manejar el símbolo de la leyenda, ya que representa la línea a través del polígono (no como un borde). Sin embargo, aún puede duplicar la capa, establecer un relleno simple y usarlo como leyenda.
Oto Kaláb
4

Intente usar el complemento refFunction dentro del generador de geometría.

Suposición. 2 capas: una línea como línea y polígonos como polígono.

Estilo de polígono como ese:ingrese la descripción de la imagen aquí

difference(exterior_ring( $geometry ),geom_from_wkt(geomintersects('line','$geometry')))

geomintersect realizará una consulta espacial entre la capa de polígono y la capa de línea, y devolverá la geometría de la intersección de dos de ellas, en nuestro caso, dos bordes de polígonos. El siguiente paso es hacer la diferencia con el borde del polígono. No sé si tendrá agujeros dentro o no, entonces exterior_ring () devolverá solo el borde exterior.

Resultado final: ingrese la descripción de la imagen aquí

La limitación: geomintersect verificará la intersección solo para un polígono. Gestiono esa limitación creando capas de polígonos en un gran multipolígono, por ejemplo, mediante una capa virtual para el diseño de bordes.

GSienko
fuente
3

¿Qué tal agregar una línea blanca debajo de la línea azul en la otra capa, que tiene el mismo ancho que la línea roja? Si coloca la línea azul sobre la capa de polígono, la línea blanca oscurecerá la línea roja.

Por supuesto, esto supone que tiene un fondo blanco como en su ejemplo, y que está de acuerdo con que algunos de los cruces también estén ocultos.

Este es el resultado de mi prueba rápida:

Imagen del mapa que muestra el estilo

Configuraciones para línea azul:

Simbología

hexamon
fuente
En mi caso, el grosor de la línea y los colores pueden variar. También tengo que usar símbolos de líneas de marcador para los polígonos a través del mapa donde el grosor de la otra característica y el grosor del polígono no serán los mismos.
Raj
2

Descargo de responsabilidad: esta respuesta no funcionará si tiene varios polígonos

Lo que podría hacer es averiguar qué nodos forman las cuatro esquinas del polígono entre las que desea dibujar líneas, y luego usarlos en las funciones MAKE_LINE () para dibujar las líneas:

Para encontrar qué nodos necesita:

  • Primero agregue una simbología del generador de geometría
  • Establezca el tipo de geometría en Point / MultiPoint
  • Use la expresión POINT_N($geometry, 1)para mostrar el primer nodo como un punto
  • Siga cambiando el valor hasta que sepa el número de cada una de las cuatro esquinas del polígono, tome nota de estos, ya que usará pares de estos para dibujar las líneas

Para dibujar las líneas:

  • Cambie el tipo de geometría del generador de geometría a LineString / MultiLineString
  • Usa la expresión MAKE_LINE(POINT_N($geometry, *first point*), POINT_N($geometry, *second point*)
  • Duplica esto usando el otro par de puntos
  • Esto dibujará las dos líneas de límite

A continuación, solo agrega una simbología de relleno de patrón de línea normal debajo de esos dos generadores de geometría

TeddyTedTed
fuente
Desafortunadamente, tengo muchos polígonos.
Raj