New to Telerik UI for WinForms? Download free 30-day trial

Polyline ElevationType

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


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;
}