计算经度和纬度数组的道路距离

时间:2016-03-08 11:21:15

标签: android google-maps google-maps-android-api-2 haversine

我有一个Android应用程序,它每15秒捕获一次lat-longs,我们使用这一堆lat-long来查找原点和目的地之间的道路距离(按时间戳排序的第一个和最后一个lat-long)。

实际上这个应用程序适用于在城市中运行迷你卡车的客户,他们的卡车司机将使用此应用程序来标记行程的开始/结束,丢包等。我们将向客户收取公里运行的公里数。旅行。

在我们的情景中,车辆将在集落/小区域内运送数据包,其中包括转弯,环形交叉路口以及一次又一次地穿越相同的路径。

所以我试图找到一种最好的方法来计算所有收集的纬度的距离。

我选择了两种方法:

  1. 使用" hasrsine"公式计算两个纬线长度之间的地球距离,增加连续距离。在这里,我的距离减少了10%。
  2. 另一个是google map api,但它在直道上很成功,在我的场景中失败了。
  3. 请提出一些方法,该方法至少提供96-97%的准确度,这是行业广泛接受的。我们不希望在车辆中部署VTS设备,因为驱动程序必须使用Android应用程序,这会使成本翻倍。

1 个答案:

答案 0 :(得分:1)

distanceTo()方法会在鸟类飞行时返回距离,而不是通过道路。您可以使用此方法获得两点之间的距离(通过道路):

public String getDistance(final double lat1, final double lon1, final double lat2, final double lon2){
String parsedDistance;
String response;
    Thread thread=new Thread(new Runnable() {
        @Override
        public void run() {
            try {

                URL url = new URL("http://maps.googleapis.com/maps/api/directions/json?origin=" + lat1 + "," + lon1 + "&destination=" + lat2 + "," + lon2 + "&sensor=false&units=metric&mode=driving");
                final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("POST");
                InputStream in = new BufferedInputStream(conn.getInputStream());
                response = org.apache.commons.io.IOUtils.toString(in, "UTF-8");

                JSONObject jsonObject = new JSONObject(response);
                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");
                parsedDistance=distance.getString("text");

            } catch (ProtocolException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });
thread.start();
try {
    thread.join();
} catch (InterruptedException e) {
    e.printStackTrace();
}
return parsedDistance;
}