Colocando etiquetas perpendiculares en QGIS?

8

Estoy tratando de obtener el mismo estilo de etiqueta que la Orientación de colocación perpendicular de ArcGIS en QGIS. Como QGIS no tiene esta característica por defecto, la opción sería usar una ubicación personalizada para esto.

Un ejemplo de ArcGIS:

ingrese la descripción de la imagen aquí

Una solución alternativa en QGIS

Configuraciones:

Coordenada X definida por datos (etiqueta en el medio de la línea):

$x_at( num_points( $geometry)/2)

Datos definidos coordinan Y (igual que la ubicación de X):

$y_at( num_points( $geometry)/2)

Rotación definida por datos:

angle_at_vertex( $geometry , num_points( $geometry)/2)

ingrese la descripción de la imagen aquí

Solo para 2/3 etiquetas, la ubicación es aceptable. Para líneas con muchos saltos con diferentes ángulos, es más difícil obtener una buena etiqueta.

ArcGIS parece buscar el segmento de línea con menos saltos o un segmento recto. ¿Hay alguna manera de obtener coordenadas o geometría del segmento de línea más recto utilizando el generador de expresiones para una mejor colocación de etiquetas?

aldo_tapia
fuente
¿qué tal tomar un promedio de los ángulos en varios vértices
csk
@csk He intentado con line_interpolate_angle($geometry, some lenght)y tomar varios angle_at_vertex( $geometry , num_points( $geometry)). Un bucle sobre esta función podría ser un enfoque, pero no puedo hacerlo directamente en el generador de Expresion
aldo_tapia
parece que quiere encontrar una sección de la línea donde el ángulo en cada vértice sea aproximadamente igual al line_interpolate_angle
csk
@csk sí, algo así. Un segmento de línea recta para colocar etiquetas
aldo_tapia

Respuestas:

1

Solución real

Supongamos este tipo de geometrías:

ingrese la descripción de la imagen aquí

Traté de encontrar una buena ubicación. También estoy trabajando con atlas, por lo que utilicé una distancia del 3% de la función de atlas desde la parte media de la línea de interpolación por vértices de la entidad para colocar etiquetas:

Algo como esto:

ingrese la descripción de la imagen aquí

Y creo una flecha desde el vértice medio de la entidad hasta la etiqueta:

ingrese la descripción de la imagen aquí


Configuraciones:

Flecha:

Generador de geometría

make_line(make_point($x_at( num_points( $geometry)/2) , $y_at( num_points( $geometry)/2)),
  project( line_interpolate_point(make_line(make_point($x_at(1),$y_at(1)),make_point($x_at(-1),$y_at(-1))),
  length(make_line(make_point($x_at(1),$y_at(1)),make_point($x_at(-1),$y_at(-1))))/2),length(@atlas_geometry)*0.03,
   (radians(line_interpolate_angle(make_line(make_point($x_at(1),$y_at(1)),make_point($x_at(-1),$y_at(-1))),
  0.0001)))+ pi() *0.5))

Etiqueta

Los datos definen X

x(project( line_interpolate_point(make_line(make_point($x_at(1),
  $y_at(1)),make_point($x_at(-1),$y_at(-1))),
  length(make_line(make_point($x_at(1),$y_at(1)),
  make_point($x_at(-1),$y_at(-1))))/2),length(@atlas_geometry)*0.03,
   (radians(line_interpolate_angle(make_line(make_point($x_at(1),
  $y_at(1)),make_point($x_at(-1),$y_at(-1))),0.0001)))+ pi() *0.5))

Los datos definen Y

y(project( line_interpolate_point(make_line(make_point($x_at(1),
  $y_at(1)),make_point($x_at(-1),$y_at(-1))),
  length(make_line(make_point($x_at(1),$y_at(1)),
  make_point($x_at(-1),$y_at(-1))))/2),length(@atlas_geometry)*0.03,
   (radians(line_interpolate_angle(make_line(make_point($x_at(1),
  $y_at(1)),make_point($x_at(-1),$y_at(-1))),0.0001)))+ pi() *0.5))

Tal vez esto podría ser útil para alguien.

Si hay un mejor enfoque, me alegro de recibirlo.

aldo_tapia
fuente