2012-01-12 7 views
0

私はガソリンスタンド会社のアンドロイドアプリケーションを開発しています。アプリケーションはGoogleマップを使用します。アンドロイドのGoogleマップルート上のポイントを計算するアルゴリズム

ユーザーはマップ上の2つのポイントを選択し、選択したポイント間のルートを表示します。 アプリケーションは、選択したルート上のガソリンスタンドを最寄りの(2マイル半径で)表示する必要があります。

{... "lon1、LAT1"、 "lon2、LAT2"、 "lon3、LAT3"、 "lon4、lat5"} ルート[5000] =

経路のような座標アレイでありますそして、私は座標で構成されるガソリンスタンドのリストを持っています。 GasStations [200] = {"lon1、lat1"、 "lon2、lat3"、 "lon4、lat5" ...}

私は、ルート上のガソリンスタンド。

ありがとうございました。

答えて

1

私はアンドロイドに精通していません。ここでは、C#の方法は、2つの場所のペア間の距離を計算する。距離が半径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)); 
}