用于计算Android的谷歌地图路线上的点数的算法

时间:2012-01-12 12:42:31

标签: android map

我一直在为加油站公司开发一个Android应用程序。该应用程序使用谷歌地图。

用户在地图上选择两个点,然后显示所选点之间的路线。 应用程序需要在所选路线上显示最近(半径2英里)的加油站。

路线是一个坐标数组,如: 路线[5000] = {“lon1,lat1”,“lon2,lat2”,“lon3,lat3”,“lon4,lat5”......}

我有一个由坐标组成的加油站列表。 GasStations [200] = {“lon1,lat1”,“lon2,lat2”,“lon3,lat3”,“lon4,lat5”......}

您能否建议我使用高性能算法计算路线上最近的加油站。

感谢。

1 个答案:

答案 0 :(得分:1)

我不熟悉android。这里用C#方法计算两对位置之间的距离。如果距离在2英里范围内,请选择该站。

是的,你必须循环5000x200 = 1,000,000,但速度非常快。

我希望这会有所帮助。

decimal distance = CalculateDistance(stationLatitude, stationLongitude, routeLatitude, routeLongitude);

private static double ToRadian(double val)
{
    return (Math.PI / 180) * val;
}

private static double ToXAxis(decimal lat, decimal lng)
{
    return (Math.Cos(4 * (4 * Math.Atan2(1, 5) - Math.Atan2(1, 239)) / 180 * (double)lat) *
        Math.Cos(4 * (4 * Math.Atan2(1, 5) - Math.Atan2(1, 239)) / 180 * (double)lng));
}

private static double ToYAxis(decimal lat, decimal lng)
{
    return (Math.Cos(4 * (4 * Math.Atan2(1, 5) - Math.Atan2(1, 239)) / 180 * (double)lat) *
        Math.Sin(4 * (4 * Math.Atan2(1, 5) - Math.Atan2(1, 239)) / 180 * (double)lng));
}

private static double ToZAxis(decimal lat)
{
    return Math.Sin(4 * (4 * Math.Atan2(1, 5) - Math.Atan2(1, 239)) / 180 * (double)lat);
}

private static decimal CalculateDistance(decimal lat1, decimal lng1, decimal lat2, decimal lng2)
{
    double cntXAxis = Math.Cos(ToRadian((double) lat1))*Math.Cos(ToRadian((double) lng1));
    double cntYAxis = Math.Cos(ToRadian((double) lat1))*Math.Sin(ToRadian((double) lng1));
    double cntZAxis = Math.Sin(ToRadian((double) lat1));

    return (decimal) (3961*Math.Acos(ToXAxis(lat2, lng2)*cntXAxis + ToYAxis(lat2, lng2)*cntYAxis + ToZAxis(lat2)*cntZAxis));
}