6 votos

Etiquete las líneas de llamada al punto más cercano en la etiqueta.

Estoy tratando de mejorar llamada de líneas en los mapas que estoy haciendo. Actualmente estoy usando el método en este enlace para hacer mi llamada líneas. Que funciona bien, pero me gustaría que las líneas para ir siempre por el punto más cercano de la etiqueta como esta:

enter image description hereenter image description here

enter image description hereenter image description here

Creo que funcionaría si he utilizado el código de abajo en la línea de este en la expresión del editor de la geometría del generador.

make_line(
  make_point($x, $y),
    make_point((CASE
      WHEN "auxiliary_storage_labeling_positionx" > $x
        THEN "auxiliary_storage_labeling_positionx"
      WHEN ("auxiliary_storage_labeling_positionx"  + "labelwidth") > $x  
            AND ("auxiliary_storage_labeling_positionx") < $x
        THEN ("auxiliary_storage_labeling_positionx" + "labelwidth")
      ELSE $x
      END )
    ,(CASE
      WHEN "auxiliary_storage_labeling_positiony" < $y
        THEN "auxiliary_storage_labeling_positiony"
      WHEN ("auxiliary_storage_labeling_positiony"  + "labelHeight") < $y
            AND ("auxiliary_storage_labeling_positiony") > $y
        THEN ("auxiliary_storage_labeling_positiony"  + "labelHeight")
      ELSE $y
      END )
  )
)

No estoy seguro de si tengo todos los < y > correcto, pero eso es irrelevante. El problema con esto es que me parece que no puede averiguar cómo obtener el ancho y el alto de la etiqueta.

Yo no soy muy bueno con el editor de expresiones, y nunca he hecho nada con el editor de la función.

3voto

Ray Koopman Puntos 111

también puede utilizar los datos definidos "Alineación" para lograrlo y el uso sólo de una simple línea dentro de la geometría del generador sin Y condiciones:

make_line($geometry,make_point( 
"auxiliary_storage_labeling_positionx" , 
"auxiliary_storage_labeling_positiony" ))

enter image description here

y una expresión como esta para la horizontal:

if(x(closest_point($geometry,
 make_point( "auxiliary_storage_labeling_positionx" ,
"auxiliary_storage_labeling_positiony" ))) 
 > x(make_point( 
"auxiliary_storage_labeling_positionx" , 
"auxiliary_storage_labeling_positiony"
)),'Right','Left')

y algo similar para la alineación vertical:

if(y(closest_point($geometry,
make_point( 
"auxiliary_storage_labeling_positionx" , 
"auxiliary_storage_labeling_positiony" ))) < 
y(make_point( 
"auxiliary_storage_labeling_positionx" , 
"auxiliary_storage_labeling_positiony" 
)),'Bottom','Top')

el 'closest_point' declaración que usted necesitará solamente si la geometría de polígono o línea.

para la posición central, se puede cambiar la expresión y agregar una variable d para un umbral (por ejemplo, en metros) en el que la etiqueta estará centrado:

with_variable ('d', 200,
CASE
WHEN 
(x(closest_point($geometry,
 make_point( "auxiliary_storage_labeling_positionx" ,
"auxiliary_storage_labeling_positiony" ))) 
< x(make_point( 
"auxiliary_storage_labeling_positionx" , 
"auxiliary_storage_labeling_positiony"
))-@d)
THEN 'Left' 
WHEN
(x(closest_point($geometry,
 make_point( "auxiliary_storage_labeling_positionx" ,
"auxiliary_storage_labeling_positiony" ))) 
> @d+x(make_point( 
"auxiliary_storage_labeling_positionx" , 
"auxiliary_storage_labeling_positiony"
))) THEN 'Right'
ELSE 'Center' END)

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