当我在浏览器中打开Google地图时,我搜索从X点到Y点的自行车道,浏览器会显示路径,并显示有关上坡需要骑多少米的信息,以及如何许多米下坡。
我一直试图通过Elevation API获取此类信息,但我不知道Google地图是如何进行这些计算的。我所做的是:
1)首先,我调用DirectionService来获得X点和Y点之间的循环路径。
2)然后我从返回的路径中获取overview_path。
3)然后调用ElevationService传递解码的overview_path返回的所有点。
4)最后我尝试以米为单位计算上坡和下坡值...所以我迭代了ElevationService返回的所有高程结果,如果下一个高程结果大于前一个,那么我增加了我的上坡计数器差异(如果它比前一个小,那么我用差异增加我的下坡计数器。)
之后我最终获得了与Google地图上坡和下坡不同的价值......你能否建议我如何继续像谷歌地图在浏览器中显示的那样上坡和下坡?
一些有趣的说明:
1)使用overview_path我通常会获得比Google地图显示更大的上坡和下坡值。这可能是因为我正在探测"密度较高的路径。
2)然而,当我通过"步骤" point(由DirectionService返回)到ElevationService,然后我得到更小的值。这可能是因为我正在探测"密度较低的路径。
示例代码显示了我在下面可以找到的内容。代码是C#(.NET 3.5),我使用GoogleMapsApi .NET包装器(https://github.com/maximn/google-maps/):
...
ElevationRequest request = new ElevationRequest()
{
Locations = listOfPoints // a list of points retrieved from the overview_path
ApiKey = apiKey
};
ElevationResponse response = GoogleMaps.Elevation.Query(request);
List<double> allElevations = new List<double>();
foreach (var r in response.Results)
{
allElevations.Add(r.Elevation);
}
double upHill = 0;
double downHill = 0;
for (int i = 1; i < allElevations.Count; i++)
{
double thisElevation = allElevations[i];
double previousElevation = allElevations[i - 1];
if (thisElevation > previousElevation)
{
upHill += thisElevation - previousElevation; // Moving up the hill...
}
else if (thisElevation < previousElevation)
{
downHill += previousElevation - thisElevation; // Moving down the hill...
}
}