基于更靠近用户位置的对象对数组进行排序

时间:2016-06-15 19:18:46

标签: angularjs ionic-framework

我有一组json数据,它们有商店名称,store_lattitude和store_longitude。我希望按照离用户当前位置更近的顺序对商店进行排序。

以下是示例JSON数据:

[{"id":"1","store_name":"Nilgiris","store_address":"QWE","store_latitude":"12.929328","store_longitude":"77.605117"},
{"id":"2","store_name":"WallMart","store_address":"ABC","store_latitude":"12.979024","store_longitude":"77.611141"},
{"id":"3","store_name":"Green Mart","store_address":"XYZ","store_latitude":"12.961398","store_longitude":"77.553128"}]

感谢任何帮助。 Thnaks。

2 个答案:

答案 0 :(得分:1)

您可以将用户和位置的latl循环到一个根据Haversine公式计算距离的函数:

在您的控制器中,加载数据后:

angular.forEach(results, function(s) {
                        store['dist'] = getDistanceInM(user_lat, user_lon, store['store_latitude'], store['store_longitude']);
})

这些功能可以在您的控制器中或在服务中:

    var getDistanceInM = function(lat1, lon1, lat2, lon2) {
        var R = 6371;
        var dLat = deg2rad(lat2 - lat1);
        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 * 1000;
        return parseInt(d, 10);
    };

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

在您看来:

<ion-item ng-repeat="item in data.stores | orderBy:'dist'">

答案 1 :(得分:0)

你还可以利用google api中已有的内容:

https://developers.google.com/maps/documentation/distance-matrix/start

额外的好处是你可以获得各种距离测量,甚至可以带来旅行时间。它还解析了文本的位置。如果您可以谷歌搜索您不需要提供长或纬度的位置。每天2500 reqs是免费的。