Placer des étiquettes perpendiculaires dans QGIS?

8

J'essaie d'obtenir le même style d'étiquette que l' orientation de positionnement perpendiculaire d'ArcGIS dans QGIS. Comme QGIS n'a pas cette fonctionnalité par défaut, l'option utiliserait un placement personnalisé pour cela.

Un exemple ArcGIS:

entrez la description de l'image ici

Une solution de contournement dans QGIS

Réglages:

Coordonnée X définie par les données (étiquette au milieu de la ligne):

$x_at( num_points( $geometry)/2)

Coordonnées Y définies par les données (identiques à l'emplacement de X):

$y_at( num_points( $geometry)/2)

Rotation définie par les données:

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

entrez la description de l'image ici

Pour seulement 2/3 étiquettes, le placement est acceptable. Pour les lignes avec beaucoup de ruptures sous différents angles, il est plus difficile d'obtenir une belle étiquette.

ArcGIS semble rechercher le segment de ligne avec moins de ruptures ou un segment droit. Existe-t-il un moyen d'obtenir les coordonnées ou la géométrie du segment de ligne le plus droit à l'aide du générateur d'expression pour un meilleur placement des étiquettes?

aldo_tapia
la source
que diriez-vous de prendre une moyenne des angles à plusieurs sommets
csk
@csk J'ai essayé line_interpolate_angle($geometry, some lenght)et j'en ai pris plusieurs angle_at_vertex( $geometry , num_points( $geometry)). Une boucle sur cette fonction pourrait être une approche, mais je ne peux pas le faire directement dans le générateur
Expresion
il semble que vous vouliez trouver une section de la ligne où l'angle à chaque sommet est approximativement égal au line_interpolate_angle
csk
@csk oui, quelque chose comme ça. Un segment de ligne droite pour placer des étiquettes
aldo_tapia

Réponses:

1

Solution de contournement réelle

Supposons que ce type de géométries:

entrez la description de l'image ici

J'ai essayé de trouver un bon placement. Je travaille également avec l'atlas, j'ai donc utilisé une distance de 3% de la caractéristique de l'atlas à partir de la partie médiane de la ligne d'interpolation par sommet de l'entité pour placer des étiquettes:

Quelque chose comme ça:

entrez la description de l'image ici

Et je crée une flèche du sommet médian de l'entité à l'étiquette:

entrez la description de l'image ici


Réglages:

La Flèche:

Générateur de géométrie

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))

Étiquette

Les données définissent 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))

Les données définissent 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))

Cela pourrait peut-être être utile à quelqu'un.

S'il existe une meilleure approche, heureux de la recevoir.

aldo_tapia
la source