ThinkGeo.com    |     Documentation    |     Premium Support

Text Placement

 


Hi 
I am displaying icons from the database successfully. But I need to display text ‘ ColumnValue(“Name”)’ on left of each icon. I tried samples howdoIsamples/Labeling. But could not get help according to my requirement. Kindly suggest me updates in my following code.
Sub load_Units()
 
Dim dt As New DataTable
Dim i As Integer
Dim pointLayer As New InMemoryFeatureLayer()
Dim iconValueStyle As New IconValueStyle
 
dt = getTable("select * from Units", "")
 
pointLayer.FeatureSource.Projection = proj
pointLayer.Open()
pointLayer.Columns.Add(New FeatureSourceColumn("Type", "string", 20))
pointLayer.Columns.Add(New FeatureSourceColumn("NAME", "string", 20))
Dim textStyle As TextStyle = New TextStyle("NAME", New GeoFont(Me.Font.FontFamily.Name, 10), New GeoSolidBrush(GeoColor.StandardColors.Black))
For i = 0 To dt.Rows.Count - 1
 Dim Coordinates As New Feature(New PointShape(dt.Rows(i).Item("Longitude"), dt.Rows(i).Item("Latitude")))
 iconValueStyle.ColumnName = "Type"
 iconValueStyle.IconValueItems.Add(New IconValueItem(dt.Rows(i).Item("Recid"), New GeoImage("..\..\Images\primary_symbols\" & dt.rows(i).item("Symbol_Name"), textStyle))
 pointLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(iconValueStyle)
 Coordinates.ColumnValues.Add("NAME","Unit#" & i)
 Coordinates.ColumnValues.Add("Type", dt.Rows(i).Item("Recid"))
 pointLayer.InternalFeatures.Add(Coordinates)
 pointLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(iconValueStyle)
Next
pointLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20
Dim UnitOverlay As New LayerOverlay()
UnitOverlay.Layers.Add("UnitOverlay", pointLayer)
winformsMap1.Overlays.Add(UnitOverlay)
 
End Sub
Regards,
Zeeshan

1 Like

ZEESHAN,


Thanks for your post and code.
 
I reviewed the code above and I am not quite understanding why you are trying to use the IconValueStyle, which is used to mark different style for different features, I think all the labeling(textstyle) are the same for the features from the database, right? If so, please try to use the IconStyle instead of IconValueStyle, I hope this fixes your issue.
 
Any more questions or concerns please feel free to let me know.
 
Thanks.
 
Yale

 



Hi Yale !


I want to display different values with different icons. I tell u my exact requirment. Each symbol will have 2 text values at left and right  [ TEXT SYMBOL TEXT ]. So tell me what method [ CODE ] could solve my requirment.


 


Regards,


Zeeshan



Hi ZEESHAN,


The following code may be suitable for your scenario. Please have another try and let us know if you have any questions.


Dim textStyle As New TextStyle()
textStyle.TextColumnName = "[NAME]        [NAME]"
textStyle.TextSolidBrush = New GeoSolidBrush(GeoColor.StandardColors.Black)
textStyle.Font = New GeoFont(Me.Font.FontFamily.Name, 10)


The result is like the image below.



Regards,


Ivan



Hi Ivan!


I tried your code. It works but i m not satisfied coz if i need at center bottom of icon or center top of icon then what i can do. It should be XY offset calculation displaying text for each icon. I tried offsets with textstyle but it shifts whole icon with text not just text. I need flexibility.Thanks


 


Regards,


Zeeshan


 


 



ZEESHAN,


Thanks for your post and question.
 
I suggest the following two properties be used to adjust the labeling positions, please take a try to see the effects, hope they can help. Enumeration property  textStyle.PointPlacement will adjust the labeling position to be one of the preset labeling positions, the other one you probably can consider is to specify the labeling positions directly by using property textStyle.LabelPositions, we have a HowDoI sample “HowDoI\Labeling\ Change the Label Postion” is showing how to use it.
 
Any more questions or concerns please feel free to let me know.
 
Thanks.
 
Yale

Hi Yale!


I tried almost every thing as u said. But none of work. I want you to take serious interest at my request to solve this problem. I have alot of other queries to sort out after this but i am stuck here. I am sending again my code where i tried with textstyle offsets as well.


 


Sub load_Units()
        Dim dt As New DataTable
        Dim i As Integer
        Dim pointLayer As New InMemoryFeatureLayer()
        Dim iconValueStyle As New IconValueStyle
 
        dt = getTable("select * from Units", "")
 
        pointLayer.FeatureSource.Projection = proj
        pointLayer.Open()
        pointLayer.Columns.Add(New FeatureSourceColumn("Type", "string", 20))
        pointLayer.Columns.Add(New FeatureSourceColumn("Left", "string", 20))
        Dim textStyle As TextStyle = New TextStyle("[Left]", New GeoFont(Me.Font.FontFamily.Name, 10), New GeoSolidBrush(GeoColor.StandardColors.Black))
        textStyle.XOffsetInPixel = -37
        textStyle.YOffsetInPixel = -9
        For i = 0 To dt.Rows.Count - 1
            Dim Symbol_Name As String = getSingleRecord("select SymbolFileName from Images where Recid=" & dt.Rows(i).Item("SymbolID_fk"), "")
            Dim Coordinates As New Feature(New PointShape(dt.Rows(i).Item("Easting"), dt.Rows(i).Item("Northing")))
            iconValueStyle.ColumnName = "Type"
            iconValueStyle.IconValueItems.Add(New IconValueItem(dt.Rows(i).Item("Recid"), New GeoImage("..\..\Images\primary_symbols\" & Symbol_Name), textStyle))
 
            pointLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(iconValueStyle)
            Coordinates.ColumnValues.Add("Left", "06")
            Coordinates.ColumnValues.Add("Type", dt.Rows(i).Item("Recid"))
            pointLayer.InternalFeatures.Add(Coordinates)
            pointLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(iconValueStyle)
        Next
        pointLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20
        Dim UnitOverlay As New LayerOverlay()
        UnitOverlay.Layers.Add("UnitOverlay", pointLayer)
        winformsMap1.Overlays.Add(UnitOverlay)
    End Sub

Zeehan,


 I read the entire thread and I have to say that it is not very clear on what the type of IconValueStyle you need exactely. You provided some sample code but without a larger context it is difficult to relate to your concrete case and bring you the proper solution. I have the suspicion that what you need is a custom IconValueStyle where you have the text displayed to the top, bottom, right or left of the icon and the placement of the label is going to adjust automatically based on the size of the icon so that it looks harmonious with icons of any size. Is it what you need? Can you provide us some picture of what the icons and labels should look like using your custom IconValueStyle? Can you also tell what type of feature you are trying to drawn and label? We are trying to relate more to your case. Also, of course, the ideal would be to have a self contained sample app that we can run and based on that we can do the appropriate changes. Thank you.



Hi Val


I am sending you screen shot attachment that we want to see on the map and following are the points that we want to implement which I am struggling.
 1-loading icons from the database with different info as you can see at screen shot
2-Popups at clicking icon
3-Dragging icons

I am succeeding so far loading different icons from the database. I hope this time you will understand my requirements. You might suggest me to take a look at SAMPLES. I studied all of them. But difficult for us to implement all above three points together using database.
Regards,
Zeeshan

Zeeshan,


I am sorry to say that I am quite busy in other tasks, so if I caused you any misunderstanding or inconvenience, I am feeling guilty.
 
I tested trying to use the PointPlacement property as I suggested as well as the use of the OffSet, following screenshots show the labels are placed on top or on bottom of the icon.
 


 
Codes are as following:
 

TextStyle centerBottomTextStyle = new TextStyle();
centerBottomTextStyle.TextColumnName = "[ColummnName]";
centerBottomTextStyle.TextSolidBrush = new GeoSolidBrush(GeoColor.StandardColors.Black);
centerBottomTextStyle.Font = new GeoFont("Arial", 10);
centerBottomTextStyle.PointPlacement = PointPlacement.LowerCenter;
centerBottomTextStyle.YOffsetInPixel = -12;
 
 
TextStyle centerTopTextStyle = new TextStyle();
centerTopTextStyle.TextColumnName = "[ColummnName]";
centerTopTextStyle.TextSolidBrush = new GeoSolidBrush(GeoColor.StandardColors.Black);
centerTopTextStyle.Font = new GeoFont("Arial", 10);
centerTopTextStyle.PointPlacement = PointPlacement.UpperCenter;
centerTopTextStyle.YOffsetInPixel = 12;

 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Hi Yale!


I applied the code u suggest. It moves the entire icon with text to the offset i assign.


Dim textStyle As TextStyle = New TextStyle("Left", New GeoFont(Me.Font.FontFamily.Name, 10), New GeoSolidBrush(GeoColor.StandardColors.Black))


textStyle.PointPlacement = PointPlacement.LowerCenter


textStyle.XOffsetInPixel = -100


 


iconValueStyle.ColumnName = "Type"


iconValueStyle.IconValueItems.Add(New IconValueItem(1, New GeoImage("..\..\Images\sedan.png”), textStyle))


I have pasted my entire scenario 2 posts back.  You can refer eactly what i m doing. And in my points i have mentioned about popup & dragging icon too.


Regards,


Zeeshan



Zeehan,


Regarding the Popup and dragging icon, I would point out a Code Community sample Dragging Icon Advanced that shows how to have a new feature with icon poping up by left clicking on the map. It also shows how to drag the icons. Here we are using EditInteractiveOverlay because that overlay already has the dragging logic built in. It is a Desktop application in C# but I think you can adapt it to VB. If your idea of popup is different let us know. You can find the sample at wiki.thinkgeo.com/wiki/Map_Suite_De...n_Advanced


    Yang will investigate the issue you have with labeling where the entire icon with text moves to the offset you assign. You should have an answer on that on Monday. Thank you.



Zeehan,



Thanks for your post and feedbacks.



If you do not mind, let us focus on the labeling issue first, for the Popups and Dragging icons, we can follow Val’s suggestion to get it proceeded.



I am sorry to say I do not agree that the offset of the text style will move the icon as well, see following screenshot. I added a reference point to mark the point location, when I set offset to the text style(here I set 120px to make an  easy watch), it only move the labeling ,it does not move the icon as it is still overlapping with the reference point location.



Following is the whole code snippet you can try:



winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);


InMemoryFeatureLayer referencePointLayer = new InMemoryFeatureLayer();
referencePointLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.Capital1;
referencePointLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
double referencelongitude = 38.9554;
double referencelatitude = -95.2806;
Feature referencefeature = new Feature(referencelatitude, referencelongitude, "referencePoint1");
referencePointLayer.InternalFeatures.Add("referencePoint1", referencefeature);



TextStyle centerBottomTextStyle = new TextStyle();
centerBottomTextStyle.TextColumnName = "[ColummnName]";
centerBottomTextStyle.TextSolidBrush = new GeoSolidBrush(GeoColor.StandardColors.Black);
centerBottomTextStyle.Font = new GeoFont("Arial", 10);
centerBottomTextStyle.PointPlacement = PointPlacement.LowerCenter;
centerBottomTextStyle.YOffsetInPixel = -120;


TextStyle centerTopTextStyle = new TextStyle();
centerTopTextStyle.TextColumnName = "[ColummnName]";
centerTopTextStyle.TextSolidBrush = new GeoSolidBrush(GeoColor.StandardColors.Black);
centerTopTextStyle.Font = new GeoFont("Arial", 10);
centerTopTextStyle.PointPlacement = PointPlacement.UpperCenter;
centerTopTextStyle.YOffsetInPixel = 120;

InMemoryFeatureLayer pointLayer = new InMemoryFeatureLayer();
pointLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.PointType = PointType.Bitmap;
pointLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.Image = new GeoImage(@"..\..\SampleData\Data\United States.png");
pointLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = centerTopTextStyle;
pointLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;


pointLayer.Open();
pointLayer.Columns.Add(new FeatureSourceColumn("ColummnName", "string", 30));

double longitude = 38.9554;
double latitude = -95.2806;
Feature feature = new Feature( latitude,longitude, "Point1");
feature.ColumnValues.Add("ColummnName", "FeaturName");
pointLayer.InternalFeatures.Add("Point1", feature);

LayerOverlay pointOverlay = new LayerOverlay();
pointOverlay.Layers.Add("PointLayer", pointLayer);
pointOverlay.Layers.Add("ReferencePointLayer", referencePointLayer);
winformsMap1.Overlays.Add("PointOverlay", pointOverlay);

winformsMap1.CurrentExtent = new RectangleShape(-111.191015625, 49.609765625, -78.671484375, 26.406640625);

winformsMap1.Refresh();



Any more questions please feel free to let me know.



Thanks.



Yale

 



Dear Yale!


I think i was very clear in this same subject  few post back that i need TextStyle.offset working using IconValueStyle or ValueStyle. Because i am loading icons from the database. The code you have provided that works fine but approach is just for only Single icon only. When we try to load multiple icons then we need to use ValueStyle or IconValueStyle. Then in this case i am confuse and struggling. Secondly I am looking to set 3 labels LEFT RIGHT and BOTTOM of every icon. I think my scenario is still not getting clear to you. you can see my code at initial of page 1 same this link. I hope hope this time what i need i will get it. Thanks to All


 


Regards,


Zeeshan



Hi ZEESHAN, 
  
 Currently, your requirement can’t be implemented by using IconValueStyle. The following solution may be suitable for your scenario: 
  
 1. Use RegexStyle to display different icon for different point 
 2. Use 3 TextStyles to display 3 labels LEFT RIGHT and BOTTOM of every icon 
  
 Regards, 
  
 Ivan

Hi Ivan


For the labels i have created three textstyles setting along with three InMemoryFeatureLayer and adding in one LayerOverlay. So working fine with me.


Secondly regarding icons i used ValueStyle along with respective InMemoryFeatureLayer. Problem Solve this too.


Now i m trying to drag icons. I have followed DraggingIcons from the samplecode. I loaded all the icons but it is not dragging. I am using GeoTiffRasterLayer to display TIFF map file.


winformsMap1.BackgroundOverlay.BackgroundBrush = New GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)


proj.InternalProjectionParameters = ManagedProj4Projection.GetEpsgParameters(4326)  'WGS84


proj.ExternalProjectionParameters = ManagedProj4Projection.GetEpsgParameters(32638) 'UTM zone 38N


winformsMap1.MapUnit = GeographyUnit.Meter


 


Dim worldImageLayer As New GeoTiffRasterLayer("..\..\Map\kuwait61.tif")


worldImageLayer.UpperThreshold = Double.MaxValue


worldImageLayer.LowerThreshold = 0


 


Dim staticOverlay As New LayerOverlay()


staticOverlay.Layers.Add("WorldImageLayer", worldImageLayer)


winformsMap1.Overlays.Add(staticOverlay)


Dim editInteractiveOverlay As New EditInteractiveOverlay()


editInteractiveOverlay.EditShapesLayer.FeatureSource.Projection = proj        editInteractiveOverlay.DragControlPointsLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.IsActive = False        editInteractiveOverlay.DragControlPointsLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20        editInteractiveOverlay.EditShapesLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.IsActive = False


editInteractiveOverlay.EditShapesLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.IsActive = False


editInteractiveOverlay.EditShapesLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.IsActive = False


 


        Dim valueStyle As New ValueStyle()


        valueStyle.ColumnName = "Type"


 


        Dim carPointStyle As New PointStyle(New GeoImage("..\..\Images\sedan.png"))


        carPointStyle.PointType = PointType.Bitmap


        Dim busPointStyle As New PointStyle(New GeoImage("..\..\Images\sedan.png"))


        busPointStyle.PointType = PointType.Bitmap


 


        valueStyle.ValueItems.Add(New ValueItem("Car", carPointStyle))


        valueStyle.ValueItems.Add(New ValueItem("Bus", busPointStyle))


 


editInteractiveOverlay.EditShapesLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle)       editInteractiveOverlay.EditShapesLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20


 


        editInteractiveOverlay.EditShapesLayer.Open()


        editInteractiveOverlay.EditShapesLayer.Columns.Add(New FeatureSourceColumn("Type"))


        editInteractiveOverlay.EditShapesLayer.Close()


 


        Dim carFeature As New Feature(New PointShape(47.5579, 29.7032))


        carFeature.ColumnValues("Type") = "Car"


 


        Dim busFeature As New Feature(New PointShape(47.1395, 29.449))


        busFeature.ColumnValues("Type") = "Bus"


 


        editInteractiveOverlay.EditShapesLayer.InternalFeatures.Add("Car", carFeature)


        editInteractiveOverlay.EditShapesLayer.InternalFeatures.Add("Bus", busFeature)


 


        editInteractiveOverlay.CanAddVertex = False


        editInteractiveOverlay.CanDrag = True


        editInteractiveOverlay.CanRemoveVertex = False


        editInteractiveOverlay.CanResize = False


        editInteractiveOverlay.CanRotate = False


        editInteractiveOverlay.CalculateAllControlPoints()


 


        winformsMap1.EditOverlay = editInteractiveOverlay


 worldImageLayer.Open()


        winformsMap1.CurrentExtent = worldImageLayer.GetBoundingBox()


        winformsMap1.Refresh()


 



ZEESHAN,


Thanks for your post and feedback.
 
I cannot fully use the code you provided as I do not have the tif file which is in the 32638 projection system, while I tried successfully without the tif file involved. The only change is the removing the projection attached in the EditInterativeOverlay, instead, project the points before adding them into the EditInterativeOverlay.
 
Following is the code, please try it:
 

winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
ManagedProj4Projection proj = new ManagedProj4Projection();
proj.InternalProjectionParameters = ManagedProj4Projection.GetEpsgParameters(4326);
//WGS84
proj.ExternalProjectionParameters = ManagedProj4Projection.GetEpsgParameters(32638);
//UTM zone 38N
winformsMap1.MapUnit = GeographyUnit.Meter;
 
//GeoTiffRasterLayer worldImageLayer = new GeoTiffRasterLayer("..\\..\\Map\\kuwait61.tif");
//worldImageLayer.UpperThreshold = double.MaxValue;
//worldImageLayer.LowerThreshold = 0;
 
//LayerOverlay staticOverlay = new LayerOverlay();
//staticOverlay.Layers.Add("WorldImageLayer", worldImageLayer);
//winformsMap1.Overlays.Add(staticOverlay);
EditInteractiveOverlay editInteractiveOverlay = new EditInteractiveOverlay();
//editInteractiveOverlay.EditShapesLayer.FeatureSource.Projection = proj;
editInteractiveOverlay.DragControlPointsLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.IsActive = false;
editInteractiveOverlay.DragControlPointsLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
editInteractiveOverlay.EditShapesLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.IsActive = false;
editInteractiveOverlay.EditShapesLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.IsActive = false;
editInteractiveOverlay.EditShapesLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.IsActive = false;
 
ValueStyle valueStyle = new ValueStyle();
valueStyle.ColumnName = "Type";
 
PointStyle carPointStyle = new PointStyle(new GeoImage(@"..\..\Data\locale.png"));
carPointStyle.PointType = PointType.Bitmap;
PointStyle busPointStyle = new PointStyle(new GeoImage(@"..\..\Data\unknown.png"));
busPointStyle.PointType = PointType.Bitmap;
 
valueStyle.ValueItems.Add(new ValueItem("Car", carPointStyle));
valueStyle.ValueItems.Add(new ValueItem("Bus", busPointStyle));
 
editInteractiveOverlay.EditShapesLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle);
editInteractiveOverlay.EditShapesLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 
editInteractiveOverlay.EditShapesLayer.Open();
editInteractiveOverlay.EditShapesLayer.Columns.Add(new FeatureSourceColumn("Type"));
editInteractiveOverlay.EditShapesLayer.Close();
 
PointShape pointShape1 = new PointShape(47.5579, 29.7032);
proj.Open();
PointShape prjPointShape1 = (PointShape)proj.ConvertToExternalProjection(pointShape1);
Feature carFeature = new Feature(prjPointShape1);
carFeature.ColumnValues.Add("Type", "Car");
 
PointShape pointShape2 = new PointShape(20.1495, 10.459);
PointShape prjPointShape2 = (PointShape)proj.ConvertToExternalProjection(pointShape2);
Feature busFeature = new Feature(prjPointShape2);
busFeature.ColumnValues.Add("Type", "Bus");
 
editInteractiveOverlay.EditShapesLayer.InternalFeatures.Add("Car", carFeature);
editInteractiveOverlay.EditShapesLayer.InternalFeatures.Add("Bus", busFeature);
 
editInteractiveOverlay.CanAddVertex = false;
editInteractiveOverlay.CanDrag = true;
editInteractiveOverlay.CanRemoveVertex = false;
editInteractiveOverlay.CanResize = false;
editInteractiveOverlay.CanRotate = false;
editInteractiveOverlay.CalculateAllControlPoints();
 
winformsMap1.EditOverlay = editInteractiveOverlay;
//worldImageLayer.Open();
//winformsMap1.CurrentExtent = worldImageLayer.GetBoundingBox();
winformsMap1.CurrentExtent = new RectangleShape(-15623389.769214, 17468799.2556869, 36411438.1284735, -14330262.2373443);
winformsMap1.Refresh();

 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

HI Yale


Thanks for your cooperation. All is well so far.


Regards,


Zeeshan



ZEESHAN, 
  
 Thanks for leting us know your status. 
  
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale