Próbuję utworzyć dynamiczne linie odniesienia za pomocą widoku PostGIS oprócz narzędzia QGIS „Move 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;
Działa to dobrze dla wszystkich etykiet, WHERE ST_X(geom) < xcord_label
ale tworzy źle wyglądające linie wiodące dla etykiet WHERE ST_X(geom) > xcord_label
.
Czy ktoś wie, jak uzyskać odpowiednio rozmieszczone linie wiodące dla etykiet WHERE ST_X(geom) > xcord_label
? Czy istnieje sposób odwoływania się do współrzędnej xmax etykiet?
qgis
postgis
labeling
coordinates
dynamic-layer
Morze Księżycowe
źródło
źródło
Odpowiedzi:
Możesz użyć specyfikatora umieszczenia kwadrantu QGIS określonego na podstawie azymutu linii, aby umieścić lepszą etykietę. Kwadrant określa 8 pozycji wokół punktu:
Oto przykład wokół wyspy Null , tworząc tabelę i dwa widoki.
Następnie w QGIS dodaj:
points
-geom
leader_line
-geom
- kluczem podstawowym musi byćgid
point_labels
-geom
- kluczem podstawowym musi byćgid
Teraz skonfiguruj właściwości warstwy dla
point_labels
:label
i zmień jej położenie na „Odsunięcie od punktu”, modyfikując „Kwadrant”, aby użyć pola atrybutuquadrant
Bingo!
Zauważ, że dla
geography
typów wymagane jest nieco inne podejście , ponieważ ST_Azimuth zachowuje się inaczej.Aktualizacja: Podczas dodawania nowych punktów do
points
warstwygeom
pole jest aktualizowane jak zwykle, alelabel_geom
tak nie jest. Aby wypełnić wartość domyślnąlabel_geom
nowymi punktami, należy utworzyć wyzwalacz . Ale jeśli używana jest funkcja wyzwalacza,quadrant
specyfikator można zapisać wpoints
tabeli, apoint_labels
widok można zignorować:Na przykład zacznijmy od nieco innego przykładu z jedną tabelą i jednym widokiem:
W pierwszym przykładzie ponownie wykonaj instrukcje
INSERT INTO points
iCREATE OR REPLACE VIEW leader_line
, ponieważ nie wymagają one modyfikacji. Ale zignoruj tenleader_line
widok.Następnie w QGIS dodaj:
points
-geom
points
-label_geom
leader_line
-geom
- kluczem podstawowym musi byćgid
Teraz skonfiguruj właściwości warstwy dla
points
zlabel_geom
tak jak w pierwszym przykładziepoint_labels
. Specyfikatorquadrant
zostanie zmodyfikowany automatycznie dla nowych i przeniesionych punktów, ale zauważysz te zmiany za każdym razem, gdy zapiszesz swoje zmiany.źródło
gid | label_geom | label
igid, geom, label
).label_geom
, a także aktualizujequadrant
wartość, więcpoint_label
warstwa / widok nie jest już potrzebny.label_geom
muszę zapisać edycję warstwy i odświeżyć płótno, aby zobaczyć rzeczywiste położenie etykiety. Szkoda, że nie ma możliwości użycia specyfikatora kwadrantu z narzędziem QGIS „Move label”.ok .. ponieważ jest to w jednostkach mapy, powinno to być dość proste, w granicach ograniczeń. Znasz już wysokość etykiety. Gdyby był w punktach, byłby zależny od skali.
Zakłada się stały rozmiar etykiety, więc to, jak to działa, zależy od tego, jak jednolite są twoje etykiety, oraz od tego, czy używasz czcionki proporcjonalnej lub stałej szerokości (stała szerokość jest łatwiejsza - pomnóż długość etykiety przez rozmiar etykiety do pobierz szerokość etykiety).
Niestety nie odpowiada to na pytanie, jak znaleźć granice etykiety jako renderowane .
masz 4 przypadki (NE, NW, SE, SW).
zakładam, że twoja tabela wygląda tak (przepraszam, niektóre nazwy pól są różne)
Następnie dodaj 4 punkty (wszystkie identyczne), ale z etykietami w 4 ćwiartkach, aby przedstawić 4 główne przypadki użycia
Użyłem CRS 27700 (0,0 w lewym dolnym rogu, jednostki mapy w metrach). Przyjąłem szerokość etykiety 50, wysokość 30 jednostek mapy.
Transformacje afiniczne
Inną możliwością jest skrócenie wszystkich wiodących linii, na przykład 80%.
To może działać lepiej, chociaż tego nie próbowałem.
źródło