DistanceBetween() возвращает неточный результат?

Я использую distanceBetween() класса Location для вычисления расстояния между двумя точками следующим образом:

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() "Вычисляет приблизительное расстояние в метрах между двумя местоположения и, возможно, начальный и конечный пеленги кратчайшего пути между ними». Однако разница между результатом, возвращаемым функцией DistanceBetween(), и реальным устройством GPS или приложением Google Navigation довольно велика. Например, мой метод вернет 6,2 мили, в то время как карты Google показывают 10 миль для того же местоположения. Я дважды проверяю координаты начальной точки p1 и конечной точки p2, и они кажутся правильными. Так работает метод DistanceBetween() или я что-то не так делаю? И, кстати, есть ли способ использовать Google Place API для получения расстояния в виде ответа JSON?

Расстояние, рассчитанное Google Maps: 6,1 мили.

введите здесь описание изображения

И результат

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

4.947700


person Marcin S.    schedule 31.01.2013    source источник
comment
Android MapView не использует Google Maps API V3. (тег удален)   -  person Marcelo    schedule 31.01.2013
comment
Марчин С., 41.742964 не совпадает с 41.742972, и -87.995971 не совпадает с -87.996068...   -  person Jorge    schedule 09.01.2014
comment
Почему вы делите на e6?   -  person sorry_I_wont    schedule 18.09.2015


Ответы (2)


Google Navigation обычно сообщает пройденное или пройденное расстояние по набору шагов в списке маршрутов, а не по прямой, о чем сообщает distanceBetween().

person CommonsWare    schedule 31.01.2013
comment
Ох, хорошо. Так что это прямолинейное расстояние. Как я могу получить расстояние, рассчитанное приложением Google? Google Place Api, похоже, не включает расстояние в ответ JSON. Спасибо за ответ. - person Marcin S.; 31.01.2013
comment
@MarcinS.: Как я могу получить расстояние, рассчитанное приложением Google? -- в Android для этого нет API. Есть ли для этого какой-то API веб-сервиса Google или нет, я понятия не имею. - person CommonsWare; 31.01.2013
comment
Я нашел что-то вроде этого developers.google.com/places/documentation/search Вероятно, неофициальный. Спасибо. - person Marcin S.; 31.01.2013
comment
@CommonsWare, только что проверил Location.distanceBetween() по сравнению с расчетом LFLL (r17), и это 3041 м против 3032 м --> разница 0,3%. Место было через город. Оба расчета завершились за 0 мс. - person Saran; 11.09.2014

Чтобы получить расстояние от Карт Google, я использовал API маршрутов Google и синтаксический анализатор 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;
        }
person Marcin S.    schedule 31.01.2013
comment
Спасибо, я некоторое время искал это решение! - person Dan; 31.01.2013
comment
Это потому, что вы вызываете этот метод в основном потоке пользовательского интерфейса. Вы должны вызвать этот метод в другом потоке или в AsyncTask. - person jaytj95; 15.08.2014
comment
если мы хотим сделать это в автономном режиме, то как мы этого добьемся? - person Parth Anjaria; 31.01.2018