如何使用angulajs计算两个纬度和经度之间的距离?

时间:2015-07-10 05:18:24

标签: javascript angularjs mongodb google-maps

$http.get('*****').success(function(data,dealers,response)
{    
 $scope.items = data;
 $scope.item ='';
 console.log(data);
var shoplatit=data.S_Location.Latitude;
 var shoplong=data.S_Location.Longitude;
															
});

$scope.nearme = function($scope) {
 if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {
                mysrclat = position.coords.latitude; 
                mysrclong = position.coords.longitude;
                console.log(mysrclat);
                console.log(mysrclong);
        });
        
    }
  i tried like this but its not working getting  deg2rad is not defined erro
var lat1 =15.008809;
var lat2 =78.659096;

var lon1 =13.90457539;
var lon2 =78.5855514

  var R = 6371; // Radius of the earth in km
  var dLat = deg2rad(lat2-lat1);  // deg2rad below
  var dLon = deg2rad(lon2-lon1); 
  var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2)
    ; 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
  var d = R * c; // Distance in km
   console.log(d);
<div ng-controller="ListingCtrl" >
  <div data-ng-init="nearme()">
    
    <div class="list card" data-ng-repeat="item in items">
    <h2>{{item.Store_Name}} </h2>{{item.S_Location.Latitude}}<br>{{item.S_Location.Longitude}}
    <p>{{item.S_Address}}</p> 
   <h1>here i want show distance in km</h1>
  </div>
    </div>
  </div>

我在mongodb中存储了商店的纬度和经度。在列表页面中,我使用navigator.geolocation.i获取客户纬度和langitude。想要计算两个latitiude和经度之间的距离。我已经包含了我的代码

2 个答案:

答案 0 :(得分:2)

这个lat-long debug可以帮助您轻松调试地理距离和其他方面。

下面是计算它的函数JS代码;它还有deg2rad()函数,用于将度数转换为等效弧度(代码中似乎缺少)。

我使用了您提供的两个坐标,返回的距离为123.04 km,也通过Google地图进行了交叉检查以验证相同。

/* 
Title: Get Distance from two Latitude / Longitude in Kilometers.

Description: This Javascript snippet calculates great-circle distances between the two points 
—— that is, the shortest distance over the earth’s surface; using the ‘Haversine’ formula.
*/

function _getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) {
  var R = 6371; // Radius of the earth in kilometers
  var dLat = deg2rad(lat2 - lat1); // deg2rad below
  var dLon = deg2rad(lon2 - lon1);
  var a =
    Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
    Math.sin(dLon / 2) * Math.sin(dLon / 2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c; // Distance in KM
  return d;
}

function deg2rad(deg) {
  return deg * (Math.PI / 180)
}



// Point 1: 15.008809, 78.659096
// Point 2: 13.90457539, 78.5855514

var _lat1 = 15.008809;
var _lon1 = 78.659096;

var _lat2 = 13.90457539;
var _lon2 = 78.5855514;

// precise value
var _d = "Precise value: " + _getDistanceFromLatLonInKm(_lat1, _lon1, _lat2, _lon2);
console.log(_d); // alert(_d);


// round value
_d = "Round value: " +
  Math.round(_getDistanceFromLatLonInKm(_lat1, _lon1, _lat2, _lon2) * 100) / 100 +
  " km";
console.log(_d); // alert(_d);

答案 1 :(得分:0)

考虑到你提到你有你想要列出的地点的数据&#34;附近&#34;进行查询的设备的当前位置,然后你就是这么错了。

MongoDB支持地理空间查询,当然您的数据格式正确。从这里你可以让&#34;服务器&#34;为您进行距离计算,而不是尝试计算客户端代码中两点之间的距离。它只需要一点设置。

假设您正在关注&#34;意思&#34;堆栈的东西,因此在你的nodejs服务器上使用mongoose(当然你不是吗?)那么你可能想要设置这样的架构:

var placeSchema = new Schema({
    "name": String,
    "location": {
        "type": String,
        "coordinates": []
    }
});

placeSchema.index({ "location": "2dsphere" })
module.exports = mongoose.model("Place",placeSchema);

将您的收藏设置为&#34;地点&#34;有一些数据,最重要的是&#34; location&#34;以GeoJSON格式存储的字段。遵循该标准是一个好主意,因为它在许多API中得到广泛支持,并且很好地获得了正确的#34;全球各地的距离。

您将看到的另一件事是"2dsphere"索引。这将被您将使用的地理空间查询用于查找&#34; near&#34;到您用于查询的位置。

然后集合中的数据应如下所示:

{
    "name": "Sydney",
    "location": {
        "type": "Point",
        "coordinates": [150.9224326,-33.7969235]
    }
}

请注意,此处的坐标顺序为&#34;经度&#34;然后&#34;纬度&#34;为了有效。

现在您只需要在控制器代码(服务器)中执行MongoDB方法来查询数据。为了返回&#34;距离&#34;使用的操作必须是返回&#34;距离&#34;领域。有两个选项是geoNear数据库命令,mongoose为其提供包装器,或$geoNear聚合框架运算符。我们会坚持使用聚合运算符,因为那里有更多的灵活性。

var coordinates = [150.9418357,-33.7775636]

Place.aggregate(
    [
       { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": coordinates
            },
            "distanceField": "distance",
            "distanceMultiplier": 0.001,
            "spherical": true
        }}
     ],
    function(err,results) {
         // send results in the response
    }
);

这将返回“&#34; ordered&#34;距离查询点的最近距离以及距离&#34;计算公里数:

{ 
    "_id" : ObjectId("559f68366274d659c90d02b8"),
    "name" : "Parramatta",
    "location" : { 
        "type" : "Point",
        "coordinates" : [ 151.0082989, -33.8151255 ]
    },
    "distance" : 8.255873925464623
},
{
     "_id" : ObjectId("559f68366274d659c90d02b7"),
     "name" : "Sydney",
     "location" : { 
         "type" : "Point", 
         "coordinates" : [ 151.2094, -33.865 ]
     }, 
     "distance" : 27.46479097844148
 }

因此,您的服务会将您的导航器坐标发送到服务器API(按正确顺序),然​​后发出查询以返回结果。然后,响应数据可以输出到您的模板,而无需计算客户端代码中的距离。

不可能比这简单。