Saya mencoba membuat garis pemimpin dinamis dengan menggunakan tampilan PostGIS di samping alat QGIS "Pindahkan Label".
CREATE VIEW leader_line AS
SELECT
gid,
ST_MakeLine(geom, ST_SetSRID(ST_MakePoint(xcord_label, ycord_label), SRID))::geometry(linestring, SRID) AS geom
FROM point
WHERE xcord_label IS NOT NULL;
Ini berfungsi dengan baik untuk semua label WHERE ST_X(geom) < xcord_label
tetapi menciptakan garis pemimpin yang keliru untuk label WHERE ST_X(geom) > xcord_label
.
Apakah ada yang tahu cara mendapatkan garis pemimpin yang tepat untuk label WHERE ST_X(geom) > xcord_label
? Apakah ada cara untuk merujuk ke koordinat xmax dari label?
qgis
postgis
labeling
coordinates
dynamic-layer
Laut Bulan
sumber
sumber
Jawaban:
Anda dapat menggunakan specifier penempatan kuadran QGIS yang ditentukan dari azimuth garis untuk menempatkan label yang lebih baik. Kuadran menentukan 8 posisi di sekitar titik:
Berikut ini contoh di sekitar Pulau Null , membuat tabel dan dua tampilan.
Kemudian di QGIS, tambahkan:
points
-geom
leader_line
-geom
- Kunci utama harusgid
point_labels
-geom
- Kunci utama harusgid
Sekarang konfigurasikan properti layer untuk
point_labels
:label
, dan ubah penempatan ke "Offset from point", modifikasi "Quadrant" untuk menggunakan bidang atributquadrant
Bingo!
Perhatikan bahwa pendekatan yang sedikit berbeda diperlukan untuk
geography
tipe, karena ST_Azimuth berperilaku berbeda.Pembaruan: Saat menambahkan poin baru ke
points
layer,geom
bidang diperbarui seperti biasa, tetapilabel_geom
tidak. Untuk mengisi nilai defaultlabel_geom
dengan poin baru, pemicu perlu dibuat . Tetapi jika fungsi pemicu digunakan,quadrant
specifier dapat disimpan dalampoints
tabel danpoint_labels
tampilan dapat diabaikan:Sebagai contoh, mari kita mulai lagi dengan contoh yang sedikit berbeda dengan satu tabel dan satu tampilan:
Dari contoh pertama, lakukan kembali
INSERT INTO points
danCREATE OR REPLACE VIEW leader_line
pernyataan, karena ini tidak memerlukan modifikasi. Tapi abaikanleader_line
pemandangan.Kemudian di QGIS, tambahkan:
points
-geom
points
-label_geom
leader_line
-geom
- Kunci utama harusgid
Sekarang konfigurasikan properti layer
points
dengan denganlabel_geom
seperti contoh pertama untukpoint_labels
. Thequadrant
specifier akan diubah secara otomatis untuk poin baru dan pindah, tetapi Anda hanya akan melihat ini berubah setiap kali Anda menyimpan suntingan Anda.sumber
gid | label_geom | label
dangid, geom, label
).label_geom
, dan juga memperbaruiquadrant
nilai juga, sehinggapoint_label
lapisan / tampilan tidak lagi diperlukan.label_geom
saya harus menyimpan layer edit dan menyegarkan kanvas untuk melihat posisi sebenarnya dari label. Sangat disayangkan bahwa tidak ada cara menggunakan specifier kuadran dengan alat "Pindahkan label" QGIS.oke .. karena ada di unit peta ini harus cukup mudah, dalam batasan. Anda sudah tahu ketinggian label. Jika dalam poin itu akan tergantung pada skala.
Ini mengasumsikan ukuran label tetap, jadi seberapa baik ini bekerja tergantung pada seberapa seragam label Anda, dan apakah Anda menggunakan font proporsional atau lebar-lebar (lebar tetap lebih mudah - gandakan panjang label dengan ukuran label ke dapatkan lebar label).
Sayangnya ini tidak menjawab pertanyaan Anda tentang cara menemukan batas-batas label yang diberikan .
Anda memiliki 4 kasing (NE, NW, SE, SW).
saya berasumsi meja Anda terlihat seperti ini (permintaan maaf, beberapa nama bidang berbeda)
Selanjutnya, tambahkan 4 poin (semua identik) tetapi dengan label di 4 kuadran untuk mewakili 4 kasus penggunaan utama
Saya menggunakan CRS 27700 (0,0 di kiri bawah, unit peta dalam m) Saya telah mengasumsikan label lebar 50, tinggi 30 unit peta.
Transformasi Affine
Kemungkinan lain adalah memperpendek semua lini terkemuka, katakanlah 80%.
Ini mungkin bekerja lebih baik, walaupun saya belum mencobanya.
sumber