J'essaie de créer des lignes de repère dynamiques en utilisant une vue PostGIS en plus de l'outil QGIS «Déplacer l'étiquette».
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;
Cela fonctionne bien pour toutes les étiquettes, WHERE ST_X(geom) < xcord_label
mais crée des lignes de repère d'apparence incorrecte pour les étiquettes WHERE ST_X(geom) > xcord_label
.
Quelqu'un sait-il comment obtenir des lignes de repère correctement placées pour les étiquettes WHERE ST_X(geom) > xcord_label
? Existe-t-il un moyen de se référer à la coordonnée xmax des étiquettes?
qgis
postgis
labeling
coordinates
dynamic-layer
Mer lunaire
la source
la source
Réponses:
Vous pouvez utiliser le spécificateur de placement de quadrant de QGIS déterminé à partir de l'azimut de la ligne pour placer une meilleure étiquette. Le quadrant spécifie 8 positions autour d'un point:
Voici un exemple autour de Null Island , créant une table et deux vues.
Ensuite, dans QGIS, ajoutez:
points
-geom
leader_line
-geom
- la clé primaire doit êtregid
point_labels
-geom
- la clé primaire doit êtregid
Configurez maintenant les propriétés de la couche pour
point_labels
:label
et changez le placement en "Décalage par rapport au point", en modifiant le "Quadrant" pour utiliser le champ d'attributquadrant
Bingo!
Notez qu'une approche légèrement différente est requise pour les
geography
types, car ST_Azimuth se comporte différemment.Mise à jour: lors de l'ajout de nouveaux points à la
points
couche, legeom
champ est mis à jour comme d'habitude, mais celabel_geom
n'est pas le cas. Pour remplir une valeur par défaut delabel_geom
avec de nouveaux points, un déclencheur doit être créé . Mais si une fonction de déclenchement est utilisée, lequadrant
spécificateur peut être stocké dans lapoints
table et lapoint_labels
vue peut être ignorée:Par exemple, recommençons avec un exemple légèrement différent avec une table et une vue:
Dans le premier exemple, refaites les instructions
INSERT INTO points
etCREATE OR REPLACE VIEW leader_line
, car celles-ci ne nécessitent pas de modification. Mais ignorez laleader_line
vue.Ensuite, dans QGIS, ajoutez:
points
-geom
points
-label_geom
leader_line
-geom
- la clé primaire doit êtregid
Configurez maintenant les propriétés de la couche pour
points
aveclabel_geom
comme le premier exemple l'a fait pourpoint_labels
. Lequadrant
spécificateur sera modifié automatiquement pour les points nouveaux et déplacés, mais vous ne remarquerez ces changements que chaque fois que vous enregistrerez vos modifications.la source
gid | label_geom | label
etgid, geom, label
).label_geom
, et met également à jour laquadrant
valeur aussi, de sorte que lapoint_label
couche / vue n'est plus nécessaire.label_geom
je dois enregistrer le calque modifier et actualiser le canevas pour voir la position réelle de l'étiquette. Dommage qu'il n'y ait aucun moyen d'utiliser un spécificateur de quadrant avec l'outil QGIS "Déplacer l'étiquette".ok .. car il est en unités de carte, cela devrait être assez simple, dans les limites. Vous connaissez déjà la hauteur de l'étiquette. Si c'était en points, cela dépendrait de l'échelle.
Cela suppose une taille d'étiquette fixe, donc la façon dont cela fonctionne dépend de l'uniformité de vos étiquettes et de l'utilisation ou non d'une police proportionnelle ou à largeur fixe (la largeur fixe est plus facile - multipliez la longueur de l'étiquette par la taille de l'étiquette à obtenir la largeur de l'étiquette).
Malheureusement, cela ne répond pas à votre question sur la façon de trouver réellement les limites de l'étiquette telles qu'elles sont rendues .
vous avez 4 cas (NE, NW, SE, SW).
je suppose que votre table ressemble à ceci (excuses, certains noms de champs sont différents)
Ensuite, ajoutez 4 points (tous identiques) mais avec des étiquettes dans les 4 quadrants pour représenter les 4 principaux cas d'utilisation
J'ai utilisé CRS 27700 (0,0 en bas à gauche, unités de carte en m) J'ai supposé une largeur d'étiquette de 50, une hauteur de 30 unités de carte.
Transformations affines
Une autre possibilité est de raccourcir toutes les lignes de tête, soit 80%.
Cela pourrait mieux fonctionner, même si je ne l'ai pas essayé.
la source