Mere

Gør etiketter korrekt skaleret

Gør etiketter korrekt skaleret


Jeg stillede et spørgsmål før om, hvorvidt det var muligt at skalere etiketter, og jeg blev korrekt peget på ejendommen IAnnotateLayerTransformationProperties.ReferenceScale. Hvad vil jeg gerne vide nu er: Er der nogen, der har pegepunkter på den rigtige algoritme, der skal bruges til at beregne dette nummer (referenceskalaen) og skriftstørrelsen for bedst at matche grænserne for dit lag og kort? (Jeg vil automatisere mærkningsprocessen så meget som muligt uden at stille brugerens spørgsmål, som de sandsynligvis ikke kan svare på (som mig nu.))


Det forekommer rimeligt, at du kan bruge løse forhold til at udlede FontSize eller ReferenceScale, forudsat at du kender det ene eller det andet. jeg siger løs forhold fordi æstetiske skrifttyper kan have en betydelig variation i bredden pr. tegn; og mens skrifthøjde er mere stabil, er der stadig variation mellem små og store bogstaver osv. Med andre ord er der "mærkelig slosh" her.

Alligevel, Pixels pr. Tomme er en nyttig konstant, og den har en værdi på 72.

Du kan manuelt eksperimentere med Reference Scale i ArcGIS ved hjælp af 1: N-knappen på standardværktøjslinjen. Arc udsender noget, der ligner 1: ###### for et givet zoomniveau. Til beregningsformål skal du slippe "1:" fra dette udtryk. For eksempel bliver 1: 1200 simpelthen 1200.

Beregn lodret plads, som en FontSize kan optage for en given ReferenceScale:

// Mine input ... // fontSize = 12, fontFamily = Arial // 1200 er en 1: 1200 referenceskala // 72 er pixel pr. Tomme konstant. scaledFontHeightOnGround = (fontSize * 72) / 1200; // scaledFontHeightOnGround bliver 200 fod // De fleste tegn vil dog være "kortere" end dette.

Med "font-height" mener jeg, at mine kommentarer skaleres eller tilpasses til ca. 200 fod på jorden. Med andre ord vokser de, når du zoomer ind, og de krymper, når du zoomer ud. De fleste tegn har brug for ca. 2/3 af dette rum. Hvis du havde flere tegn i din anno (som f.eks. Strengen "144"), optager det i mit tilfælde kun cirka 350 fod skaleret bredde på jorden. Med andre ord gælder forholdet ikke godt for annoteringsbredde, og det bliver værre, når strenglængden øges.

Når du ved dette, kan du udlede FontSize ved at arbejde problemet baglæns, forudsat at du kan etablere en lodret dimension, i kortenheder kan dine annoteringer optage på jorden for en given ReferenceScale. Eller sagde det anderledes "Hvor høj (i kortenheder) skal dine annoteringer være for at læse dem på en valgt ReferenceScale?" Lad os antage, at du er komfortabel med en skrifthøjde på 300 fod.

Hent rimelig FontSize, når du kender både ReferenceScale og ønsket fonthøjde i kortenheder:

// Mine input ... // 300 = fonthøjde i kortenheder // 1200 er en 1: 1200 referenceskala // 72 er pixel pr. Tomme konstant. (300/1200) * 72 == aNewFontSize; // aNewFontSize bliver 18

Det er klart, at vi kan omorganisere ligningen igen for at udlede en ReferenceScale, hvis vi kender både en acceptabel lodret dimension for fonthøjder i kortenheder :) og en FontSize.

Beregn en ReferenceScale, når du både har en lodret dimension i kortenheder og FontSize:

// Mine input ... // 300 = skrifttypehøjde i kortenheder // 72 er pixel pr. Tomme konstant // fontSize = 18, i dette tilfælde (300 * 72) / fontSize == theReferenceScale; // theReferenceScale bliver 1200

I dette skærmbillede er til venstre 1: N-knappen, der udsender MapScale. Du kan ændre MapScale i denne kontrol, og den zoomer ind / ud henholdsvis. Til højre måler jeg fonthøjden på min kommentar.

Efter at have spildt mine tanker om dette emne har jeg et tab at udlede begge FontSize og ReferenceScale, hvis du ikke kender det ene eller det andet. Måske ville løsningen være at sammensætte et prøvesæt af RefScale- og FontSize-par, derefter samle en graf og udlede en trendlineligning, der relaterer passende skriftstørrelser til givne referenceskalaer. Endnu bedre, måske har nogen allerede en sådan ligning?

Jeg vil være meget interesseret i at se, hvad andre folk bidrager som svar på dette spørgsmål.

Bedst, Elijah