ThinkGeo.com    |     Documentation    |     Premium Support

TextStyle.Draw not working for me

Hello again,


I am working on implementing dynamic segmentation in our application and have successfully used the ThinkGeo code example to get part of it working. However, in addition to applying a different style along the length of a line I would like to label each of the sections according to the style, say 'Asphalt', 'Gravel', 'Concrete'. 


I have inherited from the ShapefileFeatureLayer and overriden the DrawCore function. I can successfully use the Draw method on LineStyles, but it does not work for me with TextStyles, no text ever appears on the map. 


Here is a brief code snippet:



For Each oRow As DataRow In oRows
    dStartDistance = CType(oRow("DistanceFrom"), Double)
    dDistance = CType(oRow("DistanceTo"), Double) - dStartDistance

    Dim oSegmentLineShape As LineBaseShape = LineShape.GetLineOnALine(
                                          StartingPoint.FirstPoint,
                                          dStartDistance,
                                          dDistance,
                                          GeographyUnit.Meter,
                                          DistanceUnit.Meter)
    oShapes.Clear()
    oShapes.Add(oSegmentLineShape)

    Select Case oRow("Description").ToString
       Case "Asphalt"
          AsphaltSym.Draw(oShapes, canvas, labelsInAllLayers, labelsInAllLayers)
          oTextStyle.TextColumnName = "Asphalt"
       Case "Gravel"
          GravelSym.Draw(oShapes, canvas, labelsInAllLayers, labelsInAllLayers)
          oTextStyle.TextColumnName = "Gravel"
       Case "Concrete"
          ConcreteSym.Draw(oShapes, canvas, labelsInAllLayers, labelsInAllLayers)
          oTextStyle.TextColumnName = "Concrete"
    End Select
    oTextStyle.Draw(oShapes, canvas, labelsInAllLayers, labelsInAllLayers)
Next oRow

I have attached a sample project to demonstrate the problem I am having.


Thanks!


Steve


 


 


 


 



DynamicSegmentationDemo.zip (23.5 KB)

Hello Steven, 
  
 Thank you for reporting this bug.  We were able to recreate the issue and it will be reviewed and assigned to our development team during the next week.  Once the bug has been resolved I will post here so that you will be aware of the resolution.  If you ever need a status update, please feel free to let us know. 
  
 Regards, 
  
 Gary

 Hello Steven,


 
Sorry for delay, product team confirmed this is not a bug, your data is a shape file, and it's only contains one column named: "Name". 
 
1. You haven't set correct TextColumnName for feature 
2. You call textStyle to draw shape but not feature, the shape don't contains label message, it contained in feature 
 
If you want to implement some special function, I think you need do some change for the sample. 
 
Attached file is the screen capture. 
 
As below is some changed code. 

Select Case oRow("Description").ToString 
Case "Asphalt" 
AsphaltSym.Draw(oShapes, canvas, labelsInAllLayers, labelsInAllLayers) 
oTextStyle.TextColumnName = "Name" 
Case "Gravel" 
GravelSym.Draw(oShapes, canvas, labelsInAllLayers, labelsInAllLayers) 
oTextStyle.TextColumnName = "Name" 
Case "Concrete" 
ConcreteSym.Draw(oShapes, canvas, labelsInAllLayers, labelsInAllLayers) 
oTextStyle.TextColumnName = "Name" 
End Select 
 
Dim newFeatures As New Collection(Of Feature) 
Dim newFeature As New Feature(oSegmentLineShape, oFeature.ColumnValues) 
newFeatures.Add(newFeature) 
 
oTextStyle.Draw(newFeatures, canvas, labelsInAllLayers, labelsInAllLayers) 

Let me know your queries.
 
Regards,
 
Gary

Gary, 
  
 Thanks for your reply, but your solution does not do what I want to do. I incorrectly assumed that the DrawText method for the TextStyle class would work the same as the Draw method of the LineStyle. In my example, which is an attempt at dynamic segmentation, you can see that I use the GetLineOnALine method of the LineBaseShape to create lines based on different distances along the one LineShape in the shapefile. I use a different symbol when drawing those lines do differentiate between ‘Asphalt’, ‘Gravel’, and ‘Concrete’. Then I want to label those lines based on the symbol, so that the label says ‘Asphalt’, ‘Gravel’, and ‘Concrete’. I was able to simply draw the different line styles in the DrawCore method of the shapefile, and they simply drew on top of the line feature in the shapefile. So you’re saying there is no way for me to draw the labels using a similar method?  
  
 If that’s the case I will have to put all the lines I create (using GetLineOnALine) into an InMemoryFeatureLayer and create a ColumnValues collection to achieve my result. That’s a little more housekeeping than I wanted to do, but in the long run it may provide better performance. We way want to do dynamic segmentation on layers with many thousands of lines. 
  
 Thanks, 
  
 Steve

Hi Steve,


I think this is what you want.


Hope it helps,


Edgar



DynamicSegmentationDemo_Modified.zip (17.5 KB)

Edgar, 
  
 Thanks very much, that’s exactly what I needed. I should have been able to figure that one out on my own! 
  
 Thanks again! 
  
 Steve

You’re welcome Steve, if you have any questions jsut let us know. 
  
 Regards, 
  
 Edgar