Javascript Angular JS-使用地理位置对集合进行排序
我正在呈现包含坐标数据(经度、纬度)的存储位置集合。我想使用用户的地理位置对结果进行排序,特别是按最近的商店位置排序。就上下文而言,该应用程序旨在让人们更容易找到(在加拿大)安装有他们想要的iPhone的苹果专卖店: 我正在使用angularjs geolocation包装器()获取访问者的lat/lng,但我不确定在获取后如何使用用户的geolocation以及Angular的orderBy指令动态访问集合。(我想根据壁橱的接近程度进行排序,这是我在Javascript中很熟悉的计算方法。)这可能是一个简单的问题,但对于Angular来说是个新手,我仍在尝试确定方向。以下是目前为止的控制器:Javascript Angular JS-使用地理位置对集合进行排序,javascript,angularjs,geolocation,Javascript,Angularjs,Geolocation,我正在呈现包含坐标数据(经度、纬度)的存储位置集合。我想使用用户的地理位置对结果进行排序,特别是按最近的商店位置排序。就上下文而言,该应用程序旨在让人们更容易找到(在加拿大)安装有他们想要的iPhone的苹果专卖店: 我正在使用angularjs geolocation包装器()获取访问者的lat/lng,但我不确定在获取后如何使用用户的geolocation以及Angular的orderBy指令动态访问集合。(我想根据壁橱的接近程度进行排序,这是我在Javascript中很熟悉的计算方法。)
angular.module('InventoryApp')
.controller('searchController', ['$scope', 'searchService', 'geolocation', function(scope, searchService, geolocation){
scope.model_ids = model_ids;
scope.store_ids = store_ids;
scope.address = '';
scope.find = '';
scope.position = null;
scope.refreshLocation = function () {
geolocation.getLocation().then(function(data){
scope.coords = { lat:parseFloat(data.coords.latitude.toFixed(6)), lng:parseFloat(data.coords.longitude.toFixed(6)) };
var geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(scope.coords.lat, scope.coords.lng);
geocoder.geocode({ 'latLng': latlng }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[0]) {
scope.address = results[0].formatted_address;
} else {
scope.address = 'Address not found';
}
} else {
scope.address = 'Geocoder failed due to: ' + status;
}
scope.$digest();
});
});
};
scope.search = function () {
searchService.update().success(function (stores) {
scope.stores = stores;
});
};
scope.refreshLocation();
scope.search();
}])
.factory('searchService', ['$http', function(http){
return {
update: function () {
return http.get('/inventory');
}
}
}])
那么,关于如何在Angular JS中构建它,有什么想法吗 我认为AngularJS没有太大区别。我举了一个例子。它使用GooglePlacesAPI进行搜索。需要Map(Map=new google.maps.Map),因为没有它PlacesAPI就无法工作。如果您的地理位置被禁用,它将不起作用。它使用Google map geometry API以米为单位计算距离,并使用orderBy过滤器对商店进行排序
<!doctype html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.js"></script>
<script src="https://raw.githubusercontent.com/arunisrael/angularjs-geolocation/master/dist/angularjs-geolocation.min.js"></script>
<script src="http://maps.google.com/maps/api/js?sensor=false&v=3&libraries=geometry,places"></script>
<style>
.check-yes {
background-color: green;
}
</style>
</head>
<body ng-app="plunker">
<div id="map-canvas"></div>
<div ng-controller="searchController">
Search for: <input type="text" ng-model="searchText"> <button ng-click="search()">Search</button>
<ul>
<li ng-repeat="store in stores | orderBy:'distance'">
{{store.name}} ({{store.distance}} metres)
</li>
</ul>
</div>
<script>
var app = angular.module('plunker', ['geolocation']);
app.controller('searchController', ['$scope', 'searchService', 'geolocation', function(scope, searchService, geolocation){
scope.address = '';
scope.find = '';
scope.position = null;
scope.stores = [];
scope.searchText = '';
scope.refreshLocation = function () {
geolocation.getLocation().then(function(data){
scope.coords = { lat:parseFloat(data.coords.latitude.toFixed(6)), lng:parseFloat(data.coords.longitude.toFixed(6)) };
var geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(scope.coords.lat, scope.coords.lng);
scope.position = latlng;
scope.search();
geocoder.geocode({ 'latLng': latlng }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[0]) {
scope.address = results[0].formatted_address;
} else {
scope.address = 'Address not found';
}
} else {
scope.address = 'Geocoder failed due to: ' + status;
}
scope.$digest();
});
});
};
scope.search = function () {
if (!scope.position) {
alert('Please share your location to search');
}
searchService.update(setStores, scope.position, scope.searchText);
};
var setStores = function (stores) {
scope.stores = stores;
calculateDistance();
scope.$apply();
}
var calculateDistance = function () {
for (var id in scope.stores) {
var store = scope.stores[id];
var storeLocation = new google.maps.LatLng(store.geometry.location.lat(), store.geometry.location.lng());
var distance = google.maps.geometry.spherical.computeDistanceBetween(scope.position, storeLocation);
store.distance = parseInt(distance);
}
}
scope.refreshLocation();
}]).factory('searchService', ['$http', function(http){
return {
update: function (callback, position, text) {
var url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json';
var params = {
location: position,
radius: 2500,
types: ['store']
};
if (text) {
params['name'] = text;
}
map = new google.maps.Map(document.getElementById('map-canvas'), {
center: position,
zoom: 15
});
var service = new google.maps.places.PlacesService(map);
service.nearbySearch(params, callback);
}
}
}]);
</script>
</body>
</html>
1.是的{
背景颜色:绿色;
}
搜索:搜索
-
{{store.name}}({{store.distance}}米)
var app=angular.module('plunker',['geolocation']);
app.controller('searchController',['$scope','searchService','geolocation',函数(scope,searchService,geolocation){
scope.address='';
scope.find='';
scope.position=null;
scope.stores=[];
scope.searchText='';
scope.refreshLocation=函数(){
geolocation.getLocation().then(函数(数据){
scope.coords={lat:parseFloat(data.coords.latitude.toFixed(6)),lng:parseFloat(data.coords.longitude.toFixed(6));
var geocoder=new google.maps.geocoder();
var latlng=新的google.maps.latlng(scope.coords.lat,scope.coords.lng);
scope.position=车床;
scope.search();
geocoder.geocode({'latLng':latLng},函数(结果,状态){
if(status==google.maps.GeocoderStatus.OK){
如果(结果[0]){
scope.address=结果[0]。格式化的\u地址;
}否则{
scope.address='未找到地址';
}
}否则{
scope.address='地理编码器失败,原因是:'+状态;
}
范围。$digest();
});
});
};
scope.search=函数(){
如果(!范围位置){
警报(“请共享您要搜索的位置”);
}
searchService.update(设置存储、scope.position、scope.searchText);
};
var设置存储=功能(存储){
scope.stores=商店;
计算站();
作用域:$apply();
}
var calculateInstance=函数(){
for(scope.stores中的变量id){
var store=scope.stores[id];
var storeLocation=new google.maps.LatLng(store.geometry.location.lat(),store.geometry.location.lng());
var distance=google.maps.geometry.sphere.ComputedDistanceBeween(scope.position,storeLocation);
store.distance=parseInt(距离);
}
}
scope.refreshLocation();
}]).factory('searchService',['$http',函数(http){
返回{
更新:函数(回调、位置、文本){
var url='1〕https://maps.googleapis.com/maps/api/place/nearbysearch/json';
变量参数={
地点:位置,,
半径:2500,
类型:['store']
};
如果(文本){
参数['name']=文本;
}
map=new google.maps.map(document.getElementById('map-canvas'){
中锋:位置,,
缩放:15
});
var service=newgoogle.maps.places.PlacesService(地图);
service.nearbySearch(参数、回调);
}
}
}]);
您可以计算到每家商店的距离,然后按距离订购。是的,这就是我的想法。我知道如何计算距离,但在角度控制器的环境中,如何计算距离?在主干网中,这很简单——我只需要为邻近性创建一个计算属性,然后根据该属性进行排序。在Angular JS中,我只是不知道如何处理它。