$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和经度之间的距离。我已经包含了我的代码
答案 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(按正确顺序),然后发出查询以返回结果。然后,响应数据可以输出到您的模板,而无需计算客户端代码中的距离。
不可能比这简单。