Xamarin android Google Maps API计算并显示路线并计算路线距离

时间:2017-11-08 19:05:58

标签: c# android google-maps xamarin.android

我正在使用C#中的移动Android应用程序,我需要显示一条路线并计算它的距离。

I need a result similar like in this picture

1 个答案:

答案 0 :(得分:2)

要显示路线,首先需要计算路线。您可以使用Google方向API来执行此操作。很酷的是,它会让你回到总距离。因此,它只能满足您的所有要求。

Google Directions API有很多请求示例,您可以通过按名称引用它们来计算两个地方之间的道路。但最直接的是使用纬度和经度。例如:

https://maps.googleapis.com/maps/api/directions/json?origin=lat1,lon1&destination=lat2,lon2&key=yourApiKey

您可以从Google控制台获取API密钥。

您可以播放并只更改此链接中的变量并在浏览器中打开它,以查看返回的对象。

当您收到返回对象时,您需要解析它。

距离为googleApiRouteObject.routes[0].legs[0].distance; 在那里,你会发现在meeters中有一个int表示,字符串表示如2.3km。

航点将在折线中编码,您需要将它们拼凑起来。您可以在此处找到如何使用代码示例执行此操作:https://developers.google.com/maps/documentation/utilities/polylineutility

有一个例子:

List<Android.Locations.Location> FnDecodePolylinePoints(string encodedPoints) 
        {
            if ( string.IsNullOrEmpty ( encodedPoints ) )
                return null;
            var poly = new List<Android.Locations.Location>();
            char[] polylinechars = encodedPoints.ToCharArray();
            int index = 0;

            int currentLat = 0;
            int currentLng = 0;
            int next5bits;
            int sum;
            int shifter;

            try
            {
                while (index < polylinechars.Length)
                {
                    // calculate next latitude
                    sum = 0;
                    shifter = 0;
                    do
                    {
                        next5bits = (int)polylinechars[index++] - 63;
                        sum |= (next5bits & 31) << shifter;
                        shifter += 5;
                    } while (next5bits >= 32 && index < polylinechars.Length);

                    if (index >= polylinechars.Length)
                        break;

                    currentLat += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);

                    //calculate next longitude
                    sum = 0;
                    shifter = 0;
                    do
                    {
                        next5bits = (int)polylinechars[index++] - 63;
                        sum |= (next5bits & 31) << shifter;
                        shifter += 5;
                    } while (next5bits >= 32 && index < polylinechars.Length);

                    if (index >= polylinechars.Length && next5bits >= 32)
                        break;

                    currentLng += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);
                    Android.Locations.Location p = new Android.Locations.Location("");
                    p.Latitude = Convert.ToDouble(currentLat) / 100000.0;
                    p.Longitude = Convert.ToDouble(currentLng) / 100000.0;
                    poly.Add(p);
                } 
            }
            catch 
            {


            }
            return poly;
        }

现在,您需要在地图上绘制它们。我建议你使用谷歌地图。

    // Decode the points
    var lstDecodedPoints = FnDecodePolylinePoints(encodedPoints);
    //convert list of location point to array of latlng type
    var latLngPoints = new LatLng[lstDecodedPoints.Count];
    int index = 0;
    foreach (Android.Locations.Location loc in lstDecodedPoints){
      latLngPoints[index++] = new LatLng(loc.Latitude, loc.Longitude);}
    // Create polyline 
    var polylineoption = new PolylineOptions();
    polylineoption.InvokeColor(Android.Graphics.Color.GRREN);
    polylineoption.Geodesic(true);
    polylineoption.Add(latLngPoints);
    // Don't forget to add it to the main quie, if you was doing the request for a cordinate in background
   // Add polyline to map
    this.Activity.RunOnUiThread(() =>
        _map.AddPolyline(polylineoption));
    }

基本上,你会得到一个非常接近的结果,如img。