Menempatkan label tegak lurus di QGIS?

8

Saya mencoba mendapatkan gaya label yang sama dari Orientasi Penempatan Perpendicular dari ArcGIS di QGIS. Karena QGIS tidak memiliki fitur ini sebagai default, opsi akan menggunakan penempatan khusus untuk ini.

Contoh ArcGIS:

masukkan deskripsi gambar di sini

Solusi di QGIS

Pengaturan:

Data yang ditentukan koordinat X (label di tengah baris):

$x_at( num_points( $geometry)/2)

Data yang ditentukan koordinat Y (sama dengan lokasi X):

$y_at( num_points( $geometry)/2)

Rotasi yang ditentukan data:

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

masukkan deskripsi gambar di sini

Hanya untuk label 2/3, penempatan dapat diterima. Untuk garis dengan banyak celah dengan sudut yang berbeda, lebih sulit mendapatkan label yang bagus.

ArcGIS tampaknya mencari segmen garis dengan sedikit jeda atau segmen lurus. Apakah ada cara untuk mendapatkan koordinat atau geometri segmen garis lurus menggunakan pembuat Ekspresi untuk penempatan label yang lebih baik?

aldo_tapia
sumber
bagaimana kalau mengambil rata-rata sudut pada beberapa titik
csk
@csk Saya sudah mencoba line_interpolate_angle($geometry, some lenght)dan mengambil beberapa angle_at_vertex( $geometry , num_points( $geometry)). Sebuah loop atas fungsi ini bisa menjadi pendekatan, tapi saya tidak bisa melakukannya secara langsung di pembuat Expresion
aldo_tapia
sepertinya Anda ingin menemukan bagian dari garis di mana sudut pada setiap dhuwur kira-kira sama dengan line_interpolate_angle
csk
@csk ya, sesuatu seperti itu. Segmen garis lurus untuk menempatkan label
aldo_tapia

Jawaban:

1

Solusi aktual

Misalkan jenis geometri ini:

masukkan deskripsi gambar di sini

Saya mencoba mencari penempatan yang bagus. Saya juga bekerja dengan atlas, jadi saya menggunakan jarak 3% fitur atlas dari bagian tengah garis interpolasi per simpul fitur untuk menempatkan label:

Sesuatu seperti ini:

masukkan deskripsi gambar di sini

Dan saya membuat panah dari vertex tengah fitur ke label:

masukkan deskripsi gambar di sini


Pengaturan:

Panah:

Generator geometri

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

Label

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

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

Mungkin ini bisa bermanfaat bagi seseorang.

Jika ada pendekatan yang lebih baik, senang menerimanya.

aldo_tapia
sumber