Suite

Mise à l'échelle des étiquettes correctement


J'ai déjà posé une question pour savoir s'il était possible de mettre à l'échelle les étiquettes et j'ai été correctement dirigé vers la propriété IAnnotateLayerTransformationProperties.ReferenceScale. Ce que j'aimerais savoir maintenant, c'est: quelqu'un a-t-il des pointeurs sur l'algorithme correct à utiliser pour calculer ce nombre (l'échelle de référence) et la taille de la police afin de correspondre au mieux aux limites de votre couche et de votre carte ? (Je souhaite automatiser autant que possible le processus d'étiquetage sans poser aux utilisateurs des questions auxquelles ils ne peuvent probablement pas répondre (comme moi maintenant.))


Il semble raisonnable que vous puissiez utiliser des relations lâches pour dériver FontSize ou ReferenceScale, en supposant que vous connaissiez l'un ou l'autre. je dis relation lâche parce que les polices esthétiques peuvent avoir une variation de largeur par caractère significative ; et bien que la hauteur de police soit plus stable, il existe toujours des variations entre les caractères minuscules et majuscules, et cetera. En d'autres termes, il y a du "slosh impair" ici.

Néanmoins, Pixels par pouce est une constante utile, et sa valeur est 72.

Vous pouvez expérimenter manuellement l'échelle de référence dans ArcGIS à l'aide du bouton 1:N de la barre d'outils standard. Arc produira quelque chose qui ressemble à 1:###### pour un niveau de zoom donné. À des fins de calcul, supprimez le « 1 : » de cette expression. Par exemple, 1:1200 devient simplement 1200.

Calculer l'espace vertical qu'un FontSize peut occuper pour un ReferenceScale donné :

// Mes entrées… // fontSize=12, fontFamily=Arial // 1200 est une échelle de référence 1:1200 // 72 est la constante de pixels par pouce. scaledFontHeightOnGround = ( fontSize * 72 ) / 1200; // scaledFontHeightOnGround devient 200 pieds // Cependant, la plupart des caractères seront "plus courts" que cela.

Par "hauteur de police", je veux dire que mes annotations seront mises à l'échelle ou ajustées à environ 200 pieds au sol. En d'autres termes, ils grandissent lorsque vous effectuez un zoom avant et ils diminuent lorsque vous effectuez un zoom arrière. La plupart des personnages ont besoin d'environ 2/3 de cet espace. Si vous aviez plusieurs caractères dans votre anno (comme la chaîne "144" par exemple), dans mon cas cela n'occupe qu'environ 350 pieds de largeur à l'échelle au sol. En d'autres termes, la relation ne s'applique pas bien à la largeur d'annotation et elle empire à mesure que la longueur de la chaîne augmente.

Sachant cela, vous pouvez dériver FontSize en travaillant le problème à l'envers, en supposant que vous puissiez établir une dimension verticale, en unités de carte, vos annotations peuvent occuper le sol pour une ReferenceScale donnée. Ou dit différemment « Quelle hauteur (en unités cartographiques) vos annotations doivent-elles avoir pour les lire à une échelle de référence sélectionnée ? » Supposons que vous êtes à l'aise avec une hauteur de police de 300 pieds.

Dérivez FontSize raisonnable lorsque vous connaissez à la fois ReferenceScale et la hauteur de police souhaitée en unités de carte :

// Mes entrées… // 300 = hauteur de police en unités de carte // 1200 est une échelle de référence 1:1200 // 72 est la constante de pixels par pouce. ( 300 / 1200 ) * 72 == uneNouvelleTailleFont; // aNewFontSize devient 18

Clairement, nous pouvons réorganiser l'équation à nouveau pour dériver une ReferenceScale si nous connaissons à la fois une dimension verticale acceptable pour les hauteurs de police, en unités de carte :), et une FontSize.

Calculez une ReferenceScale lorsque vous avez à la fois une dimension verticale en unités de carte et FontSize :

// Mes entrées… // 300 = font-height en unités de carte // 72 est la constante de pixels par pouce // fontSize = 18, dans ce cas ( 300 * 72 ) / fontSize == theReferenceScale; // l'échelle de référence devient 1200

Dans cette capture d'écran, à gauche se trouve le bouton 1:N qui affiche MapScale. Vous pouvez modifier le MapScale dans ce contrôle et il effectuera un zoom avant/arrière, respectivement. À droite, je mesure la hauteur de police de mon annotation.

Maintenant que j'ai renversé mes pensées sur ce sujet, je suis incapable de tirer tous les deux FontSize et ReferenceScale si vous ne connaissez pas l'un ou l'autre. La solution serait peut-être de rassembler un ensemble d'échantillons de paires RefScale et FontSize, puis d'assembler un graphique et d'en dériver une équation de tendance reliant les tailles de police appropriées pour des échelles de référence données. Mieux encore, peut-être que quelqu'un a déjà une telle équation ?

Je serai très intéressé de voir ce que d'autres personnes contribuent comme réponses à cette question.

Meilleur, Elie