距离Between()返回不准确的结果?
Posted
技术标签:
【中文标题】距离Between()返回不准确的结果?【英文标题】:distanceBetween() returns inaccurate result? 【发布时间】:2013-01-15 02:18:09 【问题描述】:我使用Location类的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;
Documentation 表示 distanceBetween() “计算两个位置之间的近似距离(以米为单位),以及它们之间最短路径的初始和最终方位可选。”然而 distanceBetween() 返回的结果与真正的 GPS 设备或谷歌导航应用程序之间的差异是相当大的。例如,我的方法将返回 6.2 英里,而谷歌地图显示同一位置的 10 英里。我仔细检查了起点 p1 和终点 p2 的坐标,它们似乎是正确的。这是 distanceBetween() 方法的工作原理还是我做错了什么?顺便问一下,有没有办法使用 Google Place API 来检索距离作为 JSON 响应?
谷歌地图计算的距离:6.1 英里
结果
Location.distanceBetween(41.742964, -87.995971, 41.811511, -87.967923, dist) is
4.947700
【问题讨论】:
android MapView 不使用 Google Maps API V3。 (已删除标签) Marcin S.,41.742964 与 41.742972 不同,-87.995971 也与 -87.996068 不同... 你为什么要除以e6? 【参考方案1】:Google 导航通常会报告沿路线列表中的一组步骤行驶或步行的距离,而不是 distanceBetween()
报告的直线距离。
【讨论】:
哦,好的。所以这是一个直线距离。如何检索谷歌应用程序计算的距离? Google Place Api 似乎没有在 JSON 响应中包含距离。谢谢你的回答。 @MarcinS.:“我如何检索谷歌应用程序计算的距离?” -- Android 中没有用于此的 API。是否有一些谷歌网络服务API,我不知道。 我发现了类似的东西developers.google.com/places/documentation/search 这可能是非官方的。谢谢。 @CommonsWare,刚刚针对 LFLL 的 (r17) 计算测试了 Location.distanceBetween(),它是 3041m 与 3032m --> 0.3% 的差异。地点在一个城市的对面。两项计算均在 0 毫秒内完成。【参考方案2】:为了获得与谷歌地图的距离,我使用了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;
【讨论】:
谢谢,我找了一段时间这个解决方案! 那是因为您在主 UI 线程上调用此方法。您必须在另一个线程或 AsyncTask 中调用此方法 如果我们想离线做到这一点,那么我们如何实现呢?以上是关于距离Between()返回不准确的结果?的主要内容,如果未能解决你的问题,请参考以下文章