Position d'étiquette définie par les données pour plus d'une échelle dans une couche

9

Je recherche une meilleure solution d'étiquetage pour mes projets. Cela semble difficile - mais je suis peut-être simplement aveugle?

Mes projets: je construis des livres de randonnées imprimés. L'échelle principale est de 1: 75k et il y a une échelle de ville de 10k et une échelle de vue d'ensemble de 200k. Parce que j'aime avoir une qualité "cartographique" de placement d'étiquettes, je touche chaque étiquette et la déplace vers sa meilleure position. Je dois le faire pour chaque échelle, donc mes colonnes d'étiquetage pour 3 échelles ressemblent à ceci ('échelle 1' signifie 10k 'échelle 2' pour 75k et 'échelle 3' pour 200k):

entrez la description de l'image ici

Mais avant d'essayer d'expliquer en détail, je construis ce simple exemple de projet où vous pouvez voir et tester ma (ancienne) solution d'étiquetage pour 3 échelles: http://www.map-site.de/tmp/LabelingExample.zip

Eh bien, ça marche mais:

  • Vous avez besoin de colonnes d'étiquetage pour chaque échelle
  • Vous avez besoin d'une couche pour chaque échelle

Je cherche une bien meilleure solution sans couches et tonnes de colonnes en double. Je compte sur vos esprits créatifs!

EDIT: J'ai ajouté ces deux cartes très denses comme exemples:

entrez la description de l'image ici

Il n'y a qu'une seule position possible pour "St. Paulus Dom" et ce n'est pas un quadrant: entrez la description de l'image ici

Chaque étiquette doit être déplacée manuellement. Certaines étiquettes ne sont pas dans un quadrant.

CARTE
la source
Les étiquettes doivent-elles remplir certains critères spécifiques? Je ne comprends pas ce que vous entendez par «meilleure position».
mgri
1
Par «meilleure position», je veux dire une position selon les revendications cartographiques. C'est plus subjectif.
MAP
2
J'ai trouvé que votre exemple utilise une police, «Noto Sans», que je n'ai pas, et je suppose que ce sera également le cas pour d'autres. Vous pouvez télécharger la police ici google.com/get/noto Après avoir installé les polices, vous devez redémarrer QGIS.
TJ Rockefeller
Merci d'avoir ajouté ce lien - c'est la police standard de mon installation Mint.
MAP

Réponses:

6

Je dois dire que ce que vous demandez est un peu compliqué parce que vous voulez que l'étiquetage soit clairement visible à petite échelle ainsi qu'à grande échelle (meilleur ajustement). Donc, l'idée ici est de savoir comment placer le point visible à différentes échelles.

Après plusieurs tests, j'ai constaté qu'au lieu de créer plusieurs colonnes pour chaque plage d'échelle et de mettre des coordonnées pour x et y à des points fixes, vous ne pouvez créer qu'une seule colonne pour les positions prioritaires pour chaque point pour le meilleur emplacement, comme vous pouvez le voir ci-dessous (I suivi les emplacements dans votre dossier):

entrez la description de l'image ici

Ensuite, vous allez à Layer propoerties -> Labels -> Placement -> Offset from pointou Around point, les deux sont OK, mais j'ai choisi Offset from point.

  1. A QuadrantSélectionnez Data defined override -> Editet entrez la formule suivante:

    entrez la description de l'image ici

    CASE 
    WHEN  $scale >= 200000 THEN  "priority"  
    WHEN  $scale < 200000 and $scale >= 75000 THEN  "priority"   
    WHEN  $scale < 75000 and $scale >=10000 THEN  5
    WHEN  $scale < 10000 THEN 2 
    END
    

    Voici "Priority"l'emplacement des points définis dans le nom du champPriority

  2. Vous devez utiliser le décalage pour déplacer les points pour une meilleure visibilité, et j'ai utilisé la formule suivante:

    CASE
    WHEN  $scale >= 200000 THEN '0.001,0'
    WHEN  $scale < 200000 and $scale >= 75000 THEN '0.001,0'
    WHEN  $scale < 75000 and $scale >=10000 THEN '0.0005,0'
    WHEN  $scale < 10000 THEN '0.0001,0'
    END
    

Voici la sortie à différentes échelles:

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

Afin de voir ce que chaque numéro [0-8] représente à quel endroit, veuillez regarder l'image suivante:

entrez la description de l'image ici

Vous pouvez contrôler la position des étiquettes en ajoutant la valeur correspondant à chaque position. Mais malheureusement, vous ne pouvez pas le faire par une approche «cliquer-déplacer». Vous devez le faire dans la table attributaire.

Mise à jour:

En fonction de votre exigence selon laquelle 9 positions de quadrant ne suffisent pas, j'ai trouvé que si vous sélectionnez Cartographyau lieu de Offset from pointet sélectionnez la priorité, comme dans l'image ci-dessous, vous aurez 12 positions prioritaires au lieu de 9. Vous devez créer un champ de Texttype, puis mettez seulement l'abréviation que vous voulez pour la meilleure position 'TL', 'TSL', 'T' ... etc. Vous pouvez également entrer une distance pour éviter que l'étiquette ne recouvre le point.

entrez la description de l'image ici

ahmadhanb
la source
C'est une approche que je n'ai pas essayée jusqu'à présent. Voyez-vous un moyen de placer l'étiquette dans le quadrant par «cliquer-déplacer»?
MAP
Malheureusement, vous ne pouvez pas le faire par approche «cliquer-déplacer». Vous devez le faire dans la table attributaire. Mais ajouter 1 colonne vaut mieux que 6 colonnes pour chaque niveau d'échelle x, y. J'ai mis à jour ma réponse.
ahmadhanb
1
Ces derniers jours, j'ai aussi essayé de donner une solution mais j'ai abandonné car je pensais que le problème était trop subjectif pour proposer une solution plus générale. Au lieu de cela, la solution de @ahmadhanb semble assez créative pour le faire (je ne l'ai pas testée, cependant). +1 pour moi.
mgri
Je suis d'accord avec toi. La subjectivité est ici élevée. Il s'agit principalement d'une opinion personnelle sur la façon dont vous pouvez juger de l'emplacement des étiquettes si elles conviennent ou non.
ahmadhanb
1
N'utilisez pas l'outil d'identification pour modifier les emplacements prioritaires, il est préférable d'utiliser l'outil de sélection. Ouvrez la table attributaire et choisissez uniquement d'afficher les points sélectionnés. Démarrez la session de modification, mettez à jour l'emplacement et enregistrez les modifications. L'emplacement prioritaire sera mis à jour directement, si vous avez déjà ajouté l'expression dans le remplacement défini par les données.
ahmadhanb
2

Vous pouvez vous débarrasser des couches multiples en utilisant des expressions.

D'après ce que j'ai pu voir dans votre exemple, la principale différence entre les couches réside dans les Data defined Coordinate X Ydéfinitions pointant vers les différentes valeurs d'échelle x, y.

Vous pouvez accomplir cela dans une seule couche en sélectionnant les listes déroulantes à côté de X et Y et en sélectionnant modifier ... qui fera apparaître un générateur de chaîne d'expression.

Pour X, vous pouvez utiliser quelque chose comme

if(@map_scale <=10000, "scale1-x", if(@map_scale <=75000, "scale2-x", "scale3-x"))

Et pour Y, vous pouvez utiliser quelque chose comme

if(@map_scale <=10000,  "scale1-y" , if(@map_scale <=75000, "scale2-y", "scale3-y"))

Cela doit utiliser les valeurs scale1 x, y si l'échelle de la carte est inférieure ou égale à 1/10 000 et l'échelle 2 x, y si l'échelle de la carte est inférieure ou égale à 1/75 000 et l'échelle 3 x, y pour tout ce qui est supérieur à cette valeur. .

Si vous devez positionner manuellement pour chaque échelle, je ne vois pas comment vous pouvez vous éloigner des colonnes échelle # -x et échelle # -y pour chaque niveau que vous avez défini.

TJ Rockefeller
la source
J'ai un grand destin d'étiquettes de poids différent. Je dois les placer manuellement car aucun automatisme n'est capable de le faire d'une manière cartographique «réelle». Et les cartes seront imprimées et mises à jour chaque année, de sorte que l'étiquetage doit être quelque peu statique. en.wikipedia.org/wiki/Cartographic_labeling#Placement
MAP
@MAP OK, donc vous savez que vous devez positionner manuellement les éléments, vous voulez juste moins de couches et de colonnes.
TJ Rockefeller
Cela permet d'afficher les étiquettes de 3 échelles avec un seul calque. Mais QGIS n'est pas en mesure de "réécrire" les coordonnées via l'expression. Donc, si j'utilise l'expression d'échelle comme vous l'avez mentionné, je ne peux plus déplacer les étiquettes.
MAP