Colocando etiquetas perpendiculares no QGIS?

8

Estou tentando obter o mesmo estilo de etiqueta que a orientação de posicionamento perpendicular do ArcGIS no QGIS. Como o QGIS não possui esse recurso como padrão, a opção seria usar um posicionamento personalizado para isso.

Um exemplo do ArcGIS:

insira a descrição da imagem aqui

Uma solução alternativa no QGIS

Definições:

Coordenada definida pelos dados X (rótulo no meio da linha):

$x_at( num_points( $geometry)/2)

Coordenada definida pelos dados Y (igual à localização de X):

$y_at( num_points( $geometry)/2)

Rotação definida pelos dados:

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

insira a descrição da imagem aqui

Para apenas 2/3 rótulos, o posicionamento é aceitável. Para linhas com muitas quebras com ângulos diferentes, é mais difícil obter um bom rótulo.

O ArcGIS parece pesquisar o segmento de linha com menos quebras ou um segmento reto. Existe uma maneira de obter coordenadas ou geometria do segmento de linha mais reta usando o construtor Expression para um melhor posicionamento da etiqueta?

aldo_tapia
fonte
como sobre a tomada de uma média dos ângulos em vários vértices
CSK
@csk Eu tentei com line_interpolate_angle($geometry, some lenght)e tendo vários angle_at_vertex( $geometry , num_points( $geometry)). Um loop sobre essa função pode ser uma abordagem, mas eu não posso fazê-lo diretamente no construtor
Expresion
parece que você deseja encontrar uma seção da linha em que o ângulo em cada vértice seja aproximadamente igual ao line_interpolate_angle
csk
@csk sim, algo assim. Um segmento de linha reta para colocar etiquetas
aldo_tapia 22/01

Respostas:

1

Solução real

Suponha que este tipo de geometrias:

insira a descrição da imagem aqui

Eu tentei encontrar uma boa colocação. Também estou trabalhando com atlas, então usei uma distância de 3% do recurso atlas da parte central da linha de interpolação por vértices do recurso para colocar rótulos:

Algo assim:

insira a descrição da imagem aqui

E eu crio uma seta do vértice médio do recurso para o rótulo:

insira a descrição da imagem aqui


Definições:

Seta:

Gerador de geometria

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

Rótulo

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

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

Talvez isso possa ser útil para alguém.

Se houver uma abordagem melhor, fico feliz em recebê-la.

aldo_tapia
fonte