app.factory('$geoUtils', function($cordovaGeolocation, $filter) { var geoUtils = this; geoUtils.init = function() { if (Number.prototype.toRadians === undefined) { Number.prototype.toRadians = function() { return this * Math.PI / 180; }; } }; geoUtils.init(); geoUtils.getLatLng = function(lat, lng) { return { latitude: lat, longitude: lng }; }; geoUtils.getDistance = function(location1, location2, parse) { var lat1 = Number(location1.latitude), lat2 = Number(location2.latitude), lon1 = Number(location1.longitude), lon2 = Number(location2.longitude); var R = 6371000; // metres var f1 = lat1.toRadians(); var f2 = lat2.toRadians(); var diff_F = (lat2 - lat1).toRadians(); var diff_L = (lon2 - lon1).toRadians(); var a = Math.sin(diff_F / 2) * Math.sin(diff_F / 2) + Math.cos(f1) * Math.cos(f1) * Math.sin(diff_L / 2) * Math.sin(diff_L / 2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); var d = R * c * 0.000621371192; return parse ? $filter('number')(Math.ceil(d)) : Math.ceil(d); }; geoUtils.getBounds = function (set) { var obj = { minX: set [0].lat, maxX: set [0].lat, minY: set [0].lng, maxY: set [0].lng }; set.reduce(function(arr, cur) { obj.minX = arr.minX > cur.lat ? cur.lat : arr.minX; obj.minY = arr.minY > cur.lng ? cur.lng : arr.minY; obj.maxX = arr.maxX < cur.lat ? cur.lat : arr.maxX; obj.maxY = arr.maxY < cur.lng ? cur.lng : arr.maxY; return obj; }, obj); return [ [obj.maxX, obj.minY], [obj.minX, obj.maxY] ]; }; return geoUtils; }) .factory('$safeGL', function($q, $cordovaGeolocation, $localstorage) { this.getCurrentPosition = function(options) { var defer = $q.defer(); $cordovaGeolocation.getCurrentPosition(angular.extend({ timeout: 3000, enableHighAccuracy: false }, options)).then(function(res) { defer.resolve(angular.extend(res, { available: true })); }, function(e) { defer.resolve(angular.extend(e, { available: false })); }); return defer.promise; }; return this; });