ThinkGeo.com    |     Documentation    |     Premium Support

Character point centering


In the picture below I have blue dots representing 'trails' of ships in the past. I also have 2 indicators of the latest position of the vessel:


1) a small red dot with a blue outline


2) an icon of a ship, using webdings font.


If you look at the "Reunion" ship, you will notice the actual icon is a long way below the small red dot, wherease I would have liked the center of the icon to be over (or under) the red dot. I am not using any YOffsetInPixel in any of the properties of the items.


Is this by design? Is the "anchor point" or "home point" of an icon at the top center rather than in the X/Y center?


I could do a workaround using YOffsetInPixel but I figure that is going to require a different value depending on the size of the icon, which I don't want to get involved with unless there is no other way.


The code I use for the style is:


        ShipLayer.Srid = 4326

        ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.Capital3 ' this is a red dot with a blue outline



        ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.PointType = PointType.Character

        ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.CharacterFont = New GeoFont("Webdings", 20)

        ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.CharacterIndex = 111



        ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.CharacterSolidBrush = New GeoSolidBrush(GeoColor.StandardColors.Red)               ' ship symbol colour

        ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.SymbolPen = New GeoPen(GeoColor.FromArgb(255, GeoColor.StandardColors.Black), 1)   ' symbol outline colour and thickness



        ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.RotationAngle = 0

        ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.City1("Name") ' column from Vessels table

        ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle.PointPlacement = PointPlacement.UpperLeft ' make user definable?

        ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle.OverlappingRule = LabelOverlappingRule.NoOverlapping

        ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle.BestPlacement = True

        ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1

        ShipLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20

 


 


 



David,


I can not reproduce your problem, could you use provide a simple sample to show your problem by using InMemoryFeatureLayer?


I will keep researching on this issue and let you know if I found anything,.


Thanks


James



I have stripped out everything apart from the necessary from a test project. It uses MsSql2008FeatureLayer as this is the type of layer I am having the problem with.


To use it you need to add in the DesktopEdition (4.5) and MapSuiteCore references) and change 2 variables at the top to suit your server name (SQL Server 2008 running on same machine as code is running) & database instance name. Apart from that it should run automatically, creating it's own Database & Table and populating it with test data and displaying it.


You can zoom in to see the vessel shape more closely. The point center does not match the icon center. I also added a label with Center placement & it doesn't center with either the point center or the icon center - my feeling is that they should all be on top of each other.


 


Oh, this example also exhibits the problems seen in this topic:

gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/21/aft/8343/afv/topic/Default.aspx

I accept that there is an explanation for it, though I am not 100% clear on it. Still seems strange to me that merely zooming out can cause ThinkGeo to send info to MSSQL which will cause a crash - it's not unknown to want to zoom larger than the world view.

To get it to crash, just right-double-click 3 times near the middle of the map window (and also note another anomaly - after the 2nd right-double-click the SQL points all disappear from the map) and a crash will occur:

A .NET Framework error occurred during execution of user-defined routine or aggregate "geography": 

System.FormatException: 24201: Latitude values must be between -90 and 90 degrees.


This example also exhibits the problem seen in this topic:

gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/21/aft/8418/afv/topic/Default.aspx#21591

To get it to crash, just double-right-click twice & pan off sideways a couple of time so you go off the edge of the map:

A .NET Framework error occurred during execution of user-defined routine or aggregate "geography": 

Microsoft.SqlServer.Types.GLArgumentException: 24205: The specified input does not represent a valid geography instance because it exceeds a single hemisphere. Each geography instance must fit inside a single hemisphere.

(sometimes the 24201 error comes up instead-seems a bit random which error appears first)



TestSQLServer4.zip (490 KB)

David,


For the issue raised on this threading topic, could you take a try by setting the BestPlacement option to false?
 

ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle.BestPlacement = False
ShipLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle.PointPlacement = PointPlacement.LowerRight ' make user definable?

 
Any feedbacks would be appreciated.
 
Thanks.
 
Yale

David,


Your sample code is very helpful to find the real problem.


I set DefaultTextStyle.PointPlacement = PointPlacement.UpperCenter to fix label problem.


About charactor, I look at "Webdings" font, it has many charactors, some of them are not fill as square, such as 111 which is you choosed, so it's not MapSuite problem, the original one is lower than center, but if you change to 110, it's a circle will display at center.


webdings:



 


111:



 


110:



Thanks


James



Ok, thanks - some good progress here. Having worked with MapInfo for many years I am used to their own “MapInfo Transportation” font which does have everything nicely centered - wasn’t expecting webdings to be so messy! You are correct - depending on which icon from webdings I use, I can get the icon to line up with the point, so that is that part of the problem solved. 
  
 However, it appears the text alignment is problematic? I can set to PointPlacement.UpperCenter to get it to appear in the center. However, my existing MapInfo application that I am converting to ThinkGeo allows the use to select one of 9 places for the labels - if PointPlacement.UpperCenter is needed to put it in the center, then I won’t be able to allow them to put labels above the center? And Center and LowerCenter will in fact both be below the center… Is that a bug?

David, 
  
 I am glad you solve the icon placement problem. 
  
 About placement of label, I agree with you that it might be a bug, but we can not change it directly, it’s a legacy that many old users get used to it, if we change it, it’s a break-change that many users and their users will complain. You can see we release many major versions, but each of them we keep full compatible with old version, if some of API is not good we use new API instead of, we keep it exists but marked obsolete and let users know we will remove it in next major release. 
  
 We will figure out a workaround to make your application works as you expect. 
 Thanks 
  
 James 


ok, sounds fair - I guess none of your users ever tried to put a label above a point before! :-) 
  
 I’ll look forward to the workaround - not hugely urgent as I still have a lot of other problems to solve.

David, 
  
 Maybe so, I looked at Google Map, there are some labels above the point, sorry for inconvenience. 
  
 If we found a the workaround I will let you know. 
  
 Thanks 
 James