私は、道路を移動するための2セットのLatとLongの間の距離を計算して与えることを探しています。
GoogleのDirectionsandDistanceMatrixAPIを見てきました。また、SOについて他にも多くの質問をしました。
しかし、私はそれを行うための最良の方法を見つけることができません、あなたは毎回およそ20-25の場所までの距離を計算する必要があります。
私たちは、Androidデバイスのユーザーがいる場所からこの情報を必要とする旅行アプリを構築しています。
私は、道路を移動するための2セットのLatとLongの間の距離を計算して与えることを探しています。
GoogleのDirectionsandDistanceMatrixAPIを見てきました。また、SOについて他にも多くの質問をしました。
しかし、私はそれを行うための最良の方法を見つけることができません、あなたは毎回およそ20-25の場所までの距離を計算する必要があります。
私たちは、Androidデバイスのユーザーがいる場所からこの情報を必要とする旅行アプリを構築しています。
最短距離ではなく運転距離を探している場合は、次のようなURLを使用してAPIサービスを呼び出すことができます。
http://maps.googleapis.com/maps/api/distancematrix/json?origins=54.406505,18.67708&destinations=54.446251,18.570993&mode=driving&language=en-EN&sensor=false
これにより、次のようなJSONが生成されます。
{
"destination_addresses" : [ "Powstańców Warszawy 8, Sopot, Polska" ],
"origin_addresses" : [ "majora Henryka Sucharskiego 69, Gdańsk, Polska" ],
"rows" : [
{
"elements" : [
{
"distance" : {
"text" : "24,7 km",
"value" : 24653
},
"duration" : {
"text" : "34 min",
"value" : 2062
},
"status" : "OK"
}
]
}
],
"status" : "OK"
}
結果の距離は、2つの場所間の実際の道路距離です。
詳細については、Google DistanceMatrixAPIをご覧ください。
質問する前に、もう少し検索することをお勧めします。
とにかく、Haversine式を使用してください
rad = function(x) {return x*Math.PI/180;}
distHaversine = function(p1, p2) {
var R = 6371; // earth's mean radius in km
var dLat = rad(p2.lat() - p1.lat());
var dLong = rad(p2.lng() - p1.lng());
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) * Math.sin(dLong/2) * Math.sin(dLong/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var dist = R * c;
return dist.toFixed(3);
}
2つの場所の間の距離を示します。
まず、出発地の緯度、経度、および目的地の経度を取得する必要があります。これらをこのメソッドに渡します。
それはあなたにそれらの間の距離を返します。
public float distanceFrom(float lat1, float lng1, float lat2, float lng2) {
double earthRadius = 3958.75;
double dLat = Math.toRadians(lat2-lat1);
double dLng = Math.toRadians(lng2-lng1);
double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLng/2) * Math.sin(dLng/2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
double dist = earthRadius * c;
int meterConversion = 1609;
return new Float(dist * meterConversion).floatValue();
}