请参阅以下有关google方向api响应的参考资料。
https://developers.google.com/maps/documentation/directions/?csw=1#JSON
正如您所看到的,每个step
标记都包含一个名为polyline
的标记。此标记包含名为points
的子标记。据我了解,此标记包含在地图上绘制此方向步骤所需的所有点。正如您所见,该值已编码。我不确定它是什么编码但谷歌在下面的文章中描述了算法:
https://developers.google.com/maps/documentation/utilities/polylinealgorithm?csw=1
是否有任何代码将此值解码为List<LatLng>
以便在monondorid中使用?
答案 0 :(得分:0)
我分享了这个话题,因为我多次搜索以找到答案。 Saboor Awan在下面的文章中描述了如何使用c#编码它:
http://www.codeproject.com/Tips/312248/Google-Maps-Direction-API-V3-Polyline-Decoder
这是在monodroid上使用的代码:
private List<LatLng > DecodePolylinePoints(string encodedPoints)
{
if (encodedPoints == null || encodedPoints == "") return null;
List<LatLng> poly = new List<LatLng>();
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);
LatLng p = new LatLng(Convert.ToDouble(currentLat) / 100000.0,
Convert.ToDouble(currentLng) / 100000.0);
poly.Add(p);
}
}
catch (Exception ex)
{
//log
}
return poly;
}
只需将location
替换为LatLng
。