【问题标题】:Get the distance between two locations in android?获取android中两个位置之间的距离?
【发布时间】:2013-08-21 00:47:30
【问题描述】:

我需要获取两个位置之间的距离,但我需要获取图片中蓝线的距离。

接下来我试试:

public double getDistance(LatLng LatLng1, LatLng LatLng2) {
    double distance = 0;
    Location locationA = new Location("A");
    locationA.setLatitude(LatLng1.latitude);
    locationA.setLongitude(LatLng1.longitude);
    Location locationB = new Location("B");
    locationB.setLatitude(LatLng2.latitude);
    locationB.setLongitude(LatLng2.longitude);
    distance = locationA.distanceTo(locationB);

    return distance;
}

但我得到了红线距离。

【问题讨论】:

  • 嗨,你不需要谷歌地图来使用数学 [movable-type.co.uk/scripts/latlong.html][1] 谢谢
  • 如果你想计算路线的距离而不是红线,那么你将不得不使用google api!这将返回您的距离和预计的行驶距离!
  • 它只是返回计算两个位置的距离......如果你想红线然后使用谷歌API。

标签: android google-maps android-location


【解决方案1】:

使用Google Maps Directions API。您需要通过 HTTP 请求路线。您可以直接从 Android 或通过您自己的服务器执行此操作。

例如,来自Montreal to Toronto的路线:

GET http://maps.googleapis.com/maps/api/directions/json?origin=Toronto&destination=Montreal&sensor=false

您最终会得到一些 JSON。在routes[].legs[].distance,你会得到一个像这样的对象:

     "legs" : [
        {
           "distance" : {
              "text" : "542 km",
              "value" : 542389
           },

也可以直接从响应对象中获取折线信息。

【讨论】:

  • 嗨,您知道如何将 km 转换为 m 格式的 JSON 格式吗?
  • 很遗憾,“无钥匙访问 Google Maps Platform 已弃用”。请更新您的答案。
  • 另外,它现在必须使用HTTPS,maps.googleapis.com/maps/api/directions/…
【解决方案2】:

由于 Chris Broadfoot 是正确的,解析返回的 JSON routes[].legs[].distance

"legs" : [
        {
           "distance" : {
              "text" : "542 km",
              "value" : 542389
           }

用途:

    final JSONObject json = new JSONObject(result);
    JSONArray routeArray = json.getJSONArray("routes");
    JSONObject routes = routeArray.getJSONObject(0);

    JSONArray newTempARr = routes.getJSONArray("legs");
    JSONObject newDisTimeOb = newTempARr.getJSONObject(0);

    JSONObject distOb = newDisTimeOb.getJSONObject("distance");
    JSONObject timeOb = newDisTimeOb.getJSONObject("duration");

    Log.i("Diatance :", distOb.getString("text"));
    Log.i("Time :", timeOb.getString("text"));

【讨论】:

    【解决方案3】:
    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;
    }
    

    【讨论】:

    • 为什么你没有传递参数“&key=YOUR_API_KEY”
    【解决方案4】:

    您可以在 android 中使用 Location 类的以下方法(如果您有两个位置的纬度、经度)该方法返回以米为单位的近似距离。

    public static void distanceBetween (double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results)

    说明:

    计算两个位置之间的近似距离(以米为单位),以及它们之间最短路径的初始和最终方位(可选)。使用 WGS84 椭球定义距离和方位。

    计算出的距离存储在results[0] 中。如果结果的长度为 2 或更大,则初始方位存储在 results[1] 中。如果结果的长度为 3 或更大,则最终方位角存储在 results[2] 中。 参数:

    startLatitude - 起始纬度

    startLongitude 起始经度

    endLatitude 结束纬度

    endLongitude 结束经度

    生成一个浮点数组来保存结果

    【讨论】:

      【解决方案5】:

      使用这个:

      private String getDistanceOnRoad(double latitude, double longitude,
                  double prelatitute, double prelongitude) {
              String result_in_kms = "";
              String url = "http://maps.google.com/maps/api/directions/xml?origin="
                      + latitude + "," + longitude + "&destination=" + prelatitute
                      + "," + prelongitude + "&sensor=false&units=metric";
              String tag[] = { "text" };
              HttpResponse response = null;
              try {
                  HttpClient httpClient = new DefaultHttpClient();
                  HttpContext localContext = new BasicHttpContext();
                  HttpPost httpPost = new HttpPost(url);
                  response = httpClient.execute(httpPost, localContext);
                  InputStream is = response.getEntity().getContent();
                  DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                          .newDocumentBuilder();
                  Document doc = builder.parse(is);
                  if (doc != null) {
                      NodeList nl;
                      ArrayList args = new ArrayList();
                      for (String s : tag) {
                          nl = doc.getElementsByTagName(s);
                          if (nl.getLength() > 0) {
                              Node node = nl.item(nl.getLength() - 1);
                              args.add(node.getTextContent());
                          } else {
                              args.add(" - ");
                          }
                      }
                      result_in_kms = String.format("%s", args.get(0));
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return result_in_kms;
          }
      

      【讨论】:

        【解决方案6】:

        试试这个:

        private double calculateDistance(double fromLong, double fromLat,
                    double toLong, double toLat) {
                double d2r = Math.PI / 180;
                double dLong = (toLong - fromLong) * d2r;
                double dLat = (toLat - fromLat) * d2r;
                double a = Math.pow(Math.sin(dLat / 2.0), 2) + Math.cos(fromLat * d2r)
                        * Math.cos(toLat * d2r) * Math.pow(Math.sin(dLong / 2.0), 2);
                double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
                double d = 6367000 * c;
                return Math.round(d);
            }
        

        希望这会有所帮助。

        【讨论】:

        • OP 想要蓝线,而不是红线。
        【解决方案7】:

        您可以使用任何距离 API。 Google API 是最受欢迎的 API 之一,但也有一些替代方案,例如 Distance Matrix API: Documentation

        它非常易于使用,因为如果您以前使用过 Google Maps API,则无需重写代码。

        以下是请求示例:

        Get: https://api.distancematrix.ai/distancematrix?origins=51.4822656,-0.1933769&destinations=51.4994794,-0.1269979&key=<your_access_token>
        

        这是响应示例:

        {
          "destination_addresses":["Westminster Abbey, Westminster, 
          London SW1P 3PA, UK"],
          "origin_addresses":["Chapel, Fulham, London SW6 1BA, UK"],
          "rows":[
            {
              "elements":[
                {
                  "distance":{
                    "text": "4.7 miles",
                    "value": 7563.898
                  },
                  "duration":{
                    "text": "28 min",
                    "value": 1680
                  },
                  "duration_in_traffic":{
                    "text": "28 min",
                    "value": 1680
                  },
                  "status": "OK"
                }
              ]
            }
          ],
          "status": "OK"
        }
        

        免责声明:我在一家创建此 API 的公司工作。

        【讨论】:

          【解决方案8】:

          试试这个代码

          public double CalculationByDistance(LatLng StartP, LatLng EndP) {
              int Radius = 6371;// radius of earth in Km
              double lat1 = StartP.latitude;
              double lat2 = EndP.latitude;
              double lon1 = StartP.longitude;
              double lon2 = EndP.longitude;
              double dLat = Math.toRadians(lat2 - lat1);
              double dLon = Math.toRadians(lon2 - lon1);
              double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
                      + Math.cos(Math.toRadians(lat1))
                      * Math.cos(Math.toRadians(lat2)) * Math.sin(dLon / 2)
                      * Math.sin(dLon / 2);
              double c = 2 * Math.asin(Math.sqrt(a));
              double valueResult = Radius * c;
              double km = valueResult / 1;
              DecimalFormat newFormat = new DecimalFormat("####");
              int kmInDec = Integer.valueOf(newFormat.format(km));
              double meter = valueResult % 1000;
              int meterInDec = Integer.valueOf(newFormat.format(meter));
              Log.i("Radius Value", "" + valueResult + "   KM  " + kmInDec
                      + " Meter   " + meterInDec);
          
              return Radius * c;
          }
          

          【讨论】:

          • 这将从直线的角度返回一个值。我认为这不是 OP 的意图。不管怎样,这都是一种很棒的方法;-)。
          【解决方案9】:
          private String getDistance(double lat2, double lon2){
              Location loc1 = new Location("A");
              loc1.setLatitude("A1");
              loc1.setLongitude("B1");
              Location loc2 = new Location("B");
              loc2.setLatitude(lat2);
              loc2.setLongitude(lon2);
              float distanceInMeters = loc1.distanceTo(loc2);
              float mile = distanceInMeters / 1609.34f;
              String sm = String.format("%.2f", mile);
              return sm;
          }
          

          【讨论】:

          • 您能否解释一下您的代码如何根据 OP 获得蓝线距离?
          【解决方案10】:

          要查找 2 个位置之间的距离:

          1. 首次打开应用时,从左上角的下拉菜单中转到“您的时间线”。

          2. 打开新窗口后,从右上角菜单中的设置中进行选择,然后选择“添加地点”。

          3. 添加您的地点并将它们命名为第 1 点、第 2 点或任何容易记住的名称。

          4. 添加并标记您的地点后,返回到您的 Google 应用中的主窗口。

          5. 点击右下角带有箭头的蓝色圆圈。

          6. 将打开一个新窗口,您可以在顶部看到两个文本字段,您可以在其中添加“从位置”和“距离位置”。

          7. 单击任何文本字段并在第 3 点输入您保存的位置。

          8. 单击另一个文本字段并添加下一个保存的位置。

          9. 这样一来,Google 地图将计算两个位置之间的距离,并在地图上显示蓝色路径。

          【讨论】:

          • 问题是关于如何以编程方式在Android中找到两点之间的距离。这个答案是错误的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-12
          • 2020-10-06
          • 2016-02-27
          • 1970-01-01
          相关资源
          最近更新 更多