11

次のように Location クラスを使用distanceBetween()して、2 点間の距離を計算します。

private float getDistanceInMiles(GeoPoint p1, GeoPoint p2) {

    double lat1 = ((double)p1.getLatitudeE6()) / 1e6;
    double lng1 = ((double)p1.getLongitudeE6()) / 1e6;
    double lat2 = ((double)p2.getLatitudeE6()) / 1e6;
    double lng2 = ((double)p2.getLongitudeE6()) / 1e6;
    float [] dist = new float[1];
    Log.i("destination coordinates", "Latitude:" + lat2 + ", Longitude: " + lng2);
        Location.distanceBetween(lat1, lng1, lat2, lng2, dist);

    return dist[0] * 0.000621371192f;
}

ドキュメントによると、distanceBetween() は「2 つの場所の間のおおよその距離をメートル単位で計算し、必要に応じてそれらの間の最短経路の最初と最後の方位を計算します。」ただし、distanceBetween() によって返される結果と実際の G​​PS デバイスまたは Google ナビゲーション アプリとの違いはかなり大きいです。たとえば、私のメソッドは 6.2 マイルを返しますが、Google マップは同じ場所に対して 10 マイルを表示します。始点 p1 と終点 p2 の座標を再確認したところ、正しいようです。それが distanceBetween() メソッドの仕組みですか、それとも何か間違っていますか? ところで、Google Place API を使用して距離を JSON 応答として取得する方法はありますか?

Google マップで計算した距離: 6.1 マイル

ここに画像の説明を入力

そして結果は

Location.distanceBetween(41.742964, -87.995971, 41.811511, -87.967923, dist) is 

4.947700

4

2 に答える 2

14

通常、Google ナビはルート リストの一連のステップに沿って運転距離または徒歩距離を報告します。直線距離はdistanceBetween()報告対象ではありません。

于 2013-01-31T03:50:53.983 に答える
8

Google マップから距離を取得するために、Google Directions API と JSON パーサーを使用して距離の値を取得しました。

private double getDistanceInfo(double lat1, double lng1, String destinationAddress) {
            StringBuilder stringBuilder = new StringBuilder();
            Double dist = 0.0;
            try {

            destinationAddress = destinationAddress.replaceAll(" ","%20");    
            String url = "http://maps.googleapis.com/maps/api/directions/json?origin=" + lat1 + "," + lng1 + "&destination=" + destinationAddress + "&mode=driving&sensor=false";

            HttpPost httppost = new HttpPost(url);

            HttpClient client = new DefaultHttpClient();
            HttpResponse response;
            stringBuilder = new StringBuilder();


                response = client.execute(httppost);
                HttpEntity entity = response.getEntity();
                InputStream stream = entity.getContent();
                int b;
                while ((b = stream.read()) != -1) {
                    stringBuilder.append((char) b);
                }
            } catch (ClientProtocolException e) {
            } catch (IOException e) {
            }

            JSONObject jsonObject = new JSONObject();
            try {

                jsonObject = new JSONObject(stringBuilder.toString());

                JSONArray array = jsonObject.getJSONArray("routes");

                JSONObject routes = array.getJSONObject(0);

                JSONArray legs = routes.getJSONArray("legs");

                JSONObject steps = legs.getJSONObject(0);

                JSONObject distance = steps.getJSONObject("distance");

                Log.i("Distance", distance.toString());
                dist = Double.parseDouble(distance.getString("text").replaceAll("[^\\.0123456789]","") );

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return dist;
        }
于 2013-01-31T05:12:05.043 に答える