距离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()返回不准确的结果?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 存储过程如何取得一个表的查询结果?

SQL BETWEEN 查询返回不正确的结果

MySQL更快更准确地计算邮政编码之间的距离?

ElasticSearch常用查询方法总结

MySQL的WHERE语句中BETWEEN与IN的使用教程

使用 GPS 提高测量距离的准确性