【问题标题】:Travel Distance between two Lat and Long两个纬度和经度之间的旅行距离
【发布时间】:2013-01-29 17:36:26
【问题描述】:

我正在计算并给出两组 Lat 和 Long 之间的距离,以便在路上行驶。

我查看了 Google 的方向和距离矩阵 API。并且还做了很多关于SO的其他问题。

但我无法找出最好的方法,您需要每次计算到大约 20-25 个位置的距离。

我们正在构建一个旅行应用程序,该应用程序需要为 Android 设备上的用户提供此信息。

【问题讨论】:

    标签: android google-api latitude-longitude google-directions-api


    【解决方案1】:

    如果您正在寻找行驶距离而不是最短距离,那么您可以尝试使用以下 URL 调用 API 服务:

    http://maps.googleapis.com/maps/api/distancematrix/json?origins=54.406505,18.67708&destinations=54.446251,18.570993&mode=driving&language=en-EN&sensor=false
    

    这将导致这样的 JSON:

    {
       "destination_addresses" : [ "Powstańców Warszawy 8, Sopot, Polska" ],
       "origin_addresses" : [ "majora Henryka Sucharskiego 69, Gdańsk, Polska" ],
       "rows" : [
          {
             "elements" : [
                {
                   "distance" : {
                      "text" : "24,7 km",
                      "value" : 24653
                   },
                   "duration" : {
                      "text" : "34 min",
                      "value" : 2062
                   },
                   "status" : "OK"
                }
             ]
          }
       ],
       "status" : "OK"
    }
    

    结果距离是两个位置之间的实际道路距离。

    您可以在The Google Distance Matrix API找到更多详细信息

    【讨论】:

    • 这个有api限制吗?
    • 是的,它确实有 api 限制。这一切都在我在答案中提供的文档中进行了描述。
    【解决方案2】:

    您可能想在询问之前再搜索一下。

    无论如何,使用 Haversine 公式

    rad = function(x) {return x*Math.PI/180;}
    
    distHaversine = function(p1, p2) {
      var R = 6371; // earth's mean radius in km
      var dLat  = rad(p2.lat() - p1.lat());
      var dLong = rad(p2.lng() - p1.lng());
    
      var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
              Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) * Math.sin(dLong/2) * Math.sin(dLong/2);
      var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
      var dist = R * c;
    
      return dist.toFixed(3);
    }
    

    【讨论】:

      【解决方案3】:

      它给出了两个位置之间的距离。

      首先,您需要获取源的纬度、经度和目的地的经度。在这个方法中传递这些。

      它会返回它们之间的距离。

      public float distanceFrom(float lat1, float lng1, float lat2, float lng2) {
          double earthRadius = 3958.75;
          double dLat = Math.toRadians(lat2-lat1);
          double dLng = Math.toRadians(lng2-lng1);
          double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLng/2) * Math.sin(dLng/2);
          double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
          double dist = earthRadius * c;
          int meterConversion = 1609;
          return new Float(dist * meterConversion).floatValue();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-11
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 2019-12-02
        • 1970-01-01
        • 2014-04-10
        • 2012-10-13
        相关资源
        最近更新 更多