Ich versuche, dynamische Führungslinien mithilfe einer PostGIS-Ansicht zusätzlich zum QGIS-Tool „Label verschieben“ zu erstellen.
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;
Dies funktioniert für alle Etiketten einwandfrei WHERE ST_X(geom) < xcord_label
, erzeugt jedoch falsch aussehende Führungslinien für Etiketten WHERE ST_X(geom) > xcord_label
.
Weiß jemand, wie man richtig platzierte Führungslinien für Etiketten erhält WHERE ST_X(geom) > xcord_label
? Gibt es eine Möglichkeit, auf die xmax-Koordinate der Beschriftungen zu verweisen?
qgis
postgis
labeling
coordinates
dynamic-layer
Mondsee
quelle
quelle
Antworten:
Sie können den Quadrantenplatzierungsspezifizierer von QGIS verwenden, der aus dem Azimut der Linie ermittelt wird, um eine bessere Beschriftung zu platzieren. Der Quadrant gibt 8 Positionen um einen Punkt an:
Hier ist ein Beispiel für Null Island , in dem eine Tabelle und zwei Ansichten erstellt werden.
Fügen Sie dann in QGIS Folgendes hinzu:
points
- -geom
leader_line
-geom
- Primärschlüssel muss seingid
point_labels
-geom
- Primärschlüssel muss seingid
Konfigurieren Sie nun die Ebeneneigenschaften für
point_labels
:label
und ändern Sie die Platzierung in "Versatz vom Punkt". Ändern Sie dabei den "Quadranten", um das Attributfeld zu verwendenquadrant
Bingo!
Beachten Sie, dass für
geography
Typen ein etwas anderer Ansatz erforderlich ist , da sich ST_Azimuth anders verhält.Aktualisieren: Wenn Sie der
points
Ebene neue Punkte hinzufügen , wird dasgeom
Feld wie gewohnt aktualisiert, daslabel_geom
jedoch nicht. Um einen Standardwert vonlabel_geom
mit neuen Punkten zu füllen, muss ein Trigger erstellt werden . Wenn jedoch eine Triggerfunktion verwendet wird, kann der Bezeichnerquadrant
in derpoints
Tabelle gespeichert und diepoint_labels
Ansicht ignoriert werden:Beginnen wir zum Beispiel noch einmal mit einem etwas anderen Beispiel mit einer Tabelle und einer Ansicht:
Führen Sie im ersten Beispiel die Anweisungen
INSERT INTO points
und erneut ausCREATE OR REPLACE VIEW leader_line
, da diese nicht geändert werden müssen. Aber ignoriere dieleader_line
Ansicht.Fügen Sie dann in QGIS Folgendes hinzu:
points
- -geom
points
- -label_geom
leader_line
-geom
- Primärschlüssel muss seingid
Konfigurieren Sie nun die Ebeneneigenschaften für
points
mitlabel_geom
wie im ersten Beispiel fürpoint_labels
. Derquadrant
Bezeichner wird automatisch für neue und verschobene Punkte geändert. Sie werden diese Änderungen jedoch nur jedes Mal bemerken, wenn Sie Ihre Änderungen speichern.quelle
gid | label_geom | label
undgid, geom, label
).label_geom
und aktualisiert denquadrant
Wert ebenfalls, sodass diepoint_label
Ebene / Ansicht nicht mehr benötigt wird.label_geom
ich die Ebenenbearbeitung speichern und die Leinwand aktualisieren, um die tatsächliche Position des Etiketts zu sehen. Es ist schade, dass es keine Möglichkeit gibt, einen Quadrantenspezifizierer mit dem QGIS-Tool "Etikett verschieben" zu verwenden.okay .. da es sich um Karteneinheiten handelt, sollte dies innerhalb von Grenzen ziemlich einfach sein. Sie kennen bereits die Höhe des Etiketts. Wenn es in Punkten wäre, wäre es skalierungsabhängig.
Dies setzt eine feste Etikettengröße voraus. Wie gut dies funktioniert, hängt davon ab, wie einheitlich Ihre Etiketten sind und ob Sie eine proportionale Schriftart oder eine Schriftart mit fester Breite verwenden (feste Breite ist einfacher - multiplizieren Sie die Länge des Etiketts mit der Etikettengröße mit Holen Sie sich die Etikettenbreite).
Leider beantwortet dies nicht Ihre Frage, wie Sie die Grenzen des gerenderten Etiketts tatsächlich finden können .
Sie haben 4 Fälle (NE, NW, SE, SW).
Ich gehe davon aus, dass Ihre Tabelle so aussieht (Entschuldigung, einige Feldnamen sind unterschiedlich)
Fügen Sie als Nächstes 4 Punkte (alle identisch) hinzu, jedoch mit Beschriftungen in den 4 Quadranten, um die 4 Hauptanwendungsfälle darzustellen
Ich habe CRS 27700 verwendet (0,0 in links unten, Karteneinheiten in m). Ich habe eine Etikettenbreite von 50 und eine Kartenhöhe von 30 angenommen.
Affine Transformationen
Eine andere Möglichkeit besteht darin, alle führenden Linien auf 80% zu verkürzen.
Dies könnte besser funktionieren, obwohl ich es nicht ausprobiert habe.
quelle