我正在使用C#中的移动Android应用程序,我需要显示一条路线并计算它的距离。
答案 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。