New to Telerik UI for WinFormsStart a free 30-day trial

Polyline ElevationType

Updated over 6 months ago

Please note that Bing Maps will be deprecated effective June 30, 2025. As an alternative, users can refer to the SDK example available in our GitHub repository, which demonstrates how to create a custom provider using the Azure Maps API. A valid Azure Maps subscription key is required to use this functionality.

ElevationType.Polyline ElevationRequest gets elevations at equally-spaced locations along a polyline path. A polyline path is computed from the coordinates, and then elevation values at both endpoints and equally-spaced locations along the polyline are returned. The samples parameter specifies the number of elevations to return.

Figure 1: Polyline ElevationRequest

WinForms RadMap Polyline ElevationRequest

Polyline ElevationType request

C#
        
public void SetupPolylineElevationRequest()
{
    //add pins to the map 
    Telerik.WinControls.UI.Map.PointG point1 = new Telerik.WinControls.UI.Map.PointG(36.114647, -115.172813);
    Telerik.WinControls.UI.Map.PointG point2 = new Telerik.WinControls.UI.Map.PointG(34.05223, -118.24368);
    Telerik.WinControls.UI.Map.PointG point3 = new Telerik.WinControls.UI.Map.PointG(37.77493, -122.41942);
    MapPin pin1 = new MapPin(point1);
    MapPin pin2 = new MapPin(point2);
    MapPin pin3 = new MapPin(point3);
    
    MapLayer pinsLayer = new MapLayer("Pins");
    this.radMap1.Layers.Add(pinsLayer);
    
    MapLayer calloutsLayer = new MapLayer("Callouts");
    this.radMap1.Layers.Add(calloutsLayer);
    this.radMap1.Layers["Pins"].Add(pin1);
    this.radMap1.Layers["Pins"].Add(pin2);
    this.radMap1.Layers["Pins"].Add(pin3);
    
    ElevationRequest request = new ElevationRequest();
    request.ElevationType = ElevationType.Polyline;
    request.Samples = 3;
    request.Points = new List<Telerik.WinControls.UI.Map.PointG>()
    {
        point1,
        point2,
        point3
    };
    BingRestMapProvider bingProvider = this.radMap1.Providers[0] as BingRestMapProvider;
    bingProvider.CalculateElevationCompleted += BingProviderPolyline_CalculateElevationCompleted;
    bingProvider.CalculateElevationAsync(request);
}
        
private void BingProviderPolyline_CalculateElevationCompleted(object sender, ElevationCompletedEventArgs e)
{
    List<Telerik.WinControls.UI.Map.PointG> points = new List<Telerik.WinControls.UI.Map.PointG>();
    
    for (int i = 0; i < this.radMap1.Layers["Pins"].Overlays.Count; i++)
    {
        MapPin pin = this.radMap1.Layers["Pins"].Overlays[i] as MapPin;
        
        if (pin != null)
        {
            points.Add(pin.Location);
        }
    }
    this.radMap1.Layers["Pins"].Clear();
    
    MapPolyline polyline = new MapPolyline(points);
    this.radMap1.Layers["Callouts"].Add(polyline);
        
    List<Telerik.WinControls.UI.Map.PointG> p = this.CalculateEquidistantPointsAlongPolyline(polyline,
        this.radMap1.MapElement.ZoomLevel, e.Elevations[0].Elevations.Length);
    
    for (int i = 0; i < p.Count; i++)
    {
        MapPoint point = new MapPoint(p[i]);
        this.radMap1.Layers["Callouts"].Add(point);
        
        MapCallout callout = new MapCallout(point);
        callout.MaxWidth = 50;
        callout.Text = e.Elevations[0].Elevations[i].ToString() + "m";
        this.radMap1.Layers["Callouts"].Add(callout);
    }
}
        
private List<Telerik.WinControls.UI.Map.PointG> CalculateEquidistantPointsAlongPolyline(MapPolyline polyline, int zoomLevel, int numberOfPoints)
{
    List<Telerik.WinControls.UI.Map.PointL> points = new List<Telerik.WinControls.UI.Map.PointL>();
    
    foreach (Telerik.WinControls.UI.Map.PointG point in polyline.Points)
    {
        points.Add(MapTileSystemHelper.LatLongToPixelXY(point, zoomLevel));
    }
    
    int totalDistance = 0;
    List<double> distances = new List<double>();
    
    for (int i = 0; i < points.Count - 1; i++)
    {
        totalDistance += (int)Math.Sqrt(Math.Pow(points[i + 1].X - points[i].X, 2) + Math.Pow(points[i + 1].Y - points[i].Y, 2));
        distances.Add(totalDistance);
    }
    
    List<Telerik.WinControls.UI.Map.PointL> equidistantPoints = new List<Telerik.WinControls.UI.Map.PointL>();
    double step = (double)totalDistance / (numberOfPoints - 1);
    double currentDistance = 0;
    
    while (currentDistance < totalDistance - 1)
    {
        int index = distances.BinarySearch(currentDistance);
        
        if (index < 0)
        {
            index = ~index;
        }
        
        Telerik.WinControls.UI.Map.PointL p1 = points[index];
        Telerik.WinControls.UI.Map.PointL p2 = points[index + 1];
        double distance = index == 0 ? distances[index] : distances[index] - distances[index - 1];
        double dt = index == 0 ? currentDistance : currentDistance - distances[index - 1];
        
        double t = (double)dt / distance;
        double x = ((1d - t) * p1.X + t * p2.X);
        double y = ((1d - t) * p1.Y + t * p2.Y);
            
        equidistantPoints.Add(new Telerik.WinControls.UI.Map.PointL((long)Math.Round(x, MidpointRounding.AwayFromZero),
            (long)Math.Round(y, MidpointRounding.AwayFromZero)));
        currentDistance += step;
    }
    equidistantPoints.Add(points[points.Count - 1]);
    List<Telerik.WinControls.UI.Map.PointG> result = new List<Telerik.WinControls.UI.Map.PointG>();
    
    foreach (Telerik.WinControls.UI.Map.PointL point in equidistantPoints)
    {
        result.Add(MapTileSystemHelper.PixelXYToLatLong(point, zoomLevel));
    }
        
    return result;
}

See Also

In this article
See Also
Not finding the help you need?
Contact Support