distanceBetween () возвращает неточный результат?
Я использую distanceBetween()
класса местоположения для расчета расстояния между двумя точками следующим образом:
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, довольно велика. Например мой метод возвращение 10 миль в то время как google maps показывает 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
2 ответов
Google Navigation обычно сообщает о движении или расстоянии ходьбы по набору шагов в списке направлений, а не по прямой линии, что и есть distanceBetween()
отчеты.
чтобы получить расстояние от Google Maps, я использовал Google направления 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;
}