ThinkGeo.com    |     Documentation    |     Premium Support

WrapDateline in custom DistanceLineStyle

    Hi,


 I'm creating a custom Track and Edit interactive overlays from the custom Distance LIne Style found here from wiki.thinkgeo.com/wiki/Source_Code_WebEditionSample_DistanceLineStyle_CS_100611.zip in order to create a ruler tool that allows to measure distances on the map.


 The problem is that ir fails when trying to trace a line crossing dateline, but I can see that the default line style used by track and edit intervactive overlays do cross dateline properly. How can I fix it?


 Is is necesary to explicitly enable WrapDateline in interactive overlays? 


Regards,


Carlos



TrackAndEditWrapDateline.zip (170 KB)

I found that it tuns out to be Dim currentDist As Double = Math.Round(pointShape1.GetDistanceTo(pointShape2, canvas.MapUnit, _DistanceUnit), 2) what fails, as it cannot measure distances when point longitude is beyond 180

Carlos, 
  
   I will look into this today. :-) 
  
 David

Hi, 
  
 Are there any out of the box dimensioning / measurement tools for measuring length / area of features or redlines? 
  
 Regards, 
 Jacob 
  


Hi Jacob,



Sorry we don’t have an existing measurement tool but it can be implement it with the help of TrackInteractiveOverlay. We can defined a custom class named “MeatureToolOverlay” to inherit TrackInteractiveOverlay, then override its drawcore method. In this method, we dynamic to calculate the drawn shapes length and then draw the value on the map.



If you have any questions on implement it, I will build one for you once I get any time.

Thanks,

Troy

Hi Troy, 
 It would be helpful if you can send a working sample. 
 Thanks, 
 Jacob

Hi Jacob,



Would you please try the attached sample?



Any questions, please feel free to let us know.

Thanks,

Troy

MeasureTool.zip (10.8 KB)

Thank you, Troy, for sending the sample code.



I downloaded the solution and when I try to run it, it shows the error: 



Error 1 The name ‘tracksInProcessLineLayer’ does not exist in the current context C:\Users\jacob\Downloads\MeasureTool\WPFDisplayASimpleMap\MearsureTrackInteractiveOverlay.cs 111 34 WPFDisplayASimpleMap 



Thanks, 

Jacob

Hi Jacob, 
  
 Sorry, renaming it as "TrackShapesInProcessLayer" should be fine. 
 Thanks, 
 Troy

Hi Troy, 
  
 With that change measure line length and polygon area. I implement the same for circles, I tried including the trackmode for Circle too. (Added a radiobutton for Circle… 
 -------------------------------------------------- 
  private void CircleRadioButton_Checked(object sender, RoutedEventArgs e) 
         { 
             wpfMap1.TrackOverlay.TrackMode = TrackMode.Circle; 
         } 
 ----------------------------------------- 
  
 //Added the following in MeasureTrackInteractiveOverlay.cs: 
  
  else if (TrackMode == TrackMode.Circle) 
             { 
                 double area = 0; 
                 foreach (var f in TrackShapesInProcessLayer.InternalFeatures) 
                 { 
                     if (f.GetShape() is AreaBaseShape) 
                     { 
                         area += (f.GetShape() as AreaBaseShape).GetArea(MapUnit, AreaUnit.Acres); 
                     } 
                 } 
  
                 textBlock.Text = string.Format(CultureInfo.InvariantCulture, "{0:N3} {1}", area, "acre"); 
             } 
  
 ----------------------------------------------------------------- 
  
 I could not find the textblock in the map while doing that. 
  
 I tried writing the values of  string.Format(CultureInfo.InvariantCulture, "{0:N3} {1}", area, "acre"); to a text file while drawing a circle… It does show values for area. Somehow, it is not getting displayed on the map.  
 Am I missing something? 
  
 Thanks, 
 Jacob

Hi Jacob, 
  
 Please modify the code like this: 
  
  

   protected override void OnTrackStarting(TrackStartingTrackInteractiveOverlayEventArgs e)
        {
            if (TrackMode == TrackMode.Line || TrackMode == TrackMode.Polygon || TrackMode == TrackMode.Circle)
            {
                textBlock.Visibility = Visibility.Visible;
            }
            base.OnTrackStarting(e);
        }
 
  
 Regards, 
  
 Don

Thank you Don!

Hi Aji, 
  
 Any question please feel free to let us know. 
  
 Regards, 
  
 Don

Hi Don,  
 I am getting the area and radius of a circle while drawing using 
 
              if (TrackMode == TrackMode.Circle)
                {
                    double area = 0;
                    double radius = 0;
                    double pi = 3.1416;
                    foreach (var f in TrackShapesInProcessLayer.InternalFeatures)
                    {
                        if (f.GetShape() is AreaBaseShape)
                        {
                         area += (f.GetShape() as AreaBaseShape).GetArea(MapUnit, AreaUnit.SquareMeters);
                         radius = System.Math.Sqrt(area / pi);
                        }
                    }
}
 
 
  
 Similarly, I wish to display the area and radius of a circle while in Edit mode, ie, after I do wpfMap1.EditOverlay.EditShapesLayer.InternalFeatures.Add(feature); 
  
 How can this be done? The area/radius shown should change as I scale up/down the size of the circle. Also I would have to check the feature in the editshapelayer  shape whether it is a circle or not. 
  
 Thanks in advance, 
 Jacob

Hi Jacob, 
  
 If you want to display the area and radius of a circle, I think you can try to set a custom string as label for the feature in edit layer. 
  
 You can modify the value on ExtentChanged event so the value will be modified when you pan/zoom the map. 
  
 Wish that’s helpful. 
  
 Regards, 
  
 Don

Hi Don, 



I wanted to read the area/radius while I edit a circle (ie, when I scale up and make it bigger or scale down and make the circle smaller). I was not talking about zooming in or out. 



Please see the attached image (radius.png)… I want to dynamically change the radius value in the label when I drag the edit tool to make the circle big or small. What is the event fired when I click and drag the scale button while editing (as in the attached image… radius.png)? 





Thanks in advance,

Jacob

Hi Jacob, 
  
 I think this event as below should works for your scenario. 
  
 Map1.EditOverlay.FeatureResized += EditOverlay_FeatureResized; 
  
 You can modify the label in this event. 
  
 And I found your new question is different with the topic, could you please create a new thread for it? 
  
 Regards, 
  
 Don