# Label PointPlacement

**URL:** <https://community.thinkgeo.com/t/label-pointplacement/5153>\
**Category:** WebForms\
**Created:** [January 21, 2010, 7:43am UTC](https://community.thinkgeo.com/t/label-pointplacement/5153 "2010-01-21T07:43:29Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![gordon\_paton](https://community.thinkgeo.com/letter_avatar_proxy/v4/letter/g/57b2e6/32.png) [@gordon\_paton](https://community.thinkgeo.com/u/gordon_paton)\
**Post date:** [January 21, 2010, 7:43am UTC](https://community.thinkgeo.com/t/label-pointplacement/5153/1 "2010-01-21T07:43:29Z")

</div>

I&nbsp;am&nbsp;using&nbsp;a&nbsp;custom&nbsp;TextStyle&nbsp;and&nbsp;an&nbsp;overload&nbsp;of&nbsp;the&nbsp;DrawCore&nbsp;method&nbsp;to&nbsp;display&nbsp;labels&nbsp;generated&nbsp;from&nbsp;colum&nbsp;data&nbsp;in&nbsp;a&nbsp;database.&nbsp;&nbsp;While&nbsp;I&nbsp;can&nbsp;display&nbsp;the&nbsp;label&nbsp;at&nbsp;the&nbsp;correct&nbsp;point&nbsp;and&nbsp;at&nbsp;the&nbsp;correct&nbsp;angle&nbsp;I&nbsp;am&nbsp;unable&nbsp;to&nbsp;change&nbsp;the&nbsp;anchor&nbsp;position&nbsp;of&nbsp;the&nbsp;label.&nbsp;&nbsp;I&nbsp;need&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;change&nbsp;the&nbsp;anchor&nbsp;position&nbsp;of&nbsp;every&nbsp;label&nbsp;individually.

I&nbsp;can&nbsp;retrieve&nbsp;the&nbsp;PointPlacement&nbsp;value&nbsp;from&nbsp;the&nbsp;database,&nbsp;but&nbsp;how&nbsp;do&nbsp;I&nbsp;apply&nbsp;that&nbsp;within&nbsp;the&nbsp;DrawCore&nbsp;method.

Is&nbsp;there&nbsp;a&nbsp;way&nbsp;of&nbsp;converting&nbsp;this&nbsp;value&nbsp;to&nbsp;the&nbsp;equivalent&nbsp;XOffset&nbsp;and&nbsp;YOffset&nbsp;values&nbsp;to&nbsp;pass&nbsp;into&nbsp;the&nbsp;canvas.DrawText()&nbsp;method?

&nbsp;

---

<div class="post-metadata">

**Author:** ![Val](https://community.thinkgeo.com/letter_avatar_proxy/v4/letter/v/e56c9b/32.png) [@Val](https://community.thinkgeo.com/u/Val)\
**Post date:** [January 21, 2010, 8:52am UTC](https://community.thinkgeo.com/t/label-pointplacement/5153/2 "2010-01-21T08:52:15Z")

</div>

&nbsp;We&nbsp;have&nbsp;in&nbsp;the&nbsp;Code&nbsp;Community&nbsp;a&nbsp;project&nbsp;_Labeling&nbsp;Based&nbsp;On&nbsp;Columns&nbsp;_that&nbsp;responds,&nbsp;I&nbsp;think,&nbsp;almost&nbsp;exactely&nbsp;to&nbsp;what&nbsp;you&nbsp;are&nbsp;looking&nbsp;for.&nbsp;It&nbsp;allows&nbsp;to&nbsp;display&nbsp;labels&nbsp;on&nbsp;the&nbsp;map&nbsp;based&nbsp;on&nbsp;a&nbsp;point&nbsp;based&nbsp;layer&nbsp;with&nbsp;the&nbsp;font&nbsp;color,&nbsp;size,&nbsp;angle&nbsp;etc&nbsp;coming&nbsp;from&nbsp;columns.

[code.thinkgeo.com/projects/show/labelingbasedoncol](http://code.thinkgeo.com/projects/show/labelingbasedoncol)

&nbsp;Below,&nbsp;I&nbsp;slightly&nbsp;modified&nbsp;the&nbsp;class&nbsp;ColumBasedTextStyle&nbsp;to&nbsp;have&nbsp;the&nbsp;labels&nbsp;drawn&nbsp;according&nbsp;to&nbsp;some&nbsp;X&nbsp;and&nbsp;Y&nbsp;offset&nbsp;from&nbsp;columns.&nbsp;You&nbsp;can&nbsp;see&nbsp;how&nbsp;the&nbsp;function&nbsp;canvas.DrawText&nbsp;allows&nbsp;drawing&nbsp;the&nbsp;label&nbsp;with&nbsp;offsets&nbsp;in&nbsp;the&nbsp;override&nbsp;DrawCore.

`using System;using System.Collections.Generic;using System.Collections.ObjectModel;using ThinkGeo.MapSuite.Core;namespace LabelingBasedOnColumns{    class ColumnBasedTextStyle : TextStyle    {        private string sizeColumnName;        private string angleColumnName;        private string colorColumnName;        private string fontColumnName;        private string xOffsetColumnName;        private string yOffsetColumnName;                public ColumnBasedTextStyle()            : this(string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty,string.Empty)        { }        public ColumnBasedTextStyle( string TextColumnName, string SizeColumnName, string AngleColumnName, string ColorColumnName, string FontColumnName,                                      string XOffsetColumnName, string YOffsetColumnName)        {            this.TextColumnName = TextColumnName;            this.sizeColumnName = SizeColumnName;            this.angleColumnName = AngleColumnName;            this.colorColumnName = ColorColumnName;            this.fontColumnName = FontColumnName;            this.xOffsetColumnName = XOffsetColumnName;            this.yOffsetColumnName = YOffsetColumnName;        }       public string SizeColumnName        {            get { return sizeColumnName; }            set { sizeColumnName = value; }        }        public string AngleColumnName        {            get { return angleColumnName; }            set { angleColumnName = value; }        }        public string ColorColumnName        {            get { return colorColumnName; }            set { colorColumnName = value; }        }        public string FontColumnName        {            get { return fontColumnName; }            set { fontColumnName = value; }        }        public string XOffsetColumnName        {            get { return xOffsetColumnName; }            set { xOffsetColumnName = value; }        }        public string YOffsetColumnName        {            get { return yOffsetColumnName; }            set { yOffsetColumnName = value; }        }        protected override void DrawCore(IEnumerable<Feature> features, GeoCanvas canvas, Collection<SimpleCandidate> labelsInThisLayer, Collection<SimpleCandidate> labelsInAllLayers)        {            // Loop through each feature and get the values for the different columns to label.            foreach (Feature feature in features)            {                //Get the values for Text, Angle, Size and Font of each feature.                string Text = feature.ColumnValues[TextColumnName];                float Angle = Convert.ToSingle(feature.ColumnValues[AngleColumnName]);                float Size = Convert.ToSingle(feature.ColumnValues[SizeColumnName]);                int Color = Convert.ToInt32(feature.ColumnValues[ColorColumnName]);                string Font = feature.ColumnValues[FontColumnName];                float XOffset = Convert.ToInt32(feature.ColumnValues[XOffsetColumnName]);                float YOffset = Convert.ToInt32(feature.ColumnValues[YOffsetColumnName]);                //Convert from world coordinate to screen coordinate the location of the feature.                ScreenPointF textScreenPoint = ExtentHelper.ToScreenCoordinate (canvas .CurrentWorldExtent ,feature ,canvas. Width,canvas .Height );                //Use DrawText method of canvas to label according to the values previously set.                canvas.DrawText(Text,new GeoFont(Font,Size),new GeoSolidBrush(GeoColor.FromWin32(Color)), null, new ScreenPointF[] { textScreenPoint }, DrawingLevel.LevelFour, XOffset, YOffset,Angle );            }        }        protected override Collection<string> GetRequiredColumnNamesCore()        {            // Here we grab the columns from the textStyle and then add            // the required columns to make sure we pull back the column            //  that we need for labeling.            Collection<string> columns = new Collection<string>();            if (!columns.Contains(TextColumnName))            {                columns.Add(TextColumnName);            }            if (!columns.Contains(sizeColumnName))            {                columns.Add(sizeColumnName);            }            if (!columns.Contains(angleColumnName))            {                columns.Add(angleColumnName);            }            if (!columns.Contains(colorColumnName))            {                columns.Add(colorColumnName);            }            if (!columns.Contains(fontColumnName))            {                columns.Add(fontColumnName);            }            if (!columns.Contains(xOffsetColumnName))            {                columns.Add(xOffsetColumnName);            }            if (!columns.Contains(yOffsetColumnName))            {                columns.Add(yOffsetColumnName);            }            return columns;        }    }}`

---

<div class="post-metadata">

**Author:** ![gordon\_paton](https://community.thinkgeo.com/letter_avatar_proxy/v4/letter/g/57b2e6/32.png) [@gordon\_paton](https://community.thinkgeo.com/u/gordon_paton)\
**Post date:** [January 22, 2010, 3:06am UTC](https://community.thinkgeo.com/t/label-pointplacement/5153/3 "2010-01-22T03:06:34Z")

</div>

Val,&nbsp;thanks&nbsp;for&nbsp;the&nbsp;reply.&nbsp;&nbsp;That’s&nbsp;the&nbsp;project&nbsp;I’ve&nbsp;based&nbsp;my&nbsp;code&nbsp;on,&nbsp;howeverthe&nbsp;database&nbsp;I’m&nbsp;reading&nbsp;(Ordinance&nbsp;Survey&nbsp;MasterMap)&nbsp;doesn’t&nbsp;store&nbsp;x-offset&nbsp;and&nbsp;y-offset.&nbsp;&nbsp;It&nbsp;has&nbsp;a&nbsp;column&nbsp;with&nbsp;anchorPosition&nbsp;as&nbsp;follows:&nbsp;  
&nbsp;&nbsp;  
&nbsp;2----------------5----------------8&nbsp;  
&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;  
&nbsp;1----------------4----------------7&nbsp;&nbsp;  
&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;  
&nbsp;0----------------3----------------6&nbsp;&nbsp;  
&nbsp;&nbsp;  
&nbsp;I&nbsp;need&nbsp;some&nbsp;way&nbsp;of&nbsp;calculating&nbsp;the&nbsp;x&nbsp;and&nbsp;y&nbsp;offset&nbsp;values&nbsp;from&nbsp;the&nbsp;anchor&nbsp;position&nbsp;value.&nbsp;&nbsp;This&nbsp;calculation&nbsp;must&nbsp;take&nbsp;into&nbsp;account&nbsp;the&nbsp;length&nbsp;and&nbsp;height&nbsp;of&nbsp;the&nbsp;text,&nbsp;the&nbsp;rotation&nbsp;angle&nbsp;and&nbsp;the&nbsp;anchor&nbsp;position&nbsp;to&nbsp;get&nbsp;the&nbsp;correct&nbsp;x&nbsp;and&nbsp;y&nbsp;offset&nbsp;values.&nbsp;&nbsp;I’m&nbsp;afraid&nbsp;this&nbsp;is&nbsp;a&nbsp;bit&nbsp;beyond&nbsp;me.&nbsp;  
&nbsp;&nbsp;  
&nbsp;I&nbsp;was&nbsp;hoping&nbsp;there&nbsp;might&nbsp;be&nbsp;a&nbsp;method&nbsp;within&nbsp;the&nbsp;MapSuite&nbsp;core&nbsp;that&nbsp;already&nbsp;provides&nbsp;this&nbsp;functionality&nbsp;since&nbsp;the&nbsp;PointPosition&nbsp;property&nbsp;follows&nbsp;the&nbsp;same&nbsp;layout&nbsp;and&nbsp;must&nbsp;be&nbsp;converted&nbsp;to&nbsp;offset&nbsp;values&nbsp;before&nbsp;drawing.&nbsp;

---

<div class="post-metadata">

**Author:** ![ThinkGeo](https://community.thinkgeo.com/user_avatar/community.thinkgeo.com/thinkgeo/32/25029_2.png) [@ThinkGeo](https://community.thinkgeo.com/u/ThinkGeo)\
**Post date:** [January 22, 2010, 7:47am UTC](https://community.thinkgeo.com/t/label-pointplacement/5153/4 "2010-01-22T07:47:55Z")

</div>

Hi&nbsp;Gordon,&nbsp;  
&nbsp;&nbsp;  
&nbsp;I&nbsp;am&nbsp;not&nbsp;sure&nbsp;how&nbsp;to&nbsp;use&nbsp;the&nbsp;‘anchor&nbsp;position&nbsp;value’&nbsp;you&nbsp;mentioned&nbsp;to&nbsp;calculate&nbsp;the&nbsp;xoffset&nbsp;and&nbsp;yoffset.&nbsp;As&nbsp;I&nbsp;known,&nbsp;there&nbsp;is&nbsp;a&nbsp;method&nbsp;called&nbsp;GetLabelingCandidates&nbsp;in&nbsp;MapSuite&nbsp;core&nbsp;is&nbsp;kind&nbsp;of&nbsp;the&nbsp;functionality&nbsp;you&nbsp;are&nbsp;hoping.&nbsp;This&nbsp;method&nbsp;calculates&nbsp;some&nbsp;appropriate&nbsp;labeling&nbsp;position&nbsp;and&nbsp;rotation&nbsp;angle&nbsp;based&nbsp;on&nbsp;the&nbsp;shape&nbsp;in&nbsp;the&nbsp;passing&nbsp;in&nbsp;feature&nbsp;and&nbsp;the&nbsp;label&nbsp;text.&nbsp;You&nbsp;can&nbsp;access&nbsp;this&nbsp;method&nbsp;only&nbsp;in&nbsp;the&nbsp;class&nbsp;derived&nbsp;from&nbsp;TextStyle.&nbsp;  
&nbsp;&nbsp;  
&nbsp;So&nbsp;I&nbsp;think&nbsp;you&nbsp;could&nbsp;have&nbsp;a&nbsp;try&nbsp;using&nbsp;this&nbsp;method:&nbsp;wrapping&nbsp;the&nbsp;anchor&nbsp;position&nbsp;as&nbsp;a&nbsp;feature,&nbsp;put&nbsp;the&nbsp;label&nbsp;text&nbsp;as&nbsp;a&nbsp;column&nbsp;value&nbsp;in&nbsp;the&nbsp;feature,&nbsp;and&nbsp;then&nbsp;passing&nbsp;in&nbsp;this&nbsp;feature&nbsp;and&nbsp;canvas&nbsp;to&nbsp;the&nbsp;GetLavelingCandidates&nbsp;method,&nbsp;it&nbsp;will&nbsp;return&nbsp;a&nbsp;LabelingCandidate&nbsp;collection&nbsp;which&nbsp;contains&nbsp;one&nbsp;item&nbsp;usually.&nbsp;At&nbsp;last,&nbsp;you&nbsp;can&nbsp;access&nbsp;the&nbsp;LabelInformation&nbsp;of&nbsp;the&nbsp;LabelingCandidate&nbsp;object&nbsp;to&nbsp;get&nbsp;the&nbsp;label&nbsp;position&nbsp;and&nbsp;rotation&nbsp;angle&nbsp;information.&nbsp;&nbsp;  
&nbsp;&nbsp;  
&nbsp;I’m&nbsp;not&nbsp;sure&nbsp;if&nbsp;this&nbsp;makes&nbsp;sense&nbsp;for&nbsp;you,&nbsp;just&nbsp;hope&nbsp;this&nbsp;can&nbsp;give&nbsp;you&nbsp;some&nbsp;tips.&nbsp;  
&nbsp;&nbsp;  
&nbsp;Any&nbsp;more&nbsp;questions&nbsp;please&nbsp;let&nbsp;us&nbsp;know.&nbsp;  
&nbsp;&nbsp;  
&nbsp;Thanks,&nbsp;  
&nbsp;&nbsp;  
&nbsp;Sun&nbsp;
