5 votos

Línea del generador de geometría desde el centroide hasta el borde del polígono irregular

Tengo una capa de punto de estilo con la siguiente geometría generador fórmula para un polígono irregular. Es la unión de (a) un buffer circular con (b) una de las copas de los árboles propagación amortiguada por 1m (en el que se extiende más allá (a)).

 union(buffer($geometry,"tpzbsrad_m"),buffer(make_polygon(make_line(
 translate($geometry,0,max("N",0.2)),
 translate($geometry,0.6*max("E",0.2),0.6*max("N",0.2)),
 translate($geometry,max("E",0.2),0),
 translate($geometry,0.6*max("E",0.2),-0.6*max("S",0.2)),
 translate($geometry,0,-max("S",0.2)),
 translate($geometry,-0.6*max("W",0.2),-0.6*max("S",0.2)),
 translate($geometry,-max("W",0.2),0), 
 translate($geometry,-0.6*max("W",0.2),0.6*max("N",0.2)),
 translate($geometry,0,max("N",0.2)))),1))

Me gustaría usar la geometría del generador para dibujar 45° con la línea del árbol punto ($geometry) del borde de este polígono irregular.

Para la mayoría de los casos, el siguiente es suficiente - una línea en el borde del búfer circular.

make_line(
 $geometry, make_point($x + "tpzbsrad_m"*cos(radians(45)), 
                       $y - ("tpzbsrad_m"*sin(radians(45)))
))

Pero donde las copas de los árboles se extiende más allá de la amortiguación en esa zona no coinciden. Ver la imagen de abajo:

enter image description here

Qué expresión se puede utilizar para obtener la línea de ser lo suficientemente largos para siempre en contacto con el borde del polígono irregular a 45°? shortest_line() de resultados en los ángulos por todo el lugar, de forma natural.

(Buscando una expresión que lo ideal sería que trabaja en QGIS 2.18 y 3.x)

3voto

ghotan Puntos 29

Gracias por compartir tu gran trabajo!

[Opción 1]

Una idea que se expone a continuación requeriría:

  • El irregular (azul cielo) polígono se guarda como una capa vectorial ( your_polygon)
  • refFunctions plugin (para geomwithin() función)

A continuación, la expresión es:

intersection(
    make_line(
             $geometry, make_point($x + 2*"tpzbsrad_m"*cos(radians(45)), 
                                   $y - 2*("tpzbsrad_m"*sin(radians(45)))
    )),
    geom_from_wkt(geomwithin('your_polygon', '$geometry'))
)

(Un factor multiplicador 2 su "tpzbsrad_m" no tiene ningún significado, pero asegura que la línea se extiende el tiempo suficiente antes de que se corte en la intersección de polígonos de contorno).


[Opción 2] sin refFunctions plugin:

En lugar de utilizar refFunctions plugin, hay un paso adicional para vincular su árbol (punto) y polígono.

  • Join by Location tener idéntico id campos, tanto de sus capas (punto y polígono).

Ahora revisado expresión es:

intersection(
    make_line(
             $geometry, make_point($x + 2*"tpzbsrad_m"*cos(radians(45)), 
                                   $y - 2*("tpzbsrad_m"*sin(radians(45)))
    )),
    geometry(get_feature('your_polygon', 'id', "id"))
)

Esta expresión se utiliza get_feature() función que vincula 'id' campo del polígono (your_polygon) y el "id" de campo en el punto (capa de su árbol de ubicaciones).

2voto

she_weeds Puntos 126

La expansión en @Kazuhito la respuesta de ésta es la expresión que he utilizado - simplemente un intersection() de los 45° de línea (extended x2) con el polígono irregular se describe en el post original.

Sin embargo, a prueba de grandes conjuntos de datos - estoy seguro de que el rendimiento no es el óptimo, pero es lo suficientemente bueno para mi caso de uso de diseño y requisitos.

intersection(make_line(
 $geometry,
 make_point($x + "tpzbsrad_m"*cos(radians(45))*2, 
 $y - ("tpzbsrad_m"*sin(radians(45))*2))),

union(buffer($geometry,"tpzbsrad_m"),buffer(make_polygon(make_line(
 translate($geometry,0,max("N",0.2)),
 translate($geometry,0.6*max("E",0.2),0.6*max("N",0.2)),
 translate($geometry,max("E",0.2),0),
 translate($geometry,0.6*max("E",0.2),-0.6*max("S",0.2)),
 translate($geometry,0,-max("S",0.2)),
 translate($geometry,-0.6*max("W",0.2),-0.6*max("S",0.2)),
 translate($geometry,-max("W",0.2),0), 
 translate($geometry,-0.6*max("W",0.2),0.6*max("N",0.2)),
 translate($geometry,0,max("N",0.2)))),1)))

Ver la imagen de abajo - siempre golpea el borde del polígono ahora.

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