diff --git a/.gitignore b/.gitignore index 631fa62d..4e5cc436 100644 --- a/.gitignore +++ b/.gitignore @@ -10,11 +10,12 @@ libpeerconnection.log node_modules dist/angular-leaflet-directive.pre.js dist/angular-leaflet-directive.min.no-header.js -dist/angular-leaflet-directive_dev_mapped.js -dist/angular-leaflet-directive_dev_mapped.js.map js/angular-leaflet-directive-webpage.ngmin.js coverage bower_components saucelabs.json lib - +tags +.tags +TAGS +.TAGS diff --git a/README.md b/README.md index 4601e412..0e737eca 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,11 @@ Status](https://coveralls.io/repos/realtymaps/angular-leaflet-directive/badge.pn Library. This software aims to easily embed maps managed by leaflet on your [Leaflet](http://leaflet.cloudmade.com) project. -See some basic examples: +You can browse all the examples added by the community to learn about the directive and its possibilities here: + +http://tombatossals.github.io/angular-leaflet-directive/examples/0000-viewer .html + +Or you can see some examples directly: * [Basic example](http://tombatossals.github.io/angular-leaflet-directive/examples/simple-example.html) * [Center example](http://tombatossals.github.io/angular-leaflet-directive/examples/center-example.html) diff --git a/bower.json b/bower.json index 7fd28ee9..a95ff08d 100644 --- a/bower.json +++ b/bower.json @@ -18,8 +18,11 @@ "devDependencies": { "jquery": "*", "bootstrap": "*", + "semantic-ui": "*", + "prism": "*", "angular-route": "1.3.x", "angular-animate": "1.3.x", + "angular-sanitize": "1.3.x", "angular-mocks": "1.3.x", "leaflet.markercluster": "*", "leaflet.draw": "*", diff --git a/dist/angular-leaflet-directive.js b/dist/angular-leaflet-directive.js index f39ffbfe..c39b8756 100644 --- a/dist/angular-leaflet-directive.js +++ b/dist/angular-leaflet-directive.js @@ -1,11 +1,12 @@ /*! -* angular-leaflet-directive 0.7.11 2015-03-28 +* angular-leaflet-directive 0.7.13 2015-04-14 * angular-leaflet-directive - An AngularJS directive to easily interact with Leaflet maps * git: https://github.com/tombatossals/angular-leaflet-directive */ (function(angular){ 'use strict'; -angular.module("leaflet-directive", []).directive('leaflet', ["$q", "leafletData", "leafletMapDefaults", "leafletHelpers", "leafletEvents", function ($q, leafletData, leafletMapDefaults, leafletHelpers, leafletEvents) { +angular.module("leaflet-directive", []).directive('leaflet', + ["$q", "leafletData", "leafletMapDefaults", "leafletHelpers", "leafletEvents", function ($q, leafletData, leafletMapDefaults, leafletHelpers, leafletEvents) { var _leafletMap; return { restrict: "EA", @@ -23,7 +24,9 @@ angular.module("leaflet-directive", []).directive('leaflet', ["$q", "leafletData layers : '=', controls : '=', decorations : '=', - eventBroadcast : '=' + eventBroadcast : '=', + markersWatchOptions : '=', + geojsonWatchOptions : '=' }, transclude: true, template: '
', @@ -44,6 +47,8 @@ angular.module("leaflet-directive", []).directive('leaflet', ["$q", "leafletData genDispatchMapEvent = leafletEvents.genDispatchMapEvent, mapEvents = leafletEvents.getAvailableMapEvents(); + leafletData.setDirectiveControls({}, attrs.id); + // Set width and height utility functions function updateWidth() { if (isNaN(attrs.width)) { @@ -290,684 +295,307 @@ angular.module("leaflet-directive").service('leafletData', ["$log", "$q", "leafl getUnresolvedDefer = leafletHelpers.getUnresolvedDefer, setResolvedDefer = leafletHelpers.setResolvedDefer; - var maps = {}; - var tiles = {}; - var layers = {}; - var paths = {}; - var markers = {}; - var geoJSON = {}; - var utfGrid = {}; - var decorations = {}; - - this.setMap = function(leafletMap, scopeId) { - var defer = getUnresolvedDefer(maps, scopeId); - defer.resolve(leafletMap); - setResolvedDefer(maps, scopeId); - }; + var _private = {}; + var self = this; - this.getMap = function(scopeId) { - var defer = getDefer(maps, scopeId); - return defer.promise; + var upperFirst = function (string) { + return string.charAt(0).toUpperCase() + string.slice(1); }; + var _privateItems = [ + 'map', + 'tiles', + 'layers', + 'paths', + 'markers', + 'geoJSON', + 'UTFGrid', //odd ball on naming convention keeping to not break + 'decorations', + 'directiveControls']; + + //init + _privateItems.forEach(function(itemName){ + _private[itemName] = {}; + }); + this.unresolveMap = function (scopeId) { - var id = leafletHelpers.obtainEffectiveMapId(maps, scopeId); - maps[id] = undefined; - tiles[id] = undefined; - layers[id] = undefined; - paths[id] = undefined; - markers[id] = undefined; - geoJSON[id] = undefined; - utfGrid[id] = undefined; - decorations[id] = undefined; + var id = leafletHelpers.obtainEffectiveMapId(_private.map, scopeId); + _privateItems.forEach(function (itemName) { + _private[itemName][id] = undefined; + }); }; - this.getPaths = function(scopeId) { - var defer = getDefer(paths, scopeId); - return defer.promise; - }; + //int repetitive stuff (get and sets) + _privateItems.forEach(function (itemName) { + var name = upperFirst(itemName); + self['set' + name] = function (lObject, scopeId) { + var defer = getUnresolvedDefer(_private[itemName], scopeId); + defer.resolve(lObject); + setResolvedDefer(_private[itemName], scopeId); + }; - this.setPaths = function(leafletPaths, scopeId) { - var defer = getUnresolvedDefer(paths, scopeId); - defer.resolve(leafletPaths); - setResolvedDefer(paths, scopeId); - }; + self['get' + name] = function (scopeId) { + var defer = getDefer(_private[itemName], scopeId); + return defer.promise; + }; + }); +}]); - this.getMarkers = function(scopeId) { - var defer = getDefer(markers, scopeId); - return defer.promise; - }; +angular.module("leaflet-directive") +.service('leafletDirectiveControlsHelpers', ["$log", "leafletData", "leafletHelpers", function ($log, leafletData, leafletHelpers) { + var _isDefined = leafletHelpers.isDefined, + _isString = leafletHelpers.isString, + _isObject = leafletHelpers.isObject, + _mainErrorHeader = leafletHelpers.errorHeader; + + var _errorHeader = _mainErrorHeader + '[leafletDirectiveControlsHelpers'; + + var _extend = function(id, thingToAddName, createFn, cleanFn){ + var _fnHeader = _errorHeader + '.extend] '; + var extender = {}; + if(!_isDefined(thingToAddName)){ + $log.error(_fnHeader + 'thingToAddName cannot be undefined'); + return; + } - this.setMarkers = function(leafletMarkers, scopeId) { - var defer = getUnresolvedDefer(markers, scopeId); - defer.resolve(leafletMarkers); - setResolvedDefer(markers, scopeId); - }; + if(_isString(thingToAddName) && _isDefined(createFn) && _isDefined(cleanFn)){ + extender[thingToAddName] = { + create: createFn, + clean: cleanFn + }; + } + else if(_isObject(thingToAddName) && !_isDefined(createFn) && !_isDefined(cleanFn)){ + extender = thingToAddName; + } + else{ + $log.error(_fnHeader + 'incorrect arguments'); + return; + } - this.getLayers = function(scopeId) { - var defer = getDefer(layers, scopeId); - return defer.promise; + //add external control to create / destroy markers without a watch + leafletData.getDirectiveControls().then(function(controls){ + angular.extend(controls, extender); + leafletData.setDirectiveControls(controls, id); + }); }; - this.setLayers = function(leafletLayers, scopeId) { - var defer = getUnresolvedDefer(layers, scopeId); - defer.resolve(leafletLayers); - setResolvedDefer(layers, scopeId); + return { + extend: _extend }; +}]); - this.getUTFGrid = function(scopeId) { - var defer = getDefer(utfGrid, scopeId); - return defer.promise; - }; +angular.module("leaflet-directive").factory('leafletEvents', + ["leafletMapEvents", "leafletMarkerEvents", "leafletPathEvents", function (leafletMapEvents, leafletMarkerEvents, leafletPathEvents) { + var retObj = {}; + angular.extend(retObj,leafletMapEvents, leafletMarkerEvents, leafletPathEvents); + return retObj; +}]); - this.setUTFGrid = function(leafletUTFGrid, scopeId) { - var defer = getUnresolvedDefer(utfGrid, scopeId); - defer.resolve(leafletUTFGrid); - setResolvedDefer(utfGrid, scopeId); +angular.module("leaflet-directive") +.service('leafletGeoJsonHelpers', ["leafletHelpers", "leafletIterators", function (leafletHelpers, leafletIterators) { + var lHlp = leafletHelpers, + lIt = leafletIterators; + var Point = function(lat,lng){ + this.lat = lat; + this.lng = lng; + return this; }; - this.setTiles = function(leafletTiles, scopeId) { - var defer = getUnresolvedDefer(tiles, scopeId); - defer.resolve(leafletTiles); - setResolvedDefer(tiles, scopeId); + var _getLat = function(value) { + if (Array.isArray(value) && value.length === 2) { + return value[1]; + } else if (lHlp.isDefined(value.type) && value.type === 'Point') { + return +value.coordinates[1]; + } else { + return +value.lat; + } }; - this.getTiles = function(scopeId) { - var defer = getDefer(tiles, scopeId); - return defer.promise; + var _getLng = function(value) { + if (Array.isArray(value) && value.length === 2) { + return value[0]; + } else if (lHlp.isDefined(value.type) && value.type === 'Point') { + return +value.coordinates[0]; + } else { + return +value.lng; + } }; - this.setGeoJSON = function(leafletGeoJSON, scopeId) { - var defer = getUnresolvedDefer(geoJSON, scopeId); - defer.resolve(leafletGeoJSON); - setResolvedDefer(geoJSON, scopeId); - }; + var _validateCoords = function(coords) { + if (lHlp.isUndefined(coords)) { + return false; + } + if (lHlp.isArray(coords)) { + if (coords.length === 2 && lHlp.isNumber(coords[0]) && lHlp.isNumber(coords[1])) { + return true; + } + } else if (lHlp.isDefined(coords.type)) { + if ( + coords.type === 'Point' && lHlp.isArray(coords.coordinates) && + coords.coordinates.length === 2 && + lHlp.isNumber(coords.coordinates[0]) && + lHlp.isNumber(coords.coordinates[1])) { + return true; + } + } - this.getGeoJSON = function(scopeId) { - var defer = getDefer(geoJSON, scopeId); - return defer.promise; - }; + var ret = lIt.all(['lat', 'lng'], function(pos){ + return lHlp.isDefined(coords[pos]) && lHlp.isNumber(coords[pos]); + }); + return ret; + }; - this.setDecorations = function(leafletDecorations, scopeId) { - var defer = getUnresolvedDefer(decorations, scopeId); - defer.resolve(leafletDecorations); - setResolvedDefer(decorations, scopeId); - }; + var _getCoords = function(value) { + if (!value || !_validateCoords(value)) { + return; + } + var p = null; + if (Array.isArray(value) && value.length === 2) { + p = new Point(value[1], value[0]); + } else if (lHlp.isDefined(value.type) && value.type === 'Point') { + p = new Point(value.coordinates[1], value.coordinates[0]); + } else { + return value; + } + //note angular.merge is avail in angular 1.4.X we might want to fill it here + return angular.extend(value, p);//tap on lat, lng if it doesnt exist + }; - this.getDecorations = function(scopeId) { - var defer = getDefer(decorations, scopeId); - return defer.promise; - }; -}]); -angular.module("leaflet-directive").factory('leafletEvents', ["$rootScope", "$q", "$log", "leafletHelpers", function ($rootScope, $q, $log, leafletHelpers) { - var safeApply = leafletHelpers.safeApply, - isDefined = leafletHelpers.isDefined, - isObject = leafletHelpers.isObject, - Helpers = leafletHelpers; + return { + getLat: _getLat, + getLng: _getLng, + validateCoords: _validateCoords, + getCoords: _getCoords + }; + }]); - var _getAvailableLabelEvents = function() { - return [ - 'click', - 'dblclick', - 'mousedown', - 'mouseover', - 'mouseout', - 'contextmenu' - ]; - }; +angular.module("leaflet-directive").factory('leafletHelpers', ["$q", "$log", function ($q, $log) { + var _errorHeader = '[AngularJS - Leaflet] '; + var _copy = angular.copy; + var _clone = _copy; + /* + For parsing paths to a field in an object - var genLabelEvents = function(leafletScope, logic, marker, name) { - var labelEvents = _getAvailableLabelEvents(); - var scopeWatchName = Helpers.getObjectArrayPath("markers." + name); - for (var i = 0; i < labelEvents.length; i++) { - var eventName = labelEvents[i]; - marker.label.on(eventName, genDispatchLabelEvent(leafletScope, eventName, logic, marker.label, scopeWatchName)); + Example: + var obj = { + bike:{ + 1: 'hi' + 2: 'foo' + } + }; + _getObjectValue(obj,"bike.1") returns 'hi' + this is getPath in ui-gmap + */ + var _getObjectValue = function(object, pathStr) { + var obj; + if(!object || !angular.isObject(object)) + return; + //if the key is not a sting then we already have the value + if ((pathStr === null) || !angular.isString(pathStr)) { + return pathStr; } + obj = object; + pathStr.split('.').forEach(function(value) { + if (obj) { + obj = obj[value]; + } + }); + return obj; }; /* - argument: name: Note this can be a single string or dot notation - Example: - markerModel : { - m1: { lat:_, lon: _} - } - //would yield name of - name = "m1" + Object Array Notation + _getObjectArrayPath("bike.one.two") + returns: + 'bike["one"]["two"]' + */ + var _getObjectArrayPath = function(pathStr){ + return pathStr.split('.').reduce(function(previous, current) { + return previous + '["'+ current + '"]'; + }); + }; - If nested: - markerModel : { - cars: { - m1: { lat:_, lon: _} - } - } - //would yield name of - name = "cars.m1" + /* Object Dot Notation + _getObjectPath(["bike","one","two"]) + returns: + "bike.one.two" */ - var genDispatchMarkerEvent = function(eventName, logic, leafletScope, marker, name, markerData) { - return function(e) { - var broadcastName = 'leafletDirectiveMarker.' + eventName; + var _getObjectDotPath = function(arrayOfStrings){ + return arrayOfStrings.reduce(function(previous, current) { + return previous + '.' + current; + }); + }; - // Broadcast old marker click name for backwards compatibility - if (eventName === "click") { - safeApply(leafletScope, function() { - $rootScope.$broadcast('leafletDirectiveMarkersClick', name); - }); - } else if (eventName === 'dragend') { - safeApply(leafletScope, function() { - markerData.lat = marker.getLatLng().lat; - markerData.lng = marker.getLatLng().lng; - }); - if (markerData.message && markerData.focus === true) { - marker.openPopup(); + function _obtainEffectiveMapId(d, mapId) { + var id, i; + if (!angular.isDefined(mapId)) { + if (Object.keys(d).length === 0) { + id = "main"; + } else if (Object.keys(d).length >= 1) { + for (i in d) { + if (d.hasOwnProperty(i)) { + id = i; } } + } else if (Object.keys(d).length === 0) { + id = "main"; + } else { + $log.error(_errorHeader + "- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call"); + } + } else { + id = mapId; + } - safeApply(leafletScope, function(scope){ - if (logic === "emit") { - scope.$emit(broadcastName, { - markerName: name, - leafletEvent: e - }); - } else { - $rootScope.$broadcast(broadcastName, { - markerName: name, - leafletEvent: e - }); - } - }); - }; - }; - - var genDispatchPathEvent = function(eventName, logic, leafletScope, marker, name) { - return function(e) { - var broadcastName = 'leafletDirectivePath.' + eventName; + return id; + } - safeApply(leafletScope, function(scope){ - if (logic === "emit") { - scope.$emit(broadcastName, { - pathName: name, - leafletEvent: e - }); - } else { - $rootScope.$broadcast(broadcastName, { - pathName: name, - leafletEvent: e - }); - } - }); - }; - }; + function _getUnresolvedDefer(d, mapId) { + var id = _obtainEffectiveMapId(d, mapId), + defer; - var genDispatchLabelEvent = function(scope, eventName, logic, label, scope_watch_name) { - return function(e) { - // Put together broadcast name - var broadcastName = 'leafletDirectiveLabel.' + eventName; - var markerName = scope_watch_name.replace('markers.', ''); + if (!angular.isDefined(d[id]) || d[id].resolvedDefer === true) { + defer = $q.defer(); + d[id] = { + defer: defer, + resolvedDefer: false + }; + } else { + defer = d[id].defer; + } - // Safely broadcast the event - safeApply(scope, function(scope) { - if (logic === "emit") { - scope.$emit(broadcastName, { - leafletEvent : e, - label: label, - markerName: markerName - }); - } else if (logic === "broadcast") { - $rootScope.$broadcast(broadcastName, { - leafletEvent : e, - label: label, - markerName: markerName - }); - } - }); - }; - }; + return defer; + } - var _getAvailableMarkerEvents = function() { - return [ - 'click', - 'dblclick', - 'mousedown', - 'mouseover', - 'mouseout', - 'contextmenu', - 'dragstart', - 'drag', - 'dragend', - 'move', - 'remove', - 'popupopen', - 'popupclose' - ]; + var _isDefined = function(value) { + return angular.isDefined(value) && value !== null; }; - - var _getAvailablePathEvents = function() { - return [ - 'click', - 'dblclick', - 'mousedown', - 'mouseover', - 'mouseout', - 'contextmenu', - 'add', - 'remove', - 'popupopen', - 'popupclose' - ]; + var _isUndefined = function(value){ + return !_isDefined(value); }; return { - getAvailableMapEvents: function() { - return [ - 'click', - 'dblclick', - 'mousedown', - 'mouseup', - 'mouseover', - 'mouseout', - 'mousemove', - 'contextmenu', - 'focus', - 'blur', - 'preclick', - 'load', - 'unload', - 'viewreset', - 'movestart', - 'move', - 'moveend', - 'dragstart', - 'drag', - 'dragend', - 'zoomstart', - 'zoomend', - 'zoomlevelschange', - 'resize', - 'autopanstart', - 'layeradd', - 'layerremove', - 'baselayerchange', - 'overlayadd', - 'overlayremove', - 'locationfound', - 'locationerror', - 'popupopen', - 'popupclose', - 'draw:created', - 'draw:edited', - 'draw:deleted', - 'draw:drawstart', - 'draw:drawstop', - 'draw:editstart', - 'draw:editstop', - 'draw:deletestart', - 'draw:deletestop' - ]; + copy:_copy, + clone:_clone, + errorHeader: _errorHeader, + getObjectValue: _getObjectValue, + getObjectArrayPath:_getObjectArrayPath, + getObjectDotPath: _getObjectDotPath, + defaultTo: function(val, _default){ + return _isDefined(val) ? val : _default; }, - - genDispatchMapEvent: function(scope, eventName, logic) { - return function(e) { - // Put together broadcast name - var broadcastName = 'leafletDirectiveMap.' + eventName; - // Safely broadcast the event - safeApply(scope, function(scope) { - if (logic === "emit") { - scope.$emit(broadcastName, { - leafletEvent : e - }); - } else if (logic === "broadcast") { - $rootScope.$broadcast(broadcastName, { - leafletEvent : e - }); - } - }); - }; + //mainly for checking attributes of directives lets keep this minimal (on what we accept) + isTruthy: function(val){ + return val === 'true' || val === true; }, - - getAvailableMarkerEvents: _getAvailableMarkerEvents, - - getAvailablePathEvents: _getAvailablePathEvents, - - notifyCenterChangedToBounds: function(scope) { - scope.$broadcast("boundsChanged"); + //Determine if a reference is {} + isEmpty: function(value) { + return Object.keys(value).length === 0; }, - notifyCenterUrlHashChanged: function(scope, map, attrs, search) { - if (!isDefined(attrs.urlHashCenter)) { - return; - } - var center = map.getCenter(); - var centerUrlHash = (center.lat).toFixed(4) + ":" + (center.lng).toFixed(4) + ":" + map.getZoom(); - if (!isDefined(search.c) || search.c !== centerUrlHash) { - //$log.debug("notified new center..."); - scope.$emit("centerUrlHash", centerUrlHash); - } - }, - - bindMarkerEvents: function(marker, name, markerData, leafletScope) { - var markerEvents = []; - var i; - var eventName; - var logic = "emit"; - - if (!isDefined(leafletScope.eventBroadcast)) { - // Backward compatibility, if no event-broadcast attribute, all events are broadcasted - markerEvents = _getAvailableMarkerEvents(); - } else if (!isObject(leafletScope.eventBroadcast)) { - // Not a valid object - $log.error("[AngularJS - Leaflet] event-broadcast must be an object check your model."); - } else { - // We have a possible valid object - if (!isDefined(leafletScope.eventBroadcast.marker)) { - // We do not have events enable/disable do we do nothing (all enabled by default) - markerEvents = _getAvailableMarkerEvents(); - } else if (!isObject(leafletScope.eventBroadcast.marker)) { - // Not a valid object - $log.warn("[AngularJS - Leaflet] event-broadcast.marker must be an object check your model."); - } else { - // We have a possible valid map object - // Event propadation logic - if (leafletScope.eventBroadcast.marker.logic !== undefined && leafletScope.eventBroadcast.marker.logic !== null) { - // We take care of possible propagation logic - if (leafletScope.eventBroadcast.marker.logic !== "emit" && leafletScope.eventBroadcast.marker.logic !== "broadcast") { - // This is an error - $log.warn("[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'."); - } else if (leafletScope.eventBroadcast.marker.logic === "emit") { - logic = "emit"; - } - } - // Enable / Disable - var markerEventsEnable = false, markerEventsDisable = false; - if (leafletScope.eventBroadcast.marker.enable !== undefined && leafletScope.eventBroadcast.marker.enable !== null) { - if (typeof leafletScope.eventBroadcast.marker.enable === 'object') { - markerEventsEnable = true; - } - } - if (leafletScope.eventBroadcast.marker.disable !== undefined && leafletScope.eventBroadcast.marker.disable !== null) { - if (typeof leafletScope.eventBroadcast.marker.disable === 'object') { - markerEventsDisable = true; - } - } - if (markerEventsEnable && markerEventsDisable) { - // Both are active, this is an error - $log.warn("[AngularJS - Leaflet] can not enable and disable events at the same time"); - } else if (!markerEventsEnable && !markerEventsDisable) { - // Both are inactive, this is an error - $log.warn("[AngularJS - Leaflet] must enable or disable events"); - } else { - // At this point the marker object is OK, lets enable or disable events - if (markerEventsEnable) { - // Enable events - for (i = 0; i < leafletScope.eventBroadcast.marker.enable.length; i++) { - eventName = leafletScope.eventBroadcast.marker.enable[i]; - // Do we have already the event enabled? - if (markerEvents.indexOf(eventName) !== -1) { - // Repeated event, this is an error - $log.warn("[AngularJS - Leaflet] This event " + eventName + " is already enabled"); - } else { - // Does the event exists? - if (_getAvailableMarkerEvents().indexOf(eventName) === -1) { - // The event does not exists, this is an error - $log.warn("[AngularJS - Leaflet] This event " + eventName + " does not exist"); - } else { - // All ok enable the event - markerEvents.push(eventName); - } - } - } - } else { - // Disable events - markerEvents = _getAvailableMarkerEvents(); - for (i = 0; i < leafletScope.eventBroadcast.marker.disable.length; i++) { - eventName = leafletScope.eventBroadcast.marker.disable[i]; - var index = markerEvents.indexOf(eventName); - if (index === -1) { - // The event does not exist - $log.warn("[AngularJS - Leaflet] This event " + eventName + " does not exist or has been already disabled"); - - } else { - markerEvents.splice(index, 1); - } - } - } - } - } - } - - for (i = 0; i < markerEvents.length; i++) { - eventName = markerEvents[i]; - marker.on(eventName, genDispatchMarkerEvent(eventName, logic, leafletScope, marker, name, markerData)); - } - - if (Helpers.LabelPlugin.isLoaded() && isDefined(marker.label)) { - genLabelEvents(leafletScope, logic, marker, name); - } - }, - - bindPathEvents: function(path, name, pathData, leafletScope) { - var pathEvents = []; - var i; - var eventName; - var logic = "broadcast"; - - if (!isDefined(leafletScope.eventBroadcast)) { - // Backward compatibility, if no event-broadcast attribute, all events are broadcasted - pathEvents = _getAvailablePathEvents(); - } else if (!isObject(leafletScope.eventBroadcast)) { - // Not a valid object - $log.error("[AngularJS - Leaflet] event-broadcast must be an object check your model."); - } else { - // We have a possible valid object - if (!isDefined(leafletScope.eventBroadcast.path)) { - // We do not have events enable/disable do we do nothing (all enabled by default) - pathEvents = _getAvailablePathEvents(); - } else if (isObject(leafletScope.eventBroadcast.paths)) { - // Not a valid object - $log.warn("[AngularJS - Leaflet] event-broadcast.path must be an object check your model."); - } else { - // We have a possible valid map object - // Event propadation logic - if (leafletScope.eventBroadcast.path.logic !== undefined && leafletScope.eventBroadcast.path.logic !== null) { - // We take care of possible propagation logic - if (leafletScope.eventBroadcast.path.logic !== "emit" && leafletScope.eventBroadcast.path.logic !== "broadcast") { - // This is an error - $log.warn("[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'."); - } else if (leafletScope.eventBroadcast.path.logic === "emit") { - logic = "emit"; - } - } - // Enable / Disable - var pathEventsEnable = false, pathEventsDisable = false; - if (leafletScope.eventBroadcast.path.enable !== undefined && leafletScope.eventBroadcast.path.enable !== null) { - if (typeof leafletScope.eventBroadcast.path.enable === 'object') { - pathEventsEnable = true; - } - } - if (leafletScope.eventBroadcast.path.disable !== undefined && leafletScope.eventBroadcast.path.disable !== null) { - if (typeof leafletScope.eventBroadcast.path.disable === 'object') { - pathEventsDisable = true; - } - } - if (pathEventsEnable && pathEventsDisable) { - // Both are active, this is an error - $log.warn("[AngularJS - Leaflet] can not enable and disable events at the same time"); - } else if (!pathEventsEnable && !pathEventsDisable) { - // Both are inactive, this is an error - $log.warn("[AngularJS - Leaflet] must enable or disable events"); - } else { - // At this point the path object is OK, lets enable or disable events - if (pathEventsEnable) { - // Enable events - for (i = 0; i < leafletScope.eventBroadcast.path.enable.length; i++) { - eventName = leafletScope.eventBroadcast.path.enable[i]; - // Do we have already the event enabled? - if (pathEvents.indexOf(eventName) !== -1) { - // Repeated event, this is an error - $log.warn("[AngularJS - Leaflet] This event " + eventName + " is already enabled"); - } else { - // Does the event exists? - if (_getAvailablePathEvents().indexOf(eventName) === -1) { - // The event does not exists, this is an error - $log.warn("[AngularJS - Leaflet] This event " + eventName + " does not exist"); - } else { - // All ok enable the event - pathEvents.push(eventName); - } - } - } - } else { - // Disable events - pathEvents = _getAvailablePathEvents(); - for (i = 0; i < leafletScope.eventBroadcast.path.disable.length; i++) { - eventName = leafletScope.eventBroadcast.path.disable[i]; - var index = pathEvents.indexOf(eventName); - if (index === -1) { - // The event does not exist - $log.warn("[AngularJS - Leaflet] This event " + eventName + " does not exist or has been already disabled"); - - } else { - pathEvents.splice(index, 1); - } - } - } - } - } - } - - for (i = 0; i < pathEvents.length; i++) { - eventName = pathEvents[i]; - path.on(eventName, genDispatchPathEvent(eventName, logic, leafletScope, pathEvents, name)); - } - - if (Helpers.LabelPlugin.isLoaded() && isDefined(path.label)) { - genLabelEvents(leafletScope, logic, path, name); - } - } - - }; -}]); - -angular.module("leaflet-directive").factory('leafletHelpers', ["$q", "$log", function ($q, $log) { - var _errorHeader = '[AngularJS - Leaflet] '; - - /* - For parsing paths to a field in an object - - Example: - var obj = { - bike:{ - 1: 'hi' - 2: 'foo' - } - }; - _getObjectValue(obj,"bike.1") returns 'hi' - */ - var _getObjectValue = function(object, pathStr) { - var obj; - //if the key is not a sting then we already have the value - if ((pathStr === null) || !angular.isString(pathStr)) { - return pathStr; - } - obj = object; - pathStr.split('.').forEach(function(value) { - if (obj) { - obj = obj[value]; - } - }); - return obj; - }; - - /* - Object Array Notation - _getObjectArrayPath("bike.one.two") - returns: - 'bike["one"]["two"]' - */ - var _getObjectArrayPath = function(pathStr){ - return pathStr.split('.').reduce(function(previous, current) { - return previous + '["'+ current + '"]'; - }); - }; - - /* Object Dot Notation - _getObjectPath(["bike","one","two"]) - returns: - "bike.one.two" - */ - var _getObjectDotPath = function(arrayOfStrings){ - return arrayOfStrings.reduce(function(previous, current) { - return previous + '.' + current; - }); - }; - - function _obtainEffectiveMapId(d, mapId) { - var id, i; - if (!angular.isDefined(mapId)) { - if (Object.keys(d).length === 0) { - id = "main"; - } else if (Object.keys(d).length >= 1) { - for (i in d) { - if (d.hasOwnProperty(i)) { - id = i; - } - } - } else if (Object.keys(d).length === 0) { - id = "main"; - } else { - $log.error(_errorHeader + "- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call"); - } - } else { - id = mapId; - } - - return id; - } - - function _getUnresolvedDefer(d, mapId) { - var id = _obtainEffectiveMapId(d, mapId), - defer; - - if (!angular.isDefined(d[id]) || d[id].resolvedDefer === true) { - defer = $q.defer(); - d[id] = { - defer: defer, - resolvedDefer: false - }; - } else { - defer = d[id].defer; - } - - return defer; - } - - var _isDefined = function(value) { - return angular.isDefined(value) && value !== null; - }; - var _isUndefined = function(value){ - return !_isDefined(value); - }; - - return { - errorHeader: _errorHeader, - getObjectValue: _getObjectValue, - getObjectArrayPath:_getObjectArrayPath, - getObjectDotPath: _getObjectDotPath, - defaultTo: function(val, _default){ - return _isDefined(val) ? val : _default; - }, - //mainly for checking attributes of directives lets keep this minimal (on what we accept) - isTruthy: function(val){ - return val === 'true' || val === true; - }, - //Determine if a reference is {} - isEmpty: function(value) { - return Object.keys(value).length === 0; - }, - - //Determine if a reference is undefined or {} - isUndefinedOrEmpty: function (value) { - return (angular.isUndefined(value) || value === null) || Object.keys(value).length === 0; + //Determine if a reference is undefined or {} + isUndefinedOrEmpty: function (value) { + return (angular.isUndefined(value) || value === null) || Object.keys(value).length === 0; }, // Determine if a reference is defined @@ -1335,56 +963,198 @@ angular.module("leaflet-directive").factory('leafletHelpers', ["$q", "$log", fun } } } + }, + /* + watchOptions - object to set deep nested watches and turn off watches all together + (rely on control / functional updates) + watchOptions - Object + doWatch:boolean + isDeep:boolean (sets $watch(function,isDeep)) + individual + doWatch:boolean + isDeep:boolean + */ + //legacy defaults + watchOptions: { + doWatch:true, + isDeep: true, + individual:{ + doWatch:true, + isDeep: true + } } }; }]); angular.module('leaflet-directive').service('leafletIterators', ["$log", "leafletHelpers", function ($log, leafletHelpers) { - var $lhelp = leafletHelpers, - errorHeader = leafletHelpers.errorHeader + 'leafletIterators: '; + var lHlp = leafletHelpers, + errorHeader = leafletHelpers.errorHeader + 'leafletIterators: '; - var _hasErrors = function(collection, cb, ignoreCollection, cbName){ - if(!ignoreCollection) { - if (!$lhelp.isDefined(collection) || !$lhelp.isDefined(cb)) { - $log.error(errorHeader + 'collection or cb undefined'); - return true; - } - } - if(!$lhelp.isFunction(cb)){ - cbName = $lhelp.defaultTo(cb,'cb'); - $log.error(errorHeader + cbName + ' is not a function'); - return true; - } - return false; + //BEGIN COPY from underscore + var _keys = Object.keys; + var _isFunction = lHlp.isFunction; + var _isObject = lHlp.isObject; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + + var _isArrayLike = function(collection) { + var length = collection !== null && collection.length; + return lHlp.isNumber(length) && length >= 0 && length <= MAX_ARRAY_INDEX; + }; + + // Keep the identity function around for default iteratees. + var _identity = function(value) { + return value; + }; + + var _property = function(key) { + return function(obj) { + return obj === null ? void 0 : obj[key]; }; + }; - var _iterate = function(collection, externalCb, internalCb){ - if(_hasErrors(undefined, internalCb, true, 'internalCb')){ - return; - } - if(!_hasErrors(collection, externalCb)){ - for(var key in collection){ - internalCb(collection[key], key); - } + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount === null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + case 2: return function(value, other) { + return func.call(context, value, other); + }; + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, undefinedOnly) { + return function(obj) { + var length = arguments.length; + if (length < 2 || obj === null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; } + } + return obj; }; + }; + // Assigns a given object with all the own properties in the passed-in object(s) + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + var _extendOwn, _assign = null; + _extendOwn = _assign = createAssigner(_keys); + + // Returns whether an object has a given set of `key:value` pairs. + var _isMatch = function(object, attrs) { + var keys = _keys(attrs), length = keys.length; + if (object === null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; - //consider adding lodash or underscore but for now adding iterators as we need them - var _each = function(collection, cb){ - _iterate(collection, cb, function(val, key){ - cb(val, key); - }); + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + var _matcher, _matches = null; + _matcher = _matches = function(attrs) { + attrs = _extendOwn({}, attrs); + return function(obj) { + return _isMatch(obj, attrs); }; + }; - //lodash or underscore have preference - return window._ ? window._ : { - each:_each - }; + + // A mostly-internal function to generate callbacks that can be applied + // to each element in a collection, returning the desired result — either + // identity, an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (value === null) return _identity; + if (_isFunction(value)) return optimizeCb(value, context, argCount); + if (_isObject(value)) return _matcher(value); + return _property(value); + }; + + var _every, _all = null; + _every = _all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !_isArrayLike(obj) && _keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + }; + + //END COPY fron underscore + + var _hasErrors = function(collection, cb, ignoreCollection, cbName){ + if(!ignoreCollection) { + if (!lHlp.isDefined(collection) || !lHlp.isDefined(cb)) { + $log.error(errorHeader + 'collection or cb undefined'); + return true; + } + } + if(!lHlp.isFunction(cb)){ + cbName = lHlp.defaultTo(cb,'cb'); + $log.error(errorHeader + cbName + ' is not a function'); + return true; + } + return false; + }; + + var _iterate = function(collection, externalCb, internalCb){ + if(_hasErrors(undefined, internalCb, true, 'internalCb')){ + return; + } + if(!_hasErrors(collection, externalCb)){ + for(var key in collection){ + internalCb(collection[key], key); + } + } + }; + + + //consider adding lodash or underscore but for now adding iterators as we need them + var _each = function(collection, cb){ + _iterate(collection, cb, function(val, key){ + cb(val, key); + }); + }; + + //lodash or underscore have preference + return window._ ? window._ : { + each:_each, + every: _every, + all: _all + }; }]); -angular.module("leaflet-directive").factory('leafletLayerHelpers', ["$rootScope", "$log", "leafletHelpers", function ($rootScope, $log, leafletHelpers) { +angular.module("leaflet-directive") +.factory('leafletLayerHelpers', ["$rootScope", "$log", "leafletHelpers", function ($rootScope, $log, leafletHelpers) { var Helpers = leafletHelpers, isString = leafletHelpers.isString, isObject = leafletHelpers.isObject, @@ -1948,7 +1718,8 @@ angular.module("leaflet-directive").factory('leafletMapDefaults', ["$q", "leafle }]); angular.module("leaflet-directive") -.service('leafletMarkersHelpers', ["$rootScope", "leafletHelpers", "$log", "$compile", function ($rootScope, leafletHelpers, $log, $compile) { +.service('leafletMarkersHelpers', ["$rootScope", "leafletHelpers", "$log", "$compile", "leafletGeoJsonHelpers", function ($rootScope, leafletHelpers, $log, $compile, + leafletGeoJsonHelpers) { var isDefined = leafletHelpers.isDefined, defaultTo = leafletHelpers.defaultTo, @@ -1961,7 +1732,10 @@ angular.module("leaflet-directive") isString = leafletHelpers.isString, isNumber = leafletHelpers.isNumber, isObject = leafletHelpers.isObject, - groups = {}; + groups = {}, + geoHlp = leafletGeoJsonHelpers, + errorHeader = leafletHelpers.errorHeader; + var _string = function(marker){ //this exists since JSON.stringify barfs on cyclic @@ -1979,7 +1753,7 @@ angular.module("leaflet-directive") var createLeafletIcon = function(iconData) { if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'awesomeMarker') { if (!AwesomeMarkersPlugin.isLoaded()) { - $log.error('[AngularJS - Leaflet] The AwesomeMarkers Plugin is not loaded.'); + $log.error( errorHeader + ' The AwesomeMarkers Plugin is not loaded.'); } return new L.AwesomeMarkers.icon(iconData); @@ -1987,7 +1761,7 @@ angular.module("leaflet-directive") if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'makiMarker') { if (!MakiMarkersPlugin.isLoaded()) { - $log.error('[AngularJS - Leaflet] The MakiMarkers Plugin is not loaded.'); + $log.error(errorHeader + 'The MakiMarkers Plugin is not loaded.'); } return new L.MakiMarkers.icon(iconData); @@ -1995,7 +1769,7 @@ angular.module("leaflet-directive") if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'extraMarker') { if (!ExtraMarkersPlugin.isLoaded()) { - $log.error('[AngularJS - Leaflet] The ExtraMarkers Plugin is not loaded.'); + $log.error(errorHeader + 'The ExtraMarkers Plugin is not loaded.'); } return new L.ExtraMarkers.icon(iconData); } @@ -2123,8 +1897,14 @@ angular.module("leaflet-directive") manageOpenLabel: _manageOpenLabel, createMarker: function(markerData) { - if (!isDefined(markerData)) { - $log.error('[AngularJS - Leaflet] The marker definition is not valid.'); + if (!isDefined(markerData) || !geoHlp.validateCoords(markerData)){ + $log.error(errorHeader + 'The marker definition is not valid.'); + return; + } + var coords = geoHlp.getCoords(markerData); + + if (!isDefined(coords)){ + $log.error(errorHeader + 'Unable to get coordinates from markerData.'); return; } @@ -2144,7 +1924,7 @@ angular.module("leaflet-directive") } } - var marker = new L.marker(markerData, markerOptions); + var marker = new L.marker(coords, markerOptions); if (!isString(markerData.message)) { marker.unbindPopup(); @@ -2155,12 +1935,12 @@ angular.module("leaflet-directive") addMarkerToGroup: function(marker, groupName, groupOptions, map) { if (!isString(groupName)) { - $log.error('[AngularJS - Leaflet] The marker group you have specified is invalid.'); + $log.error(errorHeader + 'The marker group you have specified is invalid.'); return; } if (!MarkerClusterPlugin.isLoaded()) { - $log.error("[AngularJS - Leaflet] The MarkerCluster plugin is not loaded."); + $log.error(errorHeader + "The MarkerCluster plugin is not loaded."); return; } if (!isDefined(groups[groupName])) { @@ -2170,27 +1950,32 @@ angular.module("leaflet-directive") groups[groupName].addLayer(marker); }, - listenMarkerEvents: function(marker, markerData, leafletScope, watching) { + listenMarkerEvents: function(marker, markerData, leafletScope) { + //these should be deregistered on destroy .. possible leake + //handles should not be closures since they will need to be removed marker.on("popupopen", function(/* event */) { - if (watching) { - safeApply(leafletScope, function() { - markerData.focus = true; - }); - } else { - _manageOpenPopup(marker, markerData); - } + safeApply(leafletScope, function() { + markerData.focus = true; + _manageOpenPopup(marker, markerData);//needed since markerData is now a copy + }); }); marker.on("popupclose", function(/* event */) { - if (watching) { - safeApply(leafletScope, function() { - markerData.focus = false; - }); - } + safeApply(leafletScope, function() { + markerData.focus = false; + }); + }); + marker.on("add", function(/* event */) { + safeApply(leafletScope, function() { + if('label' in markerData) + _manageOpenLabel(marker, markerData); + }); }); }, - addMarkerWatcher: function(marker, name, leafletScope, layers, map) { + addMarkerWatcher: function(marker, name, leafletScope, layers, map, isDeepWatch) { var markerWatchPath = Helpers.getObjectArrayPath("markers." + name); + isDeepWatch = defaultTo(isDeepWatch, true); + //TODO:break up this 200 line function to be readable (nmccready) var clearWatch = leafletScope.$watch(markerWatchPath, function(markerData, oldMarkerData) { if (!isDefined(markerData)) { _deleteMarker(marker, map, layers); @@ -2203,7 +1988,7 @@ angular.module("leaflet-directive") } // Update the lat-lng property (always present in marker properties) - if (!(isNumber(markerData.lat) && isNumber(markerData.lng))) { + if (!geoHlp.validateCoords(markerData)) { $log.warn('There are problems with lat-lng data, please verify your marker model'); _deleteMarker(marker, map, layers); return; @@ -2253,13 +2038,13 @@ angular.module("leaflet-directive") // The markerData.layer is defined so we add the marker to the layer if it is different from the old data if (!isDefined(layers.overlays[markerData.layer])) { - $log.error('[AngularJS - Leaflet] You must use a name of an existing layer'); + $log.error(errorHeader + 'You must use a name of an existing layer'); return; } // Is a group layer? var layerGroup = layers.overlays[markerData.layer]; if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error('[AngularJS - Leaflet] A marker can only be added to a layer of type "group" or "featureGroup"'); + $log.error(errorHeader + 'A marker can only be added to a layer of type "group" or "featureGroup"'); return; } // The marker goes to a correct layer group, so first of all we add it @@ -2409,7 +2194,7 @@ angular.module("leaflet-directive") } else if (markerLatLng.lat !== markerData.lat || markerLatLng.lng !== markerData.lng) { marker.setLatLng([markerData.lat, markerData.lng]); } - }, true); + }, isDeepWatch); }, string: _string, log: _log @@ -2668,6 +2453,48 @@ angular.module("leaflet-directive").factory('leafletPathsHelpers', ["$rootScope" }; }]); +angular.module("leaflet-directive") +.service('leafletWatchHelpers', function (){ + + var _maybe = function(scope, watchFunctionName, thingToWatchStr, watchOptions, initCb){ + //watchOptions.isDeep is/should be ignored in $watchCollection + var unWatch = scope[watchFunctionName](thingToWatchStr, function(newValue, oldValue) { + initCb(newValue, oldValue); + if(!watchOptions.doWatch) + unWatch(); + }, watchOptions.isDeep); + + return unWatch; + }; + + /* + @name: maybeWatch + @description: Utility to watch something once or forever. + @returns unWatch function + @param watchOptions - see markersWatchOptions and or derrivatives. This object is used + to set watching to once and its watch depth. + */ + var _maybeWatch = function(scope, thingToWatchStr, watchOptions, initCb){ + return _maybe(scope, '$watch', thingToWatchStr, watchOptions, initCb); + }; + + /* + @name: _maybeWatchCollection + @description: Utility to watch something once or forever. + @returns unWatch function + @param watchOptions - see markersWatchOptions and or derrivatives. This object is used + to set watching to once and its watch depth. + */ + var _maybeWatchCollection = function(scope, thingToWatchStr, watchOptions, initCb){ + return _maybe(scope, '$watchCollection', thingToWatchStr, watchOptions, initCb); + }; + + return { + maybeWatch: _maybeWatch, + maybeWatchCollection: _maybeWatchCollection + }; +}); + angular.module("leaflet-directive").directive('bounds', ["$log", "$timeout", "leafletHelpers", "leafletBoundsHelpers", function ($log, $timeout, leafletHelpers, leafletBoundsHelpers) { return { restrict: "A", @@ -3092,7 +2919,16 @@ angular.module("leaflet-directive").directive('eventBroadcast', ["$log", "$rootS }; }]); -angular.module("leaflet-directive").directive('geojson', ["$log", "$rootScope", "leafletData", "leafletHelpers", function ($log, $rootScope, leafletData, leafletHelpers) { +angular.module("leaflet-directive") +.directive('geojson', ["$log", "$rootScope", "leafletData", "leafletHelpers", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", "leafletIterators", function ($log, $rootScope, leafletData, leafletHelpers, + leafletWatchHelpers, leafletDirectiveControlsHelpers,leafletIterators) { + + var _maybeWatchCollection = leafletWatchHelpers.maybeWatchCollection, + _watchOptions = leafletHelpers.watchOptions, + _extendDirectiveControls = leafletDirectiveControlsHelpers.extend, + hlp = leafletHelpers, + $it = leafletIterators; + return { restrict: "A", scope: false, @@ -3106,15 +2942,9 @@ angular.module("leaflet-directive").directive('geojson', ["$log", "$rootScope", leafletGeoJSON = {}; controller.getMap().then(function(map) { - leafletScope.$watchCollection("geojson", function(geojson) { - if (isDefined(leafletGeoJSON) && map.hasLayer(leafletGeoJSON)) { - map.removeLayer(leafletGeoJSON); - } - - if (!(isDefined(geojson) && isDefined(geojson.data))) { - return; - } + var watchOptions = leafletScope.geojsonWatchOptions || _watchOptions; + var _hookUpEvents = function(geojson){ var resetStyleOnMouseout = geojson.resetStyleOnMouseout; var onEachFeature; @@ -3148,6 +2978,32 @@ angular.module("leaflet-directive").directive('geojson', ["$log", "$rootScope", }); }; } + return onEachFeature; + }; + + var isNested = (hlp.isDefined(attrs.geojsonNested) && + hlp.isTruthy(attrs.geojsonNested)); + + var _clean = function(){ + var _remove = function(lObject) { + if (isDefined(lObject) && map.hasLayer(lObject)) { + map.removeLayer(lObject); + } + }; + if(isNested) { + $it.each(leafletGeoJSON, function(lObject) { + _remove(lObject); + }); + return; + } + _remove(leafletGeoJSON); + }; + + var _addGeojson = function(geojson, maybeName){ + if (!(isDefined(geojson) && isDefined(geojson.data))) { + return; + } + var onEachFeature = _hookUpEvents(geojson); if (!isDefined(geojson.options)) { geojson.options = { @@ -3158,10 +3014,37 @@ angular.module("leaflet-directive").directive('geojson', ["$log", "$rootScope", }; } - leafletGeoJSON = L.geoJson(geojson.data, geojson.options); + var lObject = L.geoJson(geojson.data, geojson.options); + + if(maybeName && hlp.isString(maybeName)){ + leafletGeoJSON[maybeName] = lObject; + } + else{ + leafletGeoJSON = lObject; + } leafletData.setGeoJSON(leafletGeoJSON, attrs.id); - leafletGeoJSON.addTo(map); + lObject.addTo(map); + }; + + var _create = function(model){ + _clean(); + if(isNested) { + if(!model || !Object.keys(model).length) + return; + $it.each(model, function(m, name) { + //name could be layerName and or groupName + //for now it is not tied to a layer + _addGeojson(m,name); + }); + return; + } + _addGeojson(model); + }; + _extendDirectiveControls(attrs.id, 'geojson', _create, _clean); + + _maybeWatchCollection(leafletScope,'geojson', watchOptions, function(geojson){ + _create(geojson); }); }); } @@ -3689,12 +3572,12 @@ angular.module("leaflet-directive").directive('legend', ["$log", "$http", "leafl }]); angular.module("leaflet-directive").directive('markers', - ["$log", "$rootScope", "$q", "leafletData", "leafletHelpers", "leafletMapDefaults", "leafletMarkersHelpers", "leafletEvents", "leafletIterators", function ($log, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, leafletMarkersHelpers, - leafletEvents, leafletIterators) { + ["$log", "$rootScope", "$q", "leafletData", "leafletHelpers", "leafletMapDefaults", "leafletMarkersHelpers", "leafletEvents", "leafletIterators", "leafletWatchHelpers", "leafletDirectiveControlsHelpers", function ($log, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, + leafletMarkersHelpers, leafletEvents, leafletIterators, leafletWatchHelpers, + leafletDirectiveControlsHelpers) { //less terse vars to helpers var isDefined = leafletHelpers.isDefined, errorHeader = leafletHelpers.errorHeader, - defaultTo= leafletHelpers.defaultTo, Helpers = leafletHelpers, isString = leafletHelpers.isString, addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher, @@ -3703,9 +3586,12 @@ angular.module("leaflet-directive").directive('markers', bindMarkerEvents = leafletEvents.bindMarkerEvents, createMarker = leafletMarkersHelpers.createMarker, deleteMarker = leafletMarkersHelpers.deleteMarker, - $it = leafletIterators; + $it = leafletIterators, + _markersWatchOptions = leafletHelpers.watchOptions, + maybeWatch = leafletWatchHelpers.maybeWatch, + extendDirectiveControls = leafletDirectiveControlsHelpers.extend; - var _maybeAddMarkerToLayer = function(layerName, layers, markerData, marker, shouldWatch, map){ + var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map){ if (!isString(layerName)) { $log.error(errorHeader + ' A layername must be a string'); @@ -3732,14 +3618,14 @@ angular.module("leaflet-directive").directive('markers', // The marker is automatically added to the map depending on the visibility // of the layer, so we only have to open the popup if the marker is in the map - if (!shouldWatch && map.hasLayer(marker) && markerData.focus === true) { - leafletMarkersHelpers.manageOpenPopup(marker, markerData); + if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) { + leafletMarkersHelpers.manageOpenPopup(marker, model); } return true; }; //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already) - var _addMarkers = function(markersToRender, map, layers, leafletMarkers, leafletScope, shouldWatch, maybeLayerName){ - shouldWatch = defaultTo(shouldWatch, false); + var _addMarkers = function(markersToRender, map, layers, leafletMarkers, leafletScope, + watchOptions, maybeLayerName){ for (var newName in markersToRender) { if (newName.search("-") !== -1) { @@ -3748,8 +3634,13 @@ angular.module("leaflet-directive").directive('markers', } if (!isDefined(leafletMarkers[newName])) { - var markerData = markersToRender[newName]; - var marker = createMarker(markerData); + //(nmccready) very important to not have model changes when lObject is changed + //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal + //if it is left as the reference then all changes from oldModel vs newModel are ignored + //see _destroy (where modelDiff becomes meaningless if we do not copy here) + var model = Helpers.copy(markersToRender[newName]); + var marker = createMarker(model); + var layerName = (model? model.layer : undefined) || maybeLayerName; //original way takes pref if (!isDefined(marker)) { $log.error(errorHeader + ' Received invalid data on the marker ' + newName + '.'); continue; @@ -3757,57 +3648,67 @@ angular.module("leaflet-directive").directive('markers', leafletMarkers[newName] = marker; // Bind message - if (isDefined(markerData.message)) { - marker.bindPopup(markerData.message, markerData.popupOptions); + if (isDefined(model.message)) { + marker.bindPopup(model.message, model.popupOptions); } // Add the marker to a cluster group if needed - if (isDefined(markerData.group)) { - var groupOptions = isDefined(markerData.groupOption) ? markerData.groupOption : null; - addMarkerToGroup(marker, markerData.group, groupOptions, map); + if (isDefined(model.group)) { + var groupOptions = isDefined(model.groupOption) ? model.groupOption : null; + addMarkerToGroup(marker, model.group, groupOptions, map); } // Show label if defined - if (Helpers.LabelPlugin.isLoaded() && isDefined(markerData.label) && isDefined(markerData.label.message)) { - marker.bindLabel(markerData.label.message, markerData.label.options); + if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) { + marker.bindLabel(model.label.message, model.label.options); } // Check if the marker should be added to a layer - if (isDefined(markerData) && (isDefined(markerData.layer) || isDefined(maybeLayerName))){ + if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))){ - var pass = _maybeAddMarkerToLayer( - markerData.layer || maybeLayerName, //original way takes pref - layers, - markerData, marker, shouldWatch, map - ); + var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker, + watchOptions.individual.doWatch, map); if(!pass) continue; //something went wrong move on in the loop - } else if (!isDefined(markerData.group)) { + } else if (!isDefined(model.group)) { // We do not have a layer attr, so the marker goes to the map layer map.addLayer(marker); - if (!shouldWatch && markerData.focus === true) { - leafletMarkersHelpers.manageOpenPopup(marker, markerData); + if (!watchOptions.individual.doWatch && model.focus === true) { + leafletMarkersHelpers.manageOpenPopup(marker, model); } } var pathToMarker = Helpers.getObjectDotPath(maybeLayerName? [maybeLayerName, newName]: [newName]); - if (shouldWatch) { - addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map); + if (watchOptions.individual.doWatch) { + addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map, + watchOptions.individual.doWatch); } - listenMarkerEvents(marker, markerData, leafletScope, shouldWatch); - bindMarkerEvents(marker, pathToMarker, markerData, leafletScope); + listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch); + bindMarkerEvents(marker, pathToMarker, model, leafletScope, layerName); } } }; - var _destroy = function(markerModels, lMarkers, map, layers){ + var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers){ // Delete markers from the array - var hasLogged = false; + var hasLogged = false, + modelIsDiff = false; + var doCheckOldModel = isDefined(oldMarkerModels); for (var name in lMarkers) { if(!hasLogged) { $log.debug(errorHeader + "[markers] destroy: "); hasLogged = true; } - if (!isDefined(markerModels) || !isDefined(markerModels[name])) { + + if(doCheckOldModel){ + //might want to make the option (in watch options) to disable deep checking + //ie the options to only check !== (reference check) instead of angular.equals (slow) + modelIsDiff = !angular.equals(markerModels[name],oldMarkerModels[name]); + } + if (!isDefined(markerModels) || + !Object.keys(markerModels).length || + !isDefined(markerModels[name]) || + !Object.keys(markerModels[name]).length || + modelIsDiff) { deleteMarker(lMarkers[name], map, layers); delete lMarkers[name]; } @@ -3838,22 +3739,38 @@ angular.module("leaflet-directive").directive('markers', }; } + var watchOptions = leafletScope.markersWatchOptions || _markersWatchOptions; + + // backwards compat + if(isDefined(attrs.watchMarkers)) + watchOptions.doWatch = watchOptions.individual.doWatch = + (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers)); + + var isNested = (isDefined(attrs.markersNested) && Helpers.isTruthy(attrs.markersNested)); + getLayers().then(function(layers) { - leafletData.setMarkers(leafletMarkers, attrs.id); - leafletScope.$watch('markers', function(newMarkers) { - _destroy(newMarkers, leafletMarkers, map, layers); - // Should we watch for every specific marker on the map? - var shouldWatch = (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers)); - var isNested = (isDefined(attrs.markersNested) && Helpers.isTruthy(attrs.markersNested)); + var _clean = function(models, oldModels){ + _destroy(models, oldModels, leafletMarkers, map, layers); + }; + var _create = function(models, oldModels){ + _clean(models, oldModels); if(isNested) { - $it.each(newMarkers, function(markersToAdd, layerName) { - _addMarkers(markersToAdd, map, layers, leafletMarkers, leafletScope, shouldWatch, layerName); + $it.each(models, function(markersToAdd, layerName) { + _addMarkers(markersToAdd, map, layers, leafletMarkers, leafletScope, + watchOptions, layerName); }); return; } - _addMarkers(newMarkers, map, layers, leafletMarkers, leafletScope, shouldWatch); - }, true); + _addMarkers(models, map, layers, leafletMarkers, leafletScope, + watchOptions); + }; + extendDirectiveControls(attrs.id, 'markers', _create, _clean); + leafletData.setMarkers(leafletMarkers, attrs.id); + + maybeWatch(leafletScope,'markers', watchOptions, function(newMarkers, oldMarkers){ + _create(newMarkers, oldMarkers); + }); }); }); } @@ -3992,126 +3909,642 @@ angular.module("leaflet-directive").directive('paths', ["$log", "$q", "leafletDa newPath.bindLabel(pathData.label.message, pathData.label.options); } - // Check if the marker should be added to a layer - if (isDefined(pathData) && isDefined(pathData.layer)) { + // Check if the marker should be added to a layer + if (isDefined(pathData) && isDefined(pathData.layer)) { + + if (!isString(pathData.layer)) { + $log.error('[AngularJS - Leaflet] A layername must be a string'); + continue; + } + if (!isDefined(layers)) { + $log.error('[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.'); + continue; + } + + if (!isDefined(layers.overlays) || !isDefined(layers.overlays[pathData.layer])) { + $log.error('[AngularJS - Leaflet] A marker can only be added to a layer of type "group"'); + continue; + } + var layerGroup = layers.overlays[pathData.layer]; + if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { + $log.error('[AngularJS - Leaflet] Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"'); + continue; + } + + // Listen for changes on the new path + leafletPaths[newName] = newPath; + // The path goes to a correct layer group, so first of all we add it + layerGroup.addLayer(newPath); + + if (shouldWatch) { + watchPathFn(newPath, newName); + } else { + setPathOptions(newPath, pathData.type, pathData); + } + } else if (isDefined(newPath)) { + // Listen for changes on the new path + leafletPaths[newName] = newPath; + map.addLayer(newPath); + + if (shouldWatch) { + watchPathFn(newPath, newName); + } else { + setPathOptions(newPath, pathData.type, pathData); + } + } + + bindPathEvents(newPath, newName, pathData, leafletScope); + } + } + }); + }); + }); + } + }; +}]); + +angular.module("leaflet-directive").directive('tiles', ["$log", "leafletData", "leafletMapDefaults", "leafletHelpers", function ($log, leafletData, leafletMapDefaults, leafletHelpers) { + return { + restrict: "A", + scope: false, + replace: false, + require: 'leaflet', + + link: function(scope, element, attrs, controller) { + var isDefined = leafletHelpers.isDefined, + leafletScope = controller.getLeafletScope(), + tiles = leafletScope.tiles; + + if (!isDefined(tiles) && !isDefined(tiles.url)) { + $log.warn("[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property."); + return; + } + + controller.getMap().then(function(map) { + var defaults = leafletMapDefaults.getDefaults(attrs.id); + var tileLayerObj; + leafletScope.$watch("tiles", function(tiles) { + var tileLayerOptions = defaults.tileLayerOptions; + var tileLayerUrl = defaults.tileLayer; + + // If no valid tiles are in the scope, remove the last layer + if (!isDefined(tiles.url) && isDefined(tileLayerObj)) { + map.removeLayer(tileLayerObj); + return; + } + + // No leafletTiles object defined yet + if (!isDefined(tileLayerObj)) { + if (isDefined(tiles.options)) { + angular.copy(tiles.options, tileLayerOptions); + } + + if (isDefined(tiles.url)) { + tileLayerUrl = tiles.url; + } + + tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions); + tileLayerObj.addTo(map); + leafletData.setTiles(tileLayerObj, attrs.id); + return; + } + + // If the options of the tilelayer is changed, we need to redraw the layer + if (isDefined(tiles.url) && isDefined(tiles.options) && !angular.equals(tiles.options, tileLayerOptions)) { + map.removeLayer(tileLayerObj); + tileLayerOptions = defaults.tileLayerOptions; + angular.copy(tiles.options, tileLayerOptions); + tileLayerUrl = tiles.url; + tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions); + tileLayerObj.addTo(map); + leafletData.setTiles(tileLayerObj, attrs.id); + return; + } + + // Only the URL of the layer is changed, update the tiles object + if (isDefined(tiles.url)) { + tileLayerObj.setUrl(tiles.url); + } + }, true); + }); + } + }; +}]); + +/* + Create multiple similar directives for watchOptions to support directiveControl + instead. (when watches are disabled) + NgAnnotate does not work here due to the functional creation +*/ +['markers', 'geojson'].forEach(function(name){ + angular.module("leaflet-directive").directive(name + 'WatchOptions', [ + '$log', '$rootScope', '$q', 'leafletData', 'leafletHelpers', + function ($log, $rootScope, $q, leafletData, leafletHelpers) { + + var isDefined = leafletHelpers.isDefined, + errorHeader = leafletHelpers.errorHeader, + isObject = leafletHelpers.isObject, + _watchOptions = leafletHelpers.watchOptions; + + return { + restrict: "A", + scope: false, + replace: false, + require: ['leaflet'], + + link: function (scope, element, attrs, controller) { + var mapController = controller[0], + leafletScope = mapController.getLeafletScope(); + + mapController.getMap().then(function () { + if (isDefined(scope[name + 'WatchOptions'])) { + if (isObject(scope[name + 'WatchOptions'])) + angular.extend(_watchOptions, scope[name + 'WatchOptions']); + else + $log.error(errorHeader + '[' + name + 'WatchOptions] is not an object'); + leafletScope[name + 'WatchOptions'] = _watchOptions; + } + }); + } + }; + }]); +}); + +angular.module("leaflet-directive") +.factory('leafletEventsHelpers', ["$rootScope", "$q", "$log", "leafletHelpers", function ($rootScope, $q, $log, leafletHelpers) { + var safeApply = leafletHelpers.safeApply, + isDefined = leafletHelpers.isDefined; + + var _fire = function(scope, broadcastName, logic, event, lObject, model, modelName, layerName){ + // Safely broadcast the event + safeApply(scope, function(){ + var toSend = { + leafletEvent: event, + leafletObject: lObject, + modelName: modelName, + model: model + }; + if (isDefined(layerName)) + angular.extend(toSend, {layerName: layerName}); + + if (logic === "emit") { + scope.$emit(broadcastName, toSend); + } else { + $rootScope.$broadcast(broadcastName, toSend); + } + }); + }; + + return { + fire: _fire + } +}]); + +angular.module("leaflet-directive") +.factory('leafletLabelEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletEventsHelpers", function ($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers) { + var Helpers = leafletHelpers, + fire = leafletEventsHelpers.fire; + + var _getAvailableLabelEvents = function () { + return [ + 'click', + 'dblclick', + 'mousedown', + 'mouseover', + 'mouseout', + 'contextmenu' + ]; + }; + + var _genDispatchLabelEvent = function (eventName, logic, leafletScope, label, name, model, layerName) { + return function (e) { + // Put together broadcast name + var broadcastName = 'leafletDirectiveLabel.' + eventName; + var markerName = scope_watch_name.replace('markers.', ''); + fire(leafletScope, broadcastName, logic, e, label, model, markerName, layerName); + }; + }; + + + var _genLabelEvents = function (eventName, logic, leafletScope, lObject, name, model, layerName) { + var labelEvents = _getAvailableLabelEvents(); + var scopeWatchName = Helpers.getObjectArrayPath("markers." + name); + for (var i = 0; i < labelEvents.length; i++) { + var eventName = labelEvents[i]; + lObject.label.on(eventName, + _genDispatchLabelEvent( + eventName, logic, leafletScope, lObject.label, scopeWatchName, model, layerName)); + } + }; + + return { + getAvailableLabelEvents: _getAvailableLabelEvents, + genDispatchLabelEvent: _genDispatchLabelEvent, + genLabelEvents: _genLabelEvents + }; +}]); + +angular.module("leaflet-directive") +.factory('leafletMapEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletEventsHelpers", function ($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers) { + var safeApply = leafletHelpers.safeApply, + isDefined = leafletHelpers.isDefined, + isObject = leafletHelpers.isObject, + Helpers = leafletHelpers, + errorHeader = leafletHelpers.errorHeader, + fire = leafletEventsHelpers.fire; + + var _getAvailableMapEvents = function() { + return [ + 'click', + 'dblclick', + 'mousedown', + 'mouseup', + 'mouseover', + 'mouseout', + 'mousemove', + 'contextmenu', + 'focus', + 'blur', + 'preclick', + 'load', + 'unload', + 'viewreset', + 'movestart', + 'move', + 'moveend', + 'dragstart', + 'drag', + 'dragend', + 'zoomstart', + 'zoomend', + 'zoomlevelschange', + 'resize', + 'autopanstart', + 'layeradd', + 'layerremove', + 'baselayerchange', + 'overlayadd', + 'overlayremove', + 'locationfound', + 'locationerror', + 'popupopen', + 'popupclose', + 'draw:created', + 'draw:edited', + 'draw:deleted', + 'draw:drawstart', + 'draw:drawstop', + 'draw:editstart', + 'draw:editstop', + 'draw:deletestart', + 'draw:deletestop' + ]; + }; + + var _genDispatchMapEvent = function(scope, eventName, logic) { + return function(e) { + // Put together broadcast name + var broadcastName = 'leafletDirectiveMap.' + eventName; + // Safely broadcast the event + fire(scope, broadcastName, logic, e, e.target, scope) + }; + }; + + var _notifyCenterChangedToBounds = function(scope) { + scope.$broadcast("boundsChanged"); + }; + + var _notifyCenterUrlHashChanged = function(scope, map, attrs, search) { + if (!isDefined(attrs.urlHashCenter)) { + return; + } + var center = map.getCenter(); + var centerUrlHash = (center.lat).toFixed(4) + ":" + (center.lng).toFixed(4) + ":" + map.getZoom(); + if (!isDefined(search.c) || search.c !== centerUrlHash) { + //$log.debug("notified new center..."); + scope.$emit("centerUrlHash", centerUrlHash); + } + }; + + return { + getAvailableMapEvents: _getAvailableMapEvents, + genDispatchMapEvent: _genDispatchMapEvent, + notifyCenterChangedToBounds: _notifyCenterChangedToBounds, + notifyCenterUrlHashChanged: _notifyCenterUrlHashChanged + }; +}]); + +angular.module("leaflet-directive") +.factory('leafletMarkerEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletEventsHelpers", "leafletLabelEvents", function ($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers, leafletLabelEvents) { + var safeApply = leafletHelpers.safeApply, + isDefined = leafletHelpers.isDefined, + isObject = leafletHelpers.isObject, + Helpers = leafletHelpers, + errorHeader = leafletHelpers.errorHeader, + fire = leafletEventsHelpers.fire, + lblHelp = leafletLabelEvents; + + /* + argument: name: Note this can be a single string or dot notation + Example: + markerModel : { + m1: { lat:_, lon: _} + } + //would yield name of + name = "m1" + + If nested: + markerModel : { + cars: { + m1: { lat:_, lon: _} + } + } + //would yield name of + name = "cars.m1" + */ + var _genDispatchMarkerEvent = function (eventName, logic, leafletScope, lObject, name, model, layerName) { + return function (e) { + var broadcastName = 'leafletDirectiveMarker.' + eventName; - if (!isString(pathData.layer)) { - $log.error('[AngularJS - Leaflet] A layername must be a string'); - continue; - } - if (!isDefined(layers)) { - $log.error('[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.'); - continue; - } + // Broadcast old marker click name for backwards compatibility + if (eventName === "click") { + safeApply(leafletScope, function () { + $rootScope.$broadcast('leafletDirectiveMarkersClick', name); + }); + } else if (eventName === 'dragend') { + safeApply(leafletScope, function () { + model.lat = lObject.getLatLng().lat; + model.lng = lObject.getLatLng().lng; + }); + if (model.message && model.focus === true) { + lObject.openPopup(); + } + } - if (!isDefined(layers.overlays) || !isDefined(layers.overlays[pathData.layer])) { - $log.error('[AngularJS - Leaflet] A marker can only be added to a layer of type "group"'); - continue; - } - var layerGroup = layers.overlays[pathData.layer]; - if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error('[AngularJS - Leaflet] Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"'); - continue; - } + fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName); + }; + }; - // Listen for changes on the new path - leafletPaths[newName] = newPath; - // The path goes to a correct layer group, so first of all we add it - layerGroup.addLayer(newPath); + var _getAvailableMarkerEvents = function () { + return [ + 'click', + 'dblclick', + 'mousedown', + 'mouseover', + 'mouseout', + 'contextmenu', + 'dragstart', + 'drag', + 'dragend', + 'move', + 'remove', + 'popupopen', + 'popupclose' + ]; + }; - if (shouldWatch) { - watchPathFn(newPath, newName); - } else { - setPathOptions(newPath, pathData.type, pathData); - } - } else if (isDefined(newPath)) { - // Listen for changes on the new path - leafletPaths[newName] = newPath; - map.addLayer(newPath); + return { + getAvailableMarkerEvents: _getAvailableMarkerEvents, - if (shouldWatch) { - watchPathFn(newPath, newName); + bindMarkerEvents: function (lObject, name, model, leafletScope, layerName) { + var markerEvents = []; + var i; + var eventName; + var logic = "emit"; + + if (!isDefined(leafletScope.eventBroadcast)) { + // Backward compatibility, if no event-broadcast attribute, all events are broadcasted + markerEvents = _getAvailableMarkerEvents(); + } else if (!isObject(leafletScope.eventBroadcast)) { + // Not a valid object + $log.error(errorHeader + "event-broadcast must be an object check your model."); + } else { + // We have a possible valid object + if (!isDefined(leafletScope.eventBroadcast.marker)) { + // We do not have events enable/disable do we do nothing (all enabled by default) + markerEvents = _getAvailableMarkerEvents(); + } else if (!isObject(leafletScope.eventBroadcast.marker)) { + // Not a valid object + $log.warn(errorHeader + "event-broadcast.marker must be an object check your model."); + } else { + // We have a possible valid map object + // Event propadation logic + if (leafletScope.eventBroadcast.marker.logic !== undefined && leafletScope.eventBroadcast.marker.logic !== null) { + // We take care of possible propagation logic + if (leafletScope.eventBroadcast.marker.logic !== "emit" && leafletScope.eventBroadcast.marker.logic !== "broadcast") { + // This is an error + $log.warn(errorHeader + "Available event propagation logic are: 'emit' or 'broadcast'."); + } else if (leafletScope.eventBroadcast.marker.logic === "emit") { + logic = "emit"; + } + } + // Enable / Disable + var markerEventsEnable = false, markerEventsDisable = false; + if (leafletScope.eventBroadcast.marker.enable !== undefined && leafletScope.eventBroadcast.marker.enable !== null) { + if (typeof leafletScope.eventBroadcast.marker.enable === 'object') { + markerEventsEnable = true; + } + } + if (leafletScope.eventBroadcast.marker.disable !== undefined && leafletScope.eventBroadcast.marker.disable !== null) { + if (typeof leafletScope.eventBroadcast.marker.disable === 'object') { + markerEventsDisable = true; + } + } + if (markerEventsEnable && markerEventsDisable) { + // Both are active, this is an error + $log.warn(errorHeader + "can not enable and disable events at the same time"); + } else if (!markerEventsEnable && !markerEventsDisable) { + // Both are inactive, this is an error + $log.warn(errorHeader + "must enable or disable events"); + } else { + // At this point the marker object is OK, lets enable or disable events + if (markerEventsEnable) { + // Enable events + for (i = 0; i < leafletScope.eventBroadcast.marker.enable.length; i++) { + eventName = leafletScope.eventBroadcast.marker.enable[i]; + // Do we have already the event enabled? + if (markerEvents.indexOf(eventName) !== -1) { + // Repeated event, this is an error + $log.warn(errorHeader + "This event " + eventName + " is already enabled"); + } else { + // Does the event exists? + if (_getAvailableMarkerEvents().indexOf(eventName) === -1) { + // The event does not exists, this is an error + $log.warn(errorHeader + "This event " + eventName + " does not exist"); } else { - setPathOptions(newPath, pathData.type, pathData); + // All ok enable the event + markerEvents.push(eventName); } } + } + } else { + // Disable events + markerEvents = _getAvailableMarkerEvents(); + for (i = 0; i < leafletScope.eventBroadcast.marker.disable.length; i++) { + eventName = leafletScope.eventBroadcast.marker.disable[i]; + var index = markerEvents.indexOf(eventName); + if (index === -1) { + // The event does not exist + $log.warn(errorHeader + "This event " + eventName + " does not exist or has been already disabled"); - bindPathEvents(newPath, newName, pathData, leafletScope); + } else { + markerEvents.splice(index, 1); + } } } - }); - }); - }); + } + } + } + + for (i = 0; i < markerEvents.length; i++) { + eventName = markerEvents[i]; + lObject.on(eventName, + _genDispatchMarkerEvent(eventName, logic, leafletScope, lObject, name, model, layerName)); + } + + if (Helpers.LabelPlugin.isLoaded() && isDefined(lObject.label)) { + lblHelp.genLabelEvents(name, logic, leafletScope, lObject, model, layerName); + } } }; }]); -angular.module("leaflet-directive").directive('tiles', ["$log", "leafletData", "leafletMapDefaults", "leafletHelpers", function ($log, leafletData, leafletMapDefaults, leafletHelpers) { - return { - restrict: "A", - scope: false, - replace: false, - require: 'leaflet', - - link: function(scope, element, attrs, controller) { - var isDefined = leafletHelpers.isDefined, - leafletScope = controller.getLeafletScope(), - tiles = leafletScope.tiles; +angular.module("leaflet-directive") +.factory('leafletPathEvents', ["$rootScope", "$q", "$log", "leafletHelpers", "leafletLabelEvents", function ($rootScope, $q, $log, leafletHelpers, leafletLabelEvents) { + var safeApply = leafletHelpers.safeApply, + isDefined = leafletHelpers.isDefined, + isObject = leafletHelpers.isObject, + Helpers = leafletHelpers, + errorHeader = leafletHelpers.errorHeader, + lblHelp = leafletLabelEvents; - if (!isDefined(tiles) && !isDefined(tiles.url)) { - $log.warn("[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property."); - return; - } + var _genDispatchPathEvent = function (eventName, logic, leafletScope, lObject, name, model, layerName) { + return function (e) { + var broadcastName = 'leafletDirectivePath.' + eventName; - controller.getMap().then(function(map) { - var defaults = leafletMapDefaults.getDefaults(attrs.id); - var tileLayerObj; - leafletScope.$watch("tiles", function(tiles) { - var tileLayerOptions = defaults.tileLayerOptions; - var tileLayerUrl = defaults.tileLayer; + fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName); + }; + }; - // If no valid tiles are in the scope, remove the last layer - if (!isDefined(tiles.url) && isDefined(tileLayerObj)) { - map.removeLayer(tileLayerObj); - return; + var _bindPathEvents = function (lObject, name, model, leafletScope) { + var pathEvents = [], + i, + eventName, + logic = "broadcast"; + + if (!isDefined(leafletScope.eventBroadcast)) { + // Backward compatibility, if no event-broadcast attribute, all events are broadcasted + pathEvents = _getAvailablePathEvents(); + } else if (!isObject(leafletScope.eventBroadcast)) { + // Not a valid object + $log.error(errorHeader + "event-broadcast must be an object check your model."); + } else { + // We have a possible valid object + if (!isDefined(leafletScope.eventBroadcast.path)) { + // We do not have events enable/disable do we do nothing (all enabled by default) + pathEvents = _getAvailablePathEvents(); + } else if (isObject(leafletScope.eventBroadcast.paths)) { + // Not a valid object + $log.warn(errorHeader + "event-broadcast.path must be an object check your model."); + } else { + // We have a possible valid map object + // Event propadation logic + if (leafletScope.eventBroadcast.path.logic !== undefined && leafletScope.eventBroadcast.path.logic !== null) { + // We take care of possible propagation logic + if (leafletScope.eventBroadcast.path.logic !== "emit" && leafletScope.eventBroadcast.path.logic !== "broadcast") { + // This is an error + $log.warn(errorHeader + "Available event propagation logic are: 'emit' or 'broadcast'."); + } else if (leafletScope.eventBroadcast.path.logic === "emit") { + logic = "emit"; } - - // No leafletTiles object defined yet - if (!isDefined(tileLayerObj)) { - if (isDefined(tiles.options)) { - angular.copy(tiles.options, tileLayerOptions); + } + // Enable / Disable + var pathEventsEnable = false, pathEventsDisable = false; + if (leafletScope.eventBroadcast.path.enable !== undefined && leafletScope.eventBroadcast.path.enable !== null) { + if (typeof leafletScope.eventBroadcast.path.enable === 'object') { + pathEventsEnable = true; + } + } + if (leafletScope.eventBroadcast.path.disable !== undefined && leafletScope.eventBroadcast.path.disable !== null) { + if (typeof leafletScope.eventBroadcast.path.disable === 'object') { + pathEventsDisable = true; + } + } + if (pathEventsEnable && pathEventsDisable) { + // Both are active, this is an error + $log.warn(errorHeader + "can not enable and disable events at the same time"); + } else if (!pathEventsEnable && !pathEventsDisable) { + // Both are inactive, this is an error + $log.warn(errorHeader + "must enable or disable events"); + } else { + // At this point the path object is OK, lets enable or disable events + if (pathEventsEnable) { + // Enable events + for (i = 0; i < leafletScope.eventBroadcast.path.enable.length; i++) { + eventName = leafletScope.eventBroadcast.path.enable[i]; + // Do we have already the event enabled? + if (pathEvents.indexOf(eventName) !== -1) { + // Repeated event, this is an error + $log.warn(errorHeader + "This event " + eventName + " is already enabled"); + } else { + // Does the event exists? + if (_getAvailablePathEvents().indexOf(eventName) === -1) { + // The event does not exists, this is an error + $log.warn(errorHeader + "This event " + eventName + " does not exist"); + } else { + // All ok enable the event + pathEvents.push(eventName); + } + } } - - if (isDefined(tiles.url)) { - tileLayerUrl = tiles.url; + } else { + // Disable events + pathEvents = _getAvailablePathEvents(); + for (i = 0; i < leafletScope.eventBroadcast.path.disable.length; i++) { + eventName = leafletScope.eventBroadcast.path.disable[i]; + var index = pathEvents.indexOf(eventName); + if (index === -1) { + // The event does not exist + $log.warn(errorHeader + "This event " + eventName + " does not exist or has been already disabled"); + + } else { + pathEvents.splice(index, 1); + } } - - tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions); - tileLayerObj.addTo(map); - leafletData.setTiles(tileLayerObj, attrs.id); - return; } + } + } + } - // If the options of the tilelayer is changed, we need to redraw the layer - if (isDefined(tiles.url) && isDefined(tiles.options) && !angular.equals(tiles.options, tileLayerOptions)) { - map.removeLayer(tileLayerObj); - tileLayerOptions = defaults.tileLayerOptions; - angular.copy(tiles.options, tileLayerOptions); - tileLayerUrl = tiles.url; - tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions); - tileLayerObj.addTo(map); - leafletData.setTiles(tileLayerObj, attrs.id); - return; - } + for (i = 0; i < pathEvents.length; i++) { + eventName = pathEvents[i]; + lObject.on(eventName, _genDispatchPathEvent(eventName, logic, leafletScope, pathEvents, name)); + } - // Only the URL of the layer is changed, update the tiles object - if (isDefined(tiles.url)) { - tileLayerObj.setUrl(tiles.url); - } - }, true); - }); + if (Helpers.LabelPlugin.isLoaded() && isDefined(lObject.label)) { + lblHelp.genLabelEvents(leafletScope, logic, lObject, name); } }; + + var _getAvailablePathEvents = function () { + return [ + 'click', + 'dblclick', + 'mousedown', + 'mouseover', + 'mouseout', + 'contextmenu', + 'add', + 'remove', + 'popupopen', + 'popupclose' + ]; + }; + + return { + getAvailablePathEvents: _getAvailablePathEvents, + bindPathEvents: _bindPathEvents + }; }]); }(angular)); \ No newline at end of file diff --git a/dist/angular-leaflet-directive.min.js b/dist/angular-leaflet-directive.min.js index 84aaa06e..0383262b 100644 --- a/dist/angular-leaflet-directive.min.js +++ b/dist/angular-leaflet-directive.min.js @@ -28,10 +28,11 @@ */ /*! -* angular-leaflet-directive 0.7.11 2015-03-28 +* angular-leaflet-directive 0.7.13 2015-04-14 * angular-leaflet-directive - An AngularJS directive to easily interact with Leaflet maps * git: https://github.com/tombatossals/angular-leaflet-directive */ -!function(angular){"use strict";angular.module("leaflet-directive",[]).directive("leaflet",["$q","leafletData","leafletMapDefaults","leafletHelpers","leafletEvents",function(a,b,c,d,e){var f;return{restrict:"EA",replace:!0,scope:{center:"=",defaults:"=",maxbounds:"=",bounds:"=",markers:"=",legend:"=",geojson:"=",paths:"=",tiles:"=",layers:"=",controls:"=",decorations:"=",eventBroadcast:"="},transclude:!0,template:'
',controller:["$scope",function(b){f=a.defer(),this.getMap=function(){return f.promise},this.getLeafletScope=function(){return b}}],link:function(a,g,h){function i(){isNaN(h.width)?g.css("width",h.width):g.css("width",h.width+"px")}function j(){isNaN(h.height)?g.css("height",h.height):g.css("height",h.height+"px")}var k=d.isDefined,l=c.setDefaults(a.defaults,h.id),m=e.genDispatchMapEvent,n=e.getAvailableMapEvents();k(h.width)&&(i(),a.$watch(function(){return g[0].getAttribute("width")},function(){i(),o.invalidateSize()})),k(h.height)&&(j(),a.$watch(function(){return g[0].getAttribute("height")},function(){j(),o.invalidateSize()}));var o=new L.Map(g[0],c.getMapCreationDefaults(h.id));if(f.resolve(o),k(h.center)||o.setView([l.center.lat,l.center.lng],l.center.zoom),!k(h.tiles)&&!k(h.layers)){var p=L.tileLayer(l.tileLayer,l.tileLayerOptions);p.addTo(o),b.setTiles(p,h.id)}if(k(o.zoomControl)&&k(l.zoomControlPosition)&&o.zoomControl.setPosition(l.zoomControlPosition),k(o.zoomControl)&&l.zoomControl===!1&&o.zoomControl.removeFrom(o),k(o.zoomsliderControl)&&k(l.zoomsliderControl)&&l.zoomsliderControl===!1&&o.zoomsliderControl.removeFrom(o),!k(h.eventBroadcast))for(var q="broadcast",r=0;r1},i=function(a){var b=d.getDefaults(a),c={collapsed:b.controls.layers.collapsed,position:b.controls.layers.position};angular.extend(c,b.controls.layers.options);var e;return e=b.controls.layers&&f(b.controls.layers.control)?b.controls.layers.control.apply(this,[[],[],c]):new L.control.layers([],[],c)};return{layersControlMustBeVisible:h,updateLayersControl:function(a,b,c,d,e,j){var k,l=g[b],m=h(d,e,b);if(f(l)&&c){for(k in j.baselayers)l.removeLayer(j.baselayers[k]);for(k in j.overlays)l.removeLayer(j.overlays[k]);l.removeFrom(a),delete g[b]}if(m){l=i(b),g[b]=l;for(k in d){var n=f(d[k].layerOptions)&&d[k].layerOptions.showOnSelector===!1;!n&&f(j.baselayers[k])&&l.addBaseLayer(j.baselayers[k],d[k].name)}for(k in e){var o=f(e[k].layerOptions)&&e[k].layerOptions.showOnSelector===!1;!o&&f(j.overlays[k])&&l.addOverlay(j.overlays[k],e[k].name)}l.addTo(a)}return m}}}]),angular.module("leaflet-directive").service("leafletData",["$log","$q","leafletHelpers",function(a,b,c){var d=c.getDefer,e=c.getUnresolvedDefer,f=c.setResolvedDefer,g={},h={},i={},j={},k={},l={},m={},n={};this.setMap=function(a,b){var c=e(g,b);c.resolve(a),f(g,b)},this.getMap=function(a){var b=d(g,a);return b.promise},this.unresolveMap=function(a){var b=c.obtainEffectiveMapId(g,a);g[b]=void 0,h[b]=void 0,i[b]=void 0,j[b]=void 0,k[b]=void 0,l[b]=void 0,m[b]=void 0,n[b]=void 0},this.getPaths=function(a){var b=d(j,a);return b.promise},this.setPaths=function(a,b){var c=e(j,b);c.resolve(a),f(j,b)},this.getMarkers=function(a){var b=d(k,a);return b.promise},this.setMarkers=function(a,b){var c=e(k,b);c.resolve(a),f(k,b)},this.getLayers=function(a){var b=d(i,a);return b.promise},this.setLayers=function(a,b){var c=e(i,b);c.resolve(a),f(i,b)},this.getUTFGrid=function(a){var b=d(m,a);return b.promise},this.setUTFGrid=function(a,b){var c=e(m,b);c.resolve(a),f(m,b)},this.setTiles=function(a,b){var c=e(h,b);c.resolve(a),f(h,b)},this.getTiles=function(a){var b=d(h,a);return b.promise},this.setGeoJSON=function(a,b){var c=e(l,b);c.resolve(a),f(l,b)},this.getGeoJSON=function(a){var b=d(l,a);return b.promise},this.setDecorations=function(a,b){var c=e(n,b);c.resolve(a),f(n,b)},this.getDecorations=function(a){var b=d(n,a);return b.promise}}]),angular.module("leaflet-directive").factory("leafletEvents",["$rootScope","$q","$log","leafletHelpers",function(a,b,c,d){var e=d.safeApply,f=d.isDefined,g=d.isObject,h=d,i=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu"]},j=function(a,b,c,d){for(var e=i(),f=h.getObjectArrayPath("markers."+d),g=0;g=1)for(f in a)a.hasOwnProperty(f)&&(d=f);else 0===Object.keys(a).length?d="main":b.error(e+"- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call");return d}function d(b,d){var e,f=c(b,d);return angular.isDefined(b[f])&&b[f].resolvedDefer!==!0?e=b[f].defer:(e=a.defer(),b[f]={defer:e,resolvedDefer:!1}),e}var e="[AngularJS - Leaflet] ",f=function(a,b){var c;return null!==b&&angular.isString(b)?(c=a,b.split(".").forEach(function(a){c&&(c=c[a])}),c):b},g=function(a){return a.split(".").reduce(function(a,b){return a+'["'+b+'"]'})},h=function(a){return a.reduce(function(a,b){return a+"."+b})},i=function(a){return angular.isDefined(a)&&null!==a},j=function(a){return!i(a)};return{errorHeader:e,getObjectValue:f,getObjectArrayPath:g,getObjectDotPath:h,defaultTo:function(a,b){return i(a)?a:b},isTruthy:function(a){return"true"===a||a===!0},isEmpty:function(a){return 0===Object.keys(a).length},isUndefinedOrEmpty:function(a){return angular.isUndefined(a)||null===a||0===Object.keys(a).length},isDefined:i,isUndefined:j,isNumber:function(a){return angular.isNumber(a)},isString:function(a){return angular.isString(a)},isArray:function(a){return angular.isArray(a)},isObject:function(a){return angular.isObject(a)},isFunction:function(a){return angular.isFunction(a)},equals:function(a,b){return angular.equals(a,b)},isValidCenter:function(a){return angular.isDefined(a)&&angular.isNumber(a.lat)&&angular.isNumber(a.lng)&&angular.isNumber(a.zoom)},isValidPoint:function(a){return angular.isDefined(a)?angular.isArray(a)?2===a.length&&angular.isNumber(a[0])&&angular.isNumber(a[1]):angular.isNumber(a.lat)&&angular.isNumber(a.lng):!1},isSameCenterOnMap:function(a,b){var c=b.getCenter(),d=b.getZoom();return a.lat&&a.lng&&c.lat.toFixed(4)===a.lat.toFixed(4)&&c.lng.toFixed(4)===a.lng.toFixed(4)&&d===a.zoom?!0:!1},safeApply:function(a,b){var c=a.$root.$$phase;"$apply"===c||"$digest"===c?a.$eval(b):a.$evalAsync(b)},obtainEffectiveMapId:c,getDefer:function(a,b){var e,f=c(a,b);return e=angular.isDefined(a[f])&&a[f].resolvedDefer!==!1?a[f].defer:d(a,b)},getUnresolvedDefer:d,setResolvedDefer:function(a,b){var d=c(a,b);a[d].resolvedDefer=!0},AwesomeMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.AwesomeMarkers)&&angular.isDefined(L.AwesomeMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.AwesomeMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},PolylineDecoratorPlugin:{isLoaded:function(){return angular.isDefined(L.PolylineDecorator)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.PolylineDecorator:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},MakiMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.MakiMarkers)&&angular.isDefined(L.MakiMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.MakiMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},ExtraMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.ExtraMarkers)&&angular.isDefined(L.ExtraMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.ExtraMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},LabelPlugin:{isLoaded:function(){return angular.isDefined(L.Label)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},MarkerClusterPlugin:{isLoaded:function(){return angular.isDefined(L.MarkerClusterGroup)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},GoogleLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Google)},is:function(a){return this.isLoaded()?a instanceof L.Google:!1}},ChinaLayerPlugin:{isLoaded:function(){return angular.isDefined(L.tileLayer.chinaProvider)}},HeatMapLayerPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.WebGLHeatMap)}},BingLayerPlugin:{isLoaded:function(){return angular.isDefined(L.BingLayer)},is:function(a){return this.isLoaded()?a instanceof L.BingLayer:!1}},WFSLayerPlugin:{isLoaded:function(){return void 0!==L.GeoJSON.WFS},is:function(a){return this.isLoaded()?a instanceof L.GeoJSON.WFS:!1}},AGSLayerPlugin:{isLoaded:function(){return void 0!==lvector&&void 0!==lvector.AGS},is:function(a){return this.isLoaded()?a instanceof lvector.AGS:!1}},YandexLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Yandex)},is:function(a){return this.isLoaded()?a instanceof L.Yandex:!1}},DynamicMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.dynamicMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.dynamicMapLayer:!1}},GeoJSONPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.GeoJSON)},is:function(a){return this.isLoaded()?a instanceof L.TileLayer.GeoJSON:!1}},UTFGridPlugin:{isLoaded:function(){return angular.isDefined(L.UtfGrid)},is:function(a){return this.isLoaded()?a instanceof L.UtfGrid:(b.error("[AngularJS - Leaflet] No UtfGrid plugin found."),!1)}},CartoDB:{isLoaded:function(){return cartodb},is:function(){return!0}},Leaflet:{DivIcon:{is:function(a){return a instanceof L.DivIcon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}},Icon:{is:function(a){return a instanceof L.Icon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}}}}}]),angular.module("leaflet-directive").service("leafletIterators",["$log","leafletHelpers",function(a,b){var c=b,d=b.errorHeader+"leafletIterators: ",e=function(b,e,f,g){return f||c.isDefined(b)&&c.isDefined(e)?c.isFunction(e)?!1:(g=c.defaultTo(e,"cb"),a.error(d+g+" is not a function"),!0):(a.error(d+"collection or cb undefined"),!0)},f=function(a,b,c){if(!e(void 0,c,!0,"internalCb")&&!e(a,b))for(var d in a)c(a[d],d)},g=function(a,b){f(a,b,function(a,c){b(a,c)})};return window._?window._:{each:g}}]),angular.module("leaflet-directive").factory("leafletLayerHelpers",["$rootScope","$log","leafletHelpers",function($rootScope,$log,leafletHelpers){function isValidLayerType(a){return isString(a.type)?-1===Object.keys(layerTypes).indexOf(a.type)?($log.error("[AngularJS - Leaflet] A layer must have a valid type: "+Object.keys(layerTypes)),!1):layerTypes[a.type].mustHaveUrl&&!isString(a.url)?($log.error("[AngularJS - Leaflet] A base layer must have an url"),!1):layerTypes[a.type].mustHaveData&&!isDefined(a.data)?($log.error('[AngularJS - Leaflet] The base layer must have a "data" array attribute'),!1):layerTypes[a.type].mustHaveLayer&&!isDefined(a.layer)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have an layer defined"),!1):layerTypes[a.type].mustHaveBounds&&!isDefined(a.bounds)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have bounds defined"),!1):layerTypes[a.type].mustHaveKey&&!isDefined(a.key)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have key defined"),!1):!0:($log.error("[AngularJS - Leaflet] A layer must have a valid type defined."),!1)}function createLayer(a){if(isValidLayerType(a)){if(!isString(a.name))return void $log.error("[AngularJS - Leaflet] A base layer must have a name");isObject(a.layerParams)||(a.layerParams={}),isObject(a.layerOptions)||(a.layerOptions={});for(var b in a.layerParams)a.layerOptions[b]=a.layerParams[b];var c={url:a.url,data:a.data,options:a.layerOptions,layer:a.layer,type:a.layerType,bounds:a.bounds,key:a.key,pluginOptions:a.pluginOptions,user:a.user};return layerTypes[a.type].createLayer(c)}}var Helpers=leafletHelpers,isString=leafletHelpers.isString,isObject=leafletHelpers.isObject,isDefined=leafletHelpers.isDefined,utfGridCreateLayer=function(a){if(!Helpers.UTFGridPlugin.isLoaded())return void $log.error("[AngularJS - Leaflet] The UTFGrid plugin is not loaded.");var b=new L.UtfGrid(a.url,a.pluginOptions);return b.on("mouseover",function(a){$rootScope.$broadcast("leafletDirectiveMap.utfgridMouseover",a)}),b.on("mouseout",function(a){$rootScope.$broadcast("leafletDirectiveMap.utfgridMouseout",a)}),b.on("click",function(a){$rootScope.$broadcast("leafletDirectiveMap.utfgridClick",a)}),b},layerTypes={xyz:{mustHaveUrl:!0,createLayer:function(a){return L.tileLayer(a.url,a.options)}},mapbox:{mustHaveKey:!0,createLayer:function(a){var b="//{s}.tiles.mapbox.com/v3/"+a.key+"/{z}/{x}/{y}.png";return L.tileLayer(b,a.options)}},geoJSON:{mustHaveUrl:!0,createLayer:function(a){return Helpers.GeoJSONPlugin.isLoaded()?new L.TileLayer.GeoJSON(a.url,a.pluginOptions,a.options):void 0}},utfGrid:{mustHaveUrl:!0,createLayer:utfGridCreateLayer},cartodbTiles:{mustHaveKey:!0,createLayer:function(a){var b="//"+a.user+".cartodb.com/api/v1/map/"+a.key+"/{z}/{x}/{y}.png";return L.tileLayer(b,a.options)}},cartodbUTFGrid:{mustHaveKey:!0,mustHaveLayer:!0,createLayer:function(a){return a.url="//"+a.user+".cartodb.com/api/v1/map/"+a.key+"/"+a.layer+"/{z}/{x}/{y}.grid.json",utfGridCreateLayer(a)}},cartodbInteractive:{mustHaveKey:!0,mustHaveLayer:!0,createLayer:function(a){var b="//"+a.user+".cartodb.com/api/v1/map/"+a.key+"/{z}/{x}/{y}.png",c=L.tileLayer(b,a.options);a.url="//"+a.user+".cartodb.com/api/v1/map/"+a.key+"/"+a.layer+"/{z}/{x}/{y}.grid.json";var d=utfGridCreateLayer(a);return L.layerGroup([c,d])}},wms:{mustHaveUrl:!0,createLayer:function(a){return L.tileLayer.wms(a.url,a.options)}},wmts:{mustHaveUrl:!0,createLayer:function(a){return L.tileLayer.wmts(a.url,a.options)}},wfs:{mustHaveUrl:!0,mustHaveLayer:!0,createLayer:function(params){if(Helpers.WFSLayerPlugin.isLoaded()){var options=angular.copy(params.options);return options.crs&&"string"==typeof options.crs&&(options.crs=eval(options.crs)),new L.GeoJSON.WFS(params.url,params.layer,options)}}},group:{mustHaveUrl:!1,createLayer:function(a){var b=[];return angular.forEach(a.options.layers,function(a){b.push(createLayer(a))}),L.layerGroup(b)}},featureGroup:{mustHaveUrl:!1,createLayer:function(){return L.featureGroup()}},google:{mustHaveUrl:!1,createLayer:function(a){var b=a.type||"SATELLITE";if(Helpers.GoogleLayerPlugin.isLoaded())return new L.Google(b,a.options)}},china:{mustHaveUrl:!1,createLayer:function(a){var b=a.type||"";if(Helpers.ChinaLayerPlugin.isLoaded())return L.tileLayer.chinaProvider(b,a.options)}},ags:{mustHaveUrl:!0,createLayer:function(a){if(Helpers.AGSLayerPlugin.isLoaded()){var b=angular.copy(a.options);angular.extend(b,{url:a.url});var c=new lvector.AGS(b);return c.onAdd=function(a){this.setMap(a)},c.onRemove=function(){this.setMap(null)},c}}},dynamic:{mustHaveUrl:!0,createLayer:function(a){return Helpers.DynamicMapLayerPlugin.isLoaded()?L.esri.dynamicMapLayer(a.url,a.options):void 0}},markercluster:{mustHaveUrl:!1,createLayer:function(a){return Helpers.MarkerClusterPlugin.isLoaded()?new L.MarkerClusterGroup(a.options):void $log.error("[AngularJS - Leaflet] The markercluster plugin is not loaded.")}},bing:{mustHaveUrl:!1,createLayer:function(a){return Helpers.BingLayerPlugin.isLoaded()?new L.BingLayer(a.key,a.options):void 0}},heatmap:{mustHaveUrl:!1,mustHaveData:!0,createLayer:function(a){if(Helpers.HeatMapLayerPlugin.isLoaded()){var b=new L.TileLayer.WebGLHeatMap(a.options);return isDefined(a.data)&&b.setData(a.data),b}}},yandex:{mustHaveUrl:!1,createLayer:function(a){var b=a.type||"map";if(Helpers.YandexLayerPlugin.isLoaded())return new L.Yandex(b,a.options)}},imageOverlay:{mustHaveUrl:!0,mustHaveBounds:!0,createLayer:function(a){return L.imageOverlay(a.url,a.bounds,a.options)}},custom:{createLayer:function(a){return a.layer instanceof L.Class?angular.copy(a.layer):void $log.error("[AngularJS - Leaflet] A custom layer must be a leaflet Class")}},cartodb:{mustHaveUrl:!0,createLayer:function(a){return cartodb.createLayer(a.map,a.url)}}};return{createLayer:createLayer}}]),angular.module("leaflet-directive").factory("leafletLegendHelpers",function(){var a=function(a,b,c,d){if(a.innerHTML="",b.error)a.innerHTML+='
'+b.error.message+"
";else if("arcgis"===c)for(var e=0;e'+f.layerName+"";for(var g=0;g
'+h.label+"
"}}else"image"===c&&(a.innerHTML='')},b=function(b,c,d,e){return function(){var f=L.DomUtil.create("div",c);return L.Browser.touch?L.DomEvent.on(f,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(f),L.DomEvent.on(f,"mousewheel",L.DomEvent.stopPropagation)),a(f,b,d,e),f}},c=function(a,b){return function(){for(var c=L.DomUtil.create("div",b),d=0;d
'+a.labels[d]+"
";return L.Browser.touch?L.DomEvent.on(c,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(c),L.DomEvent.on(c,"mousewheel",L.DomEvent.stopPropagation)),c}};return{getOnAddLegend:b,getOnAddArrayLegend:c,updateLegend:a}}),angular.module("leaflet-directive").factory("leafletMapDefaults",["$q","leafletHelpers",function(a,b){function c(){return{keyboard:!0,dragging:!0,worldCopyJump:!1,doubleClickZoom:!0,scrollWheelZoom:!0,tap:!0,touchZoom:!0,zoomControl:!0,zoomsliderControl:!1,zoomControlPosition:"topleft",attributionControl:!0,controls:{layers:{visible:!0,position:"topright",collapsed:!0}},crs:L.CRS.EPSG3857,tileLayer:"//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",tileLayerOptions:{attribution:'© OpenStreetMap contributors'},path:{weight:10,opacity:1,color:"#0000ff"},center:{lat:0,lng:0,zoom:1}}}var d=b.isDefined,e=b.isObject,f=b.obtainEffectiveMapId,g={};return{getDefaults:function(a){var b=f(g,a);return g[b]},getMapCreationDefaults:function(a){var b=f(g,a),c=g[b],e={maxZoom:c.maxZoom,keyboard:c.keyboard,dragging:c.dragging,zoomControl:c.zoomControl,doubleClickZoom:c.doubleClickZoom,scrollWheelZoom:c.scrollWheelZoom,tap:c.tap,touchZoom:c.touchZoom,attributionControl:c.attributionControl,worldCopyJump:c.worldCopyJump,crs:c.crs};if(d(c.minZoom)&&(e.minZoom=c.minZoom),d(c.zoomAnimation)&&(e.zoomAnimation=c.zoomAnimation),d(c.fadeAnimation)&&(e.fadeAnimation=c.fadeAnimation),d(c.markerZoomAnimation)&&(e.markerZoomAnimation=c.markerZoomAnimation),c.map)for(var h in c.map)e[h]=c.map[h];return e},setDefaults:function(a,b){var h=c();d(a)&&(h.doubleClickZoom=d(a.doubleClickZoom)?a.doubleClickZoom:h.doubleClickZoom,h.scrollWheelZoom=d(a.scrollWheelZoom)?a.scrollWheelZoom:h.doubleClickZoom,h.tap=d(a.tap)?a.tap:h.tap,h.touchZoom=d(a.touchZoom)?a.touchZoom:h.doubleClickZoom,h.zoomControl=d(a.zoomControl)?a.zoomControl:h.zoomControl,h.zoomsliderControl=d(a.zoomsliderControl)?a.zoomsliderControl:h.zoomsliderControl,h.attributionControl=d(a.attributionControl)?a.attributionControl:h.attributionControl,h.tileLayer=d(a.tileLayer)?a.tileLayer:h.tileLayer,h.zoomControlPosition=d(a.zoomControlPosition)?a.zoomControlPosition:h.zoomControlPosition,h.keyboard=d(a.keyboard)?a.keyboard:h.keyboard,h.dragging=d(a.dragging)?a.dragging:h.dragging,d(a.controls)&&angular.extend(h.controls,a.controls),e(a.crs)?h.crs=a.crs:d(L.CRS[a.crs])&&(h.crs=L.CRS[a.crs]),d(a.center)&&angular.copy(a.center,h.center),d(a.tileLayerOptions)&&angular.copy(a.tileLayerOptions,h.tileLayerOptions),d(a.maxZoom)&&(h.maxZoom=a.maxZoom),d(a.minZoom)&&(h.minZoom=a.minZoom),d(a.zoomAnimation)&&(h.zoomAnimation=a.zoomAnimation),d(a.fadeAnimation)&&(h.fadeAnimation=a.fadeAnimation),d(a.markerZoomAnimation)&&(h.markerZoomAnimation=a.markerZoomAnimation),d(a.worldCopyJump)&&(h.worldCopyJump=a.worldCopyJump),d(a.map)&&(h.map=a.map),d(a.path)&&(h.path=a.path));var i=f(g,b);return g[i]=h,h}}}]),angular.module("leaflet-directive").service("leafletMarkersHelpers",["$rootScope","leafletHelpers","$log","$compile",function(a,b,c,d){var e=b.isDefined,f=b.defaultTo,g=b.MarkerClusterPlugin,h=b.AwesomeMarkersPlugin,i=b.MakiMarkersPlugin,j=b.ExtraMarkersPlugin,k=b.safeApply,l=b,m=b.isString,n=b.isNumber,o=b.isObject,p={},q=function(a){var b="";return["_icon","_latlng","_leaflet_id","_map","_shadow"].forEach(function(c){b+=c+": "+f(a[c],"undefined")+" \n"}),"[leafletMarker] : \n"+b},r=function(a,b){var d=b?console:c;d.debug(q(a))},s=function(a){if(e(a)&&e(a.type)&&"awesomeMarker"===a.type)return h.isLoaded()||c.error("[AngularJS - Leaflet] The AwesomeMarkers Plugin is not loaded."),new L.AwesomeMarkers.icon(a);if(e(a)&&e(a.type)&&"makiMarker"===a.type)return i.isLoaded()||c.error("[AngularJS - Leaflet] The MakiMarkers Plugin is not loaded."),new L.MakiMarkers.icon(a);if(e(a)&&e(a.type)&&"extraMarker"===a.type)return j.isLoaded()||c.error("[AngularJS - Leaflet] The ExtraMarkers Plugin is not loaded."),new L.ExtraMarkers.icon(a);if(e(a)&&e(a.type)&&"div"===a.type)return new L.divIcon(a);if(e(a)&&e(a.type)&&"icon"===a.type)return a.icon;var b="data:image/png;base64,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",d="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII="; +!function(angular){"use strict";angular.module("leaflet-directive",[]).directive("leaflet",["$q","leafletData","leafletMapDefaults","leafletHelpers","leafletEvents",function(a,b,c,d,e){var f;return{restrict:"EA",replace:!0,scope:{center:"=",defaults:"=",maxbounds:"=",bounds:"=",markers:"=",legend:"=",geojson:"=",paths:"=",tiles:"=",layers:"=",controls:"=",decorations:"=",eventBroadcast:"=",markersWatchOptions:"=",geojsonWatchOptions:"="},transclude:!0,template:'
',controller:["$scope",function(b){f=a.defer(),this.getMap=function(){return f.promise},this.getLeafletScope=function(){return b}}],link:function(a,g,h){function i(){isNaN(h.width)?g.css("width",h.width):g.css("width",h.width+"px")}function j(){isNaN(h.height)?g.css("height",h.height):g.css("height",h.height+"px")}var k=d.isDefined,l=c.setDefaults(a.defaults,h.id),m=e.genDispatchMapEvent,n=e.getAvailableMapEvents();b.setDirectiveControls({},h.id),k(h.width)&&(i(),a.$watch(function(){return g[0].getAttribute("width")},function(){i(),o.invalidateSize()})),k(h.height)&&(j(),a.$watch(function(){return g[0].getAttribute("height")},function(){j(),o.invalidateSize()}));var o=new L.Map(g[0],c.getMapCreationDefaults(h.id));if(f.resolve(o),k(h.center)||o.setView([l.center.lat,l.center.lng],l.center.zoom),!k(h.tiles)&&!k(h.layers)){var p=L.tileLayer(l.tileLayer,l.tileLayerOptions);p.addTo(o),b.setTiles(p,h.id)}if(k(o.zoomControl)&&k(l.zoomControlPosition)&&o.zoomControl.setPosition(l.zoomControlPosition),k(o.zoomControl)&&l.zoomControl===!1&&o.zoomControl.removeFrom(o),k(o.zoomsliderControl)&&k(l.zoomsliderControl)&&l.zoomsliderControl===!1&&o.zoomsliderControl.removeFrom(o),!k(h.eventBroadcast))for(var q="broadcast",r=0;r1},i=function(a){var b=d.getDefaults(a),c={collapsed:b.controls.layers.collapsed,position:b.controls.layers.position};angular.extend(c,b.controls.layers.options);var e;return e=b.controls.layers&&f(b.controls.layers.control)?b.controls.layers.control.apply(this,[[],[],c]):new L.control.layers([],[],c)};return{layersControlMustBeVisible:h,updateLayersControl:function(a,b,c,d,e,j){var k,l=g[b],m=h(d,e,b);if(f(l)&&c){for(k in j.baselayers)l.removeLayer(j.baselayers[k]);for(k in j.overlays)l.removeLayer(j.overlays[k]);l.removeFrom(a),delete g[b]}if(m){l=i(b),g[b]=l;for(k in d){var n=f(d[k].layerOptions)&&d[k].layerOptions.showOnSelector===!1;!n&&f(j.baselayers[k])&&l.addBaseLayer(j.baselayers[k],d[k].name)}for(k in e){var o=f(e[k].layerOptions)&&e[k].layerOptions.showOnSelector===!1;!o&&f(j.overlays[k])&&l.addOverlay(j.overlays[k],e[k].name)}l.addTo(a)}return m}}}]),angular.module("leaflet-directive").service("leafletData",["$log","$q","leafletHelpers",function(a,b,c){var d=c.getDefer,e=c.getUnresolvedDefer,f=c.setResolvedDefer,g={},h=this,i=function(a){return a.charAt(0).toUpperCase()+a.slice(1)},j=["map","tiles","layers","paths","markers","geoJSON","UTFGrid","decorations","directiveControls"];j.forEach(function(a){g[a]={}}),this.unresolveMap=function(a){var b=c.obtainEffectiveMapId(g.map,a);j.forEach(function(a){g[a][b]=void 0})},j.forEach(function(a){var b=i(a);h["set"+b]=function(b,c){var d=e(g[a],c);d.resolve(b),f(g[a],c)},h["get"+b]=function(b){var c=d(g[a],b);return c.promise}})}]),angular.module("leaflet-directive").service("leafletDirectiveControlsHelpers",["$log","leafletData","leafletHelpers",function(a,b,c){var d=c.isDefined,e=c.isString,f=c.isObject,g=c.errorHeader,h=g+"[leafletDirectiveControlsHelpers",i=function(c,g,i,j){var k=h+".extend] ",l={};if(!d(g))return void a.error(k+"thingToAddName cannot be undefined");if(e(g)&&d(i)&&d(j))l[g]={create:i,clean:j};else{if(!f(g)||d(i)||d(j))return void a.error(k+"incorrect arguments");l=g}b.getDirectiveControls().then(function(a){angular.extend(a,l),b.setDirectiveControls(a,c)})};return{extend:i}}]),angular.module("leaflet-directive").factory("leafletEvents",["leafletMapEvents","leafletMarkerEvents","leafletPathEvents",function(a,b,c){var d={};return angular.extend(d,a,b,c),d}]),angular.module("leaflet-directive").service("leafletGeoJsonHelpers",["leafletHelpers","leafletIterators",function(a,b){var c=a,d=b,e=function(a,b){return this.lat=a,this.lng=b,this},f=function(a){return Array.isArray(a)&&2===a.length?a[1]:c.isDefined(a.type)&&"Point"===a.type?+a.coordinates[1]:+a.lat},g=function(a){return Array.isArray(a)&&2===a.length?a[0]:c.isDefined(a.type)&&"Point"===a.type?+a.coordinates[0]:+a.lng},h=function(a){if(c.isUndefined(a))return!1;if(c.isArray(a)){if(2===a.length&&c.isNumber(a[0])&&c.isNumber(a[1]))return!0}else if(c.isDefined(a.type)&&"Point"===a.type&&c.isArray(a.coordinates)&&2===a.coordinates.length&&c.isNumber(a.coordinates[0])&&c.isNumber(a.coordinates[1]))return!0;var b=d.all(["lat","lng"],function(b){return c.isDefined(a[b])&&c.isNumber(a[b])});return b},i=function(a){if(a&&h(a)){var b=null;if(Array.isArray(a)&&2===a.length)b=new e(a[1],a[0]);else{if(!c.isDefined(a.type)||"Point"!==a.type)return a;b=new e(a.coordinates[1],a.coordinates[0])}return angular.extend(a,b)}};return{getLat:f,getLng:g,validateCoords:h,getCoords:i}}]),angular.module("leaflet-directive").factory("leafletHelpers",["$q","$log",function(a,b){function c(a,c){var d,f;if(angular.isDefined(c))d=c;else if(0===Object.keys(a).length)d="main";else if(Object.keys(a).length>=1)for(f in a)a.hasOwnProperty(f)&&(d=f);else 0===Object.keys(a).length?d="main":b.error(e+"- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call");return d}function d(b,d){var e,f=c(b,d);return angular.isDefined(b[f])&&b[f].resolvedDefer!==!0?e=b[f].defer:(e=a.defer(),b[f]={defer:e,resolvedDefer:!1}),e}var e="[AngularJS - Leaflet] ",f=angular.copy,g=f,h=function(a,b){var c;if(a&&angular.isObject(a))return null!==b&&angular.isString(b)?(c=a,b.split(".").forEach(function(a){c&&(c=c[a])}),c):b},i=function(a){return a.split(".").reduce(function(a,b){return a+'["'+b+'"]'})},j=function(a){return a.reduce(function(a,b){return a+"."+b})},k=function(a){return angular.isDefined(a)&&null!==a},l=function(a){return!k(a)};return{copy:f,clone:g,errorHeader:e,getObjectValue:h,getObjectArrayPath:i,getObjectDotPath:j,defaultTo:function(a,b){return k(a)?a:b},isTruthy:function(a){return"true"===a||a===!0},isEmpty:function(a){return 0===Object.keys(a).length},isUndefinedOrEmpty:function(a){return angular.isUndefined(a)||null===a||0===Object.keys(a).length},isDefined:k,isUndefined:l,isNumber:function(a){return angular.isNumber(a)},isString:function(a){return angular.isString(a)},isArray:function(a){return angular.isArray(a)},isObject:function(a){return angular.isObject(a)},isFunction:function(a){return angular.isFunction(a)},equals:function(a,b){return angular.equals(a,b)},isValidCenter:function(a){return angular.isDefined(a)&&angular.isNumber(a.lat)&&angular.isNumber(a.lng)&&angular.isNumber(a.zoom)},isValidPoint:function(a){return angular.isDefined(a)?angular.isArray(a)?2===a.length&&angular.isNumber(a[0])&&angular.isNumber(a[1]):angular.isNumber(a.lat)&&angular.isNumber(a.lng):!1},isSameCenterOnMap:function(a,b){var c=b.getCenter(),d=b.getZoom();return a.lat&&a.lng&&c.lat.toFixed(4)===a.lat.toFixed(4)&&c.lng.toFixed(4)===a.lng.toFixed(4)&&d===a.zoom?!0:!1},safeApply:function(a,b){var c=a.$root.$$phase;"$apply"===c||"$digest"===c?a.$eval(b):a.$evalAsync(b)},obtainEffectiveMapId:c,getDefer:function(a,b){var e,f=c(a,b);return e=angular.isDefined(a[f])&&a[f].resolvedDefer!==!1?a[f].defer:d(a,b)},getUnresolvedDefer:d,setResolvedDefer:function(a,b){var d=c(a,b);a[d].resolvedDefer=!0},AwesomeMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.AwesomeMarkers)&&angular.isDefined(L.AwesomeMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.AwesomeMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},PolylineDecoratorPlugin:{isLoaded:function(){return angular.isDefined(L.PolylineDecorator)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.PolylineDecorator:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},MakiMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.MakiMarkers)&&angular.isDefined(L.MakiMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.MakiMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},ExtraMarkersPlugin:{isLoaded:function(){return angular.isDefined(L.ExtraMarkers)&&angular.isDefined(L.ExtraMarkers.Icon)?!0:!1},is:function(a){return this.isLoaded()?a instanceof L.ExtraMarkers.Icon:!1},equal:function(a,b){return this.isLoaded()&&this.is(a)?angular.equals(a,b):!1}},LabelPlugin:{isLoaded:function(){return angular.isDefined(L.Label)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},MarkerClusterPlugin:{isLoaded:function(){return angular.isDefined(L.MarkerClusterGroup)},is:function(a){return this.isLoaded()?a instanceof L.MarkerClusterGroup:!1}},GoogleLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Google)},is:function(a){return this.isLoaded()?a instanceof L.Google:!1}},ChinaLayerPlugin:{isLoaded:function(){return angular.isDefined(L.tileLayer.chinaProvider)}},HeatMapLayerPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.WebGLHeatMap)}},BingLayerPlugin:{isLoaded:function(){return angular.isDefined(L.BingLayer)},is:function(a){return this.isLoaded()?a instanceof L.BingLayer:!1}},WFSLayerPlugin:{isLoaded:function(){return void 0!==L.GeoJSON.WFS},is:function(a){return this.isLoaded()?a instanceof L.GeoJSON.WFS:!1}},AGSLayerPlugin:{isLoaded:function(){return void 0!==lvector&&void 0!==lvector.AGS},is:function(a){return this.isLoaded()?a instanceof lvector.AGS:!1}},YandexLayerPlugin:{isLoaded:function(){return angular.isDefined(L.Yandex)},is:function(a){return this.isLoaded()?a instanceof L.Yandex:!1}},DynamicMapLayerPlugin:{isLoaded:function(){return void 0!==L.esri&&void 0!==L.esri.dynamicMapLayer},is:function(a){return this.isLoaded()?a instanceof L.esri.dynamicMapLayer:!1}},GeoJSONPlugin:{isLoaded:function(){return angular.isDefined(L.TileLayer.GeoJSON)},is:function(a){return this.isLoaded()?a instanceof L.TileLayer.GeoJSON:!1}},UTFGridPlugin:{isLoaded:function(){return angular.isDefined(L.UtfGrid)},is:function(a){return this.isLoaded()?a instanceof L.UtfGrid:(b.error("[AngularJS - Leaflet] No UtfGrid plugin found."),!1)}},CartoDB:{isLoaded:function(){return cartodb},is:function(){return!0}},Leaflet:{DivIcon:{is:function(a){return a instanceof L.DivIcon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}},Icon:{is:function(a){return a instanceof L.Icon},equal:function(a,b){return this.is(a)?angular.equals(a,b):!1}}},watchOptions:{doWatch:!0,isDeep:!0,individual:{doWatch:!0,isDeep:!0}}}}]),angular.module("leaflet-directive").service("leafletIterators",["$log","leafletHelpers",function(a,b){var c,d=b,e=b.errorHeader+"leafletIterators: ",f=Object.keys,g=d.isFunction,h=d.isObject,i=Math.pow(2,53)-1,j=function(a){var b=null!==a&&a.length;return d.isNumber(b)&&b>=0&&i>=b},k=function(a){return a},l=function(a){return function(b){return null===b?void 0:b[a]}},m=function(a,b,c){if(void 0===b)return a;switch(null===c?3:c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)};case 4:return function(c,d,e,f){return a.call(b,c,d,e,f)}}return function(){return a.apply(b,arguments)}},n=function(a,b){return function(c){var d=arguments.length;if(2>d||null===c)return c;for(var e=1;d>e;e++)for(var f=arguments[e],g=a(f),h=g.length,i=0;h>i;i++){var j=g[i];b&&void 0!==c[j]||(c[j]=f[j])}return c}},o=null;c=o=n(f);var p,q=function(a,b){var c=f(b),d=c.length;if(null===a)return!d;for(var e=Object(a),g=0;d>g;g++){var h=c[g];if(b[h]!==e[h]||!(h in e))return!1}return!0},r=null;p=r=function(a){return a=c({},a),function(b){return q(b,a)}};var s,t=function(a,b,c){return null===a?k:g(a)?m(a,b,c):h(a)?p(a):l(a)},u=null;s=u=function(a,b,c){b=t(b,c);for(var d=!j(a)&&f(a),e=(d||a).length,g=0;e>g;g++){var h=d?d[g]:g;if(!b(a[h],h,a))return!1}return!0};var v=function(b,c,f,g){return f||d.isDefined(b)&&d.isDefined(c)?d.isFunction(c)?!1:(g=d.defaultTo(c,"cb"),a.error(e+g+" is not a function"),!0):(a.error(e+"collection or cb undefined"),!0)},w=function(a,b,c){if(!v(void 0,c,!0,"internalCb")&&!v(a,b))for(var d in a)c(a[d],d)},x=function(a,b){w(a,b,function(a,c){b(a,c)})};return window._?window._:{each:x,every:s,all:u}}]),angular.module("leaflet-directive").factory("leafletLayerHelpers",["$rootScope","$log","leafletHelpers",function($rootScope,$log,leafletHelpers){function isValidLayerType(a){return isString(a.type)?-1===Object.keys(layerTypes).indexOf(a.type)?($log.error("[AngularJS - Leaflet] A layer must have a valid type: "+Object.keys(layerTypes)),!1):layerTypes[a.type].mustHaveUrl&&!isString(a.url)?($log.error("[AngularJS - Leaflet] A base layer must have an url"),!1):layerTypes[a.type].mustHaveData&&!isDefined(a.data)?($log.error('[AngularJS - Leaflet] The base layer must have a "data" array attribute'),!1):layerTypes[a.type].mustHaveLayer&&!isDefined(a.layer)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have an layer defined"),!1):layerTypes[a.type].mustHaveBounds&&!isDefined(a.bounds)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have bounds defined"),!1):layerTypes[a.type].mustHaveKey&&!isDefined(a.key)?($log.error("[AngularJS - Leaflet] The type of layer "+a.type+" must have key defined"),!1):!0:($log.error("[AngularJS - Leaflet] A layer must have a valid type defined."),!1)}function createLayer(a){if(isValidLayerType(a)){if(!isString(a.name))return void $log.error("[AngularJS - Leaflet] A base layer must have a name");isObject(a.layerParams)||(a.layerParams={}),isObject(a.layerOptions)||(a.layerOptions={});for(var b in a.layerParams)a.layerOptions[b]=a.layerParams[b];var c={url:a.url,data:a.data,options:a.layerOptions,layer:a.layer,type:a.layerType,bounds:a.bounds,key:a.key,pluginOptions:a.pluginOptions,user:a.user};return layerTypes[a.type].createLayer(c)}}var Helpers=leafletHelpers,isString=leafletHelpers.isString,isObject=leafletHelpers.isObject,isDefined=leafletHelpers.isDefined,utfGridCreateLayer=function(a){if(!Helpers.UTFGridPlugin.isLoaded())return void $log.error("[AngularJS - Leaflet] The UTFGrid plugin is not loaded.");var b=new L.UtfGrid(a.url,a.pluginOptions);return b.on("mouseover",function(a){$rootScope.$broadcast("leafletDirectiveMap.utfgridMouseover",a)}),b.on("mouseout",function(a){$rootScope.$broadcast("leafletDirectiveMap.utfgridMouseout",a)}),b.on("click",function(a){$rootScope.$broadcast("leafletDirectiveMap.utfgridClick",a)}),b},layerTypes={xyz:{mustHaveUrl:!0,createLayer:function(a){return L.tileLayer(a.url,a.options)}},mapbox:{mustHaveKey:!0,createLayer:function(a){var b="//{s}.tiles.mapbox.com/v3/"+a.key+"/{z}/{x}/{y}.png";return L.tileLayer(b,a.options)}},geoJSON:{mustHaveUrl:!0,createLayer:function(a){return Helpers.GeoJSONPlugin.isLoaded()?new L.TileLayer.GeoJSON(a.url,a.pluginOptions,a.options):void 0}},utfGrid:{mustHaveUrl:!0,createLayer:utfGridCreateLayer},cartodbTiles:{mustHaveKey:!0,createLayer:function(a){var b="//"+a.user+".cartodb.com/api/v1/map/"+a.key+"/{z}/{x}/{y}.png";return L.tileLayer(b,a.options)}},cartodbUTFGrid:{mustHaveKey:!0,mustHaveLayer:!0,createLayer:function(a){return a.url="//"+a.user+".cartodb.com/api/v1/map/"+a.key+"/"+a.layer+"/{z}/{x}/{y}.grid.json",utfGridCreateLayer(a)}},cartodbInteractive:{mustHaveKey:!0,mustHaveLayer:!0,createLayer:function(a){var b="//"+a.user+".cartodb.com/api/v1/map/"+a.key+"/{z}/{x}/{y}.png",c=L.tileLayer(b,a.options);a.url="//"+a.user+".cartodb.com/api/v1/map/"+a.key+"/"+a.layer+"/{z}/{x}/{y}.grid.json";var d=utfGridCreateLayer(a);return L.layerGroup([c,d])}},wms:{mustHaveUrl:!0,createLayer:function(a){return L.tileLayer.wms(a.url,a.options)}},wmts:{mustHaveUrl:!0,createLayer:function(a){return L.tileLayer.wmts(a.url,a.options)}},wfs:{mustHaveUrl:!0,mustHaveLayer:!0,createLayer:function(params){if(Helpers.WFSLayerPlugin.isLoaded()){var options=angular.copy(params.options);return options.crs&&"string"==typeof options.crs&&(options.crs=eval(options.crs)),new L.GeoJSON.WFS(params.url,params.layer,options)}}},group:{mustHaveUrl:!1,createLayer:function(a){var b=[];return angular.forEach(a.options.layers,function(a){b.push(createLayer(a))}),L.layerGroup(b)}},featureGroup:{mustHaveUrl:!1,createLayer:function(){return L.featureGroup()}},google:{mustHaveUrl:!1,createLayer:function(a){var b=a.type||"SATELLITE";if(Helpers.GoogleLayerPlugin.isLoaded())return new L.Google(b,a.options)}},china:{mustHaveUrl:!1,createLayer:function(a){var b=a.type||"";if(Helpers.ChinaLayerPlugin.isLoaded())return L.tileLayer.chinaProvider(b,a.options)}},ags:{mustHaveUrl:!0,createLayer:function(a){if(Helpers.AGSLayerPlugin.isLoaded()){var b=angular.copy(a.options);angular.extend(b,{url:a.url});var c=new lvector.AGS(b);return c.onAdd=function(a){this.setMap(a)},c.onRemove=function(){this.setMap(null)},c}}},dynamic:{mustHaveUrl:!0,createLayer:function(a){return Helpers.DynamicMapLayerPlugin.isLoaded()?L.esri.dynamicMapLayer(a.url,a.options):void 0}},markercluster:{mustHaveUrl:!1,createLayer:function(a){return Helpers.MarkerClusterPlugin.isLoaded()?new L.MarkerClusterGroup(a.options):void $log.error("[AngularJS - Leaflet] The markercluster plugin is not loaded.")}},bing:{mustHaveUrl:!1,createLayer:function(a){return Helpers.BingLayerPlugin.isLoaded()?new L.BingLayer(a.key,a.options):void 0}},heatmap:{mustHaveUrl:!1,mustHaveData:!0,createLayer:function(a){if(Helpers.HeatMapLayerPlugin.isLoaded()){var b=new L.TileLayer.WebGLHeatMap(a.options);return isDefined(a.data)&&b.setData(a.data),b}}},yandex:{mustHaveUrl:!1,createLayer:function(a){var b=a.type||"map";if(Helpers.YandexLayerPlugin.isLoaded())return new L.Yandex(b,a.options)}},imageOverlay:{mustHaveUrl:!0,mustHaveBounds:!0,createLayer:function(a){return L.imageOverlay(a.url,a.bounds,a.options)}},custom:{createLayer:function(a){return a.layer instanceof L.Class?angular.copy(a.layer):void $log.error("[AngularJS - Leaflet] A custom layer must be a leaflet Class")}},cartodb:{mustHaveUrl:!0,createLayer:function(a){return cartodb.createLayer(a.map,a.url)}}};return{createLayer:createLayer}}]),angular.module("leaflet-directive").factory("leafletLegendHelpers",function(){var a=function(a,b,c,d){if(a.innerHTML="",b.error)a.innerHTML+='
'+b.error.message+"
";else if("arcgis"===c)for(var e=0;e'+f.layerName+"";for(var g=0;g
'+h.label+"
"}}else"image"===c&&(a.innerHTML='')},b=function(b,c,d,e){return function(){var f=L.DomUtil.create("div",c);return L.Browser.touch?L.DomEvent.on(f,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(f),L.DomEvent.on(f,"mousewheel",L.DomEvent.stopPropagation)),a(f,b,d,e),f}},c=function(a,b){return function(){for(var c=L.DomUtil.create("div",b),d=0;d
'+a.labels[d]+"
";return L.Browser.touch?L.DomEvent.on(c,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(c),L.DomEvent.on(c,"mousewheel",L.DomEvent.stopPropagation)),c}};return{getOnAddLegend:b,getOnAddArrayLegend:c,updateLegend:a}}),angular.module("leaflet-directive").factory("leafletMapDefaults",["$q","leafletHelpers",function(a,b){function c(){return{keyboard:!0,dragging:!0,worldCopyJump:!1,doubleClickZoom:!0,scrollWheelZoom:!0,tap:!0,touchZoom:!0,zoomControl:!0,zoomsliderControl:!1,zoomControlPosition:"topleft",attributionControl:!0,controls:{layers:{visible:!0,position:"topright",collapsed:!0}},crs:L.CRS.EPSG3857,tileLayer:"//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",tileLayerOptions:{attribution:'© OpenStreetMap contributors'},path:{weight:10,opacity:1,color:"#0000ff"},center:{lat:0,lng:0,zoom:1}}}var d=b.isDefined,e=b.isObject,f=b.obtainEffectiveMapId,g={};return{getDefaults:function(a){var b=f(g,a);return g[b]},getMapCreationDefaults:function(a){var b=f(g,a),c=g[b],e={maxZoom:c.maxZoom,keyboard:c.keyboard,dragging:c.dragging,zoomControl:c.zoomControl,doubleClickZoom:c.doubleClickZoom,scrollWheelZoom:c.scrollWheelZoom,tap:c.tap,touchZoom:c.touchZoom,attributionControl:c.attributionControl,worldCopyJump:c.worldCopyJump,crs:c.crs};if(d(c.minZoom)&&(e.minZoom=c.minZoom),d(c.zoomAnimation)&&(e.zoomAnimation=c.zoomAnimation),d(c.fadeAnimation)&&(e.fadeAnimation=c.fadeAnimation),d(c.markerZoomAnimation)&&(e.markerZoomAnimation=c.markerZoomAnimation),c.map)for(var h in c.map)e[h]=c.map[h];return e},setDefaults:function(a,b){var h=c();d(a)&&(h.doubleClickZoom=d(a.doubleClickZoom)?a.doubleClickZoom:h.doubleClickZoom,h.scrollWheelZoom=d(a.scrollWheelZoom)?a.scrollWheelZoom:h.doubleClickZoom,h.tap=d(a.tap)?a.tap:h.tap,h.touchZoom=d(a.touchZoom)?a.touchZoom:h.doubleClickZoom,h.zoomControl=d(a.zoomControl)?a.zoomControl:h.zoomControl,h.zoomsliderControl=d(a.zoomsliderControl)?a.zoomsliderControl:h.zoomsliderControl,h.attributionControl=d(a.attributionControl)?a.attributionControl:h.attributionControl,h.tileLayer=d(a.tileLayer)?a.tileLayer:h.tileLayer,h.zoomControlPosition=d(a.zoomControlPosition)?a.zoomControlPosition:h.zoomControlPosition,h.keyboard=d(a.keyboard)?a.keyboard:h.keyboard,h.dragging=d(a.dragging)?a.dragging:h.dragging,d(a.controls)&&angular.extend(h.controls,a.controls),e(a.crs)?h.crs=a.crs:d(L.CRS[a.crs])&&(h.crs=L.CRS[a.crs]),d(a.center)&&angular.copy(a.center,h.center),d(a.tileLayerOptions)&&angular.copy(a.tileLayerOptions,h.tileLayerOptions),d(a.maxZoom)&&(h.maxZoom=a.maxZoom),d(a.minZoom)&&(h.minZoom=a.minZoom),d(a.zoomAnimation)&&(h.zoomAnimation=a.zoomAnimation),d(a.fadeAnimation)&&(h.fadeAnimation=a.fadeAnimation),d(a.markerZoomAnimation)&&(h.markerZoomAnimation=a.markerZoomAnimation),d(a.worldCopyJump)&&(h.worldCopyJump=a.worldCopyJump),d(a.map)&&(h.map=a.map),d(a.path)&&(h.path=a.path));var i=f(g,b);return g[i]=h,h}}}]),angular.module("leaflet-directive").service("leafletMarkersHelpers",["$rootScope","leafletHelpers","$log","$compile","leafletGeoJsonHelpers",function(a,b,c,d,e){var f=b.isDefined,g=b.defaultTo,h=b.MarkerClusterPlugin,i=b.AwesomeMarkersPlugin,j=b.MakiMarkersPlugin,k=b.ExtraMarkersPlugin,l=b.safeApply,m=b,n=b.isString,o=b.isNumber,p=b.isObject,q={},r=e,s=b.errorHeader,t=function(a){var b="";return["_icon","_latlng","_leaflet_id","_map","_shadow"].forEach(function(c){b+=c+": "+g(a[c],"undefined")+" \n"}),"[leafletMarker] : \n"+b},u=function(a,b){var d=b?console:c;d.debug(t(a))},v=function(a){if(f(a)&&f(a.type)&&"awesomeMarker"===a.type)return i.isLoaded()||c.error(s+" The AwesomeMarkers Plugin is not loaded."),new L.AwesomeMarkers.icon(a);if(f(a)&&f(a.type)&&"makiMarker"===a.type)return j.isLoaded()||c.error(s+"The MakiMarkers Plugin is not loaded."),new L.MakiMarkers.icon(a);if(f(a)&&f(a.type)&&"extraMarker"===a.type)return k.isLoaded()||c.error(s+"The ExtraMarkers Plugin is not loaded."),new L.ExtraMarkers.icon(a);if(f(a)&&f(a.type)&&"div"===a.type)return new L.divIcon(a);if(f(a)&&f(a.type)&&"icon"===a.type)return a.icon;var b="data:image/png;base64,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",d="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=";return f(a)&&f(a.iconUrl)?new L.Icon(a):new L.Icon.Default({iconUrl:b,shadowUrl:d,iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]})},w=function(a){f(q[a])&&q.splice(a,1)},x=function(){q={}},y=function(a,b,c){if(a.closePopup(),f(c)&&f(c.overlays))for(var d in c.overlays)if((c.overlays[d]instanceof L.LayerGroup||c.overlays[d]instanceof L.FeatureGroup)&&c.overlays[d].hasLayer(a))return void c.overlays[d].removeLayer(a);if(f(q))for(var e in q)q[e].hasLayer(a)&&q[e].removeLayer(a);b.hasLayer(a)&&b.removeLayer(a)},z=function(b,c){b.openPopup();var e=b.getPopup(),g=angular.isFunction(c.getMessageScope)?c.getMessageScope():a,h=f(c.compileMessage)?c.compileMessage:!0;if(f(e)){var i=function(a){a._updateLayout(),a._updatePosition()};if(h)if(d(e._contentNode)(g),f(e._contentNode)&&e._contentNode.innerHTML.indexOf("ngInclude")>-1)var j=g.$on("$includeContentLoaded",function(){i(e),j()});else i(e)}},A=function(b,c){var e=angular.isFunction(c.getMessageScope)?c.getMessageScope():a,g=angular.isFunction(c.getLabelScope)?c.getLabelScope():e,h=f(c.compileMessage)?c.compileMessage:!0;m.LabelPlugin.isLoaded()&&f(c.label)&&(f(c.label.options)&&c.label.options.noHide===!0&&b.showLabel(),h&&d(b.label._container)(g))};return{resetMarkerGroup:w,resetMarkerGroups:x,deleteMarker:y,manageOpenPopup:z,manageOpenLabel:A,createMarker:function(a){if(!f(a)||!r.validateCoords(a))return void c.error(s+"The marker definition is not valid.");var b=r.getCoords(a);if(!f(b))return void c.error(s+"Unable to get coordinates from markerData.");var d={icon:v(a.icon),title:f(a.title)?a.title:"",draggable:f(a.draggable)?a.draggable:!1,clickable:f(a.clickable)?a.clickable:!0,riseOnHover:f(a.riseOnHover)?a.riseOnHover:!1,zIndexOffset:f(a.zIndexOffset)?a.zIndexOffset:0,iconAngle:f(a.iconAngle)?a.iconAngle:0};for(var e in a)a.hasOwnProperty(e)&&!d.hasOwnProperty(e)&&(d[e]=a[e]);var g=new L.marker(b,d);return n(a.message)||g.unbindPopup(),g},addMarkerToGroup:function(a,b,d,e){return n(b)?h.isLoaded()?(f(q[b])||(q[b]=new L.MarkerClusterGroup(d),e.addLayer(q[b])),void q[b].addLayer(a)):void c.error(s+"The MarkerCluster plugin is not loaded."):void c.error(s+"The marker group you have specified is invalid.")},listenMarkerEvents:function(a,b,c){a.on("popupopen",function(){l(c,function(){b.focus=!0,z(a,b)})}),a.on("popupclose",function(){l(c,function(){b.focus=!1})}),a.on("add",function(){l(c,function(){"label"in b&&A(a,b)})})},addMarkerWatcher:function(a,b,d,e,h,i){var j=m.getObjectArrayPath("markers."+b);i=g(i,!0);var k=d.$watch(j,function(b,d){if(!f(b))return y(a,h,e),void k();if(f(d)){if(!r.validateCoords(b))return c.warn("There are problems with lat-lng data, please verify your marker model"),void y(a,h,e);var g=b===d;if(f(b.iconAngle)&&d.iconAngle!==b.iconAngle&&a.setIconAngle(b.iconAngle),n(b.layer)||n(d.layer)&&(f(e.overlays[d.layer])&&e.overlays[d.layer].hasLayer(a)&&(e.overlays[d.layer].removeLayer(a),a.closePopup()),h.hasLayer(a)||h.addLayer(a)),(o(b.opacity)||o(parseFloat(b.opacity)))&&b.opacity!==d.opacity&&a.setOpacity(b.opacity),n(b.layer)&&d.layer!==b.layer){if(n(d.layer)&&f(e.overlays[d.layer])&&e.overlays[d.layer].hasLayer(a)&&e.overlays[d.layer].removeLayer(a),a.closePopup(),h.hasLayer(a)&&h.removeLayer(a),!f(e.overlays[b.layer]))return void c.error(s+"You must use a name of an existing layer");var i=e.overlays[b.layer];if(!(i instanceof L.LayerGroup||i instanceof L.FeatureGroup))return void c.error(s+'A marker can only be added to a layer of type "group" or "featureGroup"'); -return e(a)&&e(a.iconUrl)?new L.Icon(a):new L.Icon.Default({iconUrl:b,shadowUrl:d,iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]})},t=function(a){e(p[a])&&p.splice(a,1)},u=function(){p={}},v=function(a,b,c){if(a.closePopup(),e(c)&&e(c.overlays))for(var d in c.overlays)if((c.overlays[d]instanceof L.LayerGroup||c.overlays[d]instanceof L.FeatureGroup)&&c.overlays[d].hasLayer(a))return void c.overlays[d].removeLayer(a);if(e(p))for(var f in p)p[f].hasLayer(a)&&p[f].removeLayer(a);b.hasLayer(a)&&b.removeLayer(a)},w=function(b,c){b.openPopup();var f=b.getPopup(),g=angular.isFunction(c.getMessageScope)?c.getMessageScope():a,h=e(c.compileMessage)?c.compileMessage:!0;if(e(f)){var i=function(a){a._updateLayout(),a._updatePosition()};if(h)if(d(f._contentNode)(g),e(f._contentNode)&&f._contentNode.innerHTML.indexOf("ngInclude")>-1)var j=g.$on("$includeContentLoaded",function(){i(f),j()});else i(f)}},x=function(b,c){var f=angular.isFunction(c.getMessageScope)?c.getMessageScope():a,g=angular.isFunction(c.getLabelScope)?c.getLabelScope():f,h=e(c.compileMessage)?c.compileMessage:!0;l.LabelPlugin.isLoaded()&&e(c.label)&&(e(c.label.options)&&c.label.options.noHide===!0&&b.showLabel(),h&&d(b.label._container)(g))};return{resetMarkerGroup:t,resetMarkerGroups:u,deleteMarker:v,manageOpenPopup:w,manageOpenLabel:x,createMarker:function(a){if(!e(a))return void c.error("[AngularJS - Leaflet] The marker definition is not valid.");var b={icon:s(a.icon),title:e(a.title)?a.title:"",draggable:e(a.draggable)?a.draggable:!1,clickable:e(a.clickable)?a.clickable:!0,riseOnHover:e(a.riseOnHover)?a.riseOnHover:!1,zIndexOffset:e(a.zIndexOffset)?a.zIndexOffset:0,iconAngle:e(a.iconAngle)?a.iconAngle:0};for(var d in a)a.hasOwnProperty(d)&&!b.hasOwnProperty(d)&&(b[d]=a[d]);var f=new L.marker(a,b);return m(a.message)||f.unbindPopup(),f},addMarkerToGroup:function(a,b,d,f){return m(b)?g.isLoaded()?(e(p[b])||(p[b]=new L.MarkerClusterGroup(d),f.addLayer(p[b])),void p[b].addLayer(a)):void c.error("[AngularJS - Leaflet] The MarkerCluster plugin is not loaded."):void c.error("[AngularJS - Leaflet] The marker group you have specified is invalid.")},listenMarkerEvents:function(a,b,c,d){a.on("popupopen",function(){d?k(c,function(){b.focus=!0}):w(a,b)}),a.on("popupclose",function(){d&&k(c,function(){b.focus=!1})})},addMarkerWatcher:function(a,b,d,f,g){var h=l.getObjectArrayPath("markers."+b),i=d.$watch(h,function(b,d){if(!e(b))return v(a,g,f),void i();if(e(d)){if(!n(b.lat)||!n(b.lng))return c.warn("There are problems with lat-lng data, please verify your marker model"),void v(a,g,f);var h=b===d;if(e(b.iconAngle)&&d.iconAngle!==b.iconAngle&&a.setIconAngle(b.iconAngle),m(b.layer)||m(d.layer)&&(e(f.overlays[d.layer])&&f.overlays[d.layer].hasLayer(a)&&(f.overlays[d.layer].removeLayer(a),a.closePopup()),g.hasLayer(a)||g.addLayer(a)),(n(b.opacity)||n(parseFloat(b.opacity)))&&b.opacity!==d.opacity&&a.setOpacity(b.opacity),m(b.layer)&&d.layer!==b.layer){if(m(d.layer)&&e(f.overlays[d.layer])&&f.overlays[d.layer].hasLayer(a)&&f.overlays[d.layer].removeLayer(a),a.closePopup(),g.hasLayer(a)&&g.removeLayer(a),!e(f.overlays[b.layer]))return void c.error("[AngularJS - Leaflet] You must use a name of an existing layer");var j=f.overlays[b.layer];if(!(j instanceof L.LayerGroup||j instanceof L.FeatureGroup))return void c.error('[AngularJS - Leaflet] A marker can only be added to a layer of type "group" or "featureGroup"');j.addLayer(a),g.hasLayer(a)&&b.focus===!0&&w(a,b)}if(b.draggable!==!0&&d.draggable===!0&&e(a.dragging)&&a.dragging.disable(),b.draggable===!0&&d.draggable!==!0&&(a.dragging?a.dragging.enable():L.Handler.MarkerDrag&&(a.dragging=new L.Handler.MarkerDrag(a),a.options.draggable=!0,a.dragging.enable())),o(b.icon)||o(d.icon)&&(a.setIcon(s()),a.closePopup(),a.unbindPopup(),m(b.message)&&a.bindPopup(b.message,b.popupOptions)),o(b.icon)&&o(d.icon)&&!angular.equals(b.icon,d.icon)){var k=!1;a.dragging&&(k=a.dragging.enabled()),a.setIcon(s(b.icon)),k&&a.dragging.enable(),a.closePopup(),a.unbindPopup(),m(b.message)&&a.bindPopup(b.message,b.popupOptions)}!m(b.message)&&m(d.message)&&(a.closePopup(),a.unbindPopup()),l.LabelPlugin.isLoaded()&&(e(b.label)&&e(b.label.message)?"label"in d&&"message"in d.label&&!angular.equals(b.label.message,d.label.message)?a.updateLabelContent(b.label.message):angular.isFunction(a.getLabel)?x(a,b):(a.bindLabel(b.label.message,b.label.options),x(a,b)):(!("label"in b)||"message"in b.label)&&angular.isFunction(a.unbindLabel)&&a.unbindLabel()),m(b.message)&&!m(d.message)&&a.bindPopup(b.message,b.popupOptions),m(b.message)&&m(d.message)&&b.message!==d.message&&a.setPopupContent(b.message);var p=!1;b.focus!==!0&&d.focus===!0&&(a.closePopup(),p=!0),(b.focus===!0&&(!e(d.focus)||d.focus===!1)||h&&b.focus===!0)&&(w(a,b),p=!0),d.zIndexOffset!==b.zIndexOffset&&a.setZIndexOffset(b.zIndexOffset);var q=a.getLatLng(),r=m(b.layer)&&l.MarkerClusterPlugin.is(f.overlays[b.layer]);r?p?(b.lat!==d.lat||b.lng!==d.lng)&&(f.overlays[b.layer].removeLayer(a),a.setLatLng([b.lat,b.lng]),f.overlays[b.layer].addLayer(a)):q.lat!==b.lat||q.lng!==b.lng?(f.overlays[b.layer].removeLayer(a),a.setLatLng([b.lat,b.lng]),f.overlays[b.layer].addLayer(a)):b.lat!==d.lat||b.lng!==d.lng?(f.overlays[b.layer].removeLayer(a),a.setLatLng([b.lat,b.lng]),f.overlays[b.layer].addLayer(a)):o(b.icon)&&o(d.icon)&&!angular.equals(b.icon,d.icon)&&(f.overlays[b.layer].removeLayer(a),f.overlays[b.layer].addLayer(a)):(q.lat!==b.lat||q.lng!==b.lng)&&a.setLatLng([b.lat,b.lng])}},!0)},string:q,log:r}}]),angular.module("leaflet-directive").factory("leafletPathsHelpers",["$rootScope","$log","leafletHelpers",function(a,b,c){function d(a){return a.filter(function(a){return k(a)}).map(function(a){return e(a)})}function e(a){return i(a)?new L.LatLng(a[0],a[1]):new L.LatLng(a.lat,a.lng)}function f(a){return a.map(function(a){return d(a)})}function g(a,b){for(var c={},d=0;dp.center.zoom?{setView:!0,maxZoom:b.zoom}:j(p.maxZoom)?{setView:!0,maxZoom:p.maxZoom}:{setView:!0})):void(u&&l(b,f)||(r.settingCenterFromScope=!0,f.setView([b.lat,b.lng],b.zoom),h.notifyCenterChangedToBounds(r,f),d(function(){r.settingCenterFromScope=!1}))):void a.warn("[AngularJS - Leaflet] invalid 'center'")},!0),f.whenReady(function(){u=!0}),f.on("moveend",function(){i.resolve(),h.notifyCenterUrlHashChanged(r,f,o,c.search()),l(s,f)||b.settingCenterFromScope||m(r,function(a){r.settingCenterFromScope||angular.extend(a.center,{lat:f.getCenter().lat,lng:f.getCenter().lng,zoom:f.getZoom(),autoDiscover:!1}),h.notifyCenterChangedToBounds(r,f)})}),s.autoDiscover===!0&&f.on("locationerror",function(){a.warn("[AngularJS - Leaflet] The Geolocation API is unauthorized on this page."),n(s)?(f.setView([s.lat,s.lng],s.zoom),h.notifyCenterChangedToBounds(r,f)):(f.setView([p.center.lat,p.center.lng],p.center.zoom),h.notifyCenterChangedToBounds(r,f))})})}}}]),angular.module("leaflet-directive").directive("controls",["$log","leafletHelpers",function(a,b){return{restrict:"A",scope:!1,replace:!1,require:"?^leaflet",link:function(a,c,d,e){if(e){var f=b.isDefined,g=e.getLeafletScope(),h=g.controls;e.getMap().then(function(a){if(f(L.Control.Draw)&&f(h.draw)){f(h.edit)||(h.edit={featureGroup:new L.FeatureGroup},a.addLayer(h.edit.featureGroup));var b=new L.Control.Draw(h);a.addControl(b)}if(f(h.scale)){var c=new L.control.scale(h.scale);a.addControl(c)}if(f(h.custom))for(var d in h.custom)a.addControl(h.custom[d])})}}}}]),angular.module("leaflet-directive").directive("decorations",["$log","leafletHelpers",function(a,b){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(c,d,e,f){function g(b){return k(b)&&k(b.coordinates)&&(j.isLoaded()||a.error("[AngularJS - Leaflet] The PolylineDecorator Plugin is not loaded.")),L.polylineDecorator(b.coordinates)}function h(a,b){return k(a)&&k(b)&&k(b.coordinates)&&k(b.patterns)?(a.setPaths(b.coordinates),a.setPatterns(b.patterns),a):void 0}var i=f.getLeafletScope(),j=b.PolylineDecoratorPlugin,k=b.isDefined,l={};f.getMap().then(function(a){i.$watch("decorations",function(b){for(var c in l)k(b)&&k(b[c])||(a.removeLayer(l[c]),delete l[c]);for(var d in b){var e=b[d],f=g(e);k(f)&&(l[d]=f,a.addLayer(f),h(f,e))}},!0)})}}}]),angular.module("leaflet-directive").directive("eventBroadcast",["$log","$rootScope","leafletHelpers","leafletEvents",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(b,e,f,g){var h=c.isObject,i=c.isDefined,j=g.getLeafletScope(),k=j.eventBroadcast,l=d.getAvailableMapEvents(),m=d.genDispatchMapEvent;g.getMap().then(function(b){var c,d,e=[],f="broadcast";if(i(k.map))if(h(k.map))if("emit"!==k.map.logic&&"broadcast"!==k.map.logic?a.warn("[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'."):f=k.map.logic,h(k.map.enable)&&k.map.enable.length>=0)for(c=0;c=1+e&&b<=d.overlaysArray.length+e){var f;for(var h in d.layers.overlays)if(d.layers.overlays[h].index===b){f=d.layers.overlays[h];break}f&&g(d,function(){f.index=a.index,a.index=b})}c.stopPropagation(),c.preventDefault()},initIndex:function(a,b){var c=Object.keys(d.layers.baselayers).length;a.index=h(a.index)?a.index:b+c+1},toggleOpacity:function(b,c){if(a.debug("Event",b),c.visible){var e=angular.element(b.currentTarget);e.toggleClass(d.icons.close+" "+d.icons.open),e=e.parents(".lf-row").find(".lf-opacity"),e.toggle("fast",function(){g(d,function(){c.opacityControl=!c.opacityControl})})}b.stopPropagation(),b.preventDefault()},unsafeHTML:function(a){return f.trustAsHtml(a)}});var i=e.get(0);L.Browser.touch?L.DomEvent.on(i,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(i),L.DomEvent.on(i,"mousewheel",L.DomEvent.stopPropagation))}],template:'
',link:function(d,e,f,g){var h=c.isDefined,i=g.getLeafletScope(),j=i.layers;f.order=!h(f.order)||"normal"!==f.order&&"reverse"!==f.order?"normal":f.order,d.order="normal"===f.order,d.orderNumber="normal"===f.order?-1:1,d.layers=j,g.getMap().then(function(c){i.$watch("layers.baselayers",function(a){b.getLayers().then(function(b){var e;for(e in a)a[e].icon=c.hasLayer(b.baselayers[e])?d.icons.radio:d.icons.unradio})}),i.$watch("layers.overlays",function(f){var g=[];b.getLayers().then(function(a){for(var b in f)f[b].icon=d.icons[f[b].visible?"uncheck":"check"],g.push(f[b]),h(f[b].index)&&a.overlays[b].setZIndex&&a.overlays[b].setZIndex(f[b].index)});var i=d.$watch(function(){return e.children().size()>1?(e.find(".lf-overlays").trigger("resize"),e.find(".lf-opacity").size()===Object.keys(j.overlays).length):void 0},function(f){f===!0&&(h(e.find(".lf-opacity-control").ionRangeSlider)?e.find(".lf-opacity-control").each(function(a,e){var f,g=Object.keys(j.baselayers).length;for(var i in d.overlaysArray)d.overlaysArray[i].index===a+g+1&&(f=d.overlaysArray[i]);var k=angular.element(e),l=h(f)&&h(f.layerOptions)?f.layerOptions.opacity:void 0;k.ionRangeSlider({min:0,from:h(l)?Math.ceil(100*l):100,step:1,max:100,prettify:!1,hasGrid:!1,hideMinMax:!0,onChange:function(a){b.getLayers().then(function(b){var d,e,f=a.input.data().key;for(var g in j.overlays)if(j.overlays[g].index===f){d=b.overlays[g],e=j.overlays[g];break}c.hasLayer(d)&&(e.layerOptions=h(e.layerOptions)?e.layerOptions:{},e.layerOptions.opacity=a.input.val()/100,d.setOpacity&&d.setOpacity(a.input.val()/100),d.getLayers&&d.eachLayer&&d.eachLayer(function(b){b.setOpacity&&b.setOpacity(a.input.val()/100)}))})}})}):a.warn("[AngularJS - Leaflet] Ion Slide Range Plugin is not loaded"),i())});d.overlaysArray=g},!0)})}}}]),angular.module("leaflet-directive").directive("layers",["$log","$q","leafletData","leafletHelpers","leafletLayerHelpers","leafletControlHelpers",function(a,b,c,d,e,f){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",controller:["$scope",function(a){a._leafletLayers=b.defer(),this.getLayers=function(){return a._leafletLayers.promise}}],link:function(a,b,g,h){var i=d.isDefined,j={},k=h.getLeafletScope(),l=k.layers,m=e.createLayer,n=f.updateLayersControl,o=!1;h.getMap().then(function(b){a._leafletLayers.resolve(j),c.setLayers(j,g.id),j.baselayers={},j.overlays={};var d=g.id,e=!1;for(var f in l.baselayers){var h=m(l.baselayers[f]);i(h)?(j.baselayers[f]=h,l.baselayers[f].top===!0&&(b.addLayer(j.baselayers[f]),e=!0)):delete l.baselayers[f]}!e&&Object.keys(j.baselayers).length>0&&b.addLayer(j.baselayers[Object.keys(l.baselayers)[0]]);for(f in l.overlays){"cartodb"===l.overlays[f].type;var p=m(l.overlays[f]);i(p)?(j.overlays[f]=p,l.overlays[f].visible===!0&&b.addLayer(j.overlays[f])):delete l.overlays[f]}k.$watch("layers.baselayers",function(a){for(var c in j.baselayers)i(a[c])||(b.hasLayer(j.baselayers[c])&&b.removeLayer(j.baselayers[c]),delete j.baselayers[c]);for(var e in a)if(i(j.baselayers[e]))a[e].top!==!0||b.hasLayer(j.baselayers[e])?a[e].top===!1&&b.hasLayer(j.baselayers[e])&&b.removeLayer(j.baselayers[e]):b.addLayer(j.baselayers[e]);else{var f=m(a[e]);i(f)&&(j.baselayers[e]=f,a[e].top===!0&&b.addLayer(j.baselayers[e]))}var g=!1;for(var h in j.baselayers)if(b.hasLayer(j.baselayers[h])){g=!0;break}!g&&Object.keys(j.baselayers).length>0&&b.addLayer(j.baselayers[Object.keys(j.baselayers)[0]]),o=n(b,d,o,a,l.overlays,j)},!0),k.$watch("layers.overlays",function(a){for(var c in j.overlays)i(a[c])||(b.hasLayer(j.overlays[c])&&b.removeLayer(j.overlays[c]),delete j.overlays[c]);for(var e in a){if(!i(j.overlays[e])){var f=m(a[e]);i(f)&&(j.overlays[e]=f,a[e].visible===!0&&b.addLayer(j.overlays[e]))}a[e].visible&&!b.hasLayer(j.overlays[e])?b.addLayer(j.overlays[e]):a[e].visible===!1&&b.hasLayer(j.overlays[e])&&b.removeLayer(j.overlays[e]),a[e].visible&&b._loaded&&a[e].data&&"heatmap"===a[e].type&&(j.overlays[e].setData(a[e].data),j.overlays[e].update())}o=n(b,d,o,l.baselayers,a,j)},!0)})}}}]),angular.module("leaflet-directive").directive("legend",["$log","$http","leafletHelpers","leafletLegendHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i,j,k,l,m=c.isArray,n=c.isDefined,o=c.isFunction,p=h.getLeafletScope(),q=p.legend;p.$watch("legend",function(a){n(a)&&(i=a.legendClass?a.legendClass:"legend",j=a.position||"bottomright",l=a.type||"arcgis")},!0),h.getMap().then(function(c){p.$watch("legend",function(b){return n(b)?n(b.url)||"arcgis"!==l||m(b.colors)&&m(b.labels)&&b.colors.length===b.labels.length?n(b.url)?void a.info("[AngularJS - Leaflet] loading legend service."):(n(k)&&(k.removeFrom(c),k=null),k=L.control({position:j}),"arcgis"===l&&(k.onAdd=d.getOnAddArrayLegend(b,i)),void k.addTo(c)):void a.warn("[AngularJS - Leaflet] legend.colors and legend.labels must be set."):void(n(k)&&(k.removeFrom(c),k=null))}),p.$watch("legend.url",function(e){n(e)&&b.get(e).success(function(a){n(k)?d.updateLegend(k.getContainer(),a,l,e):(k=L.control({position:j}),k.onAdd=d.getOnAddLegend(a,i,l,e),k.addTo(c)),n(q.loadedData)&&o(q.loadedData)&&q.loadedData()}).error(function(){a.warn("[AngularJS - Leaflet] legend.url not loaded.")})})})}}}]),angular.module("leaflet-directive").directive("markers",["$log","$rootScope","$q","leafletData","leafletHelpers","leafletMapDefaults","leafletMarkersHelpers","leafletEvents","leafletIterators",function(a,b,c,d,e,f,g,h,i){var j=e.isDefined,k=e.errorHeader,l=e.defaultTo,m=e,n=e.isString,o=g.addMarkerWatcher,p=g.listenMarkerEvents,q=g.addMarkerToGroup,r=h.bindMarkerEvents,s=g.createMarker,t=g.deleteMarker,u=i,v=function(b,c,d,e,f,h){if(!n(b))return a.error(k+" A layername must be a string"),!1;if(!j(c))return a.error(k+" You must add layers to the directive if the markers are going to use this functionality."),!1;if(!j(c.overlays)||!j(c.overlays[b]))return a.error(k+' A marker can only be added to a layer of type "group"'),!1;var i=c.overlays[b];return i instanceof L.LayerGroup||i instanceof L.FeatureGroup?(i.addLayer(e),!f&&h.hasLayer(e)&&d.focus===!0&&g.manageOpenPopup(e,d),!0):(a.error(k+' Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"'),!1)},w=function(b,c,d,e,f,h,i){h=l(h,!1);for(var n in b)if(-1===n.search("-")){if(!j(e[n])){var t=b[n],u=s(t);if(!j(u)){a.error(k+" Received invalid data on the marker "+n+".");continue}if(e[n]=u,j(t.message)&&u.bindPopup(t.message,t.popupOptions),j(t.group)){var w=j(t.groupOption)?t.groupOption:null;q(u,t.group,w,c)}if(m.LabelPlugin.isLoaded()&&j(t.label)&&j(t.label.message)&&u.bindLabel(t.label.message,t.label.options),j(t)&&(j(t.layer)||j(i))){var x=v(t.layer||i,d,t,u,h,c);if(!x)continue}else j(t.group)||(c.addLayer(u),h||t.focus!==!0||g.manageOpenPopup(u,t));var y=m.getObjectDotPath(i?[i,n]:[n]);h&&o(u,y,f,d,c),p(u,t,f,h),r(u,y,t,f)}}else a.error('The marker can\'t use a "-" on his key name: "'+n+'".')},x=function(b,c,d,e){var f=!1;for(var g in c)f||(a.debug(k+"[markers] destroy: "),f=!0),j(b)&&j(b[g])||(t(c[g],d,e),delete c[g])};return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?layers"],link:function(a,b,e,f){var g=f[0],h=g.getLeafletScope();g.getMap().then(function(a){var b,g={};b=j(f[1])?f[1].getLayers:function(){var a=c.defer();return a.resolve(),a.promise},b().then(function(b){d.setMarkers(g,e.id),h.$watch("markers",function(c){x(c,g,a,b);var d=!j(e.watchMarkers)||m.isTruthy(e.watchMarkers),f=j(e.markersNested)&&m.isTruthy(e.markersNested);return f?void u.each(c,function(c,e){w(c,a,b,g,h,d,e)}):void w(c,a,b,g,h,d)},!0)})})}}}]),angular.module("leaflet-directive").directive("maxbounds",["$log","leafletMapDefaults","leafletBoundsHelpers","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(a,b,e,f){var g=f.getLeafletScope(),h=c.isValidBounds,i=d.isNumber;f.getMap().then(function(a){g.$watch("maxbounds",function(b){if(!h(b))return void a.setMaxBounds();var d=c.createLeafletBounds(b);i(b.pad)&&(d=d.pad(b.pad)),a.setMaxBounds(d),e.center||a.fitBounds(d)})})}}}]),angular.module("leaflet-directive").directive("paths",["$log","$q","leafletData","leafletMapDefaults","leafletHelpers","leafletPathsHelpers","leafletEvents",function(a,b,c,d,e,f,g){return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?layers"],link:function(h,i,j,k){var l=k[0],m=e.isDefined,n=e.isString,o=l.getLeafletScope(),p=o.paths,q=f.createPath,r=g.bindPathEvents,s=f.setPathOptions;l.getMap().then(function(f){var g,h=d.getDefaults(j.id);g=m(k[1])?k[1].getLayers:function(){var a=b.defer();return a.resolve(),a.promise},m(p)&&g().then(function(b){var d={};c.setPaths(d,j.id);var g=!m(j.watchPaths)||"true"===j.watchPaths,i=function(a,c){var d=o.$watch('paths["'+c+'"]',function(c,e){if(!m(c)){if(m(e.layer))for(var g in b.overlays){var h=b.overlays[g];h.removeLayer(a)}return f.removeLayer(a),void d()}s(a,c.type,c)},!0)};o.$watchCollection("paths",function(c){for(var j in d)m(c[j])||(f.removeLayer(d[j]),delete d[j]);for(var k in c)if(0!==k.search("\\$"))if(-1===k.search("-")){if(!m(d[k])){var l=c[k],p=q(k,c[k],h);if(m(p)&&m(l.message)&&p.bindPopup(l.message),e.LabelPlugin.isLoaded()&&m(l.label)&&m(l.label.message)&&p.bindLabel(l.label.message,l.label.options),m(l)&&m(l.layer)){if(!n(l.layer)){a.error("[AngularJS - Leaflet] A layername must be a string");continue}if(!m(b)){a.error("[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.");continue}if(!m(b.overlays)||!m(b.overlays[l.layer])){a.error('[AngularJS - Leaflet] A marker can only be added to a layer of type "group"');continue}var t=b.overlays[l.layer];if(!(t instanceof L.LayerGroup||t instanceof L.FeatureGroup)){a.error('[AngularJS - Leaflet] Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"');continue}d[k]=p,t.addLayer(p),g?i(p,k):s(p,l.type,l)}else m(p)&&(d[k]=p,f.addLayer(p),g?i(p,k):s(p,l.type,l));r(p,k,l,o)}}else a.error('[AngularJS - Leaflet] The path name "'+k+'" is not valid. It must not include "-" and a number.')})})})}}}]),angular.module("leaflet-directive").directive("tiles",["$log","leafletData","leafletMapDefaults","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i=d.isDefined,j=h.getLeafletScope(),k=j.tiles;return i(k)||i(k.url)?void h.getMap().then(function(a){var d,e=c.getDefaults(g.id);j.$watch("tiles",function(c){var f=e.tileLayerOptions,h=e.tileLayer;return!i(c.url)&&i(d)?void a.removeLayer(d):i(d)?i(c.url)&&i(c.options)&&!angular.equals(c.options,f)?(a.removeLayer(d),f=e.tileLayerOptions,angular.copy(c.options,f),h=c.url,d=L.tileLayer(h,f),d.addTo(a),void b.setTiles(d,g.id)):void(i(c.url)&&d.setUrl(c.url)):(i(c.options)&&angular.copy(c.options,f),i(c.url)&&(h=c.url),d=L.tileLayer(h,f),d.addTo(a),void b.setTiles(d,g.id))},!0)}):void a.warn("[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property.")}}}])}(angular); \ No newline at end of file +i.addLayer(a),h.hasLayer(a)&&b.focus===!0&&z(a,b)}if(b.draggable!==!0&&d.draggable===!0&&f(a.dragging)&&a.dragging.disable(),b.draggable===!0&&d.draggable!==!0&&(a.dragging?a.dragging.enable():L.Handler.MarkerDrag&&(a.dragging=new L.Handler.MarkerDrag(a),a.options.draggable=!0,a.dragging.enable())),p(b.icon)||p(d.icon)&&(a.setIcon(v()),a.closePopup(),a.unbindPopup(),n(b.message)&&a.bindPopup(b.message,b.popupOptions)),p(b.icon)&&p(d.icon)&&!angular.equals(b.icon,d.icon)){var j=!1;a.dragging&&(j=a.dragging.enabled()),a.setIcon(v(b.icon)),j&&a.dragging.enable(),a.closePopup(),a.unbindPopup(),n(b.message)&&a.bindPopup(b.message,b.popupOptions)}!n(b.message)&&n(d.message)&&(a.closePopup(),a.unbindPopup()),m.LabelPlugin.isLoaded()&&(f(b.label)&&f(b.label.message)?"label"in d&&"message"in d.label&&!angular.equals(b.label.message,d.label.message)?a.updateLabelContent(b.label.message):angular.isFunction(a.getLabel)?A(a,b):(a.bindLabel(b.label.message,b.label.options),A(a,b)):(!("label"in b)||"message"in b.label)&&angular.isFunction(a.unbindLabel)&&a.unbindLabel()),n(b.message)&&!n(d.message)&&a.bindPopup(b.message,b.popupOptions),n(b.message)&&n(d.message)&&b.message!==d.message&&a.setPopupContent(b.message);var l=!1;b.focus!==!0&&d.focus===!0&&(a.closePopup(),l=!0),(b.focus===!0&&(!f(d.focus)||d.focus===!1)||g&&b.focus===!0)&&(z(a,b),l=!0),d.zIndexOffset!==b.zIndexOffset&&a.setZIndexOffset(b.zIndexOffset);var q=a.getLatLng(),t=n(b.layer)&&m.MarkerClusterPlugin.is(e.overlays[b.layer]);t?l?(b.lat!==d.lat||b.lng!==d.lng)&&(e.overlays[b.layer].removeLayer(a),a.setLatLng([b.lat,b.lng]),e.overlays[b.layer].addLayer(a)):q.lat!==b.lat||q.lng!==b.lng?(e.overlays[b.layer].removeLayer(a),a.setLatLng([b.lat,b.lng]),e.overlays[b.layer].addLayer(a)):b.lat!==d.lat||b.lng!==d.lng?(e.overlays[b.layer].removeLayer(a),a.setLatLng([b.lat,b.lng]),e.overlays[b.layer].addLayer(a)):p(b.icon)&&p(d.icon)&&!angular.equals(b.icon,d.icon)&&(e.overlays[b.layer].removeLayer(a),e.overlays[b.layer].addLayer(a)):(q.lat!==b.lat||q.lng!==b.lng)&&a.setLatLng([b.lat,b.lng])}},i)},string:t,log:u}}]),angular.module("leaflet-directive").factory("leafletPathsHelpers",["$rootScope","$log","leafletHelpers",function(a,b,c){function d(a){return a.filter(function(a){return k(a)}).map(function(a){return e(a)})}function e(a){return i(a)?new L.LatLng(a[0],a[1]):new L.LatLng(a.lat,a.lng)}function f(a){return a.map(function(a){return d(a)})}function g(a,b){for(var c={},d=0;dp.center.zoom?{setView:!0,maxZoom:b.zoom}:j(p.maxZoom)?{setView:!0,maxZoom:p.maxZoom}:{setView:!0})):void(u&&l(b,f)||(r.settingCenterFromScope=!0,f.setView([b.lat,b.lng],b.zoom),h.notifyCenterChangedToBounds(r,f),d(function(){r.settingCenterFromScope=!1}))):void a.warn("[AngularJS - Leaflet] invalid 'center'")},!0),f.whenReady(function(){u=!0}),f.on("moveend",function(){i.resolve(),h.notifyCenterUrlHashChanged(r,f,o,c.search()),l(s,f)||b.settingCenterFromScope||m(r,function(a){r.settingCenterFromScope||angular.extend(a.center,{lat:f.getCenter().lat,lng:f.getCenter().lng,zoom:f.getZoom(),autoDiscover:!1}),h.notifyCenterChangedToBounds(r,f)})}),s.autoDiscover===!0&&f.on("locationerror",function(){a.warn("[AngularJS - Leaflet] The Geolocation API is unauthorized on this page."),n(s)?(f.setView([s.lat,s.lng],s.zoom),h.notifyCenterChangedToBounds(r,f)):(f.setView([p.center.lat,p.center.lng],p.center.zoom),h.notifyCenterChangedToBounds(r,f))})})}}}]),angular.module("leaflet-directive").directive("controls",["$log","leafletHelpers",function(a,b){return{restrict:"A",scope:!1,replace:!1,require:"?^leaflet",link:function(a,c,d,e){if(e){var f=b.isDefined,g=e.getLeafletScope(),h=g.controls;e.getMap().then(function(a){if(f(L.Control.Draw)&&f(h.draw)){f(h.edit)||(h.edit={featureGroup:new L.FeatureGroup},a.addLayer(h.edit.featureGroup));var b=new L.Control.Draw(h);a.addControl(b)}if(f(h.scale)){var c=new L.control.scale(h.scale);a.addControl(c)}if(f(h.custom))for(var d in h.custom)a.addControl(h.custom[d])})}}}}]),angular.module("leaflet-directive").directive("decorations",["$log","leafletHelpers",function(a,b){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(c,d,e,f){function g(b){return k(b)&&k(b.coordinates)&&(j.isLoaded()||a.error("[AngularJS - Leaflet] The PolylineDecorator Plugin is not loaded.")),L.polylineDecorator(b.coordinates)}function h(a,b){return k(a)&&k(b)&&k(b.coordinates)&&k(b.patterns)?(a.setPaths(b.coordinates),a.setPatterns(b.patterns),a):void 0}var i=f.getLeafletScope(),j=b.PolylineDecoratorPlugin,k=b.isDefined,l={};f.getMap().then(function(a){i.$watch("decorations",function(b){for(var c in l)k(b)&&k(b[c])||(a.removeLayer(l[c]),delete l[c]);for(var d in b){var e=b[d],f=g(e);k(f)&&(l[d]=f,a.addLayer(f),h(f,e))}},!0)})}}}]),angular.module("leaflet-directive").directive("eventBroadcast",["$log","$rootScope","leafletHelpers","leafletEvents",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(b,e,f,g){var h=c.isObject,i=c.isDefined,j=g.getLeafletScope(),k=j.eventBroadcast,l=d.getAvailableMapEvents(),m=d.genDispatchMapEvent;g.getMap().then(function(b){var c,d,e=[],f="broadcast";if(i(k.map))if(h(k.map))if("emit"!==k.map.logic&&"broadcast"!==k.map.logic?a.warn("[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'."):f=k.map.logic,h(k.map.enable)&&k.map.enable.length>=0)for(c=0;c=1+e&&b<=d.overlaysArray.length+e){var f;for(var h in d.layers.overlays)if(d.layers.overlays[h].index===b){f=d.layers.overlays[h];break}f&&g(d,function(){f.index=a.index,a.index=b})}c.stopPropagation(),c.preventDefault()},initIndex:function(a,b){var c=Object.keys(d.layers.baselayers).length;a.index=h(a.index)?a.index:b+c+1},toggleOpacity:function(b,c){if(a.debug("Event",b),c.visible){var e=angular.element(b.currentTarget);e.toggleClass(d.icons.close+" "+d.icons.open),e=e.parents(".lf-row").find(".lf-opacity"),e.toggle("fast",function(){g(d,function(){c.opacityControl=!c.opacityControl})})}b.stopPropagation(),b.preventDefault()},unsafeHTML:function(a){return f.trustAsHtml(a)}});var i=e.get(0);L.Browser.touch?L.DomEvent.on(i,"click",L.DomEvent.stopPropagation):(L.DomEvent.disableClickPropagation(i),L.DomEvent.on(i,"mousewheel",L.DomEvent.stopPropagation))}],template:'
',link:function(d,e,f,g){var h=c.isDefined,i=g.getLeafletScope(),j=i.layers;f.order=!h(f.order)||"normal"!==f.order&&"reverse"!==f.order?"normal":f.order,d.order="normal"===f.order,d.orderNumber="normal"===f.order?-1:1,d.layers=j,g.getMap().then(function(c){i.$watch("layers.baselayers",function(a){b.getLayers().then(function(b){var e;for(e in a)c.hasLayer(b.baselayers[e])?a[e].icon=d.icons.radio:a[e].icon=d.icons.unradio})}),i.$watch("layers.overlays",function(f){var g=[];b.getLayers().then(function(a){for(var b in f)f[b].icon=d.icons[f[b].visible?"uncheck":"check"],g.push(f[b]),h(f[b].index)&&a.overlays[b].setZIndex&&a.overlays[b].setZIndex(f[b].index)});var i=d.$watch(function(){return e.children().size()>1?(e.find(".lf-overlays").trigger("resize"),e.find(".lf-opacity").size()===Object.keys(j.overlays).length):void 0},function(f){f===!0&&(h(e.find(".lf-opacity-control").ionRangeSlider)?e.find(".lf-opacity-control").each(function(a,e){var f,g=Object.keys(j.baselayers).length;for(var i in d.overlaysArray)d.overlaysArray[i].index===a+g+1&&(f=d.overlaysArray[i]);var k=angular.element(e),l=h(f)&&h(f.layerOptions)?f.layerOptions.opacity:void 0;k.ionRangeSlider({min:0,from:h(l)?Math.ceil(100*l):100,step:1,max:100,prettify:!1,hasGrid:!1,hideMinMax:!0,onChange:function(a){b.getLayers().then(function(b){var d,e,f=a.input.data().key;for(var g in j.overlays)if(j.overlays[g].index===f){d=b.overlays[g],e=j.overlays[g];break}c.hasLayer(d)&&(e.layerOptions=h(e.layerOptions)?e.layerOptions:{},e.layerOptions.opacity=a.input.val()/100,d.setOpacity&&d.setOpacity(a.input.val()/100),d.getLayers&&d.eachLayer&&d.eachLayer(function(b){b.setOpacity&&b.setOpacity(a.input.val()/100)}))})}})}):a.warn("[AngularJS - Leaflet] Ion Slide Range Plugin is not loaded"),i())});d.overlaysArray=g},!0)})}}}]),angular.module("leaflet-directive").directive("layers",["$log","$q","leafletData","leafletHelpers","leafletLayerHelpers","leafletControlHelpers",function(a,b,c,d,e,f){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",controller:["$scope",function(a){a._leafletLayers=b.defer(),this.getLayers=function(){return a._leafletLayers.promise}}],link:function(a,b,g,h){var i=d.isDefined,j={},k=h.getLeafletScope(),l=k.layers,m=e.createLayer,n=f.updateLayersControl,o=!1;h.getMap().then(function(b){a._leafletLayers.resolve(j),c.setLayers(j,g.id),j.baselayers={},j.overlays={};var d=g.id,e=!1;for(var f in l.baselayers){var h=m(l.baselayers[f]);i(h)?(j.baselayers[f]=h,l.baselayers[f].top===!0&&(b.addLayer(j.baselayers[f]),e=!0)):delete l.baselayers[f]}!e&&Object.keys(j.baselayers).length>0&&b.addLayer(j.baselayers[Object.keys(l.baselayers)[0]]);for(f in l.overlays){"cartodb"===l.overlays[f].type;var p=m(l.overlays[f]);i(p)?(j.overlays[f]=p,l.overlays[f].visible===!0&&b.addLayer(j.overlays[f])):delete l.overlays[f]}k.$watch("layers.baselayers",function(a){for(var c in j.baselayers)i(a[c])||(b.hasLayer(j.baselayers[c])&&b.removeLayer(j.baselayers[c]),delete j.baselayers[c]);for(var e in a)if(i(j.baselayers[e]))a[e].top!==!0||b.hasLayer(j.baselayers[e])?a[e].top===!1&&b.hasLayer(j.baselayers[e])&&b.removeLayer(j.baselayers[e]):b.addLayer(j.baselayers[e]);else{var f=m(a[e]);i(f)&&(j.baselayers[e]=f,a[e].top===!0&&b.addLayer(j.baselayers[e]))}var g=!1;for(var h in j.baselayers)if(b.hasLayer(j.baselayers[h])){g=!0;break}!g&&Object.keys(j.baselayers).length>0&&b.addLayer(j.baselayers[Object.keys(j.baselayers)[0]]),o=n(b,d,o,a,l.overlays,j)},!0),k.$watch("layers.overlays",function(a){for(var c in j.overlays)i(a[c])||(b.hasLayer(j.overlays[c])&&b.removeLayer(j.overlays[c]),delete j.overlays[c]);for(var e in a){if(!i(j.overlays[e])){var f=m(a[e]);i(f)&&(j.overlays[e]=f,a[e].visible===!0&&b.addLayer(j.overlays[e]))}a[e].visible&&!b.hasLayer(j.overlays[e])?b.addLayer(j.overlays[e]):a[e].visible===!1&&b.hasLayer(j.overlays[e])&&b.removeLayer(j.overlays[e]),a[e].visible&&b._loaded&&a[e].data&&"heatmap"===a[e].type&&(j.overlays[e].setData(a[e].data),j.overlays[e].update())}o=n(b,d,o,l.baselayers,a,j)},!0)})}}}]),angular.module("leaflet-directive").directive("legend",["$log","$http","leafletHelpers","leafletLegendHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i,j,k,l,m=c.isArray,n=c.isDefined,o=c.isFunction,p=h.getLeafletScope(),q=p.legend;p.$watch("legend",function(a){n(a)&&(i=a.legendClass?a.legendClass:"legend",j=a.position||"bottomright",l=a.type||"arcgis")},!0),h.getMap().then(function(c){p.$watch("legend",function(b){return n(b)?n(b.url)||"arcgis"!==l||m(b.colors)&&m(b.labels)&&b.colors.length===b.labels.length?n(b.url)?void a.info("[AngularJS - Leaflet] loading legend service."):(n(k)&&(k.removeFrom(c),k=null),k=L.control({position:j}),"arcgis"===l&&(k.onAdd=d.getOnAddArrayLegend(b,i)),void k.addTo(c)):void a.warn("[AngularJS - Leaflet] legend.colors and legend.labels must be set."):void(n(k)&&(k.removeFrom(c),k=null))}),p.$watch("legend.url",function(e){n(e)&&b.get(e).success(function(a){n(k)?d.updateLegend(k.getContainer(),a,l,e):(k=L.control({position:j}),k.onAdd=d.getOnAddLegend(a,i,l,e),k.addTo(c)),n(q.loadedData)&&o(q.loadedData)&&q.loadedData()}).error(function(){a.warn("[AngularJS - Leaflet] legend.url not loaded.")})})})}}}]),angular.module("leaflet-directive").directive("markers",["$log","$rootScope","$q","leafletData","leafletHelpers","leafletMapDefaults","leafletMarkersHelpers","leafletEvents","leafletIterators","leafletWatchHelpers","leafletDirectiveControlsHelpers",function(a,b,c,d,e,f,g,h,i,j,k){var l=e.isDefined,m=e.errorHeader,n=e,o=e.isString,p=g.addMarkerWatcher,q=g.listenMarkerEvents,r=g.addMarkerToGroup,s=h.bindMarkerEvents,t=g.createMarker,u=g.deleteMarker,v=i,w=e.watchOptions,x=j.maybeWatch,y=k.extend,z=function(b,c,d,e,f,h){if(!o(b))return a.error(m+" A layername must be a string"),!1;if(!l(c))return a.error(m+" You must add layers to the directive if the markers are going to use this functionality."),!1;if(!l(c.overlays)||!l(c.overlays[b]))return a.error(m+' A marker can only be added to a layer of type "group"'),!1;var i=c.overlays[b];return i instanceof L.LayerGroup||i instanceof L.FeatureGroup?(i.addLayer(e),!f&&h.hasLayer(e)&&d.focus===!0&&g.manageOpenPopup(e,d),!0):(a.error(m+' Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"'),!1)},A=function(b,c,d,e,f,h,i){for(var j in b)if(-1===j.search("-")){if(!l(e[j])){var k=n.copy(b[j]),o=t(k),u=(k?k.layer:void 0)||i;if(!l(o)){a.error(m+" Received invalid data on the marker "+j+".");continue}if(e[j]=o,l(k.message)&&o.bindPopup(k.message,k.popupOptions),l(k.group)){var v=l(k.groupOption)?k.groupOption:null;r(o,k.group,v,c)}if(n.LabelPlugin.isLoaded()&&l(k.label)&&l(k.label.message)&&o.bindLabel(k.label.message,k.label.options),l(k)&&(l(k.layer)||l(i))){var w=z(u,d,k,o,h.individual.doWatch,c);if(!w)continue}else l(k.group)||(c.addLayer(o),h.individual.doWatch||k.focus!==!0||g.manageOpenPopup(o,k));var x=n.getObjectDotPath(i?[i,j]:[j]);h.individual.doWatch&&p(o,x,f,d,c,h.individual.doWatch),q(o,k,f,h.individual.doWatch),s(o,x,k,f,u)}}else a.error('The marker can\'t use a "-" on his key name: "'+j+'".')},B=function(b,c,d,e,f){var g=!1,h=!1,i=l(c);for(var j in d)g||(a.debug(m+"[markers] destroy: "),g=!0),i&&(h=!angular.equals(b[j],c[j])),l(b)&&Object.keys(b).length&&l(b[j])&&Object.keys(b[j]).length&&!h||(u(d[j],e,f),delete d[j])};return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?layers"],link:function(a,b,e,f){var g=f[0],h=g.getLeafletScope();g.getMap().then(function(a){var b,g={};b=l(f[1])?f[1].getLayers:function(){var a=c.defer();return a.resolve(),a.promise};var i=h.markersWatchOptions||w;l(e.watchMarkers)&&(i.doWatch=i.individual.doWatch=!l(e.watchMarkers)||n.isTruthy(e.watchMarkers));var j=l(e.markersNested)&&n.isTruthy(e.markersNested);b().then(function(b){var c=function(c,d){B(c,d,g,a,b)},f=function(d,e){return c(d,e),j?void v.each(d,function(c,d){A(c,a,b,g,h,i,d)}):void A(d,a,b,g,h,i)};y(e.id,"markers",f,c),d.setMarkers(g,e.id),x(h,"markers",i,function(a,b){f(a,b)})})})}}}]),angular.module("leaflet-directive").directive("maxbounds",["$log","leafletMapDefaults","leafletBoundsHelpers","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(a,b,e,f){var g=f.getLeafletScope(),h=c.isValidBounds,i=d.isNumber;f.getMap().then(function(a){g.$watch("maxbounds",function(b){if(!h(b))return void a.setMaxBounds();var d=c.createLeafletBounds(b);i(b.pad)&&(d=d.pad(b.pad)),a.setMaxBounds(d),e.center||a.fitBounds(d)})})}}}]),angular.module("leaflet-directive").directive("paths",["$log","$q","leafletData","leafletMapDefaults","leafletHelpers","leafletPathsHelpers","leafletEvents",function(a,b,c,d,e,f,g){return{restrict:"A",scope:!1,replace:!1,require:["leaflet","?layers"],link:function(h,i,j,k){var l=k[0],m=e.isDefined,n=e.isString,o=l.getLeafletScope(),p=o.paths,q=f.createPath,r=g.bindPathEvents,s=f.setPathOptions;l.getMap().then(function(f){var g,h=d.getDefaults(j.id);g=m(k[1])?k[1].getLayers:function(){var a=b.defer();return a.resolve(),a.promise},m(p)&&g().then(function(b){var d={};c.setPaths(d,j.id);var g=!m(j.watchPaths)||"true"===j.watchPaths,i=function(a,c){var d=o.$watch('paths["'+c+'"]',function(c,e){if(!m(c)){if(m(e.layer))for(var g in b.overlays){var h=b.overlays[g];h.removeLayer(a)}return f.removeLayer(a),void d()}s(a,c.type,c)},!0)};o.$watchCollection("paths",function(c){for(var j in d)m(c[j])||(f.removeLayer(d[j]),delete d[j]);for(var k in c)if(0!==k.search("\\$"))if(-1===k.search("-")){if(!m(d[k])){var l=c[k],p=q(k,c[k],h);if(m(p)&&m(l.message)&&p.bindPopup(l.message),e.LabelPlugin.isLoaded()&&m(l.label)&&m(l.label.message)&&p.bindLabel(l.label.message,l.label.options),m(l)&&m(l.layer)){if(!n(l.layer)){a.error("[AngularJS - Leaflet] A layername must be a string");continue}if(!m(b)){a.error("[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.");continue}if(!m(b.overlays)||!m(b.overlays[l.layer])){a.error('[AngularJS - Leaflet] A marker can only be added to a layer of type "group"');continue}var t=b.overlays[l.layer];if(!(t instanceof L.LayerGroup||t instanceof L.FeatureGroup)){a.error('[AngularJS - Leaflet] Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"');continue}d[k]=p,t.addLayer(p),g?i(p,k):s(p,l.type,l)}else m(p)&&(d[k]=p,f.addLayer(p),g?i(p,k):s(p,l.type,l));r(p,k,l,o)}}else a.error('[AngularJS - Leaflet] The path name "'+k+'" is not valid. It must not include "-" and a number.')})})})}}}]),angular.module("leaflet-directive").directive("tiles",["$log","leafletData","leafletMapDefaults","leafletHelpers",function(a,b,c,d){return{restrict:"A",scope:!1,replace:!1,require:"leaflet",link:function(e,f,g,h){var i=d.isDefined,j=h.getLeafletScope(),k=j.tiles;return i(k)||i(k.url)?void h.getMap().then(function(a){var d,e=c.getDefaults(g.id);j.$watch("tiles",function(c){var f=e.tileLayerOptions,h=e.tileLayer;return!i(c.url)&&i(d)?void a.removeLayer(d):i(d)?i(c.url)&&i(c.options)&&!angular.equals(c.options,f)?(a.removeLayer(d),f=e.tileLayerOptions,angular.copy(c.options,f),h=c.url,d=L.tileLayer(h,f),d.addTo(a),void b.setTiles(d,g.id)):void(i(c.url)&&d.setUrl(c.url)):(i(c.options)&&angular.copy(c.options,f),i(c.url)&&(h=c.url),d=L.tileLayer(h,f),d.addTo(a),void b.setTiles(d,g.id))},!0)}):void a.warn("[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property.")}}}]),["markers","geojson"].forEach(function(a){angular.module("leaflet-directive").directive(a+"WatchOptions",["$log","$rootScope","$q","leafletData","leafletHelpers",function(b,c,d,e,f){var g=f.isDefined,h=f.errorHeader,i=f.isObject,j=f.watchOptions;return{restrict:"A",scope:!1,replace:!1,require:["leaflet"],link:function(c,d,e,f){var k=f[0],l=k.getLeafletScope();k.getMap().then(function(){g(c[a+"WatchOptions"])&&(i(c[a+"WatchOptions"])?angular.extend(j,c[a+"WatchOptions"]):b.error(h+"["+a+"WatchOptions] is not an object"),l[a+"WatchOptions"]=j)})}}}])}),angular.module("leaflet-directive").factory("leafletEventsHelpers",["$rootScope","$q","$log","leafletHelpers",function(a,b,c,d){var e=d.safeApply,f=d.isDefined,g=function(b,c,d,g,h,i,j,k){e(b,function(){var e={leafletEvent:g,leafletObject:h,modelName:j,model:i};f(k)&&angular.extend(e,{layerName:k}),"emit"===d?b.$emit(c,e):a.$broadcast(c,e)})};return{fire:g}}]),angular.module("leaflet-directive").factory("leafletLabelEvents",["$rootScope","$q","$log","leafletHelpers","leafletEventsHelpers",function(a,b,c,d,e){var f=d,g=e.fire,h=function(){return["click","dblclick","mousedown","mouseover","mouseout","contextmenu"]},i=function(a,b,c,d,e,f,h){return function(e){var i="leafletDirectiveLabel."+a,j=scope_watch_name.replace("markers.","");g(c,i,b,e,d,f,j,h)}},j=function(a,b,c,d,e,g,j){for(var k=h(),l=f.getObjectArrayPath("markers."+e),m=0;m
', @@ -44,6 +47,8 @@ angular.module("leaflet-directive", []).directive('leaflet', function ($q, leafl genDispatchMapEvent = leafletEvents.genDispatchMapEvent, mapEvents = leafletEvents.getAvailableMapEvents(); + leafletData.setDirectiveControls({}, attrs.id); + // Set width and height utility functions function updateWidth() { if (isNaN(attrs.width)) { @@ -290,684 +295,307 @@ angular.module("leaflet-directive").service('leafletData', function ($log, $q, l getUnresolvedDefer = leafletHelpers.getUnresolvedDefer, setResolvedDefer = leafletHelpers.setResolvedDefer; - var maps = {}; - var tiles = {}; - var layers = {}; - var paths = {}; - var markers = {}; - var geoJSON = {}; - var utfGrid = {}; - var decorations = {}; - - this.setMap = function(leafletMap, scopeId) { - var defer = getUnresolvedDefer(maps, scopeId); - defer.resolve(leafletMap); - setResolvedDefer(maps, scopeId); - }; + var _private = {}; + var self = this; - this.getMap = function(scopeId) { - var defer = getDefer(maps, scopeId); - return defer.promise; + var upperFirst = function (string) { + return string.charAt(0).toUpperCase() + string.slice(1); }; + var _privateItems = [ + 'map', + 'tiles', + 'layers', + 'paths', + 'markers', + 'geoJSON', + 'UTFGrid', //odd ball on naming convention keeping to not break + 'decorations', + 'directiveControls']; + + //init + _privateItems.forEach(function(itemName){ + _private[itemName] = {}; + }); + this.unresolveMap = function (scopeId) { - var id = leafletHelpers.obtainEffectiveMapId(maps, scopeId); - maps[id] = undefined; - tiles[id] = undefined; - layers[id] = undefined; - paths[id] = undefined; - markers[id] = undefined; - geoJSON[id] = undefined; - utfGrid[id] = undefined; - decorations[id] = undefined; + var id = leafletHelpers.obtainEffectiveMapId(_private.map, scopeId); + _privateItems.forEach(function (itemName) { + _private[itemName][id] = undefined; + }); }; - this.getPaths = function(scopeId) { - var defer = getDefer(paths, scopeId); - return defer.promise; - }; + //int repetitive stuff (get and sets) + _privateItems.forEach(function (itemName) { + var name = upperFirst(itemName); + self['set' + name] = function (lObject, scopeId) { + var defer = getUnresolvedDefer(_private[itemName], scopeId); + defer.resolve(lObject); + setResolvedDefer(_private[itemName], scopeId); + }; - this.setPaths = function(leafletPaths, scopeId) { - var defer = getUnresolvedDefer(paths, scopeId); - defer.resolve(leafletPaths); - setResolvedDefer(paths, scopeId); - }; + self['get' + name] = function (scopeId) { + var defer = getDefer(_private[itemName], scopeId); + return defer.promise; + }; + }); +}); - this.getMarkers = function(scopeId) { - var defer = getDefer(markers, scopeId); - return defer.promise; - }; +angular.module("leaflet-directive") +.service('leafletDirectiveControlsHelpers', function ($log, leafletData, leafletHelpers) { + var _isDefined = leafletHelpers.isDefined, + _isString = leafletHelpers.isString, + _isObject = leafletHelpers.isObject, + _mainErrorHeader = leafletHelpers.errorHeader; + + var _errorHeader = _mainErrorHeader + '[leafletDirectiveControlsHelpers'; + + var _extend = function(id, thingToAddName, createFn, cleanFn){ + var _fnHeader = _errorHeader + '.extend] '; + var extender = {}; + if(!_isDefined(thingToAddName)){ + $log.error(_fnHeader + 'thingToAddName cannot be undefined'); + return; + } - this.setMarkers = function(leafletMarkers, scopeId) { - var defer = getUnresolvedDefer(markers, scopeId); - defer.resolve(leafletMarkers); - setResolvedDefer(markers, scopeId); - }; + if(_isString(thingToAddName) && _isDefined(createFn) && _isDefined(cleanFn)){ + extender[thingToAddName] = { + create: createFn, + clean: cleanFn + }; + } + else if(_isObject(thingToAddName) && !_isDefined(createFn) && !_isDefined(cleanFn)){ + extender = thingToAddName; + } + else{ + $log.error(_fnHeader + 'incorrect arguments'); + return; + } - this.getLayers = function(scopeId) { - var defer = getDefer(layers, scopeId); - return defer.promise; + //add external control to create / destroy markers without a watch + leafletData.getDirectiveControls().then(function(controls){ + angular.extend(controls, extender); + leafletData.setDirectiveControls(controls, id); + }); }; - this.setLayers = function(leafletLayers, scopeId) { - var defer = getUnresolvedDefer(layers, scopeId); - defer.resolve(leafletLayers); - setResolvedDefer(layers, scopeId); + return { + extend: _extend }; +}); - this.getUTFGrid = function(scopeId) { - var defer = getDefer(utfGrid, scopeId); - return defer.promise; - }; +angular.module("leaflet-directive").factory('leafletEvents', + function (leafletMapEvents, leafletMarkerEvents, leafletPathEvents) { + var retObj = {}; + angular.extend(retObj,leafletMapEvents, leafletMarkerEvents, leafletPathEvents); + return retObj; +}); - this.setUTFGrid = function(leafletUTFGrid, scopeId) { - var defer = getUnresolvedDefer(utfGrid, scopeId); - defer.resolve(leafletUTFGrid); - setResolvedDefer(utfGrid, scopeId); +angular.module("leaflet-directive") +.service('leafletGeoJsonHelpers', function (leafletHelpers, leafletIterators) { + var lHlp = leafletHelpers, + lIt = leafletIterators; + var Point = function(lat,lng){ + this.lat = lat; + this.lng = lng; + return this; }; - this.setTiles = function(leafletTiles, scopeId) { - var defer = getUnresolvedDefer(tiles, scopeId); - defer.resolve(leafletTiles); - setResolvedDefer(tiles, scopeId); + var _getLat = function(value) { + if (Array.isArray(value) && value.length === 2) { + return value[1]; + } else if (lHlp.isDefined(value.type) && value.type === 'Point') { + return +value.coordinates[1]; + } else { + return +value.lat; + } }; - this.getTiles = function(scopeId) { - var defer = getDefer(tiles, scopeId); - return defer.promise; + var _getLng = function(value) { + if (Array.isArray(value) && value.length === 2) { + return value[0]; + } else if (lHlp.isDefined(value.type) && value.type === 'Point') { + return +value.coordinates[0]; + } else { + return +value.lng; + } }; - this.setGeoJSON = function(leafletGeoJSON, scopeId) { - var defer = getUnresolvedDefer(geoJSON, scopeId); - defer.resolve(leafletGeoJSON); - setResolvedDefer(geoJSON, scopeId); - }; + var _validateCoords = function(coords) { + if (lHlp.isUndefined(coords)) { + return false; + } + if (lHlp.isArray(coords)) { + if (coords.length === 2 && lHlp.isNumber(coords[0]) && lHlp.isNumber(coords[1])) { + return true; + } + } else if (lHlp.isDefined(coords.type)) { + if ( + coords.type === 'Point' && lHlp.isArray(coords.coordinates) && + coords.coordinates.length === 2 && + lHlp.isNumber(coords.coordinates[0]) && + lHlp.isNumber(coords.coordinates[1])) { + return true; + } + } - this.getGeoJSON = function(scopeId) { - var defer = getDefer(geoJSON, scopeId); - return defer.promise; - }; + var ret = lIt.all(['lat', 'lng'], function(pos){ + return lHlp.isDefined(coords[pos]) && lHlp.isNumber(coords[pos]); + }); + return ret; + }; - this.setDecorations = function(leafletDecorations, scopeId) { - var defer = getUnresolvedDefer(decorations, scopeId); - defer.resolve(leafletDecorations); - setResolvedDefer(decorations, scopeId); - }; + var _getCoords = function(value) { + if (!value || !_validateCoords(value)) { + return; + } + var p = null; + if (Array.isArray(value) && value.length === 2) { + p = new Point(value[1], value[0]); + } else if (lHlp.isDefined(value.type) && value.type === 'Point') { + p = new Point(value.coordinates[1], value.coordinates[0]); + } else { + return value; + } + //note angular.merge is avail in angular 1.4.X we might want to fill it here + return angular.extend(value, p);//tap on lat, lng if it doesnt exist + }; - this.getDecorations = function(scopeId) { - var defer = getDefer(decorations, scopeId); - return defer.promise; - }; -}); -angular.module("leaflet-directive").factory('leafletEvents', function ($rootScope, $q, $log, leafletHelpers) { - var safeApply = leafletHelpers.safeApply, - isDefined = leafletHelpers.isDefined, - isObject = leafletHelpers.isObject, - Helpers = leafletHelpers; + return { + getLat: _getLat, + getLng: _getLng, + validateCoords: _validateCoords, + getCoords: _getCoords + }; + }); - var _getAvailableLabelEvents = function() { - return [ - 'click', - 'dblclick', - 'mousedown', - 'mouseover', - 'mouseout', - 'contextmenu' - ]; - }; +angular.module("leaflet-directive").factory('leafletHelpers', function ($q, $log) { + var _errorHeader = '[AngularJS - Leaflet] '; + var _copy = angular.copy; + var _clone = _copy; + /* + For parsing paths to a field in an object - var genLabelEvents = function(leafletScope, logic, marker, name) { - var labelEvents = _getAvailableLabelEvents(); - var scopeWatchName = Helpers.getObjectArrayPath("markers." + name); - for (var i = 0; i < labelEvents.length; i++) { - var eventName = labelEvents[i]; - marker.label.on(eventName, genDispatchLabelEvent(leafletScope, eventName, logic, marker.label, scopeWatchName)); + Example: + var obj = { + bike:{ + 1: 'hi' + 2: 'foo' + } + }; + _getObjectValue(obj,"bike.1") returns 'hi' + this is getPath in ui-gmap + */ + var _getObjectValue = function(object, pathStr) { + var obj; + if(!object || !angular.isObject(object)) + return; + //if the key is not a sting then we already have the value + if ((pathStr === null) || !angular.isString(pathStr)) { + return pathStr; } + obj = object; + pathStr.split('.').forEach(function(value) { + if (obj) { + obj = obj[value]; + } + }); + return obj; }; /* - argument: name: Note this can be a single string or dot notation - Example: - markerModel : { - m1: { lat:_, lon: _} - } - //would yield name of - name = "m1" + Object Array Notation + _getObjectArrayPath("bike.one.two") + returns: + 'bike["one"]["two"]' + */ + var _getObjectArrayPath = function(pathStr){ + return pathStr.split('.').reduce(function(previous, current) { + return previous + '["'+ current + '"]'; + }); + }; - If nested: - markerModel : { - cars: { - m1: { lat:_, lon: _} - } - } - //would yield name of - name = "cars.m1" + /* Object Dot Notation + _getObjectPath(["bike","one","two"]) + returns: + "bike.one.two" */ - var genDispatchMarkerEvent = function(eventName, logic, leafletScope, marker, name, markerData) { - return function(e) { - var broadcastName = 'leafletDirectiveMarker.' + eventName; + var _getObjectDotPath = function(arrayOfStrings){ + return arrayOfStrings.reduce(function(previous, current) { + return previous + '.' + current; + }); + }; - // Broadcast old marker click name for backwards compatibility - if (eventName === "click") { - safeApply(leafletScope, function() { - $rootScope.$broadcast('leafletDirectiveMarkersClick', name); - }); - } else if (eventName === 'dragend') { - safeApply(leafletScope, function() { - markerData.lat = marker.getLatLng().lat; - markerData.lng = marker.getLatLng().lng; - }); - if (markerData.message && markerData.focus === true) { - marker.openPopup(); + function _obtainEffectiveMapId(d, mapId) { + var id, i; + if (!angular.isDefined(mapId)) { + if (Object.keys(d).length === 0) { + id = "main"; + } else if (Object.keys(d).length >= 1) { + for (i in d) { + if (d.hasOwnProperty(i)) { + id = i; } } + } else if (Object.keys(d).length === 0) { + id = "main"; + } else { + $log.error(_errorHeader + "- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call"); + } + } else { + id = mapId; + } - safeApply(leafletScope, function(scope){ - if (logic === "emit") { - scope.$emit(broadcastName, { - markerName: name, - leafletEvent: e - }); - } else { - $rootScope.$broadcast(broadcastName, { - markerName: name, - leafletEvent: e - }); - } - }); - }; - }; - - var genDispatchPathEvent = function(eventName, logic, leafletScope, marker, name) { - return function(e) { - var broadcastName = 'leafletDirectivePath.' + eventName; + return id; + } - safeApply(leafletScope, function(scope){ - if (logic === "emit") { - scope.$emit(broadcastName, { - pathName: name, - leafletEvent: e - }); - } else { - $rootScope.$broadcast(broadcastName, { - pathName: name, - leafletEvent: e - }); - } - }); - }; - }; + function _getUnresolvedDefer(d, mapId) { + var id = _obtainEffectiveMapId(d, mapId), + defer; - var genDispatchLabelEvent = function(scope, eventName, logic, label, scope_watch_name) { - return function(e) { - // Put together broadcast name - var broadcastName = 'leafletDirectiveLabel.' + eventName; - var markerName = scope_watch_name.replace('markers.', ''); + if (!angular.isDefined(d[id]) || d[id].resolvedDefer === true) { + defer = $q.defer(); + d[id] = { + defer: defer, + resolvedDefer: false + }; + } else { + defer = d[id].defer; + } - // Safely broadcast the event - safeApply(scope, function(scope) { - if (logic === "emit") { - scope.$emit(broadcastName, { - leafletEvent : e, - label: label, - markerName: markerName - }); - } else if (logic === "broadcast") { - $rootScope.$broadcast(broadcastName, { - leafletEvent : e, - label: label, - markerName: markerName - }); - } - }); - }; - }; + return defer; + } - var _getAvailableMarkerEvents = function() { - return [ - 'click', - 'dblclick', - 'mousedown', - 'mouseover', - 'mouseout', - 'contextmenu', - 'dragstart', - 'drag', - 'dragend', - 'move', - 'remove', - 'popupopen', - 'popupclose' - ]; + var _isDefined = function(value) { + return angular.isDefined(value) && value !== null; }; - - var _getAvailablePathEvents = function() { - return [ - 'click', - 'dblclick', - 'mousedown', - 'mouseover', - 'mouseout', - 'contextmenu', - 'add', - 'remove', - 'popupopen', - 'popupclose' - ]; + var _isUndefined = function(value){ + return !_isDefined(value); }; return { - getAvailableMapEvents: function() { - return [ - 'click', - 'dblclick', - 'mousedown', - 'mouseup', - 'mouseover', - 'mouseout', - 'mousemove', - 'contextmenu', - 'focus', - 'blur', - 'preclick', - 'load', - 'unload', - 'viewreset', - 'movestart', - 'move', - 'moveend', - 'dragstart', - 'drag', - 'dragend', - 'zoomstart', - 'zoomend', - 'zoomlevelschange', - 'resize', - 'autopanstart', - 'layeradd', - 'layerremove', - 'baselayerchange', - 'overlayadd', - 'overlayremove', - 'locationfound', - 'locationerror', - 'popupopen', - 'popupclose', - 'draw:created', - 'draw:edited', - 'draw:deleted', - 'draw:drawstart', - 'draw:drawstop', - 'draw:editstart', - 'draw:editstop', - 'draw:deletestart', - 'draw:deletestop' - ]; + copy:_copy, + clone:_clone, + errorHeader: _errorHeader, + getObjectValue: _getObjectValue, + getObjectArrayPath:_getObjectArrayPath, + getObjectDotPath: _getObjectDotPath, + defaultTo: function(val, _default){ + return _isDefined(val) ? val : _default; }, - - genDispatchMapEvent: function(scope, eventName, logic) { - return function(e) { - // Put together broadcast name - var broadcastName = 'leafletDirectiveMap.' + eventName; - // Safely broadcast the event - safeApply(scope, function(scope) { - if (logic === "emit") { - scope.$emit(broadcastName, { - leafletEvent : e - }); - } else if (logic === "broadcast") { - $rootScope.$broadcast(broadcastName, { - leafletEvent : e - }); - } - }); - }; + //mainly for checking attributes of directives lets keep this minimal (on what we accept) + isTruthy: function(val){ + return val === 'true' || val === true; }, - - getAvailableMarkerEvents: _getAvailableMarkerEvents, - - getAvailablePathEvents: _getAvailablePathEvents, - - notifyCenterChangedToBounds: function(scope) { - scope.$broadcast("boundsChanged"); + //Determine if a reference is {} + isEmpty: function(value) { + return Object.keys(value).length === 0; }, - notifyCenterUrlHashChanged: function(scope, map, attrs, search) { - if (!isDefined(attrs.urlHashCenter)) { - return; - } - var center = map.getCenter(); - var centerUrlHash = (center.lat).toFixed(4) + ":" + (center.lng).toFixed(4) + ":" + map.getZoom(); - if (!isDefined(search.c) || search.c !== centerUrlHash) { - //$log.debug("notified new center..."); - scope.$emit("centerUrlHash", centerUrlHash); - } - }, - - bindMarkerEvents: function(marker, name, markerData, leafletScope) { - var markerEvents = []; - var i; - var eventName; - var logic = "emit"; - - if (!isDefined(leafletScope.eventBroadcast)) { - // Backward compatibility, if no event-broadcast attribute, all events are broadcasted - markerEvents = _getAvailableMarkerEvents(); - } else if (!isObject(leafletScope.eventBroadcast)) { - // Not a valid object - $log.error("[AngularJS - Leaflet] event-broadcast must be an object check your model."); - } else { - // We have a possible valid object - if (!isDefined(leafletScope.eventBroadcast.marker)) { - // We do not have events enable/disable do we do nothing (all enabled by default) - markerEvents = _getAvailableMarkerEvents(); - } else if (!isObject(leafletScope.eventBroadcast.marker)) { - // Not a valid object - $log.warn("[AngularJS - Leaflet] event-broadcast.marker must be an object check your model."); - } else { - // We have a possible valid map object - // Event propadation logic - if (leafletScope.eventBroadcast.marker.logic !== undefined && leafletScope.eventBroadcast.marker.logic !== null) { - // We take care of possible propagation logic - if (leafletScope.eventBroadcast.marker.logic !== "emit" && leafletScope.eventBroadcast.marker.logic !== "broadcast") { - // This is an error - $log.warn("[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'."); - } else if (leafletScope.eventBroadcast.marker.logic === "emit") { - logic = "emit"; - } - } - // Enable / Disable - var markerEventsEnable = false, markerEventsDisable = false; - if (leafletScope.eventBroadcast.marker.enable !== undefined && leafletScope.eventBroadcast.marker.enable !== null) { - if (typeof leafletScope.eventBroadcast.marker.enable === 'object') { - markerEventsEnable = true; - } - } - if (leafletScope.eventBroadcast.marker.disable !== undefined && leafletScope.eventBroadcast.marker.disable !== null) { - if (typeof leafletScope.eventBroadcast.marker.disable === 'object') { - markerEventsDisable = true; - } - } - if (markerEventsEnable && markerEventsDisable) { - // Both are active, this is an error - $log.warn("[AngularJS - Leaflet] can not enable and disable events at the same time"); - } else if (!markerEventsEnable && !markerEventsDisable) { - // Both are inactive, this is an error - $log.warn("[AngularJS - Leaflet] must enable or disable events"); - } else { - // At this point the marker object is OK, lets enable or disable events - if (markerEventsEnable) { - // Enable events - for (i = 0; i < leafletScope.eventBroadcast.marker.enable.length; i++) { - eventName = leafletScope.eventBroadcast.marker.enable[i]; - // Do we have already the event enabled? - if (markerEvents.indexOf(eventName) !== -1) { - // Repeated event, this is an error - $log.warn("[AngularJS - Leaflet] This event " + eventName + " is already enabled"); - } else { - // Does the event exists? - if (_getAvailableMarkerEvents().indexOf(eventName) === -1) { - // The event does not exists, this is an error - $log.warn("[AngularJS - Leaflet] This event " + eventName + " does not exist"); - } else { - // All ok enable the event - markerEvents.push(eventName); - } - } - } - } else { - // Disable events - markerEvents = _getAvailableMarkerEvents(); - for (i = 0; i < leafletScope.eventBroadcast.marker.disable.length; i++) { - eventName = leafletScope.eventBroadcast.marker.disable[i]; - var index = markerEvents.indexOf(eventName); - if (index === -1) { - // The event does not exist - $log.warn("[AngularJS - Leaflet] This event " + eventName + " does not exist or has been already disabled"); - - } else { - markerEvents.splice(index, 1); - } - } - } - } - } - } - - for (i = 0; i < markerEvents.length; i++) { - eventName = markerEvents[i]; - marker.on(eventName, genDispatchMarkerEvent(eventName, logic, leafletScope, marker, name, markerData)); - } - - if (Helpers.LabelPlugin.isLoaded() && isDefined(marker.label)) { - genLabelEvents(leafletScope, logic, marker, name); - } - }, - - bindPathEvents: function(path, name, pathData, leafletScope) { - var pathEvents = []; - var i; - var eventName; - var logic = "broadcast"; - - if (!isDefined(leafletScope.eventBroadcast)) { - // Backward compatibility, if no event-broadcast attribute, all events are broadcasted - pathEvents = _getAvailablePathEvents(); - } else if (!isObject(leafletScope.eventBroadcast)) { - // Not a valid object - $log.error("[AngularJS - Leaflet] event-broadcast must be an object check your model."); - } else { - // We have a possible valid object - if (!isDefined(leafletScope.eventBroadcast.path)) { - // We do not have events enable/disable do we do nothing (all enabled by default) - pathEvents = _getAvailablePathEvents(); - } else if (isObject(leafletScope.eventBroadcast.paths)) { - // Not a valid object - $log.warn("[AngularJS - Leaflet] event-broadcast.path must be an object check your model."); - } else { - // We have a possible valid map object - // Event propadation logic - if (leafletScope.eventBroadcast.path.logic !== undefined && leafletScope.eventBroadcast.path.logic !== null) { - // We take care of possible propagation logic - if (leafletScope.eventBroadcast.path.logic !== "emit" && leafletScope.eventBroadcast.path.logic !== "broadcast") { - // This is an error - $log.warn("[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'."); - } else if (leafletScope.eventBroadcast.path.logic === "emit") { - logic = "emit"; - } - } - // Enable / Disable - var pathEventsEnable = false, pathEventsDisable = false; - if (leafletScope.eventBroadcast.path.enable !== undefined && leafletScope.eventBroadcast.path.enable !== null) { - if (typeof leafletScope.eventBroadcast.path.enable === 'object') { - pathEventsEnable = true; - } - } - if (leafletScope.eventBroadcast.path.disable !== undefined && leafletScope.eventBroadcast.path.disable !== null) { - if (typeof leafletScope.eventBroadcast.path.disable === 'object') { - pathEventsDisable = true; - } - } - if (pathEventsEnable && pathEventsDisable) { - // Both are active, this is an error - $log.warn("[AngularJS - Leaflet] can not enable and disable events at the same time"); - } else if (!pathEventsEnable && !pathEventsDisable) { - // Both are inactive, this is an error - $log.warn("[AngularJS - Leaflet] must enable or disable events"); - } else { - // At this point the path object is OK, lets enable or disable events - if (pathEventsEnable) { - // Enable events - for (i = 0; i < leafletScope.eventBroadcast.path.enable.length; i++) { - eventName = leafletScope.eventBroadcast.path.enable[i]; - // Do we have already the event enabled? - if (pathEvents.indexOf(eventName) !== -1) { - // Repeated event, this is an error - $log.warn("[AngularJS - Leaflet] This event " + eventName + " is already enabled"); - } else { - // Does the event exists? - if (_getAvailablePathEvents().indexOf(eventName) === -1) { - // The event does not exists, this is an error - $log.warn("[AngularJS - Leaflet] This event " + eventName + " does not exist"); - } else { - // All ok enable the event - pathEvents.push(eventName); - } - } - } - } else { - // Disable events - pathEvents = _getAvailablePathEvents(); - for (i = 0; i < leafletScope.eventBroadcast.path.disable.length; i++) { - eventName = leafletScope.eventBroadcast.path.disable[i]; - var index = pathEvents.indexOf(eventName); - if (index === -1) { - // The event does not exist - $log.warn("[AngularJS - Leaflet] This event " + eventName + " does not exist or has been already disabled"); - - } else { - pathEvents.splice(index, 1); - } - } - } - } - } - } - - for (i = 0; i < pathEvents.length; i++) { - eventName = pathEvents[i]; - path.on(eventName, genDispatchPathEvent(eventName, logic, leafletScope, pathEvents, name)); - } - - if (Helpers.LabelPlugin.isLoaded() && isDefined(path.label)) { - genLabelEvents(leafletScope, logic, path, name); - } - } - - }; -}); - -angular.module("leaflet-directive").factory('leafletHelpers', function ($q, $log) { - var _errorHeader = '[AngularJS - Leaflet] '; - - /* - For parsing paths to a field in an object - - Example: - var obj = { - bike:{ - 1: 'hi' - 2: 'foo' - } - }; - _getObjectValue(obj,"bike.1") returns 'hi' - */ - var _getObjectValue = function(object, pathStr) { - var obj; - //if the key is not a sting then we already have the value - if ((pathStr === null) || !angular.isString(pathStr)) { - return pathStr; - } - obj = object; - pathStr.split('.').forEach(function(value) { - if (obj) { - obj = obj[value]; - } - }); - return obj; - }; - - /* - Object Array Notation - _getObjectArrayPath("bike.one.two") - returns: - 'bike["one"]["two"]' - */ - var _getObjectArrayPath = function(pathStr){ - return pathStr.split('.').reduce(function(previous, current) { - return previous + '["'+ current + '"]'; - }); - }; - - /* Object Dot Notation - _getObjectPath(["bike","one","two"]) - returns: - "bike.one.two" - */ - var _getObjectDotPath = function(arrayOfStrings){ - return arrayOfStrings.reduce(function(previous, current) { - return previous + '.' + current; - }); - }; - - function _obtainEffectiveMapId(d, mapId) { - var id, i; - if (!angular.isDefined(mapId)) { - if (Object.keys(d).length === 0) { - id = "main"; - } else if (Object.keys(d).length >= 1) { - for (i in d) { - if (d.hasOwnProperty(i)) { - id = i; - } - } - } else if (Object.keys(d).length === 0) { - id = "main"; - } else { - $log.error(_errorHeader + "- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call"); - } - } else { - id = mapId; - } - - return id; - } - - function _getUnresolvedDefer(d, mapId) { - var id = _obtainEffectiveMapId(d, mapId), - defer; - - if (!angular.isDefined(d[id]) || d[id].resolvedDefer === true) { - defer = $q.defer(); - d[id] = { - defer: defer, - resolvedDefer: false - }; - } else { - defer = d[id].defer; - } - - return defer; - } - - var _isDefined = function(value) { - return angular.isDefined(value) && value !== null; - }; - var _isUndefined = function(value){ - return !_isDefined(value); - }; - - return { - errorHeader: _errorHeader, - getObjectValue: _getObjectValue, - getObjectArrayPath:_getObjectArrayPath, - getObjectDotPath: _getObjectDotPath, - defaultTo: function(val, _default){ - return _isDefined(val) ? val : _default; - }, - //mainly for checking attributes of directives lets keep this minimal (on what we accept) - isTruthy: function(val){ - return val === 'true' || val === true; - }, - //Determine if a reference is {} - isEmpty: function(value) { - return Object.keys(value).length === 0; - }, - - //Determine if a reference is undefined or {} - isUndefinedOrEmpty: function (value) { - return (angular.isUndefined(value) || value === null) || Object.keys(value).length === 0; + //Determine if a reference is undefined or {} + isUndefinedOrEmpty: function (value) { + return (angular.isUndefined(value) || value === null) || Object.keys(value).length === 0; }, // Determine if a reference is defined @@ -1335,56 +963,198 @@ angular.module("leaflet-directive").factory('leafletHelpers', function ($q, $log } } } + }, + /* + watchOptions - object to set deep nested watches and turn off watches all together + (rely on control / functional updates) + watchOptions - Object + doWatch:boolean + isDeep:boolean (sets $watch(function,isDeep)) + individual + doWatch:boolean + isDeep:boolean + */ + //legacy defaults + watchOptions: { + doWatch:true, + isDeep: true, + individual:{ + doWatch:true, + isDeep: true + } } }; }); angular.module('leaflet-directive').service('leafletIterators', function ($log, leafletHelpers) { - var $lhelp = leafletHelpers, - errorHeader = leafletHelpers.errorHeader + 'leafletIterators: '; + var lHlp = leafletHelpers, + errorHeader = leafletHelpers.errorHeader + 'leafletIterators: '; - var _hasErrors = function(collection, cb, ignoreCollection, cbName){ - if(!ignoreCollection) { - if (!$lhelp.isDefined(collection) || !$lhelp.isDefined(cb)) { - $log.error(errorHeader + 'collection or cb undefined'); - return true; - } - } - if(!$lhelp.isFunction(cb)){ - cbName = $lhelp.defaultTo(cb,'cb'); - $log.error(errorHeader + cbName + ' is not a function'); - return true; - } - return false; + //BEGIN COPY from underscore + var _keys = Object.keys; + var _isFunction = lHlp.isFunction; + var _isObject = lHlp.isObject; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + + var _isArrayLike = function(collection) { + var length = collection !== null && collection.length; + return lHlp.isNumber(length) && length >= 0 && length <= MAX_ARRAY_INDEX; + }; + + // Keep the identity function around for default iteratees. + var _identity = function(value) { + return value; + }; + + var _property = function(key) { + return function(obj) { + return obj === null ? void 0 : obj[key]; }; + }; - var _iterate = function(collection, externalCb, internalCb){ - if(_hasErrors(undefined, internalCb, true, 'internalCb')){ - return; - } - if(!_hasErrors(collection, externalCb)){ - for(var key in collection){ - internalCb(collection[key], key); - } + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount === null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + case 2: return function(value, other) { + return func.call(context, value, other); + }; + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, undefinedOnly) { + return function(obj) { + var length = arguments.length; + if (length < 2 || obj === null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; } + } + return obj; }; + }; + // Assigns a given object with all the own properties in the passed-in object(s) + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + var _extendOwn, _assign = null; + _extendOwn = _assign = createAssigner(_keys); + + // Returns whether an object has a given set of `key:value` pairs. + var _isMatch = function(object, attrs) { + var keys = _keys(attrs), length = keys.length; + if (object === null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; - //consider adding lodash or underscore but for now adding iterators as we need them - var _each = function(collection, cb){ - _iterate(collection, cb, function(val, key){ - cb(val, key); - }); + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + var _matcher, _matches = null; + _matcher = _matches = function(attrs) { + attrs = _extendOwn({}, attrs); + return function(obj) { + return _isMatch(obj, attrs); }; + }; - //lodash or underscore have preference - return window._ ? window._ : { - each:_each - }; + + // A mostly-internal function to generate callbacks that can be applied + // to each element in a collection, returning the desired result — either + // identity, an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (value === null) return _identity; + if (_isFunction(value)) return optimizeCb(value, context, argCount); + if (_isObject(value)) return _matcher(value); + return _property(value); + }; + + var _every, _all = null; + _every = _all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !_isArrayLike(obj) && _keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + }; + + //END COPY fron underscore + + var _hasErrors = function(collection, cb, ignoreCollection, cbName){ + if(!ignoreCollection) { + if (!lHlp.isDefined(collection) || !lHlp.isDefined(cb)) { + $log.error(errorHeader + 'collection or cb undefined'); + return true; + } + } + if(!lHlp.isFunction(cb)){ + cbName = lHlp.defaultTo(cb,'cb'); + $log.error(errorHeader + cbName + ' is not a function'); + return true; + } + return false; + }; + + var _iterate = function(collection, externalCb, internalCb){ + if(_hasErrors(undefined, internalCb, true, 'internalCb')){ + return; + } + if(!_hasErrors(collection, externalCb)){ + for(var key in collection){ + internalCb(collection[key], key); + } + } + }; + + + //consider adding lodash or underscore but for now adding iterators as we need them + var _each = function(collection, cb){ + _iterate(collection, cb, function(val, key){ + cb(val, key); + }); + }; + + //lodash or underscore have preference + return window._ ? window._ : { + each:_each, + every: _every, + all: _all + }; }); -angular.module("leaflet-directive").factory('leafletLayerHelpers', function ($rootScope, $log, leafletHelpers) { +angular.module("leaflet-directive") +.factory('leafletLayerHelpers', function ($rootScope, $log, leafletHelpers) { var Helpers = leafletHelpers, isString = leafletHelpers.isString, isObject = leafletHelpers.isObject, @@ -1948,7 +1718,8 @@ angular.module("leaflet-directive").factory('leafletMapDefaults', function ($q, }); angular.module("leaflet-directive") -.service('leafletMarkersHelpers', function ($rootScope, leafletHelpers, $log, $compile) { +.service('leafletMarkersHelpers', function ($rootScope, leafletHelpers, $log, $compile, + leafletGeoJsonHelpers) { var isDefined = leafletHelpers.isDefined, defaultTo = leafletHelpers.defaultTo, @@ -1961,7 +1732,10 @@ angular.module("leaflet-directive") isString = leafletHelpers.isString, isNumber = leafletHelpers.isNumber, isObject = leafletHelpers.isObject, - groups = {}; + groups = {}, + geoHlp = leafletGeoJsonHelpers, + errorHeader = leafletHelpers.errorHeader; + var _string = function(marker){ //this exists since JSON.stringify barfs on cyclic @@ -1979,7 +1753,7 @@ angular.module("leaflet-directive") var createLeafletIcon = function(iconData) { if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'awesomeMarker') { if (!AwesomeMarkersPlugin.isLoaded()) { - $log.error('[AngularJS - Leaflet] The AwesomeMarkers Plugin is not loaded.'); + $log.error( errorHeader + ' The AwesomeMarkers Plugin is not loaded.'); } return new L.AwesomeMarkers.icon(iconData); @@ -1987,7 +1761,7 @@ angular.module("leaflet-directive") if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'makiMarker') { if (!MakiMarkersPlugin.isLoaded()) { - $log.error('[AngularJS - Leaflet] The MakiMarkers Plugin is not loaded.'); + $log.error(errorHeader + 'The MakiMarkers Plugin is not loaded.'); } return new L.MakiMarkers.icon(iconData); @@ -1995,7 +1769,7 @@ angular.module("leaflet-directive") if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'extraMarker') { if (!ExtraMarkersPlugin.isLoaded()) { - $log.error('[AngularJS - Leaflet] The ExtraMarkers Plugin is not loaded.'); + $log.error(errorHeader + 'The ExtraMarkers Plugin is not loaded.'); } return new L.ExtraMarkers.icon(iconData); } @@ -2123,8 +1897,14 @@ angular.module("leaflet-directive") manageOpenLabel: _manageOpenLabel, createMarker: function(markerData) { - if (!isDefined(markerData)) { - $log.error('[AngularJS - Leaflet] The marker definition is not valid.'); + if (!isDefined(markerData) || !geoHlp.validateCoords(markerData)){ + $log.error(errorHeader + 'The marker definition is not valid.'); + return; + } + var coords = geoHlp.getCoords(markerData); + + if (!isDefined(coords)){ + $log.error(errorHeader + 'Unable to get coordinates from markerData.'); return; } @@ -2144,7 +1924,7 @@ angular.module("leaflet-directive") } } - var marker = new L.marker(markerData, markerOptions); + var marker = new L.marker(coords, markerOptions); if (!isString(markerData.message)) { marker.unbindPopup(); @@ -2155,12 +1935,12 @@ angular.module("leaflet-directive") addMarkerToGroup: function(marker, groupName, groupOptions, map) { if (!isString(groupName)) { - $log.error('[AngularJS - Leaflet] The marker group you have specified is invalid.'); + $log.error(errorHeader + 'The marker group you have specified is invalid.'); return; } if (!MarkerClusterPlugin.isLoaded()) { - $log.error("[AngularJS - Leaflet] The MarkerCluster plugin is not loaded."); + $log.error(errorHeader + "The MarkerCluster plugin is not loaded."); return; } if (!isDefined(groups[groupName])) { @@ -2170,27 +1950,32 @@ angular.module("leaflet-directive") groups[groupName].addLayer(marker); }, - listenMarkerEvents: function(marker, markerData, leafletScope, watching) { + listenMarkerEvents: function(marker, markerData, leafletScope) { + //these should be deregistered on destroy .. possible leake + //handles should not be closures since they will need to be removed marker.on("popupopen", function(/* event */) { - if (watching) { - safeApply(leafletScope, function() { - markerData.focus = true; - }); - } else { - _manageOpenPopup(marker, markerData); - } + safeApply(leafletScope, function() { + markerData.focus = true; + _manageOpenPopup(marker, markerData);//needed since markerData is now a copy + }); }); marker.on("popupclose", function(/* event */) { - if (watching) { - safeApply(leafletScope, function() { - markerData.focus = false; - }); - } + safeApply(leafletScope, function() { + markerData.focus = false; + }); + }); + marker.on("add", function(/* event */) { + safeApply(leafletScope, function() { + if('label' in markerData) + _manageOpenLabel(marker, markerData); + }); }); }, - addMarkerWatcher: function(marker, name, leafletScope, layers, map) { + addMarkerWatcher: function(marker, name, leafletScope, layers, map, isDeepWatch) { var markerWatchPath = Helpers.getObjectArrayPath("markers." + name); + isDeepWatch = defaultTo(isDeepWatch, true); + //TODO:break up this 200 line function to be readable (nmccready) var clearWatch = leafletScope.$watch(markerWatchPath, function(markerData, oldMarkerData) { if (!isDefined(markerData)) { _deleteMarker(marker, map, layers); @@ -2203,7 +1988,7 @@ angular.module("leaflet-directive") } // Update the lat-lng property (always present in marker properties) - if (!(isNumber(markerData.lat) && isNumber(markerData.lng))) { + if (!geoHlp.validateCoords(markerData)) { $log.warn('There are problems with lat-lng data, please verify your marker model'); _deleteMarker(marker, map, layers); return; @@ -2253,13 +2038,13 @@ angular.module("leaflet-directive") // The markerData.layer is defined so we add the marker to the layer if it is different from the old data if (!isDefined(layers.overlays[markerData.layer])) { - $log.error('[AngularJS - Leaflet] You must use a name of an existing layer'); + $log.error(errorHeader + 'You must use a name of an existing layer'); return; } // Is a group layer? var layerGroup = layers.overlays[markerData.layer]; if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error('[AngularJS - Leaflet] A marker can only be added to a layer of type "group" or "featureGroup"'); + $log.error(errorHeader + 'A marker can only be added to a layer of type "group" or "featureGroup"'); return; } // The marker goes to a correct layer group, so first of all we add it @@ -2409,7 +2194,7 @@ angular.module("leaflet-directive") } else if (markerLatLng.lat !== markerData.lat || markerLatLng.lng !== markerData.lng) { marker.setLatLng([markerData.lat, markerData.lng]); } - }, true); + }, isDeepWatch); }, string: _string, log: _log @@ -2668,6 +2453,48 @@ angular.module("leaflet-directive").factory('leafletPathsHelpers', function ($ro }; }); +angular.module("leaflet-directive") +.service('leafletWatchHelpers', function (){ + + var _maybe = function(scope, watchFunctionName, thingToWatchStr, watchOptions, initCb){ + //watchOptions.isDeep is/should be ignored in $watchCollection + var unWatch = scope[watchFunctionName](thingToWatchStr, function(newValue, oldValue) { + initCb(newValue, oldValue); + if(!watchOptions.doWatch) + unWatch(); + }, watchOptions.isDeep); + + return unWatch; + }; + + /* + @name: maybeWatch + @description: Utility to watch something once or forever. + @returns unWatch function + @param watchOptions - see markersWatchOptions and or derrivatives. This object is used + to set watching to once and its watch depth. + */ + var _maybeWatch = function(scope, thingToWatchStr, watchOptions, initCb){ + return _maybe(scope, '$watch', thingToWatchStr, watchOptions, initCb); + }; + + /* + @name: _maybeWatchCollection + @description: Utility to watch something once or forever. + @returns unWatch function + @param watchOptions - see markersWatchOptions and or derrivatives. This object is used + to set watching to once and its watch depth. + */ + var _maybeWatchCollection = function(scope, thingToWatchStr, watchOptions, initCb){ + return _maybe(scope, '$watchCollection', thingToWatchStr, watchOptions, initCb); + }; + + return { + maybeWatch: _maybeWatch, + maybeWatchCollection: _maybeWatchCollection + }; +}); + angular.module("leaflet-directive").directive('bounds', function ($log, $timeout, leafletHelpers, leafletBoundsHelpers) { return { restrict: "A", @@ -3092,7 +2919,16 @@ angular.module("leaflet-directive").directive('eventBroadcast', function ($log, }; }); -angular.module("leaflet-directive").directive('geojson', function ($log, $rootScope, leafletData, leafletHelpers) { +angular.module("leaflet-directive") +.directive('geojson', function ($log, $rootScope, leafletData, leafletHelpers, + leafletWatchHelpers, leafletDirectiveControlsHelpers,leafletIterators) { + + var _maybeWatchCollection = leafletWatchHelpers.maybeWatchCollection, + _watchOptions = leafletHelpers.watchOptions, + _extendDirectiveControls = leafletDirectiveControlsHelpers.extend, + hlp = leafletHelpers, + $it = leafletIterators; + return { restrict: "A", scope: false, @@ -3106,15 +2942,9 @@ angular.module("leaflet-directive").directive('geojson', function ($log, $rootSc leafletGeoJSON = {}; controller.getMap().then(function(map) { - leafletScope.$watchCollection("geojson", function(geojson) { - if (isDefined(leafletGeoJSON) && map.hasLayer(leafletGeoJSON)) { - map.removeLayer(leafletGeoJSON); - } - - if (!(isDefined(geojson) && isDefined(geojson.data))) { - return; - } + var watchOptions = leafletScope.geojsonWatchOptions || _watchOptions; + var _hookUpEvents = function(geojson){ var resetStyleOnMouseout = geojson.resetStyleOnMouseout; var onEachFeature; @@ -3148,6 +2978,32 @@ angular.module("leaflet-directive").directive('geojson', function ($log, $rootSc }); }; } + return onEachFeature; + }; + + var isNested = (hlp.isDefined(attrs.geojsonNested) && + hlp.isTruthy(attrs.geojsonNested)); + + var _clean = function(){ + var _remove = function(lObject) { + if (isDefined(lObject) && map.hasLayer(lObject)) { + map.removeLayer(lObject); + } + }; + if(isNested) { + $it.each(leafletGeoJSON, function(lObject) { + _remove(lObject); + }); + return; + } + _remove(leafletGeoJSON); + }; + + var _addGeojson = function(geojson, maybeName){ + if (!(isDefined(geojson) && isDefined(geojson.data))) { + return; + } + var onEachFeature = _hookUpEvents(geojson); if (!isDefined(geojson.options)) { geojson.options = { @@ -3158,10 +3014,37 @@ angular.module("leaflet-directive").directive('geojson', function ($log, $rootSc }; } - leafletGeoJSON = L.geoJson(geojson.data, geojson.options); + var lObject = L.geoJson(geojson.data, geojson.options); + + if(maybeName && hlp.isString(maybeName)){ + leafletGeoJSON[maybeName] = lObject; + } + else{ + leafletGeoJSON = lObject; + } leafletData.setGeoJSON(leafletGeoJSON, attrs.id); - leafletGeoJSON.addTo(map); + lObject.addTo(map); + }; + + var _create = function(model){ + _clean(); + if(isNested) { + if(!model || !Object.keys(model).length) + return; + $it.each(model, function(m, name) { + //name could be layerName and or groupName + //for now it is not tied to a layer + _addGeojson(m,name); + }); + return; + } + _addGeojson(model); + }; + + _extendDirectiveControls(attrs.id, 'geojson', _create, _clean); + _maybeWatchCollection(leafletScope,'geojson', watchOptions, function(geojson){ + _create(geojson); }); }); } @@ -3689,12 +3572,12 @@ angular.module("leaflet-directive").directive('legend', function ($log, $http, l }); angular.module("leaflet-directive").directive('markers', - function ($log, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, leafletMarkersHelpers, - leafletEvents, leafletIterators) { + function ($log, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, + leafletMarkersHelpers, leafletEvents, leafletIterators, leafletWatchHelpers, + leafletDirectiveControlsHelpers) { //less terse vars to helpers var isDefined = leafletHelpers.isDefined, errorHeader = leafletHelpers.errorHeader, - defaultTo= leafletHelpers.defaultTo, Helpers = leafletHelpers, isString = leafletHelpers.isString, addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher, @@ -3703,9 +3586,12 @@ angular.module("leaflet-directive").directive('markers', bindMarkerEvents = leafletEvents.bindMarkerEvents, createMarker = leafletMarkersHelpers.createMarker, deleteMarker = leafletMarkersHelpers.deleteMarker, - $it = leafletIterators; + $it = leafletIterators, + _markersWatchOptions = leafletHelpers.watchOptions, + maybeWatch = leafletWatchHelpers.maybeWatch, + extendDirectiveControls = leafletDirectiveControlsHelpers.extend; - var _maybeAddMarkerToLayer = function(layerName, layers, markerData, marker, shouldWatch, map){ + var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map){ if (!isString(layerName)) { $log.error(errorHeader + ' A layername must be a string'); @@ -3732,14 +3618,14 @@ angular.module("leaflet-directive").directive('markers', // The marker is automatically added to the map depending on the visibility // of the layer, so we only have to open the popup if the marker is in the map - if (!shouldWatch && map.hasLayer(marker) && markerData.focus === true) { - leafletMarkersHelpers.manageOpenPopup(marker, markerData); + if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) { + leafletMarkersHelpers.manageOpenPopup(marker, model); } return true; }; //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already) - var _addMarkers = function(markersToRender, map, layers, leafletMarkers, leafletScope, shouldWatch, maybeLayerName){ - shouldWatch = defaultTo(shouldWatch, false); + var _addMarkers = function(markersToRender, map, layers, leafletMarkers, leafletScope, + watchOptions, maybeLayerName){ for (var newName in markersToRender) { if (newName.search("-") !== -1) { @@ -3748,8 +3634,13 @@ angular.module("leaflet-directive").directive('markers', } if (!isDefined(leafletMarkers[newName])) { - var markerData = markersToRender[newName]; - var marker = createMarker(markerData); + //(nmccready) very important to not have model changes when lObject is changed + //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal + //if it is left as the reference then all changes from oldModel vs newModel are ignored + //see _destroy (where modelDiff becomes meaningless if we do not copy here) + var model = Helpers.copy(markersToRender[newName]); + var marker = createMarker(model); + var layerName = (model? model.layer : undefined) || maybeLayerName; //original way takes pref if (!isDefined(marker)) { $log.error(errorHeader + ' Received invalid data on the marker ' + newName + '.'); continue; @@ -3757,57 +3648,67 @@ angular.module("leaflet-directive").directive('markers', leafletMarkers[newName] = marker; // Bind message - if (isDefined(markerData.message)) { - marker.bindPopup(markerData.message, markerData.popupOptions); + if (isDefined(model.message)) { + marker.bindPopup(model.message, model.popupOptions); } // Add the marker to a cluster group if needed - if (isDefined(markerData.group)) { - var groupOptions = isDefined(markerData.groupOption) ? markerData.groupOption : null; - addMarkerToGroup(marker, markerData.group, groupOptions, map); + if (isDefined(model.group)) { + var groupOptions = isDefined(model.groupOption) ? model.groupOption : null; + addMarkerToGroup(marker, model.group, groupOptions, map); } // Show label if defined - if (Helpers.LabelPlugin.isLoaded() && isDefined(markerData.label) && isDefined(markerData.label.message)) { - marker.bindLabel(markerData.label.message, markerData.label.options); + if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) { + marker.bindLabel(model.label.message, model.label.options); } // Check if the marker should be added to a layer - if (isDefined(markerData) && (isDefined(markerData.layer) || isDefined(maybeLayerName))){ + if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))){ - var pass = _maybeAddMarkerToLayer( - markerData.layer || maybeLayerName, //original way takes pref - layers, - markerData, marker, shouldWatch, map - ); + var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker, + watchOptions.individual.doWatch, map); if(!pass) continue; //something went wrong move on in the loop - } else if (!isDefined(markerData.group)) { + } else if (!isDefined(model.group)) { // We do not have a layer attr, so the marker goes to the map layer map.addLayer(marker); - if (!shouldWatch && markerData.focus === true) { - leafletMarkersHelpers.manageOpenPopup(marker, markerData); + if (!watchOptions.individual.doWatch && model.focus === true) { + leafletMarkersHelpers.manageOpenPopup(marker, model); } } var pathToMarker = Helpers.getObjectDotPath(maybeLayerName? [maybeLayerName, newName]: [newName]); - if (shouldWatch) { - addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map); + if (watchOptions.individual.doWatch) { + addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map, + watchOptions.individual.doWatch); } - listenMarkerEvents(marker, markerData, leafletScope, shouldWatch); - bindMarkerEvents(marker, pathToMarker, markerData, leafletScope); + listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch); + bindMarkerEvents(marker, pathToMarker, model, leafletScope, layerName); } } }; - var _destroy = function(markerModels, lMarkers, map, layers){ + var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers){ // Delete markers from the array - var hasLogged = false; + var hasLogged = false, + modelIsDiff = false; + var doCheckOldModel = isDefined(oldMarkerModels); for (var name in lMarkers) { if(!hasLogged) { $log.debug(errorHeader + "[markers] destroy: "); hasLogged = true; } - if (!isDefined(markerModels) || !isDefined(markerModels[name])) { + + if(doCheckOldModel){ + //might want to make the option (in watch options) to disable deep checking + //ie the options to only check !== (reference check) instead of angular.equals (slow) + modelIsDiff = !angular.equals(markerModels[name],oldMarkerModels[name]); + } + if (!isDefined(markerModels) || + !Object.keys(markerModels).length || + !isDefined(markerModels[name]) || + !Object.keys(markerModels[name]).length || + modelIsDiff) { deleteMarker(lMarkers[name], map, layers); delete lMarkers[name]; } @@ -3838,22 +3739,38 @@ angular.module("leaflet-directive").directive('markers', }; } + var watchOptions = leafletScope.markersWatchOptions || _markersWatchOptions; + + // backwards compat + if(isDefined(attrs.watchMarkers)) + watchOptions.doWatch = watchOptions.individual.doWatch = + (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers)); + + var isNested = (isDefined(attrs.markersNested) && Helpers.isTruthy(attrs.markersNested)); + getLayers().then(function(layers) { - leafletData.setMarkers(leafletMarkers, attrs.id); - leafletScope.$watch('markers', function(newMarkers) { - _destroy(newMarkers, leafletMarkers, map, layers); - // Should we watch for every specific marker on the map? - var shouldWatch = (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers)); - var isNested = (isDefined(attrs.markersNested) && Helpers.isTruthy(attrs.markersNested)); + var _clean = function(models, oldModels){ + _destroy(models, oldModels, leafletMarkers, map, layers); + }; + var _create = function(models, oldModels){ + _clean(models, oldModels); if(isNested) { - $it.each(newMarkers, function(markersToAdd, layerName) { - _addMarkers(markersToAdd, map, layers, leafletMarkers, leafletScope, shouldWatch, layerName); + $it.each(models, function(markersToAdd, layerName) { + _addMarkers(markersToAdd, map, layers, leafletMarkers, leafletScope, + watchOptions, layerName); }); return; } - _addMarkers(newMarkers, map, layers, leafletMarkers, leafletScope, shouldWatch); - }, true); + _addMarkers(models, map, layers, leafletMarkers, leafletScope, + watchOptions); + }; + extendDirectiveControls(attrs.id, 'markers', _create, _clean); + leafletData.setMarkers(leafletMarkers, attrs.id); + + maybeWatch(leafletScope,'markers', watchOptions, function(newMarkers, oldMarkers){ + _create(newMarkers, oldMarkers); + }); }); }); } @@ -3992,126 +3909,642 @@ angular.module("leaflet-directive").directive('paths', function ($log, $q, leafl newPath.bindLabel(pathData.label.message, pathData.label.options); } - // Check if the marker should be added to a layer - if (isDefined(pathData) && isDefined(pathData.layer)) { + // Check if the marker should be added to a layer + if (isDefined(pathData) && isDefined(pathData.layer)) { + + if (!isString(pathData.layer)) { + $log.error('[AngularJS - Leaflet] A layername must be a string'); + continue; + } + if (!isDefined(layers)) { + $log.error('[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.'); + continue; + } + + if (!isDefined(layers.overlays) || !isDefined(layers.overlays[pathData.layer])) { + $log.error('[AngularJS - Leaflet] A marker can only be added to a layer of type "group"'); + continue; + } + var layerGroup = layers.overlays[pathData.layer]; + if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { + $log.error('[AngularJS - Leaflet] Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"'); + continue; + } + + // Listen for changes on the new path + leafletPaths[newName] = newPath; + // The path goes to a correct layer group, so first of all we add it + layerGroup.addLayer(newPath); + + if (shouldWatch) { + watchPathFn(newPath, newName); + } else { + setPathOptions(newPath, pathData.type, pathData); + } + } else if (isDefined(newPath)) { + // Listen for changes on the new path + leafletPaths[newName] = newPath; + map.addLayer(newPath); + + if (shouldWatch) { + watchPathFn(newPath, newName); + } else { + setPathOptions(newPath, pathData.type, pathData); + } + } + + bindPathEvents(newPath, newName, pathData, leafletScope); + } + } + }); + }); + }); + } + }; +}); + +angular.module("leaflet-directive").directive('tiles', function ($log, leafletData, leafletMapDefaults, leafletHelpers) { + return { + restrict: "A", + scope: false, + replace: false, + require: 'leaflet', + + link: function(scope, element, attrs, controller) { + var isDefined = leafletHelpers.isDefined, + leafletScope = controller.getLeafletScope(), + tiles = leafletScope.tiles; + + if (!isDefined(tiles) && !isDefined(tiles.url)) { + $log.warn("[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property."); + return; + } + + controller.getMap().then(function(map) { + var defaults = leafletMapDefaults.getDefaults(attrs.id); + var tileLayerObj; + leafletScope.$watch("tiles", function(tiles) { + var tileLayerOptions = defaults.tileLayerOptions; + var tileLayerUrl = defaults.tileLayer; + + // If no valid tiles are in the scope, remove the last layer + if (!isDefined(tiles.url) && isDefined(tileLayerObj)) { + map.removeLayer(tileLayerObj); + return; + } + + // No leafletTiles object defined yet + if (!isDefined(tileLayerObj)) { + if (isDefined(tiles.options)) { + angular.copy(tiles.options, tileLayerOptions); + } + + if (isDefined(tiles.url)) { + tileLayerUrl = tiles.url; + } + + tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions); + tileLayerObj.addTo(map); + leafletData.setTiles(tileLayerObj, attrs.id); + return; + } + + // If the options of the tilelayer is changed, we need to redraw the layer + if (isDefined(tiles.url) && isDefined(tiles.options) && !angular.equals(tiles.options, tileLayerOptions)) { + map.removeLayer(tileLayerObj); + tileLayerOptions = defaults.tileLayerOptions; + angular.copy(tiles.options, tileLayerOptions); + tileLayerUrl = tiles.url; + tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions); + tileLayerObj.addTo(map); + leafletData.setTiles(tileLayerObj, attrs.id); + return; + } + + // Only the URL of the layer is changed, update the tiles object + if (isDefined(tiles.url)) { + tileLayerObj.setUrl(tiles.url); + } + }, true); + }); + } + }; +}); + +/* + Create multiple similar directives for watchOptions to support directiveControl + instead. (when watches are disabled) + NgAnnotate does not work here due to the functional creation +*/ +['markers', 'geojson'].forEach(function(name){ + angular.module("leaflet-directive").directive(name + 'WatchOptions', [ + '$log', '$rootScope', '$q', 'leafletData', 'leafletHelpers', + function ($log, $rootScope, $q, leafletData, leafletHelpers) { + + var isDefined = leafletHelpers.isDefined, + errorHeader = leafletHelpers.errorHeader, + isObject = leafletHelpers.isObject, + _watchOptions = leafletHelpers.watchOptions; + + return { + restrict: "A", + scope: false, + replace: false, + require: ['leaflet'], + + link: function (scope, element, attrs, controller) { + var mapController = controller[0], + leafletScope = mapController.getLeafletScope(); + + mapController.getMap().then(function () { + if (isDefined(scope[name + 'WatchOptions'])) { + if (isObject(scope[name + 'WatchOptions'])) + angular.extend(_watchOptions, scope[name + 'WatchOptions']); + else + $log.error(errorHeader + '[' + name + 'WatchOptions] is not an object'); + leafletScope[name + 'WatchOptions'] = _watchOptions; + } + }); + } + }; + }]); +}); + +angular.module("leaflet-directive") +.factory('leafletEventsHelpers', function ($rootScope, $q, $log, leafletHelpers) { + var safeApply = leafletHelpers.safeApply, + isDefined = leafletHelpers.isDefined; + + var _fire = function(scope, broadcastName, logic, event, lObject, model, modelName, layerName){ + // Safely broadcast the event + safeApply(scope, function(){ + var toSend = { + leafletEvent: event, + leafletObject: lObject, + modelName: modelName, + model: model + }; + if (isDefined(layerName)) + angular.extend(toSend, {layerName: layerName}); + + if (logic === "emit") { + scope.$emit(broadcastName, toSend); + } else { + $rootScope.$broadcast(broadcastName, toSend); + } + }); + }; + + return { + fire: _fire + } +}); + +angular.module("leaflet-directive") +.factory('leafletLabelEvents', function ($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers) { + var Helpers = leafletHelpers, + fire = leafletEventsHelpers.fire; + + var _getAvailableLabelEvents = function () { + return [ + 'click', + 'dblclick', + 'mousedown', + 'mouseover', + 'mouseout', + 'contextmenu' + ]; + }; + + var _genDispatchLabelEvent = function (eventName, logic, leafletScope, label, name, model, layerName) { + return function (e) { + // Put together broadcast name + var broadcastName = 'leafletDirectiveLabel.' + eventName; + var markerName = scope_watch_name.replace('markers.', ''); + fire(leafletScope, broadcastName, logic, e, label, model, markerName, layerName); + }; + }; + + + var _genLabelEvents = function (eventName, logic, leafletScope, lObject, name, model, layerName) { + var labelEvents = _getAvailableLabelEvents(); + var scopeWatchName = Helpers.getObjectArrayPath("markers." + name); + for (var i = 0; i < labelEvents.length; i++) { + var eventName = labelEvents[i]; + lObject.label.on(eventName, + _genDispatchLabelEvent( + eventName, logic, leafletScope, lObject.label, scopeWatchName, model, layerName)); + } + }; + + return { + getAvailableLabelEvents: _getAvailableLabelEvents, + genDispatchLabelEvent: _genDispatchLabelEvent, + genLabelEvents: _genLabelEvents + }; +}); + +angular.module("leaflet-directive") +.factory('leafletMapEvents', function ($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers) { + var safeApply = leafletHelpers.safeApply, + isDefined = leafletHelpers.isDefined, + isObject = leafletHelpers.isObject, + Helpers = leafletHelpers, + errorHeader = leafletHelpers.errorHeader, + fire = leafletEventsHelpers.fire; + + var _getAvailableMapEvents = function() { + return [ + 'click', + 'dblclick', + 'mousedown', + 'mouseup', + 'mouseover', + 'mouseout', + 'mousemove', + 'contextmenu', + 'focus', + 'blur', + 'preclick', + 'load', + 'unload', + 'viewreset', + 'movestart', + 'move', + 'moveend', + 'dragstart', + 'drag', + 'dragend', + 'zoomstart', + 'zoomend', + 'zoomlevelschange', + 'resize', + 'autopanstart', + 'layeradd', + 'layerremove', + 'baselayerchange', + 'overlayadd', + 'overlayremove', + 'locationfound', + 'locationerror', + 'popupopen', + 'popupclose', + 'draw:created', + 'draw:edited', + 'draw:deleted', + 'draw:drawstart', + 'draw:drawstop', + 'draw:editstart', + 'draw:editstop', + 'draw:deletestart', + 'draw:deletestop' + ]; + }; + + var _genDispatchMapEvent = function(scope, eventName, logic) { + return function(e) { + // Put together broadcast name + var broadcastName = 'leafletDirectiveMap.' + eventName; + // Safely broadcast the event + fire(scope, broadcastName, logic, e, e.target, scope) + }; + }; + + var _notifyCenterChangedToBounds = function(scope) { + scope.$broadcast("boundsChanged"); + }; + + var _notifyCenterUrlHashChanged = function(scope, map, attrs, search) { + if (!isDefined(attrs.urlHashCenter)) { + return; + } + var center = map.getCenter(); + var centerUrlHash = (center.lat).toFixed(4) + ":" + (center.lng).toFixed(4) + ":" + map.getZoom(); + if (!isDefined(search.c) || search.c !== centerUrlHash) { + //$log.debug("notified new center..."); + scope.$emit("centerUrlHash", centerUrlHash); + } + }; + + return { + getAvailableMapEvents: _getAvailableMapEvents, + genDispatchMapEvent: _genDispatchMapEvent, + notifyCenterChangedToBounds: _notifyCenterChangedToBounds, + notifyCenterUrlHashChanged: _notifyCenterUrlHashChanged + }; +}); + +angular.module("leaflet-directive") +.factory('leafletMarkerEvents', function ($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers, leafletLabelEvents) { + var safeApply = leafletHelpers.safeApply, + isDefined = leafletHelpers.isDefined, + isObject = leafletHelpers.isObject, + Helpers = leafletHelpers, + errorHeader = leafletHelpers.errorHeader, + fire = leafletEventsHelpers.fire, + lblHelp = leafletLabelEvents; + + /* + argument: name: Note this can be a single string or dot notation + Example: + markerModel : { + m1: { lat:_, lon: _} + } + //would yield name of + name = "m1" + + If nested: + markerModel : { + cars: { + m1: { lat:_, lon: _} + } + } + //would yield name of + name = "cars.m1" + */ + var _genDispatchMarkerEvent = function (eventName, logic, leafletScope, lObject, name, model, layerName) { + return function (e) { + var broadcastName = 'leafletDirectiveMarker.' + eventName; - if (!isString(pathData.layer)) { - $log.error('[AngularJS - Leaflet] A layername must be a string'); - continue; - } - if (!isDefined(layers)) { - $log.error('[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.'); - continue; - } + // Broadcast old marker click name for backwards compatibility + if (eventName === "click") { + safeApply(leafletScope, function () { + $rootScope.$broadcast('leafletDirectiveMarkersClick', name); + }); + } else if (eventName === 'dragend') { + safeApply(leafletScope, function () { + model.lat = lObject.getLatLng().lat; + model.lng = lObject.getLatLng().lng; + }); + if (model.message && model.focus === true) { + lObject.openPopup(); + } + } - if (!isDefined(layers.overlays) || !isDefined(layers.overlays[pathData.layer])) { - $log.error('[AngularJS - Leaflet] A marker can only be added to a layer of type "group"'); - continue; - } - var layerGroup = layers.overlays[pathData.layer]; - if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) { - $log.error('[AngularJS - Leaflet] Adding a marker to an overlay needs a overlay of the type "group" or "featureGroup"'); - continue; - } + fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName); + }; + }; - // Listen for changes on the new path - leafletPaths[newName] = newPath; - // The path goes to a correct layer group, so first of all we add it - layerGroup.addLayer(newPath); + var _getAvailableMarkerEvents = function () { + return [ + 'click', + 'dblclick', + 'mousedown', + 'mouseover', + 'mouseout', + 'contextmenu', + 'dragstart', + 'drag', + 'dragend', + 'move', + 'remove', + 'popupopen', + 'popupclose' + ]; + }; - if (shouldWatch) { - watchPathFn(newPath, newName); - } else { - setPathOptions(newPath, pathData.type, pathData); - } - } else if (isDefined(newPath)) { - // Listen for changes on the new path - leafletPaths[newName] = newPath; - map.addLayer(newPath); + return { + getAvailableMarkerEvents: _getAvailableMarkerEvents, - if (shouldWatch) { - watchPathFn(newPath, newName); + bindMarkerEvents: function (lObject, name, model, leafletScope, layerName) { + var markerEvents = []; + var i; + var eventName; + var logic = "emit"; + + if (!isDefined(leafletScope.eventBroadcast)) { + // Backward compatibility, if no event-broadcast attribute, all events are broadcasted + markerEvents = _getAvailableMarkerEvents(); + } else if (!isObject(leafletScope.eventBroadcast)) { + // Not a valid object + $log.error(errorHeader + "event-broadcast must be an object check your model."); + } else { + // We have a possible valid object + if (!isDefined(leafletScope.eventBroadcast.marker)) { + // We do not have events enable/disable do we do nothing (all enabled by default) + markerEvents = _getAvailableMarkerEvents(); + } else if (!isObject(leafletScope.eventBroadcast.marker)) { + // Not a valid object + $log.warn(errorHeader + "event-broadcast.marker must be an object check your model."); + } else { + // We have a possible valid map object + // Event propadation logic + if (leafletScope.eventBroadcast.marker.logic !== undefined && leafletScope.eventBroadcast.marker.logic !== null) { + // We take care of possible propagation logic + if (leafletScope.eventBroadcast.marker.logic !== "emit" && leafletScope.eventBroadcast.marker.logic !== "broadcast") { + // This is an error + $log.warn(errorHeader + "Available event propagation logic are: 'emit' or 'broadcast'."); + } else if (leafletScope.eventBroadcast.marker.logic === "emit") { + logic = "emit"; + } + } + // Enable / Disable + var markerEventsEnable = false, markerEventsDisable = false; + if (leafletScope.eventBroadcast.marker.enable !== undefined && leafletScope.eventBroadcast.marker.enable !== null) { + if (typeof leafletScope.eventBroadcast.marker.enable === 'object') { + markerEventsEnable = true; + } + } + if (leafletScope.eventBroadcast.marker.disable !== undefined && leafletScope.eventBroadcast.marker.disable !== null) { + if (typeof leafletScope.eventBroadcast.marker.disable === 'object') { + markerEventsDisable = true; + } + } + if (markerEventsEnable && markerEventsDisable) { + // Both are active, this is an error + $log.warn(errorHeader + "can not enable and disable events at the same time"); + } else if (!markerEventsEnable && !markerEventsDisable) { + // Both are inactive, this is an error + $log.warn(errorHeader + "must enable or disable events"); + } else { + // At this point the marker object is OK, lets enable or disable events + if (markerEventsEnable) { + // Enable events + for (i = 0; i < leafletScope.eventBroadcast.marker.enable.length; i++) { + eventName = leafletScope.eventBroadcast.marker.enable[i]; + // Do we have already the event enabled? + if (markerEvents.indexOf(eventName) !== -1) { + // Repeated event, this is an error + $log.warn(errorHeader + "This event " + eventName + " is already enabled"); + } else { + // Does the event exists? + if (_getAvailableMarkerEvents().indexOf(eventName) === -1) { + // The event does not exists, this is an error + $log.warn(errorHeader + "This event " + eventName + " does not exist"); } else { - setPathOptions(newPath, pathData.type, pathData); + // All ok enable the event + markerEvents.push(eventName); } } + } + } else { + // Disable events + markerEvents = _getAvailableMarkerEvents(); + for (i = 0; i < leafletScope.eventBroadcast.marker.disable.length; i++) { + eventName = leafletScope.eventBroadcast.marker.disable[i]; + var index = markerEvents.indexOf(eventName); + if (index === -1) { + // The event does not exist + $log.warn(errorHeader + "This event " + eventName + " does not exist or has been already disabled"); - bindPathEvents(newPath, newName, pathData, leafletScope); + } else { + markerEvents.splice(index, 1); + } } } - }); - }); - }); + } + } + } + + for (i = 0; i < markerEvents.length; i++) { + eventName = markerEvents[i]; + lObject.on(eventName, + _genDispatchMarkerEvent(eventName, logic, leafletScope, lObject, name, model, layerName)); + } + + if (Helpers.LabelPlugin.isLoaded() && isDefined(lObject.label)) { + lblHelp.genLabelEvents(name, logic, leafletScope, lObject, model, layerName); + } } }; }); -angular.module("leaflet-directive").directive('tiles', function ($log, leafletData, leafletMapDefaults, leafletHelpers) { - return { - restrict: "A", - scope: false, - replace: false, - require: 'leaflet', - - link: function(scope, element, attrs, controller) { - var isDefined = leafletHelpers.isDefined, - leafletScope = controller.getLeafletScope(), - tiles = leafletScope.tiles; +angular.module("leaflet-directive") +.factory('leafletPathEvents', function ($rootScope, $q, $log, leafletHelpers, leafletLabelEvents) { + var safeApply = leafletHelpers.safeApply, + isDefined = leafletHelpers.isDefined, + isObject = leafletHelpers.isObject, + Helpers = leafletHelpers, + errorHeader = leafletHelpers.errorHeader, + lblHelp = leafletLabelEvents; - if (!isDefined(tiles) && !isDefined(tiles.url)) { - $log.warn("[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property."); - return; - } + var _genDispatchPathEvent = function (eventName, logic, leafletScope, lObject, name, model, layerName) { + return function (e) { + var broadcastName = 'leafletDirectivePath.' + eventName; - controller.getMap().then(function(map) { - var defaults = leafletMapDefaults.getDefaults(attrs.id); - var tileLayerObj; - leafletScope.$watch("tiles", function(tiles) { - var tileLayerOptions = defaults.tileLayerOptions; - var tileLayerUrl = defaults.tileLayer; + fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName); + }; + }; - // If no valid tiles are in the scope, remove the last layer - if (!isDefined(tiles.url) && isDefined(tileLayerObj)) { - map.removeLayer(tileLayerObj); - return; + var _bindPathEvents = function (lObject, name, model, leafletScope) { + var pathEvents = [], + i, + eventName, + logic = "broadcast"; + + if (!isDefined(leafletScope.eventBroadcast)) { + // Backward compatibility, if no event-broadcast attribute, all events are broadcasted + pathEvents = _getAvailablePathEvents(); + } else if (!isObject(leafletScope.eventBroadcast)) { + // Not a valid object + $log.error(errorHeader + "event-broadcast must be an object check your model."); + } else { + // We have a possible valid object + if (!isDefined(leafletScope.eventBroadcast.path)) { + // We do not have events enable/disable do we do nothing (all enabled by default) + pathEvents = _getAvailablePathEvents(); + } else if (isObject(leafletScope.eventBroadcast.paths)) { + // Not a valid object + $log.warn(errorHeader + "event-broadcast.path must be an object check your model."); + } else { + // We have a possible valid map object + // Event propadation logic + if (leafletScope.eventBroadcast.path.logic !== undefined && leafletScope.eventBroadcast.path.logic !== null) { + // We take care of possible propagation logic + if (leafletScope.eventBroadcast.path.logic !== "emit" && leafletScope.eventBroadcast.path.logic !== "broadcast") { + // This is an error + $log.warn(errorHeader + "Available event propagation logic are: 'emit' or 'broadcast'."); + } else if (leafletScope.eventBroadcast.path.logic === "emit") { + logic = "emit"; } - - // No leafletTiles object defined yet - if (!isDefined(tileLayerObj)) { - if (isDefined(tiles.options)) { - angular.copy(tiles.options, tileLayerOptions); + } + // Enable / Disable + var pathEventsEnable = false, pathEventsDisable = false; + if (leafletScope.eventBroadcast.path.enable !== undefined && leafletScope.eventBroadcast.path.enable !== null) { + if (typeof leafletScope.eventBroadcast.path.enable === 'object') { + pathEventsEnable = true; + } + } + if (leafletScope.eventBroadcast.path.disable !== undefined && leafletScope.eventBroadcast.path.disable !== null) { + if (typeof leafletScope.eventBroadcast.path.disable === 'object') { + pathEventsDisable = true; + } + } + if (pathEventsEnable && pathEventsDisable) { + // Both are active, this is an error + $log.warn(errorHeader + "can not enable and disable events at the same time"); + } else if (!pathEventsEnable && !pathEventsDisable) { + // Both are inactive, this is an error + $log.warn(errorHeader + "must enable or disable events"); + } else { + // At this point the path object is OK, lets enable or disable events + if (pathEventsEnable) { + // Enable events + for (i = 0; i < leafletScope.eventBroadcast.path.enable.length; i++) { + eventName = leafletScope.eventBroadcast.path.enable[i]; + // Do we have already the event enabled? + if (pathEvents.indexOf(eventName) !== -1) { + // Repeated event, this is an error + $log.warn(errorHeader + "This event " + eventName + " is already enabled"); + } else { + // Does the event exists? + if (_getAvailablePathEvents().indexOf(eventName) === -1) { + // The event does not exists, this is an error + $log.warn(errorHeader + "This event " + eventName + " does not exist"); + } else { + // All ok enable the event + pathEvents.push(eventName); + } + } } - - if (isDefined(tiles.url)) { - tileLayerUrl = tiles.url; + } else { + // Disable events + pathEvents = _getAvailablePathEvents(); + for (i = 0; i < leafletScope.eventBroadcast.path.disable.length; i++) { + eventName = leafletScope.eventBroadcast.path.disable[i]; + var index = pathEvents.indexOf(eventName); + if (index === -1) { + // The event does not exist + $log.warn(errorHeader + "This event " + eventName + " does not exist or has been already disabled"); + + } else { + pathEvents.splice(index, 1); + } } - - tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions); - tileLayerObj.addTo(map); - leafletData.setTiles(tileLayerObj, attrs.id); - return; } + } + } + } - // If the options of the tilelayer is changed, we need to redraw the layer - if (isDefined(tiles.url) && isDefined(tiles.options) && !angular.equals(tiles.options, tileLayerOptions)) { - map.removeLayer(tileLayerObj); - tileLayerOptions = defaults.tileLayerOptions; - angular.copy(tiles.options, tileLayerOptions); - tileLayerUrl = tiles.url; - tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions); - tileLayerObj.addTo(map); - leafletData.setTiles(tileLayerObj, attrs.id); - return; - } + for (i = 0; i < pathEvents.length; i++) { + eventName = pathEvents[i]; + lObject.on(eventName, _genDispatchPathEvent(eventName, logic, leafletScope, pathEvents, name)); + } - // Only the URL of the layer is changed, update the tiles object - if (isDefined(tiles.url)) { - tileLayerObj.setUrl(tiles.url); - } - }, true); - }); + if (Helpers.LabelPlugin.isLoaded() && isDefined(lObject.label)) { + lblHelp.genLabelEvents(leafletScope, logic, lObject, name); } }; + + var _getAvailablePathEvents = function () { + return [ + 'click', + 'dblclick', + 'mousedown', + 'mouseover', + 'mouseout', + 'contextmenu', + 'add', + 'remove', + 'popupopen', + 'popupclose' + ]; + }; + + return { + getAvailablePathEvents: _getAvailablePathEvents, + bindPathEvents: _bindPathEvents + }; }); }(angular)); diff --git a/dist/angular-leaflet-directive_dev_mapped.js.map b/dist/angular-leaflet-directive_dev_mapped.js.map index 21599d4a..68a578f4 100644 --- a/dist/angular-leaflet-directive_dev_mapped.js.map +++ b/dist/angular-leaflet-directive_dev_mapped.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/directives/leaflet.js","../src/services/leafletBoundsHelpers.js","../src/services/leafletControlHelpers.js","../src/services/leafletData.js","../src/services/leafletEvents.js","../src/services/leafletHelpers.js","../src/services/leafletIterators.js","../src/services/leafletLayerHelpers.js","../src/services/leafletLegendHelpers.js","../src/services/leafletMapDefaults.js","../src/services/leafletMarkersHelpers.js","../src/services/leafletPathsHelpers.js","../src/directives/bounds.js","../src/directives/center.js","../src/directives/controls.js","../src/directives/decorations.js","../src/directives/eventBroadcast.js","../src/directives/geojson.js","../src/directives/layercontrol.js","../src/directives/layers.js","../src/directives/legend.js","../src/directives/markers.js","../src/directives/maxbounds.js","../src/directives/paths.js","../src/directives/tiles.js"],"names":[],"mappings":"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","file":"angular-leaflet-directive_dev_mapped.js","sourcesContent":["angular.module(\"leaflet-directive\", []).directive('leaflet', function ($q, leafletData, leafletMapDefaults, leafletHelpers, leafletEvents) {\n var _leafletMap;\n return {\n restrict: \"EA\",\n replace: true,\n scope: {\n center : '=',\n defaults : '=',\n maxbounds : '=',\n bounds : '=',\n markers : '=',\n legend : '=',\n geojson : '=',\n paths : '=',\n tiles : '=',\n layers : '=',\n controls : '=',\n decorations : '=',\n eventBroadcast : '='\n },\n transclude: true,\n template: '
',\n controller: function ($scope) {\n _leafletMap = $q.defer();\n this.getMap = function () {\n return _leafletMap.promise;\n };\n\n this.getLeafletScope = function() {\n return $scope;\n };\n },\n\n link: function(scope, element, attrs) {\n var isDefined = leafletHelpers.isDefined,\n defaults = leafletMapDefaults.setDefaults(scope.defaults, attrs.id),\n genDispatchMapEvent = leafletEvents.genDispatchMapEvent,\n mapEvents = leafletEvents.getAvailableMapEvents();\n\n // Set width and height utility functions\n function updateWidth() {\n if (isNaN(attrs.width)) {\n element.css('width', attrs.width);\n } else {\n element.css('width', attrs.width + 'px');\n }\n }\n\n function updateHeight() {\n if (isNaN(attrs.height)) {\n element.css('height', attrs.height);\n } else {\n element.css('height', attrs.height + 'px');\n }\n }\n\n // If the width attribute defined update css\n // Then watch if bound property changes and update css\n if (isDefined(attrs.width)) {\n updateWidth();\n\n scope.$watch(\n function () {\n return element[0].getAttribute('width');\n },\n function () {\n updateWidth();\n map.invalidateSize();\n });\n }\n\n // If the height attribute defined update css\n // Then watch if bound property changes and update css\n if (isDefined(attrs.height)) {\n updateHeight();\n\n scope.$watch(\n function () {\n return element[0].getAttribute('height');\n },\n function () {\n updateHeight();\n map.invalidateSize();\n });\n }\n\n // Create the Leaflet Map Object with the options\n var map = new L.Map(element[0], leafletMapDefaults.getMapCreationDefaults(attrs.id));\n _leafletMap.resolve(map);\n\n if (!isDefined(attrs.center)) {\n map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);\n }\n\n // If no layers nor tiles defined, set the default tileLayer\n if (!isDefined(attrs.tiles) && (!isDefined(attrs.layers))) {\n var tileLayerObj = L.tileLayer(defaults.tileLayer, defaults.tileLayerOptions);\n tileLayerObj.addTo(map);\n leafletData.setTiles(tileLayerObj, attrs.id);\n }\n\n // Set zoom control configuration\n if (isDefined(map.zoomControl) &&\n isDefined(defaults.zoomControlPosition)) {\n map.zoomControl.setPosition(defaults.zoomControlPosition);\n }\n\n if (isDefined(map.zoomControl) &&\n defaults.zoomControl===false) {\n map.zoomControl.removeFrom(map);\n }\n\n if (isDefined(map.zoomsliderControl) &&\n isDefined(defaults.zoomsliderControl) &&\n defaults.zoomsliderControl===false) {\n map.zoomsliderControl.removeFrom(map);\n }\n\n\n // if no event-broadcast attribute, all events are broadcasted\n if (!isDefined(attrs.eventBroadcast)) {\n var logic = \"broadcast\";\n for (var i = 0; i < mapEvents.length; i++) {\n var eventName = mapEvents[i];\n map.on(eventName, genDispatchMapEvent(scope, eventName, logic), {\n eventName: eventName\n });\n }\n }\n\n // Resolve the map object to the promises\n map.whenReady(function() {\n leafletData.setMap(map, attrs.id);\n });\n\n scope.$on('$destroy', function () {\n map.remove();\n leafletData.unresolveMap(attrs.id);\n });\n\n //Handle request to invalidate the map size\n //Up scope using $scope.$emit('invalidateSize')\n //Down scope using $scope.$broadcast('invalidateSize')\n scope.$on('invalidateSize', function() {\n map.invalidateSize();\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").factory('leafletBoundsHelpers', function ($log, leafletHelpers) {\n\n var isArray = leafletHelpers.isArray,\n isNumber = leafletHelpers.isNumber;\n\n function _isValidBounds(bounds) {\n return angular.isDefined(bounds) && angular.isDefined(bounds.southWest) &&\n angular.isDefined(bounds.northEast) && angular.isNumber(bounds.southWest.lat) &&\n angular.isNumber(bounds.southWest.lng) && angular.isNumber(bounds.northEast.lat) &&\n angular.isNumber(bounds.northEast.lng);\n }\n\n return {\n createLeafletBounds: function(bounds) {\n if (_isValidBounds(bounds)) {\n return L.latLngBounds([bounds.southWest.lat, bounds.southWest.lng],\n [bounds.northEast.lat, bounds.northEast.lng ]);\n }\n },\n\n isValidBounds: _isValidBounds,\n\n createBoundsFromArray: function(boundsArray) {\n if (!(isArray(boundsArray) && boundsArray.length === 2 &&\n isArray(boundsArray[0]) && isArray(boundsArray[1]) &&\n boundsArray[0].length === 2 && boundsArray[1].length === 2 &&\n isNumber(boundsArray[0][0]) && isNumber(boundsArray[0][1]) &&\n isNumber(boundsArray[1][0]) && isNumber(boundsArray[1][1]))) {\n $log.error(\"[AngularJS - Leaflet] The bounds array is not valid.\");\n return;\n }\n\n return {\n northEast: {\n lat: boundsArray[0][0],\n lng: boundsArray[0][1]\n },\n southWest: {\n lat: boundsArray[1][0],\n lng: boundsArray[1][1]\n }\n };\n\n }\n };\n});\n","angular.module(\"leaflet-directive\").factory('leafletControlHelpers', function ($rootScope, $log, leafletHelpers, leafletMapDefaults) {\n var isObject = leafletHelpers.isObject,\n isDefined = leafletHelpers.isDefined;\n var _controls = {};\n\n var _controlLayersMustBeVisible = function(baselayers, overlays, mapId) {\n var defaults = leafletMapDefaults.getDefaults(mapId);\n if(!defaults.controls.layers.visible) {\n return false;\n }\n\n var numberOfLayers = 0;\n if (isObject(baselayers)) {\n numberOfLayers += Object.keys(baselayers).length;\n }\n if (isObject(overlays)) {\n numberOfLayers += Object.keys(overlays).length;\n }\n return numberOfLayers > 1;\n };\n\n var _createLayersControl = function(mapId) {\n var defaults = leafletMapDefaults.getDefaults(mapId);\n var controlOptions = {\n collapsed: defaults.controls.layers.collapsed,\n position: defaults.controls.layers.position\n };\n\n angular.extend(controlOptions, defaults.controls.layers.options);\n\n var control;\n if(defaults.controls.layers && isDefined(defaults.controls.layers.control)) {\n\t\t\tcontrol = defaults.controls.layers.control.apply(this, [[], [], controlOptions]);\n\t\t} else {\n\t\t\tcontrol = new L.control.layers([], [], controlOptions);\n\t\t}\n\n return control;\n };\n\n return {\n layersControlMustBeVisible: _controlLayersMustBeVisible,\n\n updateLayersControl: function(map, mapId, loaded, baselayers, overlays, leafletLayers) {\n var i;\n\n var _layersControl = _controls[mapId];\n var mustBeLoaded = _controlLayersMustBeVisible(baselayers, overlays, mapId);\n if (isDefined(_layersControl) && loaded) {\n for (i in leafletLayers.baselayers) {\n _layersControl.removeLayer(leafletLayers.baselayers[i]);\n }\n for (i in leafletLayers.overlays) {\n _layersControl.removeLayer(leafletLayers.overlays[i]);\n }\n _layersControl.removeFrom(map);\n delete _controls[mapId];\n }\n\n if (mustBeLoaded) {\n _layersControl = _createLayersControl(mapId);\n _controls[mapId] = _layersControl;\n for (i in baselayers) {\n var hideOnSelector = isDefined(baselayers[i].layerOptions) &&\n baselayers[i].layerOptions.showOnSelector === false;\n if (!hideOnSelector && isDefined(leafletLayers.baselayers[i])) {\n _layersControl.addBaseLayer(leafletLayers.baselayers[i], baselayers[i].name);\n }\n }\n for (i in overlays) {\n \tvar hideOverlayOnSelector = isDefined(overlays[i].layerOptions) &&\n overlays[i].layerOptions.showOnSelector === false;\n if (!hideOverlayOnSelector && isDefined(leafletLayers.overlays[i])) {\n _layersControl.addOverlay(leafletLayers.overlays[i], overlays[i].name);\n }\n }\n _layersControl.addTo(map);\n }\n return mustBeLoaded;\n }\n };\n});\n","angular.module(\"leaflet-directive\").service('leafletData', function ($log, $q, leafletHelpers) {\n var getDefer = leafletHelpers.getDefer,\n getUnresolvedDefer = leafletHelpers.getUnresolvedDefer,\n setResolvedDefer = leafletHelpers.setResolvedDefer;\n\n var maps = {};\n var tiles = {};\n var layers = {};\n var paths = {};\n var markers = {};\n var geoJSON = {};\n var utfGrid = {};\n var decorations = {};\n\n this.setMap = function(leafletMap, scopeId) {\n var defer = getUnresolvedDefer(maps, scopeId);\n defer.resolve(leafletMap);\n setResolvedDefer(maps, scopeId);\n };\n\n this.getMap = function(scopeId) {\n var defer = getDefer(maps, scopeId);\n return defer.promise;\n };\n\n this.unresolveMap = function (scopeId) {\n var id = leafletHelpers.obtainEffectiveMapId(maps, scopeId);\n maps[id] = undefined;\n tiles[id] = undefined;\n layers[id] = undefined;\n paths[id] = undefined;\n markers[id] = undefined;\n geoJSON[id] = undefined;\n utfGrid[id] = undefined;\n decorations[id] = undefined;\n };\n\n this.getPaths = function(scopeId) {\n var defer = getDefer(paths, scopeId);\n return defer.promise;\n };\n\n this.setPaths = function(leafletPaths, scopeId) {\n var defer = getUnresolvedDefer(paths, scopeId);\n defer.resolve(leafletPaths);\n setResolvedDefer(paths, scopeId);\n };\n\n this.getMarkers = function(scopeId) {\n var defer = getDefer(markers, scopeId);\n return defer.promise;\n };\n\n this.setMarkers = function(leafletMarkers, scopeId) {\n var defer = getUnresolvedDefer(markers, scopeId);\n defer.resolve(leafletMarkers);\n setResolvedDefer(markers, scopeId);\n };\n\n this.getLayers = function(scopeId) {\n var defer = getDefer(layers, scopeId);\n return defer.promise;\n };\n\n this.setLayers = function(leafletLayers, scopeId) {\n var defer = getUnresolvedDefer(layers, scopeId);\n defer.resolve(leafletLayers);\n setResolvedDefer(layers, scopeId);\n };\n\n this.getUTFGrid = function(scopeId) {\n var defer = getDefer(utfGrid, scopeId);\n return defer.promise;\n };\n\n this.setUTFGrid = function(leafletUTFGrid, scopeId) {\n var defer = getUnresolvedDefer(utfGrid, scopeId);\n defer.resolve(leafletUTFGrid);\n setResolvedDefer(utfGrid, scopeId);\n };\n\n this.setTiles = function(leafletTiles, scopeId) {\n var defer = getUnresolvedDefer(tiles, scopeId);\n defer.resolve(leafletTiles);\n setResolvedDefer(tiles, scopeId);\n };\n\n this.getTiles = function(scopeId) {\n var defer = getDefer(tiles, scopeId);\n return defer.promise;\n };\n\n this.setGeoJSON = function(leafletGeoJSON, scopeId) {\n var defer = getUnresolvedDefer(geoJSON, scopeId);\n defer.resolve(leafletGeoJSON);\n setResolvedDefer(geoJSON, scopeId);\n };\n\n this.getGeoJSON = function(scopeId) {\n var defer = getDefer(geoJSON, scopeId);\n return defer.promise;\n };\n\n this.setDecorations = function(leafletDecorations, scopeId) {\n var defer = getUnresolvedDefer(decorations, scopeId);\n defer.resolve(leafletDecorations);\n setResolvedDefer(decorations, scopeId);\n };\n\n this.getDecorations = function(scopeId) {\n var defer = getDefer(decorations, scopeId);\n return defer.promise;\n };\n});\n","angular.module(\"leaflet-directive\").factory('leafletEvents', function ($rootScope, $q, $log, leafletHelpers) {\n var safeApply = leafletHelpers.safeApply,\n isDefined = leafletHelpers.isDefined,\n isObject = leafletHelpers.isObject,\n Helpers = leafletHelpers;\n\n var _getAvailableLabelEvents = function() {\n return [\n 'click',\n 'dblclick',\n 'mousedown',\n 'mouseover',\n 'mouseout',\n 'contextmenu'\n ];\n };\n\n var genLabelEvents = function(leafletScope, logic, marker, name) {\n var labelEvents = _getAvailableLabelEvents();\n var scopeWatchName = Helpers.getObjectArrayPath(\"markers.\" + name);\n for (var i = 0; i < labelEvents.length; i++) {\n var eventName = labelEvents[i];\n marker.label.on(eventName, genDispatchLabelEvent(leafletScope, eventName, logic, marker.label, scopeWatchName));\n }\n };\n\n /*\n argument: name: Note this can be a single string or dot notation\n Example:\n markerModel : {\n m1: { lat:_, lon: _}\n }\n //would yield name of\n name = \"m1\"\n\n If nested:\n markerModel : {\n cars: {\n m1: { lat:_, lon: _}\n }\n }\n //would yield name of\n name = \"cars.m1\"\n */\n var genDispatchMarkerEvent = function(eventName, logic, leafletScope, marker, name, markerData) {\n return function(e) {\n var broadcastName = 'leafletDirectiveMarker.' + eventName;\n\n // Broadcast old marker click name for backwards compatibility\n if (eventName === \"click\") {\n safeApply(leafletScope, function() {\n $rootScope.$broadcast('leafletDirectiveMarkersClick', name);\n });\n } else if (eventName === 'dragend') {\n safeApply(leafletScope, function() {\n markerData.lat = marker.getLatLng().lat;\n markerData.lng = marker.getLatLng().lng;\n });\n if (markerData.message && markerData.focus === true) {\n marker.openPopup();\n }\n }\n\n safeApply(leafletScope, function(scope){\n if (logic === \"emit\") {\n scope.$emit(broadcastName, {\n markerName: name,\n leafletEvent: e\n });\n } else {\n $rootScope.$broadcast(broadcastName, {\n markerName: name,\n leafletEvent: e\n });\n }\n });\n };\n };\n\n var genDispatchPathEvent = function(eventName, logic, leafletScope, marker, name) {\n return function(e) {\n var broadcastName = 'leafletDirectivePath.' + eventName;\n\n safeApply(leafletScope, function(scope){\n if (logic === \"emit\") {\n scope.$emit(broadcastName, {\n pathName: name,\n leafletEvent: e\n });\n } else {\n $rootScope.$broadcast(broadcastName, {\n pathName: name,\n leafletEvent: e\n });\n }\n });\n };\n };\n\n var genDispatchLabelEvent = function(scope, eventName, logic, label, scope_watch_name) {\n return function(e) {\n // Put together broadcast name\n var broadcastName = 'leafletDirectiveLabel.' + eventName;\n var markerName = scope_watch_name.replace('markers.', '');\n\n // Safely broadcast the event\n safeApply(scope, function(scope) {\n if (logic === \"emit\") {\n scope.$emit(broadcastName, {\n leafletEvent : e,\n label: label,\n markerName: markerName\n });\n } else if (logic === \"broadcast\") {\n $rootScope.$broadcast(broadcastName, {\n leafletEvent : e,\n label: label,\n markerName: markerName\n });\n }\n });\n };\n };\n\n var _getAvailableMarkerEvents = function() {\n return [\n 'click',\n 'dblclick',\n 'mousedown',\n 'mouseover',\n 'mouseout',\n 'contextmenu',\n 'dragstart',\n 'drag',\n 'dragend',\n 'move',\n 'remove',\n 'popupopen',\n 'popupclose'\n ];\n };\n\n var _getAvailablePathEvents = function() {\n return [\n 'click',\n 'dblclick',\n 'mousedown',\n 'mouseover',\n 'mouseout',\n 'contextmenu',\n 'add',\n 'remove',\n 'popupopen',\n 'popupclose'\n ];\n };\n\n return {\n getAvailableMapEvents: function() {\n return [\n 'click',\n 'dblclick',\n 'mousedown',\n 'mouseup',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'contextmenu',\n 'focus',\n 'blur',\n 'preclick',\n 'load',\n 'unload',\n 'viewreset',\n 'movestart',\n 'move',\n 'moveend',\n 'dragstart',\n 'drag',\n 'dragend',\n 'zoomstart',\n 'zoomend',\n 'zoomlevelschange',\n 'resize',\n 'autopanstart',\n 'layeradd',\n 'layerremove',\n 'baselayerchange',\n 'overlayadd',\n 'overlayremove',\n 'locationfound',\n 'locationerror',\n 'popupopen',\n 'popupclose',\n 'draw:created',\n 'draw:edited',\n 'draw:deleted',\n 'draw:drawstart',\n 'draw:drawstop',\n 'draw:editstart',\n 'draw:editstop',\n 'draw:deletestart',\n 'draw:deletestop'\n ];\n },\n\n genDispatchMapEvent: function(scope, eventName, logic) {\n return function(e) {\n // Put together broadcast name\n var broadcastName = 'leafletDirectiveMap.' + eventName;\n // Safely broadcast the event\n safeApply(scope, function(scope) {\n if (logic === \"emit\") {\n scope.$emit(broadcastName, {\n leafletEvent : e\n });\n } else if (logic === \"broadcast\") {\n $rootScope.$broadcast(broadcastName, {\n leafletEvent : e\n });\n }\n });\n };\n },\n\n getAvailableMarkerEvents: _getAvailableMarkerEvents,\n\n getAvailablePathEvents: _getAvailablePathEvents,\n\n notifyCenterChangedToBounds: function(scope) {\n scope.$broadcast(\"boundsChanged\");\n },\n\n notifyCenterUrlHashChanged: function(scope, map, attrs, search) {\n if (!isDefined(attrs.urlHashCenter)) {\n return;\n }\n var center = map.getCenter();\n var centerUrlHash = (center.lat).toFixed(4) + \":\" + (center.lng).toFixed(4) + \":\" + map.getZoom();\n if (!isDefined(search.c) || search.c !== centerUrlHash) {\n //$log.debug(\"notified new center...\");\n scope.$emit(\"centerUrlHash\", centerUrlHash);\n }\n },\n\n bindMarkerEvents: function(marker, name, markerData, leafletScope) {\n var markerEvents = [];\n var i;\n var eventName;\n var logic = \"emit\";\n\n if (!isDefined(leafletScope.eventBroadcast)) {\n // Backward compatibility, if no event-broadcast attribute, all events are broadcasted\n markerEvents = _getAvailableMarkerEvents();\n } else if (!isObject(leafletScope.eventBroadcast)) {\n // Not a valid object\n $log.error(\"[AngularJS - Leaflet] event-broadcast must be an object check your model.\");\n } else {\n // We have a possible valid object\n if (!isDefined(leafletScope.eventBroadcast.marker)) {\n // We do not have events enable/disable do we do nothing (all enabled by default)\n markerEvents = _getAvailableMarkerEvents();\n } else if (!isObject(leafletScope.eventBroadcast.marker)) {\n // Not a valid object\n $log.warn(\"[AngularJS - Leaflet] event-broadcast.marker must be an object check your model.\");\n } else {\n // We have a possible valid map object\n // Event propadation logic\n if (leafletScope.eventBroadcast.marker.logic !== undefined && leafletScope.eventBroadcast.marker.logic !== null) {\n // We take care of possible propagation logic\n if (leafletScope.eventBroadcast.marker.logic !== \"emit\" && leafletScope.eventBroadcast.marker.logic !== \"broadcast\") {\n // This is an error\n $log.warn(\"[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'.\");\n } else if (leafletScope.eventBroadcast.marker.logic === \"emit\") {\n logic = \"emit\";\n }\n }\n // Enable / Disable\n var markerEventsEnable = false, markerEventsDisable = false;\n if (leafletScope.eventBroadcast.marker.enable !== undefined && leafletScope.eventBroadcast.marker.enable !== null) {\n if (typeof leafletScope.eventBroadcast.marker.enable === 'object') {\n markerEventsEnable = true;\n }\n }\n if (leafletScope.eventBroadcast.marker.disable !== undefined && leafletScope.eventBroadcast.marker.disable !== null) {\n if (typeof leafletScope.eventBroadcast.marker.disable === 'object') {\n markerEventsDisable = true;\n }\n }\n if (markerEventsEnable && markerEventsDisable) {\n // Both are active, this is an error\n $log.warn(\"[AngularJS - Leaflet] can not enable and disable events at the same time\");\n } else if (!markerEventsEnable && !markerEventsDisable) {\n // Both are inactive, this is an error\n $log.warn(\"[AngularJS - Leaflet] must enable or disable events\");\n } else {\n // At this point the marker object is OK, lets enable or disable events\n if (markerEventsEnable) {\n // Enable events\n for (i = 0; i < leafletScope.eventBroadcast.marker.enable.length; i++) {\n eventName = leafletScope.eventBroadcast.marker.enable[i];\n // Do we have already the event enabled?\n if (markerEvents.indexOf(eventName) !== -1) {\n // Repeated event, this is an error\n $log.warn(\"[AngularJS - Leaflet] This event \" + eventName + \" is already enabled\");\n } else {\n // Does the event exists?\n if (_getAvailableMarkerEvents().indexOf(eventName) === -1) {\n // The event does not exists, this is an error\n $log.warn(\"[AngularJS - Leaflet] This event \" + eventName + \" does not exist\");\n } else {\n // All ok enable the event\n markerEvents.push(eventName);\n }\n }\n }\n } else {\n // Disable events\n markerEvents = _getAvailableMarkerEvents();\n for (i = 0; i < leafletScope.eventBroadcast.marker.disable.length; i++) {\n eventName = leafletScope.eventBroadcast.marker.disable[i];\n var index = markerEvents.indexOf(eventName);\n if (index === -1) {\n // The event does not exist\n $log.warn(\"[AngularJS - Leaflet] This event \" + eventName + \" does not exist or has been already disabled\");\n\n } else {\n markerEvents.splice(index, 1);\n }\n }\n }\n }\n }\n }\n\n for (i = 0; i < markerEvents.length; i++) {\n eventName = markerEvents[i];\n marker.on(eventName, genDispatchMarkerEvent(eventName, logic, leafletScope, marker, name, markerData));\n }\n\n if (Helpers.LabelPlugin.isLoaded() && isDefined(marker.label)) {\n genLabelEvents(leafletScope, logic, marker, name);\n }\n },\n\n bindPathEvents: function(path, name, pathData, leafletScope) {\n var pathEvents = [];\n var i;\n var eventName;\n var logic = \"broadcast\";\n\n if (!isDefined(leafletScope.eventBroadcast)) {\n // Backward compatibility, if no event-broadcast attribute, all events are broadcasted\n pathEvents = _getAvailablePathEvents();\n } else if (!isObject(leafletScope.eventBroadcast)) {\n // Not a valid object\n $log.error(\"[AngularJS - Leaflet] event-broadcast must be an object check your model.\");\n } else {\n // We have a possible valid object\n if (!isDefined(leafletScope.eventBroadcast.path)) {\n // We do not have events enable/disable do we do nothing (all enabled by default)\n pathEvents = _getAvailablePathEvents();\n } else if (isObject(leafletScope.eventBroadcast.paths)) {\n // Not a valid object\n $log.warn(\"[AngularJS - Leaflet] event-broadcast.path must be an object check your model.\");\n } else {\n // We have a possible valid map object\n // Event propadation logic\n if (leafletScope.eventBroadcast.path.logic !== undefined && leafletScope.eventBroadcast.path.logic !== null) {\n // We take care of possible propagation logic\n if (leafletScope.eventBroadcast.path.logic !== \"emit\" && leafletScope.eventBroadcast.path.logic !== \"broadcast\") {\n // This is an error\n $log.warn(\"[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'.\");\n } else if (leafletScope.eventBroadcast.path.logic === \"emit\") {\n logic = \"emit\";\n }\n }\n // Enable / Disable\n var pathEventsEnable = false, pathEventsDisable = false;\n if (leafletScope.eventBroadcast.path.enable !== undefined && leafletScope.eventBroadcast.path.enable !== null) {\n if (typeof leafletScope.eventBroadcast.path.enable === 'object') {\n pathEventsEnable = true;\n }\n }\n if (leafletScope.eventBroadcast.path.disable !== undefined && leafletScope.eventBroadcast.path.disable !== null) {\n if (typeof leafletScope.eventBroadcast.path.disable === 'object') {\n pathEventsDisable = true;\n }\n }\n if (pathEventsEnable && pathEventsDisable) {\n // Both are active, this is an error\n $log.warn(\"[AngularJS - Leaflet] can not enable and disable events at the same time\");\n } else if (!pathEventsEnable && !pathEventsDisable) {\n // Both are inactive, this is an error\n $log.warn(\"[AngularJS - Leaflet] must enable or disable events\");\n } else {\n // At this point the path object is OK, lets enable or disable events\n if (pathEventsEnable) {\n // Enable events\n for (i = 0; i < leafletScope.eventBroadcast.path.enable.length; i++) {\n eventName = leafletScope.eventBroadcast.path.enable[i];\n // Do we have already the event enabled?\n if (pathEvents.indexOf(eventName) !== -1) {\n // Repeated event, this is an error\n $log.warn(\"[AngularJS - Leaflet] This event \" + eventName + \" is already enabled\");\n } else {\n // Does the event exists?\n if (_getAvailablePathEvents().indexOf(eventName) === -1) {\n // The event does not exists, this is an error\n $log.warn(\"[AngularJS - Leaflet] This event \" + eventName + \" does not exist\");\n } else {\n // All ok enable the event\n pathEvents.push(eventName);\n }\n }\n }\n } else {\n // Disable events\n pathEvents = _getAvailablePathEvents();\n for (i = 0; i < leafletScope.eventBroadcast.path.disable.length; i++) {\n eventName = leafletScope.eventBroadcast.path.disable[i];\n var index = pathEvents.indexOf(eventName);\n if (index === -1) {\n // The event does not exist\n $log.warn(\"[AngularJS - Leaflet] This event \" + eventName + \" does not exist or has been already disabled\");\n\n } else {\n pathEvents.splice(index, 1);\n }\n }\n }\n }\n }\n }\n\n for (i = 0; i < pathEvents.length; i++) {\n eventName = pathEvents[i];\n path.on(eventName, genDispatchPathEvent(eventName, logic, leafletScope, pathEvents, name));\n }\n\n if (Helpers.LabelPlugin.isLoaded() && isDefined(path.label)) {\n genLabelEvents(leafletScope, logic, path, name);\n }\n }\n\n };\n});\n","angular.module(\"leaflet-directive\").factory('leafletHelpers', function ($q, $log) {\n var _errorHeader = '[AngularJS - Leaflet] ';\n\n /*\n For parsing paths to a field in an object\n\n Example:\n var obj = {\n bike:{\n 1: 'hi'\n 2: 'foo'\n }\n };\n _getObjectValue(obj,\"bike.1\") returns 'hi'\n */\n var _getObjectValue = function(object, pathStr) {\n var obj;\n //if the key is not a sting then we already have the value\n if ((pathStr === null) || !angular.isString(pathStr)) {\n return pathStr;\n }\n obj = object;\n pathStr.split('.').forEach(function(value) {\n if (obj) {\n obj = obj[value];\n }\n });\n return obj;\n };\n\n /*\n Object Array Notation\n _getObjectArrayPath(\"bike.one.two\")\n returns:\n 'bike[\"one\"][\"two\"]'\n */\n var _getObjectArrayPath = function(pathStr){\n return pathStr.split('.').reduce(function(previous, current) {\n return previous + '[\"'+ current + '\"]';\n });\n };\n\n /* Object Dot Notation\n _getObjectPath([\"bike\",\"one\",\"two\"])\n returns:\n \"bike.one.two\"\n */\n var _getObjectDotPath = function(arrayOfStrings){\n return arrayOfStrings.reduce(function(previous, current) {\n return previous + '.' + current;\n });\n };\n\n function _obtainEffectiveMapId(d, mapId) {\n var id, i;\n if (!angular.isDefined(mapId)) {\n if (Object.keys(d).length === 0) {\n id = \"main\";\n } else if (Object.keys(d).length >= 1) {\n for (i in d) {\n if (d.hasOwnProperty(i)) {\n id = i;\n }\n }\n } else if (Object.keys(d).length === 0) {\n id = \"main\";\n } else {\n $log.error(_errorHeader + \"- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call\");\n }\n } else {\n id = mapId;\n }\n\n return id;\n }\n\n function _getUnresolvedDefer(d, mapId) {\n var id = _obtainEffectiveMapId(d, mapId),\n defer;\n\n if (!angular.isDefined(d[id]) || d[id].resolvedDefer === true) {\n defer = $q.defer();\n d[id] = {\n defer: defer,\n resolvedDefer: false\n };\n } else {\n defer = d[id].defer;\n }\n\n return defer;\n }\n\n var _isDefined = function(value) {\n return angular.isDefined(value) && value !== null;\n };\n var _isUndefined = function(value){\n return !_isDefined(value);\n };\n\n return {\n errorHeader: _errorHeader,\n getObjectValue: _getObjectValue,\n getObjectArrayPath:_getObjectArrayPath,\n getObjectDotPath: _getObjectDotPath,\n defaultTo: function(val, _default){\n return _isDefined(val) ? val : _default;\n },\n //mainly for checking attributes of directives lets keep this minimal (on what we accept)\n isTruthy: function(val){\n return val === 'true' || val === true;\n },\n //Determine if a reference is {}\n isEmpty: function(value) {\n return Object.keys(value).length === 0;\n },\n\n //Determine if a reference is undefined or {}\n isUndefinedOrEmpty: function (value) {\n return (angular.isUndefined(value) || value === null) || Object.keys(value).length === 0;\n },\n\n // Determine if a reference is defined\n isDefined: _isDefined,\n isUndefined:_isUndefined,\n // Determine if a reference is a number\n isNumber: function(value) {\n return angular.isNumber(value);\n },\n\n // Determine if a reference is a string\n isString: function(value) {\n return angular.isString(value);\n },\n\n // Determine if a reference is an array\n isArray: function(value) {\n return angular.isArray(value);\n },\n\n // Determine if a reference is an object\n isObject: function(value) {\n return angular.isObject(value);\n },\n\n // Determine if a reference is a function.\n isFunction: function(value) {\n return angular.isFunction(value);\n },\n\n // Determine if two objects have the same properties\n equals: function(o1, o2) {\n return angular.equals(o1, o2);\n },\n\n isValidCenter: function(center) {\n return angular.isDefined(center) && angular.isNumber(center.lat) &&\n angular.isNumber(center.lng) && angular.isNumber(center.zoom);\n },\n\n isValidPoint: function(point) {\n if (!angular.isDefined(point)) {\n return false;\n }\n if (angular.isArray(point)) {\n return point.length === 2 && angular.isNumber(point[0]) && angular.isNumber(point[1]);\n }\n return angular.isNumber(point.lat) && angular.isNumber(point.lng);\n },\n\n isSameCenterOnMap: function(centerModel, map) {\n var mapCenter = map.getCenter();\n var zoom = map.getZoom();\n if (centerModel.lat && centerModel.lng &&\n mapCenter.lat.toFixed(4) === centerModel.lat.toFixed(4) &&\n mapCenter.lng.toFixed(4) === centerModel.lng.toFixed(4) &&\n zoom === centerModel.zoom) {\n return true;\n }\n return false;\n },\n\n safeApply: function($scope, fn) {\n var phase = $scope.$root.$$phase;\n if (phase === '$apply' || phase === '$digest') {\n $scope.$eval(fn);\n } else {\n $scope.$evalAsync(fn);\n }\n },\n\n obtainEffectiveMapId: _obtainEffectiveMapId,\n\n getDefer: function(d, mapId) {\n var id = _obtainEffectiveMapId(d, mapId),\n defer;\n if (!angular.isDefined(d[id]) || d[id].resolvedDefer === false) {\n defer = _getUnresolvedDefer(d, mapId);\n } else {\n defer = d[id].defer;\n }\n return defer;\n },\n\n getUnresolvedDefer: _getUnresolvedDefer,\n\n setResolvedDefer: function(d, mapId) {\n var id = _obtainEffectiveMapId(d, mapId);\n d[id].resolvedDefer = true;\n },\n\n AwesomeMarkersPlugin: {\n isLoaded: function() {\n if (angular.isDefined(L.AwesomeMarkers) && angular.isDefined(L.AwesomeMarkers.Icon)) {\n return true;\n } else {\n return false;\n }\n },\n is: function(icon) {\n if (this.isLoaded()) {\n return icon instanceof L.AwesomeMarkers.Icon;\n } else {\n return false;\n }\n },\n equal: function (iconA, iconB) {\n if (!this.isLoaded()) {\n return false;\n }\n if (this.is(iconA)) {\n return angular.equals(iconA, iconB);\n } else {\n return false;\n }\n }\n },\n\n PolylineDecoratorPlugin: {\n isLoaded: function() {\n if (angular.isDefined(L.PolylineDecorator)) {\n return true;\n } else {\n return false;\n }\n },\n is: function(decoration) {\n if (this.isLoaded()) {\n return decoration instanceof L.PolylineDecorator;\n } else {\n return false;\n }\n },\n equal: function(decorationA, decorationB) {\n if (!this.isLoaded()) {\n return false;\n }\n if (this.is(decorationA)) {\n return angular.equals(decorationA, decorationB);\n } else {\n return false;\n }\n }\n },\n\n MakiMarkersPlugin: {\n isLoaded: function() {\n if (angular.isDefined(L.MakiMarkers) && angular.isDefined(L.MakiMarkers.Icon)) {\n return true;\n } else {\n return false;\n }\n },\n is: function(icon) {\n if (this.isLoaded()) {\n return icon instanceof L.MakiMarkers.Icon;\n } else {\n return false;\n }\n },\n equal: function (iconA, iconB) {\n if (!this.isLoaded()) {\n return false;\n }\n if (this.is(iconA)) {\n return angular.equals(iconA, iconB);\n } else {\n return false;\n }\n }\n },\n ExtraMarkersPlugin: {\n isLoaded: function () {\n if (angular.isDefined(L.ExtraMarkers) && angular.isDefined(L.ExtraMarkers.Icon)) {\n return true;\n } else {\n return false;\n }\n },\n is: function (icon) {\n if (this.isLoaded()) {\n return icon instanceof L.ExtraMarkers.Icon;\n } else {\n return false;\n }\n },\n equal: function (iconA, iconB) {\n if (!this.isLoaded()) {\n return false;\n }\n if (this.is(iconA)) {\n return angular.equals(iconA, iconB);\n } else {\n return false;\n }\n }\n },\n LabelPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.Label);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.MarkerClusterGroup;\n } else {\n return false;\n }\n }\n },\n MarkerClusterPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.MarkerClusterGroup);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.MarkerClusterGroup;\n } else {\n return false;\n }\n }\n },\n GoogleLayerPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.Google);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.Google;\n } else {\n return false;\n }\n }\n },\n ChinaLayerPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.tileLayer.chinaProvider);\n }\n },\n HeatMapLayerPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.TileLayer.WebGLHeatMap);\n }\n },\n BingLayerPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.BingLayer);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.BingLayer;\n } else {\n return false;\n }\n }\n },\n WFSLayerPlugin: {\n isLoaded: function() {\n return L.GeoJSON.WFS !== undefined;\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.GeoJSON.WFS;\n } else {\n return false;\n }\n }\n },\n AGSLayerPlugin: {\n isLoaded: function() {\n return lvector !== undefined && lvector.AGS !== undefined;\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof lvector.AGS;\n } else {\n return false;\n }\n }\n },\n YandexLayerPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.Yandex);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.Yandex;\n } else {\n return false;\n }\n }\n },\n DynamicMapLayerPlugin: {\n isLoaded: function () {\n return L.esri !== undefined && L.esri.dynamicMapLayer !== undefined;\n },\n is: function (layer) {\n if (this.isLoaded()) {\n return layer instanceof L.esri.dynamicMapLayer;\n } else {\n return false;\n }\n }\n },\n GeoJSONPlugin: {\n isLoaded: function(){\n return angular.isDefined(L.TileLayer.GeoJSON);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.TileLayer.GeoJSON;\n } else {\n return false;\n }\n }\n },\n UTFGridPlugin: {\n isLoaded: function(){\n return angular.isDefined(L.UtfGrid);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.UtfGrid;\n } else {\n $log.error('[AngularJS - Leaflet] No UtfGrid plugin found.');\n return false;\n }\n }\n },\n CartoDB: {\n isLoaded: function(){\n return cartodb;\n },\n is: function(/*layer*/) {\n return true;\n /*\n if (this.isLoaded()) {\n return layer instanceof L.TileLayer.GeoJSON;\n } else {\n return false;\n }*/\n }\n },\n Leaflet: {\n DivIcon: {\n is: function(icon) {\n return icon instanceof L.DivIcon;\n },\n equal: function(iconA, iconB) {\n if (this.is(iconA)) {\n return angular.equals(iconA, iconB);\n } else {\n return false;\n }\n }\n },\n Icon: {\n is: function(icon) {\n return icon instanceof L.Icon;\n },\n equal: function(iconA, iconB) {\n if (this.is(iconA)) {\n return angular.equals(iconA, iconB);\n } else {\n return false;\n }\n }\n }\n }\n };\n});\n","angular.module('leaflet-directive').service('leafletIterators', function ($log, leafletHelpers) {\n\n var $lhelp = leafletHelpers,\n errorHeader = leafletHelpers.errorHeader + 'leafletIterators: ';\n\n var _hasErrors = function(collection, cb, ignoreCollection, cbName){\n if(!ignoreCollection) {\n if (!$lhelp.isDefined(collection) || !$lhelp.isDefined(cb)) {\n $log.error(errorHeader + 'collection or cb undefined');\n return true;\n }\n }\n if(!$lhelp.isFunction(cb)){\n cbName = $lhelp.defaultTo(cb,'cb');\n $log.error(errorHeader + cbName + ' is not a function');\n return true;\n }\n return false;\n };\n\n var _iterate = function(collection, externalCb, internalCb){\n if(_hasErrors(undefined, internalCb, true, 'internalCb')){\n return;\n }\n if(!_hasErrors(collection, externalCb)){\n for(var key in collection){\n internalCb(collection[key], key);\n }\n }\n };\n\n\n //consider adding lodash or underscore but for now adding iterators as we need them\n var _each = function(collection, cb){\n _iterate(collection, cb, function(val, key){\n cb(val, key);\n });\n };\n\n //lodash or underscore have preference\n return window._ ? window._ : {\n each:_each\n };\n});\n","angular.module(\"leaflet-directive\").factory('leafletLayerHelpers', function ($rootScope, $log, leafletHelpers) {\n var Helpers = leafletHelpers,\n isString = leafletHelpers.isString,\n isObject = leafletHelpers.isObject,\n isDefined = leafletHelpers.isDefined;\n\n var utfGridCreateLayer = function(params) {\n if (!Helpers.UTFGridPlugin.isLoaded()) {\n $log.error('[AngularJS - Leaflet] The UTFGrid plugin is not loaded.');\n return;\n }\n var utfgrid = new L.UtfGrid(params.url, params.pluginOptions);\n\n utfgrid.on('mouseover', function(e) {\n $rootScope.$broadcast('leafletDirectiveMap.utfgridMouseover', e);\n });\n\n utfgrid.on('mouseout', function(e) {\n $rootScope.$broadcast('leafletDirectiveMap.utfgridMouseout', e);\n });\n\n utfgrid.on('click', function(e) {\n $rootScope.$broadcast('leafletDirectiveMap.utfgridClick', e);\n });\n\n return utfgrid;\n };\n\n var layerTypes = {\n xyz: {\n mustHaveUrl: true,\n createLayer: function(params) {\n return L.tileLayer(params.url, params.options);\n }\n },\n mapbox: {\n mustHaveKey: true,\n createLayer: function(params) {\n var url = '//{s}.tiles.mapbox.com/v3/' + params.key + '/{z}/{x}/{y}.png';\n return L.tileLayer(url, params.options);\n }\n },\n geoJSON: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!Helpers.GeoJSONPlugin.isLoaded()) {\n return;\n }\n return new L.TileLayer.GeoJSON(params.url, params.pluginOptions, params.options);\n }\n },\n utfGrid: {\n mustHaveUrl: true,\n createLayer: utfGridCreateLayer\n },\n cartodbTiles: {\n mustHaveKey: true,\n createLayer: function(params) {\n var url = '//' + params.user + '.cartodb.com/api/v1/map/' + params.key + '/{z}/{x}/{y}.png';\n return L.tileLayer(url, params.options);\n }\n },\n cartodbUTFGrid: {\n mustHaveKey: true,\n mustHaveLayer : true,\n createLayer: function(params) {\n params.url = '//' + params.user + '.cartodb.com/api/v1/map/' + params.key + '/' + params.layer + '/{z}/{x}/{y}.grid.json';\n return utfGridCreateLayer(params);\n }\n },\n cartodbInteractive: {\n mustHaveKey: true,\n mustHaveLayer : true,\n createLayer: function(params) {\n var tilesURL = '//' + params.user + '.cartodb.com/api/v1/map/' + params.key + '/{z}/{x}/{y}.png';\n var tileLayer = L.tileLayer(tilesURL, params.options);\n params.url = '//' + params.user + '.cartodb.com/api/v1/map/' + params.key + '/' + params.layer + '/{z}/{x}/{y}.grid.json';\n var utfLayer = utfGridCreateLayer(params);\n return L.layerGroup([tileLayer, utfLayer]);\n }\n },\n wms: {\n mustHaveUrl: true,\n createLayer: function(params) {\n return L.tileLayer.wms(params.url, params.options);\n }\n },\n wmts: {\n mustHaveUrl: true,\n createLayer: function(params) {\n return L.tileLayer.wmts(params.url, params.options);\n }\n },\n wfs: {\n mustHaveUrl: true,\n mustHaveLayer : true,\n createLayer: function(params) {\n if (!Helpers.WFSLayerPlugin.isLoaded()) {\n return;\n }\n var options = angular.copy(params.options);\n if(options.crs && 'string' === typeof options.crs) {\n /*jshint -W061 */\n options.crs = eval(options.crs);\n }\n return new L.GeoJSON.WFS(params.url, params.layer, options);\n }\n },\n group: {\n mustHaveUrl: false,\n createLayer: function (params) {\n var lyrs = [];\n angular.forEach(params.options.layers, function(l){\n lyrs.push(createLayer(l));\n });\n return L.layerGroup(lyrs);\n }\n },\n featureGroup: {\n mustHaveUrl: false,\n createLayer: function () {\n return L.featureGroup();\n }\n },\n google: {\n mustHaveUrl: false,\n createLayer: function(params) {\n var type = params.type || 'SATELLITE';\n if (!Helpers.GoogleLayerPlugin.isLoaded()) {\n return;\n }\n return new L.Google(type, params.options);\n }\n },\n china:{\n mustHaveUrl:false,\n createLayer:function(params){\n var type = params.type || '';\n if(!Helpers.ChinaLayerPlugin.isLoaded()){\n return;\n }\n return L.tileLayer.chinaProvider(type, params.options);\n }\n },\n ags: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!Helpers.AGSLayerPlugin.isLoaded()) {\n return;\n }\n\n var options = angular.copy(params.options);\n angular.extend(options, {\n url: params.url\n });\n var layer = new lvector.AGS(options);\n layer.onAdd = function(map) {\n this.setMap(map);\n };\n layer.onRemove = function() {\n this.setMap(null);\n };\n return layer;\n }\n },\n dynamic: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!Helpers.DynamicMapLayerPlugin.isLoaded()) {\n return;\n }\n return L.esri.dynamicMapLayer(params.url, params.options);\n }\n },\n markercluster: {\n mustHaveUrl: false,\n createLayer: function(params) {\n if (!Helpers.MarkerClusterPlugin.isLoaded()) {\n $log.error('[AngularJS - Leaflet] The markercluster plugin is not loaded.');\n return;\n }\n return new L.MarkerClusterGroup(params.options);\n }\n },\n bing: {\n mustHaveUrl: false,\n createLayer: function(params) {\n if (!Helpers.BingLayerPlugin.isLoaded()) {\n return;\n }\n return new L.BingLayer(params.key, params.options);\n }\n },\n heatmap: {\n mustHaveUrl: false,\n mustHaveData: true,\n createLayer: function(params) {\n if (!Helpers.HeatMapLayerPlugin.isLoaded()) {\n return;\n }\n var layer = new L.TileLayer.WebGLHeatMap(params.options);\n if (isDefined(params.data)) {\n layer.setData(params.data);\n }\n\n return layer;\n }\n },\n yandex: {\n mustHaveUrl: false,\n createLayer: function(params) {\n var type = params.type || 'map';\n if (!Helpers.YandexLayerPlugin.isLoaded()) {\n return;\n }\n return new L.Yandex(type, params.options);\n }\n },\n imageOverlay: {\n mustHaveUrl: true,\n mustHaveBounds : true,\n createLayer: function(params) {\n return L.imageOverlay(params.url, params.bounds, params.options);\n }\n },\n\n // This \"custom\" type is used to accept every layer that user want to define himself.\n // We can wrap these custom layers like heatmap or yandex, but it means a lot of work/code to wrap the world,\n // so we let user to define their own layer outside the directive,\n // and pass it on \"createLayer\" result for next processes\n custom: {\n createLayer: function (params) {\n if (params.layer instanceof L.Class) {\n return angular.copy(params.layer);\n }\n else {\n $log.error('[AngularJS - Leaflet] A custom layer must be a leaflet Class');\n }\n }\n },\n cartodb: {\n mustHaveUrl: true,\n createLayer: function(params) {\n return cartodb.createLayer(params.map, params.url);\n }\n }\n };\n\n function isValidLayerType(layerDefinition) {\n // Check if the baselayer has a valid type\n if (!isString(layerDefinition.type)) {\n $log.error('[AngularJS - Leaflet] A layer must have a valid type defined.');\n return false;\n }\n\n if (Object.keys(layerTypes).indexOf(layerDefinition.type) === -1) {\n $log.error('[AngularJS - Leaflet] A layer must have a valid type: ' + Object.keys(layerTypes));\n return false;\n }\n\n // Check if the layer must have an URL\n if (layerTypes[layerDefinition.type].mustHaveUrl && !isString(layerDefinition.url)) {\n $log.error('[AngularJS - Leaflet] A base layer must have an url');\n return false;\n }\n\n if (layerTypes[layerDefinition.type].mustHaveData && !isDefined(layerDefinition.data)) {\n $log.error('[AngularJS - Leaflet] The base layer must have a \"data\" array attribute');\n return false;\n }\n\n if(layerTypes[layerDefinition.type].mustHaveLayer && !isDefined(layerDefinition.layer)) {\n $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have an layer defined');\n return false;\n }\n\n if (layerTypes[layerDefinition.type].mustHaveBounds && !isDefined(layerDefinition.bounds)) {\n $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have bounds defined');\n return false ;\n }\n\n if (layerTypes[layerDefinition.type].mustHaveKey && !isDefined(layerDefinition.key)) {\n $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have key defined');\n return false ;\n }\n return true;\n }\n\n function createLayer(layerDefinition) {\n if (!isValidLayerType(layerDefinition)) {\n return;\n }\n\n if (!isString(layerDefinition.name)) {\n $log.error('[AngularJS - Leaflet] A base layer must have a name');\n return;\n }\n if (!isObject(layerDefinition.layerParams)) {\n layerDefinition.layerParams = {};\n }\n if (!isObject(layerDefinition.layerOptions)) {\n layerDefinition.layerOptions = {};\n }\n\n // Mix the layer specific parameters with the general Leaflet options. Although this is an overhead\n // the definition of a base layers is more 'clean' if the two types of parameters are differentiated\n for (var attrname in layerDefinition.layerParams) {\n layerDefinition.layerOptions[attrname] = layerDefinition.layerParams[attrname];\n }\n\n var params = {\n url: layerDefinition.url,\n data: layerDefinition.data,\n options: layerDefinition.layerOptions,\n layer: layerDefinition.layer,\n type: layerDefinition.layerType,\n bounds: layerDefinition.bounds,\n key: layerDefinition.key,\n pluginOptions: layerDefinition.pluginOptions,\n user: layerDefinition.user\n };\n\n //TODO Add $watch to the layer properties\n return layerTypes[layerDefinition.type].createLayer(params);\n }\n\n return {\n createLayer: createLayer\n };\n});\n","angular.module(\"leaflet-directive\").factory('leafletLegendHelpers', function () {\n\tvar _updateLegend = function(div, legendData, type, url) {\n\t\tdiv.innerHTML = '';\n\t\tif(legendData.error) {\n\t\t\tdiv.innerHTML += '
' + legendData.error.message + '
';\n\t\t} else {\n\t\t\tif (type === 'arcgis') {\n\t\t\t\tfor (var i = 0; i < legendData.layers.length; i++) {\n\t\t\t\t\tvar layer = legendData.layers[i];\n\t\t\t\t\tdiv.innerHTML += '
' + layer.layerName + '
';\n\t\t\t\t\tfor(var j = 0; j < layer.legend.length; j++) {\n\t\t\t\t\t\tvar leg = layer.legend[j];\n\t\t\t\t\t\tdiv.innerHTML +=\n\t\t\t\t\t\t\t'
' +\n\t\t\t\t\t\t\t'
' + leg.label + '
';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (type === 'image') {\n\t\t\t\tdiv.innerHTML = '';\n\t\t\t}\n\t\t}\n\t};\n\n\tvar _getOnAddLegend = function(legendData, legendClass, type, url) {\n\t\treturn function(/*map*/) {\n\t\t\tvar div = L.DomUtil.create('div', legendClass);\n\n\t\t\tif (!L.Browser.touch) {\n\t\t\t\tL.DomEvent.disableClickPropagation(div);\n\t\t\t\tL.DomEvent.on(div, 'mousewheel', L.DomEvent.stopPropagation);\n\t\t\t} else {\n\t\t\t\tL.DomEvent.on(div, 'click', L.DomEvent.stopPropagation);\n\t\t\t}\n\t\t\t_updateLegend(div, legendData, type, url);\n\t\t\treturn div;\n\t\t};\n\t};\n\n\tvar _getOnAddArrayLegend = function(legend, legendClass) {\n\t\treturn function(/*map*/) {\n\t\t\tvar div = L.DomUtil.create('div', legendClass);\n for (var i = 0; i < legend.colors.length; i++) {\n div.innerHTML +=\n '
' +\n '
' + legend.labels[i] + '
';\n }\n if (!L.Browser.touch) {\n\t\t\t\tL.DomEvent.disableClickPropagation(div);\n\t\t\t\tL.DomEvent.on(div, 'mousewheel', L.DomEvent.stopPropagation);\n\t\t\t} else {\n\t\t\t\tL.DomEvent.on(div, 'click', L.DomEvent.stopPropagation);\n\t\t\t}\n return div;\n\t\t};\n\t};\n\n\treturn {\n\t\tgetOnAddLegend: _getOnAddLegend,\n\t\tgetOnAddArrayLegend: _getOnAddArrayLegend,\n\t\tupdateLegend: _updateLegend,\n\t};\n});\n","angular.module(\"leaflet-directive\").factory('leafletMapDefaults', function ($q, leafletHelpers) {\n function _getDefaults() {\n return {\n keyboard: true,\n dragging: true,\n worldCopyJump: false,\n doubleClickZoom: true,\n scrollWheelZoom: true,\n tap: true,\n touchZoom: true,\n zoomControl: true,\n zoomsliderControl: false,\n zoomControlPosition: 'topleft',\n attributionControl: true,\n controls: {\n layers: {\n visible: true,\n position: 'topright',\n collapsed: true\n }\n },\n crs: L.CRS.EPSG3857,\n tileLayer: '//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n tileLayerOptions: {\n attribution: '© OpenStreetMap contributors'\n },\n path: {\n weight: 10,\n opacity: 1,\n color: '#0000ff'\n },\n center: {\n lat: 0,\n lng: 0,\n zoom: 1\n }\n };\n }\n\n var isDefined = leafletHelpers.isDefined,\n isObject = leafletHelpers.isObject,\n obtainEffectiveMapId = leafletHelpers.obtainEffectiveMapId,\n defaults = {};\n\n // Get the _defaults dictionary, and override the properties defined by the user\n return {\n getDefaults: function (scopeId) {\n var mapId = obtainEffectiveMapId(defaults, scopeId);\n return defaults[mapId];\n },\n\n getMapCreationDefaults: function (scopeId) {\n var mapId = obtainEffectiveMapId(defaults, scopeId);\n var d = defaults[mapId];\n\n var mapDefaults = {\n maxZoom: d.maxZoom,\n keyboard: d.keyboard,\n dragging: d.dragging,\n zoomControl: d.zoomControl,\n doubleClickZoom: d.doubleClickZoom,\n scrollWheelZoom: d.scrollWheelZoom,\n tap: d.tap,\n touchZoom: d.touchZoom,\n attributionControl: d.attributionControl,\n worldCopyJump: d.worldCopyJump,\n crs: d.crs\n };\n\n if (isDefined(d.minZoom)) {\n mapDefaults.minZoom = d.minZoom;\n }\n\n if (isDefined(d.zoomAnimation)) {\n mapDefaults.zoomAnimation = d.zoomAnimation;\n }\n\n if (isDefined(d.fadeAnimation)) {\n mapDefaults.fadeAnimation = d.fadeAnimation;\n }\n\n if (isDefined(d.markerZoomAnimation)) {\n mapDefaults.markerZoomAnimation = d.markerZoomAnimation;\n }\n\n if (d.map) {\n for (var option in d.map) {\n mapDefaults[option] = d.map[option];\n }\n }\n\n return mapDefaults;\n },\n\n setDefaults: function (userDefaults, scopeId) {\n var newDefaults = _getDefaults();\n\n if (isDefined(userDefaults)) {\n newDefaults.doubleClickZoom = isDefined(userDefaults.doubleClickZoom) ? userDefaults.doubleClickZoom : newDefaults.doubleClickZoom;\n newDefaults.scrollWheelZoom = isDefined(userDefaults.scrollWheelZoom) ? userDefaults.scrollWheelZoom : newDefaults.doubleClickZoom;\n newDefaults.tap = isDefined(userDefaults.tap) ? userDefaults.tap : newDefaults.tap;\n newDefaults.touchZoom = isDefined(userDefaults.touchZoom) ? userDefaults.touchZoom : newDefaults.doubleClickZoom;\n newDefaults.zoomControl = isDefined(userDefaults.zoomControl) ? userDefaults.zoomControl : newDefaults.zoomControl;\n newDefaults.zoomsliderControl = isDefined(userDefaults.zoomsliderControl) ? userDefaults.zoomsliderControl : newDefaults.zoomsliderControl;\n newDefaults.attributionControl = isDefined(userDefaults.attributionControl) ? userDefaults.attributionControl : newDefaults.attributionControl;\n newDefaults.tileLayer = isDefined(userDefaults.tileLayer) ? userDefaults.tileLayer : newDefaults.tileLayer;\n newDefaults.zoomControlPosition = isDefined(userDefaults.zoomControlPosition) ? userDefaults.zoomControlPosition : newDefaults.zoomControlPosition;\n newDefaults.keyboard = isDefined(userDefaults.keyboard) ? userDefaults.keyboard : newDefaults.keyboard;\n newDefaults.dragging = isDefined(userDefaults.dragging) ? userDefaults.dragging : newDefaults.dragging;\n\n if (isDefined(userDefaults.controls)) {\n angular.extend(newDefaults.controls, userDefaults.controls);\n }\n\n if (isObject(userDefaults.crs)) {\n newDefaults.crs = userDefaults.crs;\n } else if (isDefined(L.CRS[userDefaults.crs])) {\n newDefaults.crs = L.CRS[userDefaults.crs];\n }\n\n if (isDefined(userDefaults.center)) {\n angular.copy(userDefaults.center, newDefaults.center);\n }\n\n if (isDefined(userDefaults.tileLayerOptions)) {\n angular.copy(userDefaults.tileLayerOptions, newDefaults.tileLayerOptions);\n }\n\n if (isDefined(userDefaults.maxZoom)) {\n newDefaults.maxZoom = userDefaults.maxZoom;\n }\n\n if (isDefined(userDefaults.minZoom)) {\n newDefaults.minZoom = userDefaults.minZoom;\n }\n\n if (isDefined(userDefaults.zoomAnimation)) {\n newDefaults.zoomAnimation = userDefaults.zoomAnimation;\n }\n\n if (isDefined(userDefaults.fadeAnimation)) {\n newDefaults.fadeAnimation = userDefaults.fadeAnimation;\n }\n\n if (isDefined(userDefaults.markerZoomAnimation)) {\n newDefaults.markerZoomAnimation = userDefaults.markerZoomAnimation;\n }\n\n if (isDefined(userDefaults.worldCopyJump)) {\n newDefaults.worldCopyJump = userDefaults.worldCopyJump;\n }\n\n if (isDefined(userDefaults.map)) {\n newDefaults.map = userDefaults.map;\n }\n \n if (isDefined(userDefaults.path)) {\n newDefaults.path = userDefaults.path;\n }\n }\n\n var mapId = obtainEffectiveMapId(defaults, scopeId);\n defaults[mapId] = newDefaults;\n return newDefaults;\n }\n };\n});\n","angular.module(\"leaflet-directive\")\n.service('leafletMarkersHelpers', function ($rootScope, leafletHelpers, $log, $compile) {\n\n var isDefined = leafletHelpers.isDefined,\n defaultTo = leafletHelpers.defaultTo,\n MarkerClusterPlugin = leafletHelpers.MarkerClusterPlugin,\n AwesomeMarkersPlugin = leafletHelpers.AwesomeMarkersPlugin,\n MakiMarkersPlugin = leafletHelpers.MakiMarkersPlugin,\n ExtraMarkersPlugin = leafletHelpers.ExtraMarkersPlugin,\n safeApply = leafletHelpers.safeApply,\n Helpers = leafletHelpers,\n isString = leafletHelpers.isString,\n isNumber = leafletHelpers.isNumber,\n isObject = leafletHelpers.isObject,\n groups = {};\n\n var _string = function(marker){\n //this exists since JSON.stringify barfs on cyclic\n var retStr = '';\n ['_icon', '_latlng', '_leaflet_id', '_map', '_shadow'].forEach(function(prop){\n retStr += prop + ': ' + defaultTo(marker[prop], 'undefined') + ' \\n';\n });\n return '[leafletMarker] : \\n' + retStr;\n };\n var _log = function(marker, useConsole){\n var logger = useConsole? console : $log;\n logger.debug(_string(marker));\n };\n\n var createLeafletIcon = function(iconData) {\n if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'awesomeMarker') {\n if (!AwesomeMarkersPlugin.isLoaded()) {\n $log.error('[AngularJS - Leaflet] The AwesomeMarkers Plugin is not loaded.');\n }\n\n return new L.AwesomeMarkers.icon(iconData);\n }\n\n if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'makiMarker') {\n if (!MakiMarkersPlugin.isLoaded()) {\n $log.error('[AngularJS - Leaflet] The MakiMarkers Plugin is not loaded.');\n }\n\n return new L.MakiMarkers.icon(iconData);\n }\n\n if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'extraMarker') {\n if (!ExtraMarkersPlugin.isLoaded()) {\n $log.error('[AngularJS - Leaflet] The ExtraMarkers Plugin is not loaded.');\n }\n return new L.ExtraMarkers.icon(iconData);\n }\n\n if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'div') {\n return new L.divIcon(iconData);\n }\n\n // allow for any custom icon to be used... assumes the icon has already been initialized\n if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'icon') {\n return iconData.icon;\n }\n\n var base64icon = \"data:image/png;base64,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\";\n var base64shadow = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=\";\n\n if (!isDefined(iconData) || !isDefined(iconData.iconUrl)) {\n return new L.Icon.Default({\n iconUrl: base64icon,\n shadowUrl: base64shadow,\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n });\n }\n\n return new L.Icon(iconData);\n };\n\n var _resetMarkerGroup = function(groupName) {\n if (isDefined(groups[groupName])) {\n groups.splice(groupName, 1);\n }\n };\n\n var _resetMarkerGroups = function() {\n groups = {};\n };\n\n var _deleteMarker = function(marker, map, layers) {\n marker.closePopup();\n // There is no easy way to know if a marker is added to a layer, so we search for it\n // if there are overlays\n if (isDefined(layers) && isDefined(layers.overlays)) {\n for (var key in layers.overlays) {\n if (layers.overlays[key] instanceof L.LayerGroup || layers.overlays[key] instanceof L.FeatureGroup) {\n if (layers.overlays[key].hasLayer(marker)) {\n layers.overlays[key].removeLayer(marker);\n return;\n }\n }\n }\n }\n\n if (isDefined(groups)) {\n for (var groupKey in groups) {\n if (groups[groupKey].hasLayer(marker)) {\n groups[groupKey].removeLayer(marker);\n }\n }\n }\n\n if (map.hasLayer(marker)) {\n map.removeLayer(marker);\n }\n };\n\n var _manageOpenPopup = function(marker, markerData) {\n marker.openPopup();\n\n //the marker may have angular templates to compile\n var popup = marker.getPopup(),\n //the marker may provide a scope returning function used to compile the message\n //default to $rootScope otherwise\n markerScope = angular.isFunction(markerData.getMessageScope) ? markerData.getMessageScope() : $rootScope,\n compileMessage = isDefined(markerData.compileMessage) ? markerData.compileMessage : true;\n\n if (isDefined(popup)) {\n var updatePopup = function(popup) {\n popup._updateLayout();\n popup._updatePosition();\n };\n\n if (compileMessage) {\n $compile(popup._contentNode)(markerScope);\n //in case of an ng-include, we need to update the content after template load\n if (isDefined(popup._contentNode) && popup._contentNode.innerHTML.indexOf(\"ngInclude\") > -1) {\n var unregister = markerScope.$on('$includeContentLoaded', function() {\n updatePopup(popup);\n unregister();\n });\n }\n else {\n updatePopup(popup);\n }\n }\n }\n };\n\n var _manageOpenLabel = function(marker, markerData) {\n var markerScope = angular.isFunction(markerData.getMessageScope) ? markerData.getMessageScope() : $rootScope,\n labelScope = angular.isFunction(markerData.getLabelScope) ? markerData.getLabelScope() : markerScope,\n compileMessage = isDefined(markerData.compileMessage) ? markerData.compileMessage : true;\n\n if (Helpers.LabelPlugin.isLoaded() && isDefined(markerData.label)) {\n if (isDefined(markerData.label.options) && markerData.label.options.noHide === true) {\n marker.showLabel();\n }\n if (compileMessage) {\n $compile(marker.label._container)(labelScope);\n }\n }\n };\n\n return {\n resetMarkerGroup: _resetMarkerGroup,\n\n resetMarkerGroups: _resetMarkerGroups,\n\n deleteMarker: _deleteMarker,\n\n manageOpenPopup: _manageOpenPopup,\n\n manageOpenLabel: _manageOpenLabel,\n\n createMarker: function(markerData) {\n if (!isDefined(markerData)) {\n $log.error('[AngularJS - Leaflet] The marker definition is not valid.');\n return;\n }\n\n var markerOptions = {\n icon: createLeafletIcon(markerData.icon),\n title: isDefined(markerData.title) ? markerData.title : '',\n draggable: isDefined(markerData.draggable) ? markerData.draggable : false,\n clickable: isDefined(markerData.clickable) ? markerData.clickable : true,\n riseOnHover: isDefined(markerData.riseOnHover) ? markerData.riseOnHover : false,\n zIndexOffset: isDefined(markerData.zIndexOffset) ? markerData.zIndexOffset : 0,\n iconAngle: isDefined(markerData.iconAngle) ? markerData.iconAngle : 0\n };\n // Add any other options not added above to markerOptions\n for (var markerDatum in markerData) {\n if (markerData.hasOwnProperty(markerDatum) && !markerOptions.hasOwnProperty(markerDatum)) {\n markerOptions[markerDatum] = markerData[markerDatum];\n }\n }\n\n var marker = new L.marker(markerData, markerOptions);\n\n if (!isString(markerData.message)) {\n marker.unbindPopup();\n }\n\n return marker;\n },\n\n addMarkerToGroup: function(marker, groupName, groupOptions, map) {\n if (!isString(groupName)) {\n $log.error('[AngularJS - Leaflet] The marker group you have specified is invalid.');\n return;\n }\n\n if (!MarkerClusterPlugin.isLoaded()) {\n $log.error(\"[AngularJS - Leaflet] The MarkerCluster plugin is not loaded.\");\n return;\n }\n if (!isDefined(groups[groupName])) {\n groups[groupName] = new L.MarkerClusterGroup(groupOptions);\n map.addLayer(groups[groupName]);\n }\n groups[groupName].addLayer(marker);\n },\n\n listenMarkerEvents: function(marker, markerData, leafletScope, watching) {\n marker.on(\"popupopen\", function(/* event */) {\n if (watching) {\n safeApply(leafletScope, function() {\n markerData.focus = true;\n });\n } else {\n _manageOpenPopup(marker, markerData);\n }\n });\n marker.on(\"popupclose\", function(/* event */) {\n if (watching) {\n safeApply(leafletScope, function() {\n markerData.focus = false;\n });\n }\n });\n },\n\n addMarkerWatcher: function(marker, name, leafletScope, layers, map) {\n var markerWatchPath = Helpers.getObjectArrayPath(\"markers.\" + name);\n var clearWatch = leafletScope.$watch(markerWatchPath, function(markerData, oldMarkerData) {\n if (!isDefined(markerData)) {\n _deleteMarker(marker, map, layers);\n clearWatch();\n return;\n }\n\n if (!isDefined(oldMarkerData)) {\n return;\n }\n\n // Update the lat-lng property (always present in marker properties)\n if (!(isNumber(markerData.lat) && isNumber(markerData.lng))) {\n $log.warn('There are problems with lat-lng data, please verify your marker model');\n _deleteMarker(marker, map, layers);\n return;\n }\n\n // watch is being initialized if old and new object is the same\n var isInitializing = markerData === oldMarkerData;\n\n // Update marker rotation\n if (isDefined(markerData.iconAngle) && oldMarkerData.iconAngle !== markerData.iconAngle) {\n marker.setIconAngle(markerData.iconAngle);\n }\n\n // It is possible that the layer has been removed or the layer marker does not exist\n // Update the layer group if present or move it to the map if not\n if (!isString(markerData.layer)) {\n // There is no layer information, we move the marker to the map if it was in a layer group\n if (isString(oldMarkerData.layer)) {\n // Remove from the layer group that is supposed to be\n if (isDefined(layers.overlays[oldMarkerData.layer]) && layers.overlays[oldMarkerData.layer].hasLayer(marker)) {\n layers.overlays[oldMarkerData.layer].removeLayer(marker);\n marker.closePopup();\n }\n // Test if it is not on the map and add it\n if (!map.hasLayer(marker)) {\n map.addLayer(marker);\n }\n }\n }\n\n if ((isNumber(markerData.opacity) || isNumber(parseFloat(markerData.opacity))) && markerData.opacity !== oldMarkerData.opacity) {\n // There was a different opacity so we update it\n marker.setOpacity(markerData.opacity);\n }\n\n if (isString(markerData.layer) && oldMarkerData.layer !== markerData.layer) {\n // If it was on a layer group we have to remove it\n if (isString(oldMarkerData.layer) && isDefined(layers.overlays[oldMarkerData.layer]) && layers.overlays[oldMarkerData.layer].hasLayer(marker)) {\n layers.overlays[oldMarkerData.layer].removeLayer(marker);\n }\n marker.closePopup();\n\n // Remove it from the map in case the new layer is hidden or there is an error in the new layer\n if (map.hasLayer(marker)) {\n map.removeLayer(marker);\n }\n\n // The markerData.layer is defined so we add the marker to the layer if it is different from the old data\n if (!isDefined(layers.overlays[markerData.layer])) {\n $log.error('[AngularJS - Leaflet] You must use a name of an existing layer');\n return;\n }\n // Is a group layer?\n var layerGroup = layers.overlays[markerData.layer];\n if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {\n $log.error('[AngularJS - Leaflet] A marker can only be added to a layer of type \"group\" or \"featureGroup\"');\n return;\n }\n // The marker goes to a correct layer group, so first of all we add it\n layerGroup.addLayer(marker);\n // The marker is automatically added to the map depending on the visibility\n // of the layer, so we only have to open the popup if the marker is in the map\n if (map.hasLayer(marker) && markerData.focus === true) {\n _manageOpenPopup(marker, markerData);\n }\n }\n\n // Update the draggable property\n if (markerData.draggable !== true && oldMarkerData.draggable === true && (isDefined(marker.dragging))) {\n marker.dragging.disable();\n }\n\n if (markerData.draggable === true && oldMarkerData.draggable !== true) {\n // The markerData.draggable property must be true so we update if there wasn't a previous value or it wasn't true\n if (marker.dragging) {\n marker.dragging.enable();\n } else {\n if (L.Handler.MarkerDrag) {\n marker.dragging = new L.Handler.MarkerDrag(marker);\n marker.options.draggable = true;\n marker.dragging.enable();\n }\n }\n }\n\n // Update the icon property\n if (!isObject(markerData.icon)) {\n // If there is no icon property or it's not an object\n if (isObject(oldMarkerData.icon)) {\n // If there was an icon before restore to the default\n marker.setIcon(createLeafletIcon());\n marker.closePopup();\n marker.unbindPopup();\n if (isString(markerData.message)) {\n marker.bindPopup(markerData.message, markerData.popupOptions);\n }\n }\n }\n\n if (isObject(markerData.icon) && isObject(oldMarkerData.icon) && !angular.equals(markerData.icon, oldMarkerData.icon)) {\n var dragG = false;\n if (marker.dragging) {\n dragG = marker.dragging.enabled();\n }\n marker.setIcon(createLeafletIcon(markerData.icon));\n if (dragG) {\n marker.dragging.enable();\n }\n marker.closePopup();\n marker.unbindPopup();\n if (isString(markerData.message)) {\n marker.bindPopup(markerData.message, markerData.popupOptions);\n }\n }\n\n // Update the Popup message property\n if (!isString(markerData.message) && isString(oldMarkerData.message)) {\n marker.closePopup();\n marker.unbindPopup();\n }\n\n // Update the label content or bind a new label if the old one has been removed.\n if (Helpers.LabelPlugin.isLoaded()) {\n if (isDefined(markerData.label) && isDefined(markerData.label.message)) {\n if ('label' in oldMarkerData && 'message' in oldMarkerData.label && !angular.equals(markerData.label.message, oldMarkerData.label.message)) {\n marker.updateLabelContent(markerData.label.message);\n } else if (!angular.isFunction(marker.getLabel)) {\n marker.bindLabel(markerData.label.message, markerData.label.options);\n _manageOpenLabel(marker, markerData);\n } else {\n _manageOpenLabel(marker, markerData);\n }\n } else if (!('label' in markerData && !('message' in markerData.label))) {\n if (angular.isFunction(marker.unbindLabel)) {\n marker.unbindLabel();\n }\n }\n }\n\n // There is some text in the popup, so we must show the text or update existing\n if (isString(markerData.message) && !isString(oldMarkerData.message)) {\n // There was no message before so we create it\n marker.bindPopup(markerData.message, markerData.popupOptions);\n }\n\n if (isString(markerData.message) && isString(oldMarkerData.message) && markerData.message !== oldMarkerData.message) {\n // There was a different previous message so we update it\n marker.setPopupContent(markerData.message);\n }\n\n // Update the focus property\n var updatedFocus = false;\n if (markerData.focus !== true && oldMarkerData.focus === true) {\n // If there was a focus property and was true we turn it off\n marker.closePopup();\n updatedFocus = true;\n }\n\n // The markerData.focus property must be true so we update if there wasn't a previous value or it wasn't true\n if (markerData.focus === true && ( !isDefined(oldMarkerData.focus) || oldMarkerData.focus === false) || (isInitializing && markerData.focus === true)) {\n // Reopen the popup when focus is still true\n _manageOpenPopup(marker, markerData);\n updatedFocus = true;\n }\n\n // zIndexOffset adjustment\n if (oldMarkerData.zIndexOffset !== markerData.zIndexOffset) {\n marker.setZIndexOffset(markerData.zIndexOffset);\n }\n\n var markerLatLng = marker.getLatLng();\n var isCluster = (isString(markerData.layer) && Helpers.MarkerClusterPlugin.is(layers.overlays[markerData.layer]));\n // If the marker is in a cluster it has to be removed and added to the layer when the location is changed\n if (isCluster) {\n // The focus has changed even by a user click or programatically\n if (updatedFocus) {\n // We only have to update the location if it was changed programatically, because it was\n // changed by a user drag the marker data has already been updated by the internal event\n // listened by the directive\n if ((markerData.lat !== oldMarkerData.lat) || (markerData.lng !== oldMarkerData.lng)) {\n layers.overlays[markerData.layer].removeLayer(marker);\n marker.setLatLng([markerData.lat, markerData.lng]);\n layers.overlays[markerData.layer].addLayer(marker);\n }\n } else {\n // The marker has possibly moved. It can be moved by a user drag (marker location and data are equal but old\n // data is diferent) or programatically (marker location and data are diferent)\n if ((markerLatLng.lat !== markerData.lat) || (markerLatLng.lng !== markerData.lng)) {\n // The marker was moved by a user drag\n layers.overlays[markerData.layer].removeLayer(marker);\n marker.setLatLng([markerData.lat, markerData.lng]);\n layers.overlays[markerData.layer].addLayer(marker);\n } else if ((markerData.lat !== oldMarkerData.lat) || (markerData.lng !== oldMarkerData.lng)) {\n // The marker was moved programatically\n layers.overlays[markerData.layer].removeLayer(marker);\n marker.setLatLng([markerData.lat, markerData.lng]);\n layers.overlays[markerData.layer].addLayer(marker);\n } else if (isObject(markerData.icon) && isObject(oldMarkerData.icon) && !angular.equals(markerData.icon, oldMarkerData.icon)) {\n layers.overlays[markerData.layer].removeLayer(marker);\n layers.overlays[markerData.layer].addLayer(marker);\n }\n }\n } else if (markerLatLng.lat !== markerData.lat || markerLatLng.lng !== markerData.lng) {\n marker.setLatLng([markerData.lat, markerData.lng]);\n }\n }, true);\n },\n string: _string,\n log: _log\n };\n});\n","angular.module(\"leaflet-directive\").factory('leafletPathsHelpers', function ($rootScope, $log, leafletHelpers) {\n var isDefined = leafletHelpers.isDefined,\n isArray = leafletHelpers.isArray,\n isNumber = leafletHelpers.isNumber,\n isValidPoint = leafletHelpers.isValidPoint;\n var availableOptions = [\n // Path options\n 'stroke', 'weight', 'color', 'opacity',\n 'fill', 'fillColor', 'fillOpacity',\n 'dashArray', 'lineCap', 'lineJoin', 'clickable',\n 'pointerEvents', 'className',\n\n // Polyline options\n 'smoothFactor', 'noClip'\n ];\n function _convertToLeafletLatLngs(latlngs) {\n return latlngs.filter(function(latlng) {\n return isValidPoint(latlng);\n }).map(function (latlng) {\n return _convertToLeafletLatLng(latlng);\n });\n }\n\n function _convertToLeafletLatLng(latlng) {\n if (isArray(latlng)) {\n return new L.LatLng(latlng[0], latlng[1]);\n } else {\n return new L.LatLng(latlng.lat, latlng.lng);\n }\n }\n\n function _convertToLeafletMultiLatLngs(paths) {\n return paths.map(function(latlngs) {\n return _convertToLeafletLatLngs(latlngs);\n });\n }\n\n function _getOptions(path, defaults) {\n var options = {};\n for (var i = 0; i < availableOptions.length; i++) {\n var optionName = availableOptions[i];\n\n if (isDefined(path[optionName])) {\n options[optionName] = path[optionName];\n } else if (isDefined(defaults.path[optionName])) {\n options[optionName] = defaults.path[optionName];\n }\n }\n\n return options;\n }\n\n var _updatePathOptions = function (path, data) {\n var updatedStyle = {};\n for (var i = 0; i < availableOptions.length; i++) {\n var optionName = availableOptions[i];\n if (isDefined(data[optionName])) {\n updatedStyle[optionName] = data[optionName];\n }\n }\n path.setStyle(data);\n };\n\n var _isValidPolyline = function(latlngs) {\n if (!isArray(latlngs)) {\n return false;\n }\n for (var i = 0; i < latlngs.length; i++) {\n var point = latlngs[i];\n if (!isValidPoint(point)) {\n return false;\n }\n }\n return true;\n };\n\n var pathTypes = {\n polyline: {\n isValid: function(pathData) {\n var latlngs = pathData.latlngs;\n return _isValidPolyline(latlngs);\n },\n createPath: function(options) {\n return new L.Polyline([], options);\n },\n setPath: function(path, data) {\n path.setLatLngs(_convertToLeafletLatLngs(data.latlngs));\n _updatePathOptions(path, data);\n return;\n }\n },\n multiPolyline: {\n isValid: function(pathData) {\n var latlngs = pathData.latlngs;\n if (!isArray(latlngs)) {\n return false;\n }\n\n for (var i in latlngs) {\n var polyline = latlngs[i];\n if (!_isValidPolyline(polyline)) {\n return false;\n }\n }\n\n return true;\n },\n createPath: function(options) {\n return new L.multiPolyline([[[0,0],[1,1]]], options);\n },\n setPath: function(path, data) {\n path.setLatLngs(_convertToLeafletMultiLatLngs(data.latlngs));\n _updatePathOptions(path, data);\n return;\n }\n } ,\n polygon: {\n isValid: function(pathData) {\n var latlngs = pathData.latlngs;\n return _isValidPolyline(latlngs);\n },\n createPath: function(options) {\n return new L.Polygon([], options);\n },\n setPath: function(path, data) {\n path.setLatLngs(_convertToLeafletLatLngs(data.latlngs));\n _updatePathOptions(path, data);\n return;\n }\n },\n multiPolygon: {\n isValid: function(pathData) {\n var latlngs = pathData.latlngs;\n\n if (!isArray(latlngs)) {\n return false;\n }\n\n for (var i in latlngs) {\n var polyline = latlngs[i];\n if (!_isValidPolyline(polyline)) {\n return false;\n }\n }\n\n return true;\n },\n createPath: function(options) {\n return new L.MultiPolygon([[[0,0],[1,1],[0,1]]], options);\n },\n setPath: function(path, data) {\n path.setLatLngs(_convertToLeafletMultiLatLngs(data.latlngs));\n _updatePathOptions(path, data);\n return;\n }\n },\n rectangle: {\n isValid: function(pathData) {\n var latlngs = pathData.latlngs;\n\n if (!isArray(latlngs) || latlngs.length !== 2) {\n return false;\n }\n\n for (var i in latlngs) {\n var point = latlngs[i];\n if (!isValidPoint(point)) {\n return false;\n }\n }\n\n return true;\n },\n createPath: function(options) {\n return new L.Rectangle([[0,0],[1,1]], options);\n },\n setPath: function(path, data) {\n path.setBounds(new L.LatLngBounds(_convertToLeafletLatLngs(data.latlngs)));\n _updatePathOptions(path, data);\n }\n },\n circle: {\n isValid: function(pathData) {\n var point= pathData.latlngs;\n return isValidPoint(point) && isNumber(pathData.radius);\n },\n createPath: function(options) {\n return new L.Circle([0,0], 1, options);\n },\n setPath: function(path, data) {\n path.setLatLng(_convertToLeafletLatLng(data.latlngs));\n if (isDefined(data.radius)) {\n path.setRadius(data.radius);\n }\n _updatePathOptions(path, data);\n }\n },\n circleMarker: {\n isValid: function(pathData) {\n var point= pathData.latlngs;\n return isValidPoint(point) && isNumber(pathData.radius);\n },\n createPath: function(options) {\n return new L.CircleMarker([0,0], options);\n },\n setPath: function(path, data) {\n path.setLatLng(_convertToLeafletLatLng(data.latlngs));\n if (isDefined(data.radius)) {\n path.setRadius(data.radius);\n }\n _updatePathOptions(path, data);\n }\n }\n };\n\n var _getPathData = function(path) {\n var pathData = {};\n if (path.latlngs) {\n pathData.latlngs = path.latlngs;\n }\n\n if (path.radius) {\n pathData.radius = path.radius;\n }\n\n return pathData;\n };\n\n return {\n setPathOptions: function(leafletPath, pathType, data) {\n if(!isDefined(pathType)) {\n pathType = \"polyline\";\n }\n pathTypes[pathType].setPath(leafletPath, data);\n },\n createPath: function(name, path, defaults) {\n if(!isDefined(path.type)) {\n path.type = \"polyline\";\n }\n var options = _getOptions(path, defaults);\n var pathData = _getPathData(path);\n\n if (!pathTypes[path.type].isValid(pathData)) {\n $log.error(\"[AngularJS - Leaflet] Invalid data passed to the \" + path.type + \" path\");\n return;\n }\n\n return pathTypes[path.type].createPath(options);\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('bounds', function ($log, $timeout, leafletHelpers, leafletBoundsHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: [ 'leaflet', 'center' ],\n\n link: function(scope, element, attrs, controller) {\n var isDefined = leafletHelpers.isDefined,\n createLeafletBounds = leafletBoundsHelpers.createLeafletBounds,\n leafletScope = controller[0].getLeafletScope(),\n mapController = controller[0];\n\n var emptyBounds = function(bounds) {\n return (bounds._southWest.lat === 0 && bounds._southWest.lng === 0 &&\n bounds._northEast.lat === 0 && bounds._northEast.lng === 0);\n };\n\n mapController.getMap().then(function (map) {\n leafletScope.$on('boundsChanged', function (event) {\n var scope = event.currentScope;\n var bounds = map.getBounds();\n //$log.debug('updated map bounds...', bounds);\n if (emptyBounds(bounds) || scope.settingBoundsFromScope) {\n return;\n }\n var newScopeBounds = {\n northEast: {\n lat: bounds._northEast.lat,\n lng: bounds._northEast.lng\n },\n southWest: {\n lat: bounds._southWest.lat,\n lng: bounds._southWest.lng\n }\n };\n if (!angular.equals(scope.bounds, newScopeBounds)) {\n //$log.debug('Need to update scope bounds.');\n scope.bounds = newScopeBounds;\n }\n });\n leafletScope.$watch('bounds', function (bounds) {\n //$log.debug('updated bounds...', bounds);\n if (!isDefined(bounds)) {\n $log.error('[AngularJS - Leaflet] Invalid bounds');\n return;\n }\n var leafletBounds = createLeafletBounds(bounds);\n if (leafletBounds && !map.getBounds().equals(leafletBounds)) {\n //$log.debug('Need to update map bounds.');\n scope.settingBoundsFromScope = true;\n map.fitBounds(leafletBounds);\n $timeout( function() {\n //$log.debug('Allow bound updates.');\n scope.settingBoundsFromScope = false;\n });\n }\n }, true);\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('center',\n function ($log, $q, $location, $timeout, leafletMapDefaults, leafletHelpers, leafletBoundsHelpers, leafletEvents) {\n\n var isDefined = leafletHelpers.isDefined,\n isNumber = leafletHelpers.isNumber,\n isSameCenterOnMap = leafletHelpers.isSameCenterOnMap,\n safeApply = leafletHelpers.safeApply,\n isValidCenter = leafletHelpers.isValidCenter,\n isValidBounds = leafletBoundsHelpers.isValidBounds,\n isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty;\n\n var shouldInitializeMapWithBounds = function(bounds, center) {\n return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center);\n };\n\n var _leafletCenter;\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n controller: function () {\n _leafletCenter = $q.defer();\n this.getCenter = function() {\n return _leafletCenter.promise;\n };\n },\n link: function(scope, element, attrs, controller) {\n var leafletScope = controller.getLeafletScope(),\n centerModel = leafletScope.center;\n\n controller.getMap().then(function(map) {\n var defaults = leafletMapDefaults.getDefaults(attrs.id);\n\n if (attrs.center.search(\"-\") !== -1) {\n $log.error('The \"center\" variable can\\'t use a \"-\" on his key name: \"' + attrs.center + '\".');\n map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);\n return;\n } else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) {\n map.fitBounds(leafletBoundsHelpers.createLeafletBounds(leafletScope.bounds));\n centerModel = map.getCenter();\n safeApply(leafletScope, function (scope) {\n scope.center = {\n lat: map.getCenter().lat,\n lng: map.getCenter().lng,\n zoom: map.getZoom(),\n autoDiscover: false\n };\n angular.extend(scope.center,{\n lat: map.getCenter().lat,\n lng: map.getCenter().lng,\n zoom: map.getZoom(),\n autoDiscover: false\n });\n });\n safeApply(leafletScope, function (scope) {\n var mapBounds = map.getBounds();\n scope.bounds = {\n northEast: {\n lat: mapBounds._northEast.lat,\n lng: mapBounds._northEast.lng\n },\n southWest: {\n lat: mapBounds._southWest.lat,\n lng: mapBounds._southWest.lng\n }\n };\n });\n } else if (!isDefined(centerModel)) {\n $log.error('The \"center\" property is not defined in the main scope');\n map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);\n return;\n } else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) {\n angular.copy(defaults.center, centerModel);\n }\n\n var urlCenterHash, mapReady;\n if (attrs.urlHashCenter === \"yes\") {\n var extractCenterFromUrl = function() {\n var search = $location.search();\n var centerParam;\n if (isDefined(search.c)) {\n var cParam = search.c.split(\":\");\n if (cParam.length === 3) {\n centerParam = { lat: parseFloat(cParam[0]), lng: parseFloat(cParam[1]), zoom: parseInt(cParam[2], 10) };\n }\n }\n return centerParam;\n };\n urlCenterHash = extractCenterFromUrl();\n\n leafletScope.$on('$locationChangeSuccess', function(event) {\n var scope = event.currentScope;\n //$log.debug(\"updated location...\");\n var urlCenter = extractCenterFromUrl();\n if (isDefined(urlCenter) && !isSameCenterOnMap(urlCenter, map)) {\n //$log.debug(\"updating center model...\", urlCenter);\n scope.center = {\n lat: urlCenter.lat,\n lng: urlCenter.lng,\n zoom: urlCenter.zoom\n };\n }\n });\n }\n\n leafletScope.$watch(\"center\", function(center) {\n //$log.debug(\"updated center model...\");\n // The center from the URL has priority\n if (isDefined(urlCenterHash)) {\n angular.copy(urlCenterHash, center);\n urlCenterHash = undefined;\n }\n\n if (!isValidCenter(center) && center.autoDiscover !== true) {\n $log.warn(\"[AngularJS - Leaflet] invalid 'center'\");\n //map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);\n return;\n }\n\n if (center.autoDiscover === true) {\n if (!isNumber(center.zoom)) {\n map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);\n }\n if (isNumber(center.zoom) && center.zoom > defaults.center.zoom) {\n map.locate({ setView: true, maxZoom: center.zoom });\n } else if (isDefined(defaults.maxZoom)) {\n map.locate({ setView: true, maxZoom: defaults.maxZoom });\n } else {\n map.locate({ setView: true });\n }\n return;\n }\n\n if (mapReady && isSameCenterOnMap(center, map)) {\n //$log.debug(\"no need to update map again.\");\n return;\n }\n\n //$log.debug(\"updating map center...\", center);\n leafletScope.settingCenterFromScope = true;\n map.setView([center.lat, center.lng], center.zoom);\n leafletEvents.notifyCenterChangedToBounds(leafletScope, map);\n $timeout(function() {\n leafletScope.settingCenterFromScope = false;\n //$log.debug(\"allow center scope updates\");\n });\n }, true);\n\n map.whenReady(function() {\n mapReady = true;\n });\n\n map.on(\"moveend\", function(/* event */) {\n // Resolve the center after the first map position\n _leafletCenter.resolve();\n leafletEvents.notifyCenterUrlHashChanged(leafletScope, map, attrs, $location.search());\n //$log.debug(\"updated center on map...\");\n if (isSameCenterOnMap(centerModel, map) || scope.settingCenterFromScope) {\n //$log.debug(\"same center in model, no need to update again.\");\n return;\n }\n safeApply(leafletScope, function(scope) {\n if (!leafletScope.settingCenterFromScope) {\n //$log.debug(\"updating center model...\", map.getCenter(), map.getZoom());\n \n angular.extend(scope.center,{\n lat: map.getCenter().lat,\n lng: map.getCenter().lng,\n zoom: map.getZoom(),\n autoDiscover: false\n });\n }\n leafletEvents.notifyCenterChangedToBounds(leafletScope, map);\n });\n });\n\n if (centerModel.autoDiscover === true) {\n map.on(\"locationerror\", function() {\n $log.warn(\"[AngularJS - Leaflet] The Geolocation API is unauthorized on this page.\");\n if (isValidCenter(centerModel)) {\n map.setView([centerModel.lat, centerModel.lng], centerModel.zoom);\n leafletEvents.notifyCenterChangedToBounds(leafletScope, map);\n } else {\n map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);\n leafletEvents.notifyCenterChangedToBounds(leafletScope, map);\n }\n });\n }\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('controls', function ($log, leafletHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: '?^leaflet',\n\n link: function(scope, element, attrs, controller) {\n if(!controller) {\n return;\n }\n\n var isDefined = leafletHelpers.isDefined,\n leafletScope = controller.getLeafletScope(),\n controls = leafletScope.controls;\n\n controller.getMap().then(function(map) {\n if (isDefined(L.Control.Draw) && isDefined(controls.draw)) {\n\n if (!isDefined(controls.edit)) {\n controls.edit = { featureGroup: new L.FeatureGroup() };\n map.addLayer(controls.edit.featureGroup);\n }\n\n var drawControl = new L.Control.Draw(controls);\n map.addControl(drawControl);\n }\n\n if (isDefined(controls.scale)) {\n var scaleControl = new L.control.scale(controls.scale);\n map.addControl(scaleControl);\n }\n\n if (isDefined(controls.custom)) {\n for(var i in controls.custom) {\n map.addControl(controls.custom[i]);\n }\n }\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive(\"decorations\", function($log, leafletHelpers) {\n\treturn {\n\t\trestrict: \"A\", \n\t\tscope: false,\n\t\treplace: false,\n\t\trequire: 'leaflet',\n\n\t\tlink: function(scope, element, attrs, controller) {\n\t\t\tvar leafletScope = controller.getLeafletScope(),\n\t\t\t\tPolylineDecoratorPlugin = leafletHelpers.PolylineDecoratorPlugin,\n\t\t\t\tisDefined = leafletHelpers.isDefined,\n\t\t\t\tleafletDecorations = {};\n\n\t\t\t/* Creates an \"empty\" decoration with a set of coordinates, but no pattern. */\n\t\t\tfunction createDecoration(options) {\n\t\t\t\tif (isDefined(options) && isDefined(options.coordinates)) {\n\t\t\t\t\tif (!PolylineDecoratorPlugin.isLoaded()) {\n\t\t\t\t\t\t$log.error('[AngularJS - Leaflet] The PolylineDecorator Plugin is not loaded.');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn L.polylineDecorator(options.coordinates);\n\t\t\t}\n\n\t\t\t/* Updates the path and the patterns for the provided decoration, and returns the decoration. */\n\t\t\tfunction setDecorationOptions(decoration, options) {\n\t\t\t\tif (isDefined(decoration) && isDefined(options)) {\n\t\t\t\t\tif (isDefined(options.coordinates) && isDefined(options.patterns)) {\n\t\t\t\t\t\tdecoration.setPaths(options.coordinates);\n\t\t\t\t\t\tdecoration.setPatterns(options.patterns);\n\t\t\t\t\t\treturn decoration;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcontroller.getMap().then(function(map) {\n\t\t\t\tleafletScope.$watch(\"decorations\", function(newDecorations) {\n\t\t\t\t\tfor (var name in leafletDecorations) {\n\t\t\t\t\t\tif (!isDefined(newDecorations) || !isDefined(newDecorations[name])) {\n\t\t\t\t\t\t\tmap.removeLayer(leafletDecorations[name]);\n\t\t\t\t\t\t\tdelete leafletDecorations[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tfor (var newName in newDecorations) {\n\t\t\t\t\t\tvar decorationData = newDecorations[newName],\n\t\t\t\t\t\t\tnewDecoration = createDecoration(decorationData);\n\n\t\t\t\t\t\tif (isDefined(newDecoration)) {\n\t\t\t\t\t\t\tleafletDecorations[newName] = newDecoration;\n\t\t\t\t\t\t\tmap.addLayer(newDecoration);\n\t\t\t\t\t\t\tsetDecorationOptions(newDecoration, decorationData);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, true);\n\t\t\t});\n\t\t}\n\t};\n});","angular.module(\"leaflet-directive\").directive('eventBroadcast', function ($log, $rootScope, leafletHelpers, leafletEvents) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n\n link: function(scope, element, attrs, controller) {\n var isObject = leafletHelpers.isObject,\n isDefined = leafletHelpers.isDefined,\n leafletScope = controller.getLeafletScope(),\n eventBroadcast = leafletScope.eventBroadcast,\n availableMapEvents = leafletEvents.getAvailableMapEvents(),\n genDispatchMapEvent = leafletEvents.genDispatchMapEvent;\n\n controller.getMap().then(function(map) {\n\n var mapEvents = [];\n var i;\n var eventName;\n var logic = \"broadcast\";\n\n // We have a possible valid object\n if (!isDefined(eventBroadcast.map)) {\n // We do not have events enable/disable do we do nothing (all enabled by default)\n mapEvents = availableMapEvents;\n } else if (!isObject(eventBroadcast.map)) {\n // Not a valid object\n $log.warn(\"[AngularJS - Leaflet] event-broadcast.map must be an object check your model.\");\n } else {\n // We have a possible valid map object\n // Event propadation logic\n if (eventBroadcast.map.logic !== \"emit\" && eventBroadcast.map.logic !== \"broadcast\") {\n // This is an error\n $log.warn(\"[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'.\");\n } else {\n logic = eventBroadcast.map.logic;\n }\n\n if (!(isObject(eventBroadcast.map.enable) && eventBroadcast.map.enable.length >= 0)) {\n $log.warn(\"[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.\");\n } else {\n // Enable events\n for (i = 0; i < eventBroadcast.map.enable.length; i++) {\n eventName = eventBroadcast.map.enable[i];\n // Do we have already the event enabled?\n if (mapEvents.indexOf(eventName) === -1 && availableMapEvents.indexOf(eventName) !== -1) {\n mapEvents.push(eventName);\n }\n }\n }\n\n }\n\n for (i = 0; i < mapEvents.length; i++) {\n eventName = mapEvents[i];\n map.on(eventName, genDispatchMapEvent(leafletScope, eventName, logic), {\n eventName: eventName\n });\n }\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('geojson', function ($log, $rootScope, leafletData, leafletHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n\n link: function(scope, element, attrs, controller) {\n var safeApply = leafletHelpers.safeApply,\n isDefined = leafletHelpers.isDefined,\n leafletScope = controller.getLeafletScope(),\n leafletGeoJSON = {};\n\n controller.getMap().then(function(map) {\n leafletScope.$watchCollection(\"geojson\", function(geojson) {\n if (isDefined(leafletGeoJSON) && map.hasLayer(leafletGeoJSON)) {\n map.removeLayer(leafletGeoJSON);\n }\n\n if (!(isDefined(geojson) && isDefined(geojson.data))) {\n return;\n }\n\n var resetStyleOnMouseout = geojson.resetStyleOnMouseout;\n var onEachFeature;\n\n if (angular.isFunction(geojson.onEachFeature)) {\n onEachFeature = geojson.onEachFeature;\n } else {\n onEachFeature = function(feature, layer) {\n if (leafletHelpers.LabelPlugin.isLoaded() && isDefined(geojson.label)) {\n layer.bindLabel(feature.properties.description);\n }\n\n layer.on({\n mouseover: function(e) {\n safeApply(leafletScope, function() {\n $rootScope.$broadcast('leafletDirectiveMap.geojsonMouseover', feature, e);\n });\n },\n mouseout: function(e) {\n if (resetStyleOnMouseout) {\n leafletGeoJSON.resetStyle(e.target);\n }\n safeApply(leafletScope, function() {\n $rootScope.$broadcast('leafletDirectiveMap.geojsonMouseout', e);\n });\n },\n click: function(e) {\n safeApply(leafletScope, function() {\n $rootScope.$broadcast('leafletDirectiveMap.geojsonClick', feature, e);\n });\n }\n });\n };\n }\n\n if (!isDefined(geojson.options)) {\n geojson.options = {\n style: geojson.style,\n filter: geojson.filter,\n onEachFeature: onEachFeature,\n pointToLayer: geojson.pointToLayer\n };\n }\n\n leafletGeoJSON = L.geoJson(geojson.data, geojson.options);\n leafletData.setGeoJSON(leafletGeoJSON, attrs.id);\n leafletGeoJSON.addTo(map);\n\n });\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('layercontrol', function ($log, leafletData, leafletHelpers) {\n return {\n restrict: \"E\",\n scope: {\n },\n replace: true,\n transclude: false,\n require: '^leaflet',\n controller: function ($scope, $element, $sce) {\n $log.debug('[Angular Directive - Layers] layers', $scope, $element);\n var safeApply = leafletHelpers.safeApply,\n isDefined = leafletHelpers.isDefined;\n angular.extend($scope, {\n baselayer: '',\n icons: {\n uncheck: 'fa fa-check-square-o',\n check: 'fa fa-square-o',\n radio: 'fa fa-dot-circle-o',\n unradio: 'fa fa-circle-o',\n up: 'fa fa-angle-up',\n down: 'fa fa-angle-down',\n open: 'fa fa-angle-double-down',\n close: 'fa fa-angle-double-up'\n },\n changeBaseLayer: function(key, e) {\n leafletHelpers.safeApply($scope, function(scp) {\n scp.baselayer = key;\n leafletData.getMap().then(function(map) {\n leafletData.getLayers().then(function(leafletLayers) {\n if(map.hasLayer(leafletLayers.baselayers[key])) {\n return;\n }\n for(var i in scp.layers.baselayers) {\n scp.layers.baselayers[i].icon = scp.icons.unradio;\n if(map.hasLayer(leafletLayers.baselayers[i])) {\n map.removeLayer(leafletLayers.baselayers[i]);\n }\n }\n map.addLayer(leafletLayers.baselayers[key]);\n scp.layers.baselayers[key].icon = $scope.icons.radio;\n });\n });\n });\n e.preventDefault();\n },\n moveLayer: function(ly, newIndex, e) {\n var delta = Object.keys($scope.layers.baselayers).length;\n if(newIndex >= (1+delta) && newIndex <= ($scope.overlaysArray.length+delta)) {\n var oldLy;\n for(var key in $scope.layers.overlays) {\n if($scope.layers.overlays[key].index === newIndex) {\n oldLy = $scope.layers.overlays[key];\n break;\n }\n }\n if(oldLy) {\n safeApply($scope, function() {\n oldLy.index = ly.index;\n ly.index = newIndex;\n });\n }\n }\n e.stopPropagation();\n e.preventDefault();\n },\n initIndex: function(layer, idx) {\n var delta = Object.keys($scope.layers.baselayers).length;\n layer.index = isDefined(layer.index)? layer.index:idx+delta+1;\n },\n toggleOpacity: function(e, layer) {\n $log.debug('Event', e);\n if(layer.visible) {\n var el = angular.element(e.currentTarget);\n el.toggleClass($scope.icons.close + ' ' + $scope.icons.open);\n el = el.parents('.lf-row').find('.lf-opacity');\n el.toggle('fast', function() {\n safeApply($scope, function() {\n layer.opacityControl = !layer.opacityControl;\n });\n });\n }\n e.stopPropagation();\n e.preventDefault();\n },\n unsafeHTML: function(html) {\n return $sce.trustAsHtml(html);\n }\n });\n\n var div = $element.get(0);\n if (!L.Browser.touch) {\n L.DomEvent.disableClickPropagation(div);\n L.DomEvent.on(div, 'mousewheel', L.DomEvent.stopPropagation);\n } else {\n L.DomEvent.on(div, 'click', L.DomEvent.stopPropagation);\n }\n },\n template:\n '
' +\n '
' +\n '
' +\n '' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n ''+\n '
' +\n '
' +\n '' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
',\n link: function(scope, element, attrs, controller) {\n var isDefined = leafletHelpers.isDefined,\n leafletScope = controller.getLeafletScope(),\n layers = leafletScope.layers;\n\n // Setting layer stack order.\n attrs.order = (isDefined(attrs.order) && (attrs.order === 'normal' || attrs.order === 'reverse'))? attrs.order:'normal';\n scope.order = attrs.order === 'normal';\n scope.orderNumber = attrs.order === 'normal'? -1:1;\n\n scope.layers = layers;\n controller.getMap().then(function(map) {\n\n leafletScope.$watch('layers.baselayers', function(newBaseLayers) {\n leafletData.getLayers().then(function(leafletLayers) {\n var key;\n for(key in newBaseLayers) {\n if(map.hasLayer(leafletLayers.baselayers[key])) {\n newBaseLayers[key].icon = scope.icons.radio;\n } else {\n newBaseLayers[key].icon = scope.icons.unradio;\n }\n }\n });\n });\n\n leafletScope.$watch('layers.overlays', function(newOverlayLayers) {\n var overlaysArray = [];\n leafletData.getLayers().then(function(leafletLayers) {\n for(var key in newOverlayLayers) {\n newOverlayLayers[key].icon = scope.icons[(newOverlayLayers[key].visible? 'uncheck':'check')];\n overlaysArray.push(newOverlayLayers[key]);\n if(isDefined(newOverlayLayers[key].index) && leafletLayers.overlays[key].setZIndex) {\n leafletLayers.overlays[key].setZIndex(newOverlayLayers[key].index);\n }\n }\n });\n\n var unreg = scope.$watch(function() {\n if(element.children().size() > 1) {\n element.find('.lf-overlays').trigger('resize');\n return element.find('.lf-opacity').size() === Object.keys(layers.overlays).length;\n }\n }, function(el) {\n if(el === true) {\n if(isDefined(element.find('.lf-opacity-control').ionRangeSlider)) {\n element.find('.lf-opacity-control').each(function(idx, inp) {\n var delta = Object.keys(layers.baselayers).length,\n lyAux;\n for(var key in scope.overlaysArray) {\n if(scope.overlaysArray[key].index === idx+delta+1) {\n lyAux = scope.overlaysArray[key];\n }\n }\n\n var input = angular.element(inp),\n op = isDefined(lyAux) && isDefined(lyAux.layerOptions)?\n lyAux.layerOptions.opacity:undefined;\n input.ionRangeSlider({\n min: 0,\n from: isDefined(op)? Math.ceil(op*100):100,\n step: 1,\n max: 100,\n prettify: false,\n hasGrid: false,\n hideMinMax: true,\n onChange: function(val) {\n leafletData.getLayers().then(function(leafletLayers) {\n var key = val.input.data().key;\n var ly, layer;\n for(var k in layers.overlays) {\n if(layers.overlays[k].index === key) {\n ly = leafletLayers.overlays[k];\n layer = layers.overlays[k];\n break;\n }\n }\n if(map.hasLayer(ly)) {\n layer.layerOptions = isDefined(layer.layerOptions)? layer.layerOptions:{};\n layer.layerOptions.opacity = val.input.val()/100;\n if(ly.setOpacity) {\n ly.setOpacity(val.input.val()/100);\n }\n if(ly.getLayers && ly.eachLayer) {\n ly.eachLayer(function(lay) {\n if(lay.setOpacity) {\n lay.setOpacity(val.input.val()/100);\n }\n });\n }\n }\n });\n }\n });\n });\n } else {\n $log.warn('[AngularJS - Leaflet] Ion Slide Range Plugin is not loaded');\n }\n unreg();\n }\n });\n\n scope.overlaysArray = overlaysArray;\n }, true);\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('layers', function ($log, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n controller: function ($scope) {\n $scope._leafletLayers = $q.defer();\n this.getLayers = function () {\n return $scope._leafletLayers.promise;\n };\n },\n link: function(scope, element, attrs, controller){\n var isDefined = leafletHelpers.isDefined,\n leafletLayers = {},\n leafletScope = controller.getLeafletScope(),\n layers = leafletScope.layers,\n createLayer = leafletLayerHelpers.createLayer,\n updateLayersControl = leafletControlHelpers.updateLayersControl,\n isLayersControlVisible = false;\n\n controller.getMap().then(function(map) {\n\n // We have baselayers to add to the map\n scope._leafletLayers.resolve(leafletLayers);\n leafletData.setLayers(leafletLayers, attrs.id);\n\n leafletLayers.baselayers = {};\n leafletLayers.overlays = {};\n\n var mapId = attrs.id;\n\n // Setup all baselayers definitions\n var oneVisibleLayer = false;\n for (var layerName in layers.baselayers) {\n var newBaseLayer = createLayer(layers.baselayers[layerName]);\n if (!isDefined(newBaseLayer)) {\n delete layers.baselayers[layerName];\n continue;\n }\n leafletLayers.baselayers[layerName] = newBaseLayer;\n // Only add the visible layer to the map, layer control manages the addition to the map\n // of layers in its control\n if (layers.baselayers[layerName].top === true) {\n map.addLayer(leafletLayers.baselayers[layerName]);\n oneVisibleLayer = true;\n }\n }\n\n // If there is no visible layer add first to the map\n if (!oneVisibleLayer && Object.keys(leafletLayers.baselayers).length > 0) {\n map.addLayer(leafletLayers.baselayers[Object.keys(layers.baselayers)[0]]);\n }\n\n // Setup the Overlays\n for (layerName in layers.overlays) {\n if(layers.overlays[layerName].type === 'cartodb') {\n\n }\n var newOverlayLayer = createLayer(layers.overlays[layerName]);\n if (!isDefined(newOverlayLayer)) {\n delete layers.overlays[layerName];\n continue;\n }\n leafletLayers.overlays[layerName] = newOverlayLayer;\n // Only add the visible overlays to the map\n if (layers.overlays[layerName].visible === true) {\n map.addLayer(leafletLayers.overlays[layerName]);\n }\n }\n\n // Watch for the base layers\n leafletScope.$watch('layers.baselayers', function(newBaseLayers) {\n // Delete layers from the array\n for (var name in leafletLayers.baselayers) {\n if (!isDefined(newBaseLayers[name])) {\n // Remove from the map if it's on it\n if (map.hasLayer(leafletLayers.baselayers[name])) {\n map.removeLayer(leafletLayers.baselayers[name]);\n }\n delete leafletLayers.baselayers[name];\n }\n }\n // add new layers\n for (var newName in newBaseLayers) {\n if (!isDefined(leafletLayers.baselayers[newName])) {\n var testBaseLayer = createLayer(newBaseLayers[newName]);\n if (isDefined(testBaseLayer)) {\n leafletLayers.baselayers[newName] = testBaseLayer;\n // Only add the visible layer to the map\n if (newBaseLayers[newName].top === true) {\n map.addLayer(leafletLayers.baselayers[newName]);\n }\n }\n } else {\n if (newBaseLayers[newName].top === true && !map.hasLayer(leafletLayers.baselayers[newName])) {\n map.addLayer(leafletLayers.baselayers[newName]);\n } else if (newBaseLayers[newName].top === false && map.hasLayer(leafletLayers.baselayers[newName])) {\n map.removeLayer(leafletLayers.baselayers[newName]);\n }\n }\n }\n\n //we have layers, so we need to make, at least, one active\n var found = false;\n // search for an active layer\n for (var key in leafletLayers.baselayers) {\n if (map.hasLayer(leafletLayers.baselayers[key])) {\n found = true;\n break;\n }\n }\n // If there is no active layer make one active\n if (!found && Object.keys(leafletLayers.baselayers).length > 0) {\n map.addLayer(leafletLayers.baselayers[Object.keys(leafletLayers.baselayers)[0]]);\n }\n\n // Only show the layers switch selector control if we have more than one baselayer + overlay\n isLayersControlVisible = updateLayersControl(map, mapId, isLayersControlVisible, newBaseLayers, layers.overlays, leafletLayers);\n }, true);\n\n // Watch for the overlay layers\n leafletScope.$watch('layers.overlays', function(newOverlayLayers) {\n // Delete layers from the array\n for (var name in leafletLayers.overlays) {\n if (!isDefined(newOverlayLayers[name])) {\n // Remove from the map if it's on it\n if (map.hasLayer(leafletLayers.overlays[name])) {\n map.removeLayer(leafletLayers.overlays[name]);\n }\n // TODO: Depending on the layer type we will have to delete what's included on it\n delete leafletLayers.overlays[name];\n }\n }\n\n // add new overlays\n for (var newName in newOverlayLayers) {\n if (!isDefined(leafletLayers.overlays[newName])) {\n var testOverlayLayer = createLayer(newOverlayLayers[newName]);\n if (isDefined(testOverlayLayer)) {\n leafletLayers.overlays[newName] = testOverlayLayer;\n if (newOverlayLayers[newName].visible === true) {\n map.addLayer(leafletLayers.overlays[newName]);\n }\n }\n }\n\n // check for the .visible property to hide/show overLayers\n if (newOverlayLayers[newName].visible && !map.hasLayer(leafletLayers.overlays[newName])) {\n map.addLayer(leafletLayers.overlays[newName]);\n } else if (newOverlayLayers[newName].visible === false && map.hasLayer(leafletLayers.overlays[newName])) {\n map.removeLayer(leafletLayers.overlays[newName]);\n }\n\n //refresh heatmap data if present\n if (newOverlayLayers[newName].visible && map._loaded && newOverlayLayers[newName].data && newOverlayLayers[newName].type === \"heatmap\") {\n leafletLayers.overlays[newName].setData(newOverlayLayers[newName].data);\n leafletLayers.overlays[newName].update();\n }\n }\n\n // Only add the layers switch selector control if we have more than one baselayer + overlay\n isLayersControlVisible = updateLayersControl(map, mapId, isLayersControlVisible, layers.baselayers, newOverlayLayers, leafletLayers);\n }, true);\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('legend', function ($log, $http, leafletHelpers, leafletLegendHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n\n link: function (scope, element, attrs, controller) {\n\n var isArray = leafletHelpers.isArray,\n isDefined = leafletHelpers.isDefined,\n isFunction = leafletHelpers.isFunction,\n leafletScope = controller.getLeafletScope(),\n legend = leafletScope.legend;\n\n var legendClass;\n var position;\n var leafletLegend;\n var type;\n\n leafletScope.$watch('legend', function (newLegend) {\n\n if (isDefined(newLegend)) {\n\n legendClass = newLegend.legendClass ? newLegend.legendClass : \"legend\";\n\n position = newLegend.position || 'bottomright';\n\n // default to arcgis\n type = newLegend.type || 'arcgis'; \n }\n\n }, true);\n\n controller.getMap().then(function (map) {\n\n leafletScope.$watch('legend', function (newLegend) {\n\n if (!isDefined(newLegend)) {\n\n if (isDefined(leafletLegend)) {\n leafletLegend.removeFrom(map);\n leafletLegend= null;\n }\n\n return;\n }\n\n if (!isDefined(newLegend.url) && (type === 'arcgis') && (!isArray(newLegend.colors) || !isArray(newLegend.labels) || newLegend.colors.length !== newLegend.labels.length)) {\n\n $log.warn(\"[AngularJS - Leaflet] legend.colors and legend.labels must be set.\");\n\n return;\n }\n\n if (isDefined(newLegend.url)) {\n\n $log.info(\"[AngularJS - Leaflet] loading legend service.\");\n\n return;\n }\n\n if (isDefined(leafletLegend)) {\n leafletLegend.removeFrom(map);\n leafletLegend= null;\n }\n\n leafletLegend = L.control({\n position: position\n });\n if (type === 'arcgis') {\n leafletLegend.onAdd = leafletLegendHelpers.getOnAddArrayLegend(newLegend, legendClass);\n }\n leafletLegend.addTo(map);\n\n });\n\n leafletScope.$watch('legend.url', function (newURL) {\n\n if (!isDefined(newURL)) {\n return;\n }\n $http.get(newURL)\n .success(function (legendData) {\n\n if (isDefined(leafletLegend)) {\n\n leafletLegendHelpers.updateLegend(leafletLegend.getContainer(), legendData, type, newURL);\n\n } else {\n\n leafletLegend = L.control({\n position: position\n });\n leafletLegend.onAdd = leafletLegendHelpers.getOnAddLegend(legendData, legendClass, type, newURL);\n leafletLegend.addTo(map);\n }\n\n if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) {\n legend.loadedData();\n }\n })\n .error(function () {\n $log.warn('[AngularJS - Leaflet] legend.url not loaded.');\n });\n });\n\n });\n }\n };\n });\n","angular.module(\"leaflet-directive\").directive('markers',\n function ($log, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults, leafletMarkersHelpers,\n leafletEvents, leafletIterators) {\n //less terse vars to helpers\n var isDefined = leafletHelpers.isDefined,\n errorHeader = leafletHelpers.errorHeader,\n defaultTo= leafletHelpers.defaultTo,\n Helpers = leafletHelpers,\n isString = leafletHelpers.isString,\n addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher,\n listenMarkerEvents = leafletMarkersHelpers.listenMarkerEvents,\n addMarkerToGroup = leafletMarkersHelpers.addMarkerToGroup,\n bindMarkerEvents = leafletEvents.bindMarkerEvents,\n createMarker = leafletMarkersHelpers.createMarker,\n deleteMarker = leafletMarkersHelpers.deleteMarker,\n $it = leafletIterators;\n\n var _maybeAddMarkerToLayer = function(layerName, layers, markerData, marker, shouldWatch, map){\n\n if (!isString(layerName)) {\n $log.error(errorHeader + ' A layername must be a string');\n return false;\n }\n\n if (!isDefined(layers)) {\n $log.error(errorHeader + ' You must add layers to the directive if the markers are going to use this functionality.');\n return false;\n }\n\n if (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) {\n $log.error(errorHeader +' A marker can only be added to a layer of type \"group\"');\n return false;\n }\n var layerGroup = layers.overlays[layerName];\n if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {\n $log.error(errorHeader + ' Adding a marker to an overlay needs a overlay of the type \"group\" or \"featureGroup\"');\n return false;\n }\n\n // The marker goes to a correct layer group, so first of all we add it\n layerGroup.addLayer(marker);\n\n // The marker is automatically added to the map depending on the visibility\n // of the layer, so we only have to open the popup if the marker is in the map\n if (!shouldWatch && map.hasLayer(marker) && markerData.focus === true) {\n leafletMarkersHelpers.manageOpenPopup(marker, markerData);\n }\n return true;\n };\n //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already)\n var _addMarkers = function(markersToRender, map, layers, leafletMarkers, leafletScope, shouldWatch, maybeLayerName){\n shouldWatch = defaultTo(shouldWatch, false);\n\n for (var newName in markersToRender) {\n if (newName.search(\"-\") !== -1) {\n $log.error('The marker can\\'t use a \"-\" on his key name: \"' + newName + '\".');\n continue;\n }\n\n if (!isDefined(leafletMarkers[newName])) {\n var markerData = markersToRender[newName];\n var marker = createMarker(markerData);\n if (!isDefined(marker)) {\n $log.error(errorHeader + ' Received invalid data on the marker ' + newName + '.');\n continue;\n }\n leafletMarkers[newName] = marker;\n\n // Bind message\n if (isDefined(markerData.message)) {\n marker.bindPopup(markerData.message, markerData.popupOptions);\n }\n\n // Add the marker to a cluster group if needed\n if (isDefined(markerData.group)) {\n var groupOptions = isDefined(markerData.groupOption) ? markerData.groupOption : null;\n addMarkerToGroup(marker, markerData.group, groupOptions, map);\n }\n\n // Show label if defined\n if (Helpers.LabelPlugin.isLoaded() && isDefined(markerData.label) && isDefined(markerData.label.message)) {\n marker.bindLabel(markerData.label.message, markerData.label.options);\n }\n\n // Check if the marker should be added to a layer\n if (isDefined(markerData) && (isDefined(markerData.layer) || isDefined(maybeLayerName))){\n\n var pass = _maybeAddMarkerToLayer(\n markerData.layer || maybeLayerName, //original way takes pref\n layers,\n markerData, marker, shouldWatch, map\n );\n if(!pass)\n continue; //something went wrong move on in the loop\n } else if (!isDefined(markerData.group)) {\n // We do not have a layer attr, so the marker goes to the map layer\n map.addLayer(marker);\n if (!shouldWatch && markerData.focus === true) {\n leafletMarkersHelpers.manageOpenPopup(marker, markerData);\n }\n }\n var pathToMarker = Helpers.getObjectDotPath(maybeLayerName? [maybeLayerName, newName]: [newName]);\n if (shouldWatch) {\n addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map);\n }\n\n listenMarkerEvents(marker, markerData, leafletScope, shouldWatch);\n bindMarkerEvents(marker, pathToMarker, markerData, leafletScope);\n }\n }\n };\n var _destroy = function(markerModels, lMarkers, map, layers){\n // Delete markers from the array\n var hasLogged = false;\n for (var name in lMarkers) {\n if(!hasLogged) {\n $log.debug(errorHeader + \"[markers] destroy: \");\n hasLogged = true;\n }\n if (!isDefined(markerModels) || !isDefined(markerModels[name])) {\n deleteMarker(lMarkers[name], map, layers);\n delete lMarkers[name];\n }\n }\n };\n\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: ['leaflet', '?layers'],\n\n link: function(scope, element, attrs, controller) {\n var mapController = controller[0],\n leafletScope = mapController.getLeafletScope();\n\n mapController.getMap().then(function(map) {\n var leafletMarkers = {}, getLayers;\n\n // If the layers attribute is used, we must wait until the layers are created\n if (isDefined(controller[1])) {\n getLayers = controller[1].getLayers;\n } else {\n getLayers = function() {\n var deferred = $q.defer();\n deferred.resolve();\n return deferred.promise;\n };\n }\n\n getLayers().then(function(layers) {\n leafletData.setMarkers(leafletMarkers, attrs.id);\n leafletScope.$watch('markers', function(newMarkers) {\n _destroy(newMarkers, leafletMarkers, map, layers);\n // Should we watch for every specific marker on the map?\n var shouldWatch = (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers));\n var isNested = (isDefined(attrs.markersNested) && Helpers.isTruthy(attrs.markersNested));\n\n if(isNested) {\n $it.each(newMarkers, function(markersToAdd, layerName) {\n _addMarkers(markersToAdd, map, layers, leafletMarkers, leafletScope, shouldWatch, layerName);\n });\n return;\n }\n _addMarkers(newMarkers, map, layers, leafletMarkers, leafletScope, shouldWatch);\n }, true);\n });\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('maxbounds', function ($log, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n\n link: function(scope, element, attrs, controller) {\n var leafletScope = controller.getLeafletScope(),\n isValidBounds = leafletBoundsHelpers.isValidBounds,\n isNumber = leafletHelpers.isNumber;\n\n\n controller.getMap().then(function(map) {\n leafletScope.$watch(\"maxbounds\", function (maxbounds) {\n if (!isValidBounds(maxbounds)) {\n // Unset any previous maxbounds\n map.setMaxBounds();\n return;\n }\n \n var leafletBounds = leafletBoundsHelpers.createLeafletBounds(maxbounds);\n if(isNumber(maxbounds.pad)) {\n leafletBounds = leafletBounds.pad(maxbounds.pad);\n }\n\n map.setMaxBounds(leafletBounds);\n if (!attrs.center) {\n map.fitBounds(leafletBounds);\n }\n });\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('paths', function ($log, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletEvents) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: ['leaflet', '?layers'],\n\n link: function(scope, element, attrs, controller) {\n var mapController = controller[0],\n isDefined = leafletHelpers.isDefined,\n isString = leafletHelpers.isString,\n leafletScope = mapController.getLeafletScope(),\n paths = leafletScope.paths,\n createPath = leafletPathsHelpers.createPath,\n bindPathEvents = leafletEvents.bindPathEvents,\n setPathOptions = leafletPathsHelpers.setPathOptions;\n\n mapController.getMap().then(function(map) {\n var defaults = leafletMapDefaults.getDefaults(attrs.id),\n getLayers;\n\n // If the layers attribute is used, we must wait until the layers are created\n if (isDefined(controller[1])) {\n getLayers = controller[1].getLayers;\n } else {\n getLayers = function() {\n var deferred = $q.defer();\n deferred.resolve();\n return deferred.promise;\n };\n }\n\n if (!isDefined(paths)) {\n return;\n }\n\n getLayers().then(function(layers) {\n\n var leafletPaths = {};\n leafletData.setPaths(leafletPaths, attrs.id);\n\n // Should we watch for every specific marker on the map?\n var shouldWatch = (!isDefined(attrs.watchPaths) || attrs.watchPaths === 'true');\n\n // Function for listening every single path once created\n var watchPathFn = function(leafletPath, name) {\n var clearWatch = leafletScope.$watch(\"paths[\\\"\"+name+\"\\\"]\", function(pathData, old) {\n if (!isDefined(pathData)) {\n if (isDefined(old.layer)) {\n for (var i in layers.overlays) {\n var overlay = layers.overlays[i];\n overlay.removeLayer(leafletPath);\n }\n }\n map.removeLayer(leafletPath);\n clearWatch();\n return;\n }\n setPathOptions(leafletPath, pathData.type, pathData);\n }, true);\n };\n\n leafletScope.$watchCollection(\"paths\", function (newPaths) {\n\n // Delete paths (by name) from the array\n for (var name in leafletPaths) {\n if (!isDefined(newPaths[name])) {\n map.removeLayer(leafletPaths[name]);\n delete leafletPaths[name];\n }\n }\n\n // Create the new paths\n for (var newName in newPaths) {\n if (newName.search('\\\\$') === 0) {\n continue;\n }\n if (newName.search(\"-\") !== -1) {\n $log.error('[AngularJS - Leaflet] The path name \"' + newName + '\" is not valid. It must not include \"-\" and a number.');\n continue;\n }\n\n if (!isDefined(leafletPaths[newName])) {\n var pathData = newPaths[newName];\n var newPath = createPath(newName, newPaths[newName], defaults);\n\n // bind popup if defined\n if (isDefined(newPath) && isDefined(pathData.message)) {\n newPath.bindPopup(pathData.message);\n }\n\n // Show label if defined\n if (leafletHelpers.LabelPlugin.isLoaded() && isDefined(pathData.label) && isDefined(pathData.label.message)) {\n newPath.bindLabel(pathData.label.message, pathData.label.options);\n }\n\n // Check if the marker should be added to a layer\n if (isDefined(pathData) && isDefined(pathData.layer)) {\n\n if (!isString(pathData.layer)) {\n $log.error('[AngularJS - Leaflet] A layername must be a string');\n continue;\n }\n if (!isDefined(layers)) {\n $log.error('[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.');\n continue;\n }\n\n if (!isDefined(layers.overlays) || !isDefined(layers.overlays[pathData.layer])) {\n $log.error('[AngularJS - Leaflet] A marker can only be added to a layer of type \"group\"');\n continue;\n }\n var layerGroup = layers.overlays[pathData.layer];\n if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {\n $log.error('[AngularJS - Leaflet] Adding a marker to an overlay needs a overlay of the type \"group\" or \"featureGroup\"');\n continue;\n }\n\n // Listen for changes on the new path\n leafletPaths[newName] = newPath;\n // The path goes to a correct layer group, so first of all we add it\n layerGroup.addLayer(newPath);\n\n if (shouldWatch) {\n watchPathFn(newPath, newName);\n } else {\n setPathOptions(newPath, pathData.type, pathData);\n }\n } else if (isDefined(newPath)) {\n // Listen for changes on the new path\n leafletPaths[newName] = newPath;\n map.addLayer(newPath);\n\n if (shouldWatch) {\n watchPathFn(newPath, newName);\n } else {\n setPathOptions(newPath, pathData.type, pathData);\n }\n }\n\n bindPathEvents(newPath, newName, pathData, leafletScope);\n }\n }\n });\n });\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('tiles', function ($log, leafletData, leafletMapDefaults, leafletHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n\n link: function(scope, element, attrs, controller) {\n var isDefined = leafletHelpers.isDefined,\n leafletScope = controller.getLeafletScope(),\n tiles = leafletScope.tiles;\n\n if (!isDefined(tiles) && !isDefined(tiles.url)) {\n $log.warn(\"[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property.\");\n return;\n }\n\n controller.getMap().then(function(map) {\n var defaults = leafletMapDefaults.getDefaults(attrs.id);\n var tileLayerObj;\n leafletScope.$watch(\"tiles\", function(tiles) {\n var tileLayerOptions = defaults.tileLayerOptions;\n var tileLayerUrl = defaults.tileLayer;\n\n // If no valid tiles are in the scope, remove the last layer\n if (!isDefined(tiles.url) && isDefined(tileLayerObj)) {\n map.removeLayer(tileLayerObj);\n return;\n }\n\n // No leafletTiles object defined yet\n if (!isDefined(tileLayerObj)) {\n if (isDefined(tiles.options)) {\n angular.copy(tiles.options, tileLayerOptions);\n }\n\n if (isDefined(tiles.url)) {\n tileLayerUrl = tiles.url;\n }\n\n tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions);\n tileLayerObj.addTo(map);\n leafletData.setTiles(tileLayerObj, attrs.id);\n return;\n }\n\n // If the options of the tilelayer is changed, we need to redraw the layer\n if (isDefined(tiles.url) && isDefined(tiles.options) && !angular.equals(tiles.options, tileLayerOptions)) {\n map.removeLayer(tileLayerObj);\n tileLayerOptions = defaults.tileLayerOptions;\n angular.copy(tiles.options, tileLayerOptions);\n tileLayerUrl = tiles.url;\n tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions);\n tileLayerObj.addTo(map);\n leafletData.setTiles(tileLayerObj, attrs.id);\n return;\n }\n\n // Only the URL of the layer is changed, update the tiles object\n if (isDefined(tiles.url)) {\n tileLayerObj.setUrl(tiles.url);\n }\n }, true);\n });\n }\n };\n});\n"]} \ No newline at end of file +{"version":3,"sources":["../src/directives/leaflet.js","../src/services/leafletBoundsHelpers.js","../src/services/leafletControlHelpers.js","../src/services/leafletData.js","../src/services/leafletDirectiveControlsHelpers.js","../src/services/leafletEvents.js","../src/services/leafletGeoJsonHelpers.js","../src/services/leafletHelpers.js","../src/services/leafletIterators.js","../src/services/leafletLayerHelpers.js","../src/services/leafletLegendHelpers.js","../src/services/leafletMapDefaults.js","../src/services/leafletMarkersHelpers.js","../src/services/leafletPathsHelpers.js","../src/services/leafletWatchHelpers.js","../src/directives/bounds.js","../src/directives/center.js","../src/directives/controls.js","../src/directives/decorations.js","../src/directives/eventBroadcast.js","../src/directives/geojson.js","../src/directives/layercontrol.js","../src/directives/layers.js","../src/directives/legend.js","../src/directives/markers.js","../src/directives/maxbounds.js","../src/directives/paths.js","../src/directives/tiles.js","../src/directives/watchOptions.js","../src/services/events/leafletEventsHelpers.js","../src/services/events/leafletLabelEvents.js","../src/services/events/leafletMapEvents.js","../src/services/events/leafletMarkerEvents.js","../src/services/events/leafletPathEvents.js"],"names":[],"mappings":"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","file":"angular-leaflet-directive_dev_mapped.js","sourcesContent":["angular.module(\"leaflet-directive\", []).directive('leaflet',\n function ($q, leafletData, leafletMapDefaults, leafletHelpers, leafletEvents) {\n var _leafletMap;\n return {\n restrict: \"EA\",\n replace: true,\n scope: {\n center : '=',\n defaults : '=',\n maxbounds : '=',\n bounds : '=',\n markers : '=',\n legend : '=',\n geojson : '=',\n paths : '=',\n tiles : '=',\n layers : '=',\n controls : '=',\n decorations : '=',\n eventBroadcast : '=',\n markersWatchOptions : '=',\n geojsonWatchOptions : '='\n },\n transclude: true,\n template: '
',\n controller: function ($scope) {\n _leafletMap = $q.defer();\n this.getMap = function () {\n return _leafletMap.promise;\n };\n\n this.getLeafletScope = function() {\n return $scope;\n };\n },\n\n link: function(scope, element, attrs) {\n var isDefined = leafletHelpers.isDefined,\n defaults = leafletMapDefaults.setDefaults(scope.defaults, attrs.id),\n genDispatchMapEvent = leafletEvents.genDispatchMapEvent,\n mapEvents = leafletEvents.getAvailableMapEvents();\n\n leafletData.setDirectiveControls({}, attrs.id);\n\n // Set width and height utility functions\n function updateWidth() {\n if (isNaN(attrs.width)) {\n element.css('width', attrs.width);\n } else {\n element.css('width', attrs.width + 'px');\n }\n }\n\n function updateHeight() {\n if (isNaN(attrs.height)) {\n element.css('height', attrs.height);\n } else {\n element.css('height', attrs.height + 'px');\n }\n }\n\n // If the width attribute defined update css\n // Then watch if bound property changes and update css\n if (isDefined(attrs.width)) {\n updateWidth();\n\n scope.$watch(\n function () {\n return element[0].getAttribute('width');\n },\n function () {\n updateWidth();\n map.invalidateSize();\n });\n }\n\n // If the height attribute defined update css\n // Then watch if bound property changes and update css\n if (isDefined(attrs.height)) {\n updateHeight();\n\n scope.$watch(\n function () {\n return element[0].getAttribute('height');\n },\n function () {\n updateHeight();\n map.invalidateSize();\n });\n }\n\n // Create the Leaflet Map Object with the options\n var map = new L.Map(element[0], leafletMapDefaults.getMapCreationDefaults(attrs.id));\n _leafletMap.resolve(map);\n\n if (!isDefined(attrs.center)) {\n map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);\n }\n\n // If no layers nor tiles defined, set the default tileLayer\n if (!isDefined(attrs.tiles) && (!isDefined(attrs.layers))) {\n var tileLayerObj = L.tileLayer(defaults.tileLayer, defaults.tileLayerOptions);\n tileLayerObj.addTo(map);\n leafletData.setTiles(tileLayerObj, attrs.id);\n }\n\n // Set zoom control configuration\n if (isDefined(map.zoomControl) &&\n isDefined(defaults.zoomControlPosition)) {\n map.zoomControl.setPosition(defaults.zoomControlPosition);\n }\n\n if (isDefined(map.zoomControl) &&\n defaults.zoomControl===false) {\n map.zoomControl.removeFrom(map);\n }\n\n if (isDefined(map.zoomsliderControl) &&\n isDefined(defaults.zoomsliderControl) &&\n defaults.zoomsliderControl===false) {\n map.zoomsliderControl.removeFrom(map);\n }\n\n\n // if no event-broadcast attribute, all events are broadcasted\n if (!isDefined(attrs.eventBroadcast)) {\n var logic = \"broadcast\";\n for (var i = 0; i < mapEvents.length; i++) {\n var eventName = mapEvents[i];\n map.on(eventName, genDispatchMapEvent(scope, eventName, logic), {\n eventName: eventName\n });\n }\n }\n\n // Resolve the map object to the promises\n map.whenReady(function() {\n leafletData.setMap(map, attrs.id);\n });\n\n scope.$on('$destroy', function () {\n map.remove();\n leafletData.unresolveMap(attrs.id);\n });\n\n //Handle request to invalidate the map size\n //Up scope using $scope.$emit('invalidateSize')\n //Down scope using $scope.$broadcast('invalidateSize')\n scope.$on('invalidateSize', function() {\n map.invalidateSize();\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").factory('leafletBoundsHelpers', function ($log, leafletHelpers) {\n\n var isArray = leafletHelpers.isArray,\n isNumber = leafletHelpers.isNumber;\n\n function _isValidBounds(bounds) {\n return angular.isDefined(bounds) && angular.isDefined(bounds.southWest) &&\n angular.isDefined(bounds.northEast) && angular.isNumber(bounds.southWest.lat) &&\n angular.isNumber(bounds.southWest.lng) && angular.isNumber(bounds.northEast.lat) &&\n angular.isNumber(bounds.northEast.lng);\n }\n\n return {\n createLeafletBounds: function(bounds) {\n if (_isValidBounds(bounds)) {\n return L.latLngBounds([bounds.southWest.lat, bounds.southWest.lng],\n [bounds.northEast.lat, bounds.northEast.lng ]);\n }\n },\n\n isValidBounds: _isValidBounds,\n\n createBoundsFromArray: function(boundsArray) {\n if (!(isArray(boundsArray) && boundsArray.length === 2 &&\n isArray(boundsArray[0]) && isArray(boundsArray[1]) &&\n boundsArray[0].length === 2 && boundsArray[1].length === 2 &&\n isNumber(boundsArray[0][0]) && isNumber(boundsArray[0][1]) &&\n isNumber(boundsArray[1][0]) && isNumber(boundsArray[1][1]))) {\n $log.error(\"[AngularJS - Leaflet] The bounds array is not valid.\");\n return;\n }\n\n return {\n northEast: {\n lat: boundsArray[0][0],\n lng: boundsArray[0][1]\n },\n southWest: {\n lat: boundsArray[1][0],\n lng: boundsArray[1][1]\n }\n };\n\n }\n };\n});\n","angular.module(\"leaflet-directive\").factory('leafletControlHelpers', function ($rootScope, $log, leafletHelpers, leafletMapDefaults) {\n var isObject = leafletHelpers.isObject,\n isDefined = leafletHelpers.isDefined;\n var _controls = {};\n\n var _controlLayersMustBeVisible = function(baselayers, overlays, mapId) {\n var defaults = leafletMapDefaults.getDefaults(mapId);\n if(!defaults.controls.layers.visible) {\n return false;\n }\n\n var numberOfLayers = 0;\n if (isObject(baselayers)) {\n numberOfLayers += Object.keys(baselayers).length;\n }\n if (isObject(overlays)) {\n numberOfLayers += Object.keys(overlays).length;\n }\n return numberOfLayers > 1;\n };\n\n var _createLayersControl = function(mapId) {\n var defaults = leafletMapDefaults.getDefaults(mapId);\n var controlOptions = {\n collapsed: defaults.controls.layers.collapsed,\n position: defaults.controls.layers.position\n };\n\n angular.extend(controlOptions, defaults.controls.layers.options);\n\n var control;\n if(defaults.controls.layers && isDefined(defaults.controls.layers.control)) {\n\t\t\tcontrol = defaults.controls.layers.control.apply(this, [[], [], controlOptions]);\n\t\t} else {\n\t\t\tcontrol = new L.control.layers([], [], controlOptions);\n\t\t}\n\n return control;\n };\n\n return {\n layersControlMustBeVisible: _controlLayersMustBeVisible,\n\n updateLayersControl: function(map, mapId, loaded, baselayers, overlays, leafletLayers) {\n var i;\n\n var _layersControl = _controls[mapId];\n var mustBeLoaded = _controlLayersMustBeVisible(baselayers, overlays, mapId);\n if (isDefined(_layersControl) && loaded) {\n for (i in leafletLayers.baselayers) {\n _layersControl.removeLayer(leafletLayers.baselayers[i]);\n }\n for (i in leafletLayers.overlays) {\n _layersControl.removeLayer(leafletLayers.overlays[i]);\n }\n _layersControl.removeFrom(map);\n delete _controls[mapId];\n }\n\n if (mustBeLoaded) {\n _layersControl = _createLayersControl(mapId);\n _controls[mapId] = _layersControl;\n for (i in baselayers) {\n var hideOnSelector = isDefined(baselayers[i].layerOptions) &&\n baselayers[i].layerOptions.showOnSelector === false;\n if (!hideOnSelector && isDefined(leafletLayers.baselayers[i])) {\n _layersControl.addBaseLayer(leafletLayers.baselayers[i], baselayers[i].name);\n }\n }\n for (i in overlays) {\n \tvar hideOverlayOnSelector = isDefined(overlays[i].layerOptions) &&\n overlays[i].layerOptions.showOnSelector === false;\n if (!hideOverlayOnSelector && isDefined(leafletLayers.overlays[i])) {\n _layersControl.addOverlay(leafletLayers.overlays[i], overlays[i].name);\n }\n }\n _layersControl.addTo(map);\n }\n return mustBeLoaded;\n }\n };\n});\n","angular.module(\"leaflet-directive\").service('leafletData', function ($log, $q, leafletHelpers) {\n var getDefer = leafletHelpers.getDefer,\n getUnresolvedDefer = leafletHelpers.getUnresolvedDefer,\n setResolvedDefer = leafletHelpers.setResolvedDefer;\n\n var _private = {};\n var self = this;\n\n var upperFirst = function (string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n };\n\n var _privateItems = [\n 'map',\n 'tiles',\n 'layers',\n 'paths',\n 'markers',\n 'geoJSON',\n 'UTFGrid', //odd ball on naming convention keeping to not break\n 'decorations',\n 'directiveControls'];\n\n //init\n _privateItems.forEach(function(itemName){\n _private[itemName] = {};\n });\n\n this.unresolveMap = function (scopeId) {\n var id = leafletHelpers.obtainEffectiveMapId(_private.map, scopeId);\n _privateItems.forEach(function (itemName) {\n _private[itemName][id] = undefined;\n });\n };\n\n //int repetitive stuff (get and sets)\n _privateItems.forEach(function (itemName) {\n var name = upperFirst(itemName);\n self['set' + name] = function (lObject, scopeId) {\n var defer = getUnresolvedDefer(_private[itemName], scopeId);\n defer.resolve(lObject);\n setResolvedDefer(_private[itemName], scopeId);\n };\n\n self['get' + name] = function (scopeId) {\n var defer = getDefer(_private[itemName], scopeId);\n return defer.promise;\n };\n });\n});\n","angular.module(\"leaflet-directive\")\n.service('leafletDirectiveControlsHelpers', function ($log, leafletData, leafletHelpers) {\n var _isDefined = leafletHelpers.isDefined,\n _isString = leafletHelpers.isString,\n _isObject = leafletHelpers.isObject,\n _mainErrorHeader = leafletHelpers.errorHeader;\n\n var _errorHeader = _mainErrorHeader + '[leafletDirectiveControlsHelpers';\n\n var _extend = function(id, thingToAddName, createFn, cleanFn){\n var _fnHeader = _errorHeader + '.extend] ';\n var extender = {};\n if(!_isDefined(thingToAddName)){\n $log.error(_fnHeader + 'thingToAddName cannot be undefined');\n return;\n }\n\n if(_isString(thingToAddName) && _isDefined(createFn) && _isDefined(cleanFn)){\n extender[thingToAddName] = {\n create: createFn,\n clean: cleanFn\n };\n }\n else if(_isObject(thingToAddName) && !_isDefined(createFn) && !_isDefined(cleanFn)){\n extender = thingToAddName;\n }\n else{\n $log.error(_fnHeader + 'incorrect arguments');\n return;\n }\n\n //add external control to create / destroy markers without a watch\n leafletData.getDirectiveControls().then(function(controls){\n angular.extend(controls, extender);\n leafletData.setDirectiveControls(controls, id);\n });\n };\n\n return {\n extend: _extend\n };\n});\n","angular.module(\"leaflet-directive\").factory('leafletEvents',\n function (leafletMapEvents, leafletMarkerEvents, leafletPathEvents) {\n var retObj = {};\n angular.extend(retObj,leafletMapEvents, leafletMarkerEvents, leafletPathEvents);\n return retObj;\n});\n","angular.module(\"leaflet-directive\")\n.service('leafletGeoJsonHelpers', function (leafletHelpers, leafletIterators) {\n var lHlp = leafletHelpers,\n lIt = leafletIterators;\n var Point = function(lat,lng){\n this.lat = lat;\n this.lng = lng;\n return this;\n };\n\n var _getLat = function(value) {\n if (Array.isArray(value) && value.length === 2) {\n return value[1];\n } else if (lHlp.isDefined(value.type) && value.type === 'Point') {\n return +value.coordinates[1];\n } else {\n return +value.lat;\n }\n };\n\n var _getLng = function(value) {\n if (Array.isArray(value) && value.length === 2) {\n return value[0];\n } else if (lHlp.isDefined(value.type) && value.type === 'Point') {\n return +value.coordinates[0];\n } else {\n return +value.lng;\n }\n };\n\n var _validateCoords = function(coords) {\n if (lHlp.isUndefined(coords)) {\n return false;\n }\n if (lHlp.isArray(coords)) {\n if (coords.length === 2 && lHlp.isNumber(coords[0]) && lHlp.isNumber(coords[1])) {\n return true;\n }\n } else if (lHlp.isDefined(coords.type)) {\n if (\n coords.type === 'Point' && lHlp.isArray(coords.coordinates) &&\n coords.coordinates.length === 2 &&\n lHlp.isNumber(coords.coordinates[0]) &&\n lHlp.isNumber(coords.coordinates[1])) {\n return true;\n }\n }\n\n var ret = lIt.all(['lat', 'lng'], function(pos){\n return lHlp.isDefined(coords[pos]) && lHlp.isNumber(coords[pos]);\n });\n return ret;\n };\n\n var _getCoords = function(value) {\n if (!value || !_validateCoords(value)) {\n return;\n }\n var p = null;\n if (Array.isArray(value) && value.length === 2) {\n p = new Point(value[1], value[0]);\n } else if (lHlp.isDefined(value.type) && value.type === 'Point') {\n p = new Point(value.coordinates[1], value.coordinates[0]);\n } else {\n return value;\n }\n //note angular.merge is avail in angular 1.4.X we might want to fill it here\n return angular.extend(value, p);//tap on lat, lng if it doesnt exist\n };\n\n\n return {\n getLat: _getLat,\n getLng: _getLng,\n validateCoords: _validateCoords,\n getCoords: _getCoords\n };\n });\n","angular.module(\"leaflet-directive\").factory('leafletHelpers', function ($q, $log) {\n var _errorHeader = '[AngularJS - Leaflet] ';\n var _copy = angular.copy;\n var _clone = _copy;\n /*\n For parsing paths to a field in an object\n\n Example:\n var obj = {\n bike:{\n 1: 'hi'\n 2: 'foo'\n }\n };\n _getObjectValue(obj,\"bike.1\") returns 'hi'\n this is getPath in ui-gmap\n */\n var _getObjectValue = function(object, pathStr) {\n var obj;\n if(!object || !angular.isObject(object))\n return;\n //if the key is not a sting then we already have the value\n if ((pathStr === null) || !angular.isString(pathStr)) {\n return pathStr;\n }\n obj = object;\n pathStr.split('.').forEach(function(value) {\n if (obj) {\n obj = obj[value];\n }\n });\n return obj;\n };\n\n /*\n Object Array Notation\n _getObjectArrayPath(\"bike.one.two\")\n returns:\n 'bike[\"one\"][\"two\"]'\n */\n var _getObjectArrayPath = function(pathStr){\n return pathStr.split('.').reduce(function(previous, current) {\n return previous + '[\"'+ current + '\"]';\n });\n };\n\n /* Object Dot Notation\n _getObjectPath([\"bike\",\"one\",\"two\"])\n returns:\n \"bike.one.two\"\n */\n var _getObjectDotPath = function(arrayOfStrings){\n return arrayOfStrings.reduce(function(previous, current) {\n return previous + '.' + current;\n });\n };\n\n function _obtainEffectiveMapId(d, mapId) {\n var id, i;\n if (!angular.isDefined(mapId)) {\n if (Object.keys(d).length === 0) {\n id = \"main\";\n } else if (Object.keys(d).length >= 1) {\n for (i in d) {\n if (d.hasOwnProperty(i)) {\n id = i;\n }\n }\n } else if (Object.keys(d).length === 0) {\n id = \"main\";\n } else {\n $log.error(_errorHeader + \"- You have more than 1 map on the DOM, you must provide the map ID to the leafletData.getXXX call\");\n }\n } else {\n id = mapId;\n }\n\n return id;\n }\n\n function _getUnresolvedDefer(d, mapId) {\n var id = _obtainEffectiveMapId(d, mapId),\n defer;\n\n if (!angular.isDefined(d[id]) || d[id].resolvedDefer === true) {\n defer = $q.defer();\n d[id] = {\n defer: defer,\n resolvedDefer: false\n };\n } else {\n defer = d[id].defer;\n }\n\n return defer;\n }\n\n var _isDefined = function(value) {\n return angular.isDefined(value) && value !== null;\n };\n var _isUndefined = function(value){\n return !_isDefined(value);\n };\n\n return {\n copy:_copy,\n clone:_clone,\n errorHeader: _errorHeader,\n getObjectValue: _getObjectValue,\n getObjectArrayPath:_getObjectArrayPath,\n getObjectDotPath: _getObjectDotPath,\n defaultTo: function(val, _default){\n return _isDefined(val) ? val : _default;\n },\n //mainly for checking attributes of directives lets keep this minimal (on what we accept)\n isTruthy: function(val){\n return val === 'true' || val === true;\n },\n //Determine if a reference is {}\n isEmpty: function(value) {\n return Object.keys(value).length === 0;\n },\n\n //Determine if a reference is undefined or {}\n isUndefinedOrEmpty: function (value) {\n return (angular.isUndefined(value) || value === null) || Object.keys(value).length === 0;\n },\n\n // Determine if a reference is defined\n isDefined: _isDefined,\n isUndefined:_isUndefined,\n // Determine if a reference is a number\n isNumber: function(value) {\n return angular.isNumber(value);\n },\n\n // Determine if a reference is a string\n isString: function(value) {\n return angular.isString(value);\n },\n\n // Determine if a reference is an array\n isArray: function(value) {\n return angular.isArray(value);\n },\n\n // Determine if a reference is an object\n isObject: function(value) {\n return angular.isObject(value);\n },\n\n // Determine if a reference is a function.\n isFunction: function(value) {\n return angular.isFunction(value);\n },\n\n // Determine if two objects have the same properties\n equals: function(o1, o2) {\n return angular.equals(o1, o2);\n },\n\n isValidCenter: function(center) {\n return angular.isDefined(center) && angular.isNumber(center.lat) &&\n angular.isNumber(center.lng) && angular.isNumber(center.zoom);\n },\n\n isValidPoint: function(point) {\n if (!angular.isDefined(point)) {\n return false;\n }\n if (angular.isArray(point)) {\n return point.length === 2 && angular.isNumber(point[0]) && angular.isNumber(point[1]);\n }\n return angular.isNumber(point.lat) && angular.isNumber(point.lng);\n },\n\n isSameCenterOnMap: function(centerModel, map) {\n var mapCenter = map.getCenter();\n var zoom = map.getZoom();\n if (centerModel.lat && centerModel.lng &&\n mapCenter.lat.toFixed(4) === centerModel.lat.toFixed(4) &&\n mapCenter.lng.toFixed(4) === centerModel.lng.toFixed(4) &&\n zoom === centerModel.zoom) {\n return true;\n }\n return false;\n },\n\n safeApply: function($scope, fn) {\n var phase = $scope.$root.$$phase;\n if (phase === '$apply' || phase === '$digest') {\n $scope.$eval(fn);\n } else {\n $scope.$evalAsync(fn);\n }\n },\n\n obtainEffectiveMapId: _obtainEffectiveMapId,\n\n getDefer: function(d, mapId) {\n var id = _obtainEffectiveMapId(d, mapId),\n defer;\n if (!angular.isDefined(d[id]) || d[id].resolvedDefer === false) {\n defer = _getUnresolvedDefer(d, mapId);\n } else {\n defer = d[id].defer;\n }\n return defer;\n },\n\n getUnresolvedDefer: _getUnresolvedDefer,\n\n setResolvedDefer: function(d, mapId) {\n var id = _obtainEffectiveMapId(d, mapId);\n d[id].resolvedDefer = true;\n },\n\n AwesomeMarkersPlugin: {\n isLoaded: function() {\n if (angular.isDefined(L.AwesomeMarkers) && angular.isDefined(L.AwesomeMarkers.Icon)) {\n return true;\n } else {\n return false;\n }\n },\n is: function(icon) {\n if (this.isLoaded()) {\n return icon instanceof L.AwesomeMarkers.Icon;\n } else {\n return false;\n }\n },\n equal: function (iconA, iconB) {\n if (!this.isLoaded()) {\n return false;\n }\n if (this.is(iconA)) {\n return angular.equals(iconA, iconB);\n } else {\n return false;\n }\n }\n },\n\n PolylineDecoratorPlugin: {\n isLoaded: function() {\n if (angular.isDefined(L.PolylineDecorator)) {\n return true;\n } else {\n return false;\n }\n },\n is: function(decoration) {\n if (this.isLoaded()) {\n return decoration instanceof L.PolylineDecorator;\n } else {\n return false;\n }\n },\n equal: function(decorationA, decorationB) {\n if (!this.isLoaded()) {\n return false;\n }\n if (this.is(decorationA)) {\n return angular.equals(decorationA, decorationB);\n } else {\n return false;\n }\n }\n },\n\n MakiMarkersPlugin: {\n isLoaded: function() {\n if (angular.isDefined(L.MakiMarkers) && angular.isDefined(L.MakiMarkers.Icon)) {\n return true;\n } else {\n return false;\n }\n },\n is: function(icon) {\n if (this.isLoaded()) {\n return icon instanceof L.MakiMarkers.Icon;\n } else {\n return false;\n }\n },\n equal: function (iconA, iconB) {\n if (!this.isLoaded()) {\n return false;\n }\n if (this.is(iconA)) {\n return angular.equals(iconA, iconB);\n } else {\n return false;\n }\n }\n },\n ExtraMarkersPlugin: {\n isLoaded: function () {\n if (angular.isDefined(L.ExtraMarkers) && angular.isDefined(L.ExtraMarkers.Icon)) {\n return true;\n } else {\n return false;\n }\n },\n is: function (icon) {\n if (this.isLoaded()) {\n return icon instanceof L.ExtraMarkers.Icon;\n } else {\n return false;\n }\n },\n equal: function (iconA, iconB) {\n if (!this.isLoaded()) {\n return false;\n }\n if (this.is(iconA)) {\n return angular.equals(iconA, iconB);\n } else {\n return false;\n }\n }\n },\n LabelPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.Label);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.MarkerClusterGroup;\n } else {\n return false;\n }\n }\n },\n MarkerClusterPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.MarkerClusterGroup);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.MarkerClusterGroup;\n } else {\n return false;\n }\n }\n },\n GoogleLayerPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.Google);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.Google;\n } else {\n return false;\n }\n }\n },\n ChinaLayerPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.tileLayer.chinaProvider);\n }\n },\n HeatMapLayerPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.TileLayer.WebGLHeatMap);\n }\n },\n BingLayerPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.BingLayer);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.BingLayer;\n } else {\n return false;\n }\n }\n },\n WFSLayerPlugin: {\n isLoaded: function() {\n return L.GeoJSON.WFS !== undefined;\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.GeoJSON.WFS;\n } else {\n return false;\n }\n }\n },\n AGSLayerPlugin: {\n isLoaded: function() {\n return lvector !== undefined && lvector.AGS !== undefined;\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof lvector.AGS;\n } else {\n return false;\n }\n }\n },\n YandexLayerPlugin: {\n isLoaded: function() {\n return angular.isDefined(L.Yandex);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.Yandex;\n } else {\n return false;\n }\n }\n },\n DynamicMapLayerPlugin: {\n isLoaded: function () {\n return L.esri !== undefined && L.esri.dynamicMapLayer !== undefined;\n },\n is: function (layer) {\n if (this.isLoaded()) {\n return layer instanceof L.esri.dynamicMapLayer;\n } else {\n return false;\n }\n }\n },\n GeoJSONPlugin: {\n isLoaded: function(){\n return angular.isDefined(L.TileLayer.GeoJSON);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.TileLayer.GeoJSON;\n } else {\n return false;\n }\n }\n },\n UTFGridPlugin: {\n isLoaded: function(){\n return angular.isDefined(L.UtfGrid);\n },\n is: function(layer) {\n if (this.isLoaded()) {\n return layer instanceof L.UtfGrid;\n } else {\n $log.error('[AngularJS - Leaflet] No UtfGrid plugin found.');\n return false;\n }\n }\n },\n CartoDB: {\n isLoaded: function(){\n return cartodb;\n },\n is: function(/*layer*/) {\n return true;\n /*\n if (this.isLoaded()) {\n return layer instanceof L.TileLayer.GeoJSON;\n } else {\n return false;\n }*/\n }\n },\n Leaflet: {\n DivIcon: {\n is: function(icon) {\n return icon instanceof L.DivIcon;\n },\n equal: function(iconA, iconB) {\n if (this.is(iconA)) {\n return angular.equals(iconA, iconB);\n } else {\n return false;\n }\n }\n },\n Icon: {\n is: function(icon) {\n return icon instanceof L.Icon;\n },\n equal: function(iconA, iconB) {\n if (this.is(iconA)) {\n return angular.equals(iconA, iconB);\n } else {\n return false;\n }\n }\n }\n },\n /*\n watchOptions - object to set deep nested watches and turn off watches all together\n (rely on control / functional updates)\n watchOptions - Object\n doWatch:boolean\n isDeep:boolean (sets $watch(function,isDeep))\n individual\n doWatch:boolean\n isDeep:boolean\n */\n //legacy defaults\n watchOptions: {\n doWatch:true,\n isDeep: true,\n individual:{\n doWatch:true,\n isDeep: true\n }\n }\n };\n});\n","angular.module('leaflet-directive').service('leafletIterators', function ($log, leafletHelpers) {\n\n var lHlp = leafletHelpers,\n errorHeader = leafletHelpers.errorHeader + 'leafletIterators: ';\n\n //BEGIN COPY from underscore\n var _keys = Object.keys;\n var _isFunction = lHlp.isFunction;\n var _isObject = lHlp.isObject;\n\n // Helper for collection methods to determine whether a collection\n // should be iterated as an array or as an object\n // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n\n var _isArrayLike = function(collection) {\n var length = collection !== null && collection.length;\n return lHlp.isNumber(length) && length >= 0 && length <= MAX_ARRAY_INDEX;\n };\n\n // Keep the identity function around for default iteratees.\n var _identity = function(value) {\n return value;\n };\n\n var _property = function(key) {\n return function(obj) {\n return obj === null ? void 0 : obj[key];\n };\n };\n\n // Internal function that returns an efficient (for current engines) version\n // of the passed-in callback, to be repeatedly applied in other Underscore\n // functions.\n var optimizeCb = function(func, context, argCount) {\n if (context === void 0) return func;\n switch (argCount === null ? 3 : argCount) {\n case 1: return function(value) {\n return func.call(context, value);\n };\n case 2: return function(value, other) {\n return func.call(context, value, other);\n };\n case 3: return function(value, index, collection) {\n return func.call(context, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(context, accumulator, value, index, collection);\n };\n }\n return function() {\n return func.apply(context, arguments);\n };\n };\n\n // An internal function for creating assigner functions.\n var createAssigner = function(keysFunc, undefinedOnly) {\n return function(obj) {\n var length = arguments.length;\n if (length < 2 || obj === null) return obj;\n for (var index = 1; index < length; index++) {\n var source = arguments[index],\n keys = keysFunc(source),\n l = keys.length;\n for (var i = 0; i < l; i++) {\n var key = keys[i];\n if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];\n }\n }\n return obj;\n };\n };\n\n // Assigns a given object with all the own properties in the passed-in object(s)\n // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n var _extendOwn, _assign = null;\n _extendOwn = _assign = createAssigner(_keys);\n\n // Returns whether an object has a given set of `key:value` pairs.\n var _isMatch = function(object, attrs) {\n var keys = _keys(attrs), length = keys.length;\n if (object === null) return !length;\n var obj = Object(object);\n for (var i = 0; i < length; i++) {\n var key = keys[i];\n if (attrs[key] !== obj[key] || !(key in obj)) return false;\n }\n return true;\n };\n\n // Returns a predicate for checking whether an object has a given set of\n // `key:value` pairs.\n var _matcher, _matches = null;\n _matcher = _matches = function(attrs) {\n attrs = _extendOwn({}, attrs);\n return function(obj) {\n return _isMatch(obj, attrs);\n };\n };\n\n\n // A mostly-internal function to generate callbacks that can be applied\n // to each element in a collection, returning the desired result — either\n // identity, an arbitrary callback, a property matcher, or a property accessor.\n var cb = function(value, context, argCount) {\n if (value === null) return _identity;\n if (_isFunction(value)) return optimizeCb(value, context, argCount);\n if (_isObject(value)) return _matcher(value);\n return _property(value);\n };\n\n var _every, _all = null;\n _every = _all = function(obj, predicate, context) {\n predicate = cb(predicate, context);\n var keys = !_isArrayLike(obj) && _keys(obj),\n length = (keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = keys ? keys[index] : index;\n if (!predicate(obj[currentKey], currentKey, obj)) return false;\n }\n return true;\n };\n\n //END COPY fron underscore\n\n var _hasErrors = function(collection, cb, ignoreCollection, cbName){\n if(!ignoreCollection) {\n if (!lHlp.isDefined(collection) || !lHlp.isDefined(cb)) {\n $log.error(errorHeader + 'collection or cb undefined');\n return true;\n }\n }\n if(!lHlp.isFunction(cb)){\n cbName = lHlp.defaultTo(cb,'cb');\n $log.error(errorHeader + cbName + ' is not a function');\n return true;\n }\n return false;\n };\n\n var _iterate = function(collection, externalCb, internalCb){\n if(_hasErrors(undefined, internalCb, true, 'internalCb')){\n return;\n }\n if(!_hasErrors(collection, externalCb)){\n for(var key in collection){\n internalCb(collection[key], key);\n }\n }\n };\n\n\n //consider adding lodash or underscore but for now adding iterators as we need them\n var _each = function(collection, cb){\n _iterate(collection, cb, function(val, key){\n cb(val, key);\n });\n };\n\n //lodash or underscore have preference\n return window._ ? window._ : {\n each:_each,\n every: _every,\n all: _all\n };\n});\n","angular.module(\"leaflet-directive\")\n.factory('leafletLayerHelpers', function ($rootScope, $log, leafletHelpers) {\n var Helpers = leafletHelpers,\n isString = leafletHelpers.isString,\n isObject = leafletHelpers.isObject,\n isDefined = leafletHelpers.isDefined;\n\n var utfGridCreateLayer = function(params) {\n if (!Helpers.UTFGridPlugin.isLoaded()) {\n $log.error('[AngularJS - Leaflet] The UTFGrid plugin is not loaded.');\n return;\n }\n var utfgrid = new L.UtfGrid(params.url, params.pluginOptions);\n\n utfgrid.on('mouseover', function(e) {\n $rootScope.$broadcast('leafletDirectiveMap.utfgridMouseover', e);\n });\n\n utfgrid.on('mouseout', function(e) {\n $rootScope.$broadcast('leafletDirectiveMap.utfgridMouseout', e);\n });\n\n utfgrid.on('click', function(e) {\n $rootScope.$broadcast('leafletDirectiveMap.utfgridClick', e);\n });\n\n return utfgrid;\n };\n\n var layerTypes = {\n xyz: {\n mustHaveUrl: true,\n createLayer: function(params) {\n return L.tileLayer(params.url, params.options);\n }\n },\n mapbox: {\n mustHaveKey: true,\n createLayer: function(params) {\n var url = '//{s}.tiles.mapbox.com/v3/' + params.key + '/{z}/{x}/{y}.png';\n return L.tileLayer(url, params.options);\n }\n },\n geoJSON: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!Helpers.GeoJSONPlugin.isLoaded()) {\n return;\n }\n return new L.TileLayer.GeoJSON(params.url, params.pluginOptions, params.options);\n }\n },\n utfGrid: {\n mustHaveUrl: true,\n createLayer: utfGridCreateLayer\n },\n cartodbTiles: {\n mustHaveKey: true,\n createLayer: function(params) {\n var url = '//' + params.user + '.cartodb.com/api/v1/map/' + params.key + '/{z}/{x}/{y}.png';\n return L.tileLayer(url, params.options);\n }\n },\n cartodbUTFGrid: {\n mustHaveKey: true,\n mustHaveLayer : true,\n createLayer: function(params) {\n params.url = '//' + params.user + '.cartodb.com/api/v1/map/' + params.key + '/' + params.layer + '/{z}/{x}/{y}.grid.json';\n return utfGridCreateLayer(params);\n }\n },\n cartodbInteractive: {\n mustHaveKey: true,\n mustHaveLayer : true,\n createLayer: function(params) {\n var tilesURL = '//' + params.user + '.cartodb.com/api/v1/map/' + params.key + '/{z}/{x}/{y}.png';\n var tileLayer = L.tileLayer(tilesURL, params.options);\n params.url = '//' + params.user + '.cartodb.com/api/v1/map/' + params.key + '/' + params.layer + '/{z}/{x}/{y}.grid.json';\n var utfLayer = utfGridCreateLayer(params);\n return L.layerGroup([tileLayer, utfLayer]);\n }\n },\n wms: {\n mustHaveUrl: true,\n createLayer: function(params) {\n return L.tileLayer.wms(params.url, params.options);\n }\n },\n wmts: {\n mustHaveUrl: true,\n createLayer: function(params) {\n return L.tileLayer.wmts(params.url, params.options);\n }\n },\n wfs: {\n mustHaveUrl: true,\n mustHaveLayer : true,\n createLayer: function(params) {\n if (!Helpers.WFSLayerPlugin.isLoaded()) {\n return;\n }\n var options = angular.copy(params.options);\n if(options.crs && 'string' === typeof options.crs) {\n /*jshint -W061 */\n options.crs = eval(options.crs);\n }\n return new L.GeoJSON.WFS(params.url, params.layer, options);\n }\n },\n group: {\n mustHaveUrl: false,\n createLayer: function (params) {\n var lyrs = [];\n angular.forEach(params.options.layers, function(l){\n lyrs.push(createLayer(l));\n });\n return L.layerGroup(lyrs);\n }\n },\n featureGroup: {\n mustHaveUrl: false,\n createLayer: function () {\n return L.featureGroup();\n }\n },\n google: {\n mustHaveUrl: false,\n createLayer: function(params) {\n var type = params.type || 'SATELLITE';\n if (!Helpers.GoogleLayerPlugin.isLoaded()) {\n return;\n }\n return new L.Google(type, params.options);\n }\n },\n china:{\n mustHaveUrl:false,\n createLayer:function(params){\n var type = params.type || '';\n if(!Helpers.ChinaLayerPlugin.isLoaded()){\n return;\n }\n return L.tileLayer.chinaProvider(type, params.options);\n }\n },\n ags: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!Helpers.AGSLayerPlugin.isLoaded()) {\n return;\n }\n\n var options = angular.copy(params.options);\n angular.extend(options, {\n url: params.url\n });\n var layer = new lvector.AGS(options);\n layer.onAdd = function(map) {\n this.setMap(map);\n };\n layer.onRemove = function() {\n this.setMap(null);\n };\n return layer;\n }\n },\n dynamic: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!Helpers.DynamicMapLayerPlugin.isLoaded()) {\n return;\n }\n return L.esri.dynamicMapLayer(params.url, params.options);\n }\n },\n markercluster: {\n mustHaveUrl: false,\n createLayer: function(params) {\n if (!Helpers.MarkerClusterPlugin.isLoaded()) {\n $log.error('[AngularJS - Leaflet] The markercluster plugin is not loaded.');\n return;\n }\n return new L.MarkerClusterGroup(params.options);\n }\n },\n bing: {\n mustHaveUrl: false,\n createLayer: function(params) {\n if (!Helpers.BingLayerPlugin.isLoaded()) {\n return;\n }\n return new L.BingLayer(params.key, params.options);\n }\n },\n heatmap: {\n mustHaveUrl: false,\n mustHaveData: true,\n createLayer: function(params) {\n if (!Helpers.HeatMapLayerPlugin.isLoaded()) {\n return;\n }\n var layer = new L.TileLayer.WebGLHeatMap(params.options);\n if (isDefined(params.data)) {\n layer.setData(params.data);\n }\n\n return layer;\n }\n },\n yandex: {\n mustHaveUrl: false,\n createLayer: function(params) {\n var type = params.type || 'map';\n if (!Helpers.YandexLayerPlugin.isLoaded()) {\n return;\n }\n return new L.Yandex(type, params.options);\n }\n },\n imageOverlay: {\n mustHaveUrl: true,\n mustHaveBounds : true,\n createLayer: function(params) {\n return L.imageOverlay(params.url, params.bounds, params.options);\n }\n },\n\n // This \"custom\" type is used to accept every layer that user want to define himself.\n // We can wrap these custom layers like heatmap or yandex, but it means a lot of work/code to wrap the world,\n // so we let user to define their own layer outside the directive,\n // and pass it on \"createLayer\" result for next processes\n custom: {\n createLayer: function (params) {\n if (params.layer instanceof L.Class) {\n return angular.copy(params.layer);\n }\n else {\n $log.error('[AngularJS - Leaflet] A custom layer must be a leaflet Class');\n }\n }\n },\n cartodb: {\n mustHaveUrl: true,\n createLayer: function(params) {\n return cartodb.createLayer(params.map, params.url);\n }\n }\n };\n\n function isValidLayerType(layerDefinition) {\n // Check if the baselayer has a valid type\n if (!isString(layerDefinition.type)) {\n $log.error('[AngularJS - Leaflet] A layer must have a valid type defined.');\n return false;\n }\n\n if (Object.keys(layerTypes).indexOf(layerDefinition.type) === -1) {\n $log.error('[AngularJS - Leaflet] A layer must have a valid type: ' + Object.keys(layerTypes));\n return false;\n }\n\n // Check if the layer must have an URL\n if (layerTypes[layerDefinition.type].mustHaveUrl && !isString(layerDefinition.url)) {\n $log.error('[AngularJS - Leaflet] A base layer must have an url');\n return false;\n }\n\n if (layerTypes[layerDefinition.type].mustHaveData && !isDefined(layerDefinition.data)) {\n $log.error('[AngularJS - Leaflet] The base layer must have a \"data\" array attribute');\n return false;\n }\n\n if(layerTypes[layerDefinition.type].mustHaveLayer && !isDefined(layerDefinition.layer)) {\n $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have an layer defined');\n return false;\n }\n\n if (layerTypes[layerDefinition.type].mustHaveBounds && !isDefined(layerDefinition.bounds)) {\n $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have bounds defined');\n return false ;\n }\n\n if (layerTypes[layerDefinition.type].mustHaveKey && !isDefined(layerDefinition.key)) {\n $log.error('[AngularJS - Leaflet] The type of layer ' + layerDefinition.type + ' must have key defined');\n return false ;\n }\n return true;\n }\n\n function createLayer(layerDefinition) {\n if (!isValidLayerType(layerDefinition)) {\n return;\n }\n\n if (!isString(layerDefinition.name)) {\n $log.error('[AngularJS - Leaflet] A base layer must have a name');\n return;\n }\n if (!isObject(layerDefinition.layerParams)) {\n layerDefinition.layerParams = {};\n }\n if (!isObject(layerDefinition.layerOptions)) {\n layerDefinition.layerOptions = {};\n }\n\n // Mix the layer specific parameters with the general Leaflet options. Although this is an overhead\n // the definition of a base layers is more 'clean' if the two types of parameters are differentiated\n for (var attrname in layerDefinition.layerParams) {\n layerDefinition.layerOptions[attrname] = layerDefinition.layerParams[attrname];\n }\n\n var params = {\n url: layerDefinition.url,\n data: layerDefinition.data,\n options: layerDefinition.layerOptions,\n layer: layerDefinition.layer,\n type: layerDefinition.layerType,\n bounds: layerDefinition.bounds,\n key: layerDefinition.key,\n pluginOptions: layerDefinition.pluginOptions,\n user: layerDefinition.user\n };\n\n //TODO Add $watch to the layer properties\n return layerTypes[layerDefinition.type].createLayer(params);\n }\n\n return {\n createLayer: createLayer\n };\n});\n","angular.module(\"leaflet-directive\").factory('leafletLegendHelpers', function () {\n\tvar _updateLegend = function(div, legendData, type, url) {\n\t\tdiv.innerHTML = '';\n\t\tif(legendData.error) {\n\t\t\tdiv.innerHTML += '
' + legendData.error.message + '
';\n\t\t} else {\n\t\t\tif (type === 'arcgis') {\n\t\t\t\tfor (var i = 0; i < legendData.layers.length; i++) {\n\t\t\t\t\tvar layer = legendData.layers[i];\n\t\t\t\t\tdiv.innerHTML += '
' + layer.layerName + '
';\n\t\t\t\t\tfor(var j = 0; j < layer.legend.length; j++) {\n\t\t\t\t\t\tvar leg = layer.legend[j];\n\t\t\t\t\t\tdiv.innerHTML +=\n\t\t\t\t\t\t\t'
' +\n\t\t\t\t\t\t\t'
' + leg.label + '
';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (type === 'image') {\n\t\t\t\tdiv.innerHTML = '';\n\t\t\t}\n\t\t}\n\t};\n\n\tvar _getOnAddLegend = function(legendData, legendClass, type, url) {\n\t\treturn function(/*map*/) {\n\t\t\tvar div = L.DomUtil.create('div', legendClass);\n\n\t\t\tif (!L.Browser.touch) {\n\t\t\t\tL.DomEvent.disableClickPropagation(div);\n\t\t\t\tL.DomEvent.on(div, 'mousewheel', L.DomEvent.stopPropagation);\n\t\t\t} else {\n\t\t\t\tL.DomEvent.on(div, 'click', L.DomEvent.stopPropagation);\n\t\t\t}\n\t\t\t_updateLegend(div, legendData, type, url);\n\t\t\treturn div;\n\t\t};\n\t};\n\n\tvar _getOnAddArrayLegend = function(legend, legendClass) {\n\t\treturn function(/*map*/) {\n\t\t\tvar div = L.DomUtil.create('div', legendClass);\n for (var i = 0; i < legend.colors.length; i++) {\n div.innerHTML +=\n '
' +\n '
' + legend.labels[i] + '
';\n }\n if (!L.Browser.touch) {\n\t\t\t\tL.DomEvent.disableClickPropagation(div);\n\t\t\t\tL.DomEvent.on(div, 'mousewheel', L.DomEvent.stopPropagation);\n\t\t\t} else {\n\t\t\t\tL.DomEvent.on(div, 'click', L.DomEvent.stopPropagation);\n\t\t\t}\n return div;\n\t\t};\n\t};\n\n\treturn {\n\t\tgetOnAddLegend: _getOnAddLegend,\n\t\tgetOnAddArrayLegend: _getOnAddArrayLegend,\n\t\tupdateLegend: _updateLegend,\n\t};\n});\n","angular.module(\"leaflet-directive\").factory('leafletMapDefaults', function ($q, leafletHelpers) {\n function _getDefaults() {\n return {\n keyboard: true,\n dragging: true,\n worldCopyJump: false,\n doubleClickZoom: true,\n scrollWheelZoom: true,\n tap: true,\n touchZoom: true,\n zoomControl: true,\n zoomsliderControl: false,\n zoomControlPosition: 'topleft',\n attributionControl: true,\n controls: {\n layers: {\n visible: true,\n position: 'topright',\n collapsed: true\n }\n },\n crs: L.CRS.EPSG3857,\n tileLayer: '//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n tileLayerOptions: {\n attribution: '© OpenStreetMap contributors'\n },\n path: {\n weight: 10,\n opacity: 1,\n color: '#0000ff'\n },\n center: {\n lat: 0,\n lng: 0,\n zoom: 1\n }\n };\n }\n\n var isDefined = leafletHelpers.isDefined,\n isObject = leafletHelpers.isObject,\n obtainEffectiveMapId = leafletHelpers.obtainEffectiveMapId,\n defaults = {};\n\n // Get the _defaults dictionary, and override the properties defined by the user\n return {\n getDefaults: function (scopeId) {\n var mapId = obtainEffectiveMapId(defaults, scopeId);\n return defaults[mapId];\n },\n\n getMapCreationDefaults: function (scopeId) {\n var mapId = obtainEffectiveMapId(defaults, scopeId);\n var d = defaults[mapId];\n\n var mapDefaults = {\n maxZoom: d.maxZoom,\n keyboard: d.keyboard,\n dragging: d.dragging,\n zoomControl: d.zoomControl,\n doubleClickZoom: d.doubleClickZoom,\n scrollWheelZoom: d.scrollWheelZoom,\n tap: d.tap,\n touchZoom: d.touchZoom,\n attributionControl: d.attributionControl,\n worldCopyJump: d.worldCopyJump,\n crs: d.crs\n };\n\n if (isDefined(d.minZoom)) {\n mapDefaults.minZoom = d.minZoom;\n }\n\n if (isDefined(d.zoomAnimation)) {\n mapDefaults.zoomAnimation = d.zoomAnimation;\n }\n\n if (isDefined(d.fadeAnimation)) {\n mapDefaults.fadeAnimation = d.fadeAnimation;\n }\n\n if (isDefined(d.markerZoomAnimation)) {\n mapDefaults.markerZoomAnimation = d.markerZoomAnimation;\n }\n\n if (d.map) {\n for (var option in d.map) {\n mapDefaults[option] = d.map[option];\n }\n }\n\n return mapDefaults;\n },\n\n setDefaults: function (userDefaults, scopeId) {\n var newDefaults = _getDefaults();\n\n if (isDefined(userDefaults)) {\n newDefaults.doubleClickZoom = isDefined(userDefaults.doubleClickZoom) ? userDefaults.doubleClickZoom : newDefaults.doubleClickZoom;\n newDefaults.scrollWheelZoom = isDefined(userDefaults.scrollWheelZoom) ? userDefaults.scrollWheelZoom : newDefaults.doubleClickZoom;\n newDefaults.tap = isDefined(userDefaults.tap) ? userDefaults.tap : newDefaults.tap;\n newDefaults.touchZoom = isDefined(userDefaults.touchZoom) ? userDefaults.touchZoom : newDefaults.doubleClickZoom;\n newDefaults.zoomControl = isDefined(userDefaults.zoomControl) ? userDefaults.zoomControl : newDefaults.zoomControl;\n newDefaults.zoomsliderControl = isDefined(userDefaults.zoomsliderControl) ? userDefaults.zoomsliderControl : newDefaults.zoomsliderControl;\n newDefaults.attributionControl = isDefined(userDefaults.attributionControl) ? userDefaults.attributionControl : newDefaults.attributionControl;\n newDefaults.tileLayer = isDefined(userDefaults.tileLayer) ? userDefaults.tileLayer : newDefaults.tileLayer;\n newDefaults.zoomControlPosition = isDefined(userDefaults.zoomControlPosition) ? userDefaults.zoomControlPosition : newDefaults.zoomControlPosition;\n newDefaults.keyboard = isDefined(userDefaults.keyboard) ? userDefaults.keyboard : newDefaults.keyboard;\n newDefaults.dragging = isDefined(userDefaults.dragging) ? userDefaults.dragging : newDefaults.dragging;\n\n if (isDefined(userDefaults.controls)) {\n angular.extend(newDefaults.controls, userDefaults.controls);\n }\n\n if (isObject(userDefaults.crs)) {\n newDefaults.crs = userDefaults.crs;\n } else if (isDefined(L.CRS[userDefaults.crs])) {\n newDefaults.crs = L.CRS[userDefaults.crs];\n }\n\n if (isDefined(userDefaults.center)) {\n angular.copy(userDefaults.center, newDefaults.center);\n }\n\n if (isDefined(userDefaults.tileLayerOptions)) {\n angular.copy(userDefaults.tileLayerOptions, newDefaults.tileLayerOptions);\n }\n\n if (isDefined(userDefaults.maxZoom)) {\n newDefaults.maxZoom = userDefaults.maxZoom;\n }\n\n if (isDefined(userDefaults.minZoom)) {\n newDefaults.minZoom = userDefaults.minZoom;\n }\n\n if (isDefined(userDefaults.zoomAnimation)) {\n newDefaults.zoomAnimation = userDefaults.zoomAnimation;\n }\n\n if (isDefined(userDefaults.fadeAnimation)) {\n newDefaults.fadeAnimation = userDefaults.fadeAnimation;\n }\n\n if (isDefined(userDefaults.markerZoomAnimation)) {\n newDefaults.markerZoomAnimation = userDefaults.markerZoomAnimation;\n }\n\n if (isDefined(userDefaults.worldCopyJump)) {\n newDefaults.worldCopyJump = userDefaults.worldCopyJump;\n }\n\n if (isDefined(userDefaults.map)) {\n newDefaults.map = userDefaults.map;\n }\n \n if (isDefined(userDefaults.path)) {\n newDefaults.path = userDefaults.path;\n }\n }\n\n var mapId = obtainEffectiveMapId(defaults, scopeId);\n defaults[mapId] = newDefaults;\n return newDefaults;\n }\n };\n});\n","angular.module(\"leaflet-directive\")\n.service('leafletMarkersHelpers', function ($rootScope, leafletHelpers, $log, $compile,\n leafletGeoJsonHelpers) {\n\n var isDefined = leafletHelpers.isDefined,\n defaultTo = leafletHelpers.defaultTo,\n MarkerClusterPlugin = leafletHelpers.MarkerClusterPlugin,\n AwesomeMarkersPlugin = leafletHelpers.AwesomeMarkersPlugin,\n MakiMarkersPlugin = leafletHelpers.MakiMarkersPlugin,\n ExtraMarkersPlugin = leafletHelpers.ExtraMarkersPlugin,\n safeApply = leafletHelpers.safeApply,\n Helpers = leafletHelpers,\n isString = leafletHelpers.isString,\n isNumber = leafletHelpers.isNumber,\n isObject = leafletHelpers.isObject,\n groups = {},\n geoHlp = leafletGeoJsonHelpers,\n errorHeader = leafletHelpers.errorHeader;\n\n\n var _string = function(marker){\n //this exists since JSON.stringify barfs on cyclic\n var retStr = '';\n ['_icon', '_latlng', '_leaflet_id', '_map', '_shadow'].forEach(function(prop){\n retStr += prop + ': ' + defaultTo(marker[prop], 'undefined') + ' \\n';\n });\n return '[leafletMarker] : \\n' + retStr;\n };\n var _log = function(marker, useConsole){\n var logger = useConsole? console : $log;\n logger.debug(_string(marker));\n };\n\n var createLeafletIcon = function(iconData) {\n if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'awesomeMarker') {\n if (!AwesomeMarkersPlugin.isLoaded()) {\n $log.error( errorHeader + ' The AwesomeMarkers Plugin is not loaded.');\n }\n\n return new L.AwesomeMarkers.icon(iconData);\n }\n\n if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'makiMarker') {\n if (!MakiMarkersPlugin.isLoaded()) {\n $log.error(errorHeader + 'The MakiMarkers Plugin is not loaded.');\n }\n\n return new L.MakiMarkers.icon(iconData);\n }\n\n if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'extraMarker') {\n if (!ExtraMarkersPlugin.isLoaded()) {\n $log.error(errorHeader + 'The ExtraMarkers Plugin is not loaded.');\n }\n return new L.ExtraMarkers.icon(iconData);\n }\n\n if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'div') {\n return new L.divIcon(iconData);\n }\n\n // allow for any custom icon to be used... assumes the icon has already been initialized\n if (isDefined(iconData) && isDefined(iconData.type) && iconData.type === 'icon') {\n return iconData.icon;\n }\n\n var base64icon = \"data:image/png;base64,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\";\n var base64shadow = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAYAAACoYAD2AAAC5ElEQVRYw+2YW4/TMBCF45S0S1luXZCABy5CgLQgwf//S4BYBLTdJLax0fFqmB07nnQfEGqkIydpVH85M+NLjPe++dcPc4Q8Qh4hj5D/AaQJx6H/4TMwB0PeBNwU7EGQAmAtsNfAzoZkgIa0ZgLMa4Aj6CxIAsjhjOCoL5z7Glg1JAOkaicgvQBXuncwJAWjksLtBTWZe04CnYRktUGdilALppZBOgHGZcBzL6OClABvMSVIzyBjazOgrvACf1ydC5mguqAVg6RhdkSWQFj2uxfaq/BrIZOLEWgZdALIDvcMcZLD8ZbLC9de4yR1sYMi4G20S4Q/PWeJYxTOZn5zJXANZHIxAd4JWhPIloTJZhzMQduM89WQ3MUVAE/RnhAXpTycqys3NZALOBbB7kFrgLesQl2h45Fcj8L1tTSohUwuxhy8H/Qg6K7gIs+3kkaigQCOcyEXCHN07wyQazhrmIulvKMQAwMcmLNqyCVyMAI+BuxSMeTk3OPikLY2J1uE+VHQk6ANrhds+tNARqBeaGc72cK550FP4WhXmFmcMGhTwAR1ifOe3EvPqIegFmF+C8gVy0OfAaWQPMR7gF1OQKqGoBjq90HPMP01BUjPOqGFksC4emE48tWQAH0YmvOgF3DST6xieJgHAWxPAHMuNhrImIdvoNOKNWIOcE+UXE0pYAnkX6uhWsgVXDxHdTfCmrEEmMB2zMFimLVOtiiajxiGWrbU52EeCdyOwPEQD8LqyPH9Ti2kgYMf4OhSKB7qYILbBv3CuVTJ11Y80oaseiMWOONc/Y7kJYe0xL2f0BaiFTxknHO5HaMGMublKwxFGzYdWsBF174H/QDknhTHmHHN39iWFnkZx8lPyM8WHfYELmlLKtgWNmFNzQcC1b47gJ4hL19i7o65dhH0Negbca8vONZoP7doIeOC9zXm8RjuL0Gf4d4OYaU5ljo3GYiqzrWQHfJxA6ALhDpVKv9qYeZA8eM3EhfPSCmpuD0AAAAASUVORK5CYII=\";\n\n if (!isDefined(iconData) || !isDefined(iconData.iconUrl)) {\n return new L.Icon.Default({\n iconUrl: base64icon,\n shadowUrl: base64shadow,\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n });\n }\n\n return new L.Icon(iconData);\n };\n\n var _resetMarkerGroup = function(groupName) {\n if (isDefined(groups[groupName])) {\n groups.splice(groupName, 1);\n }\n };\n\n var _resetMarkerGroups = function() {\n groups = {};\n };\n\n var _deleteMarker = function(marker, map, layers) {\n marker.closePopup();\n // There is no easy way to know if a marker is added to a layer, so we search for it\n // if there are overlays\n if (isDefined(layers) && isDefined(layers.overlays)) {\n for (var key in layers.overlays) {\n if (layers.overlays[key] instanceof L.LayerGroup || layers.overlays[key] instanceof L.FeatureGroup) {\n if (layers.overlays[key].hasLayer(marker)) {\n layers.overlays[key].removeLayer(marker);\n return;\n }\n }\n }\n }\n\n if (isDefined(groups)) {\n for (var groupKey in groups) {\n if (groups[groupKey].hasLayer(marker)) {\n groups[groupKey].removeLayer(marker);\n }\n }\n }\n\n if (map.hasLayer(marker)) {\n map.removeLayer(marker);\n }\n };\n\n var _manageOpenPopup = function(marker, markerData) {\n marker.openPopup();\n\n //the marker may have angular templates to compile\n var popup = marker.getPopup(),\n //the marker may provide a scope returning function used to compile the message\n //default to $rootScope otherwise\n markerScope = angular.isFunction(markerData.getMessageScope) ? markerData.getMessageScope() : $rootScope,\n compileMessage = isDefined(markerData.compileMessage) ? markerData.compileMessage : true;\n\n if (isDefined(popup)) {\n var updatePopup = function(popup) {\n popup._updateLayout();\n popup._updatePosition();\n };\n\n if (compileMessage) {\n $compile(popup._contentNode)(markerScope);\n //in case of an ng-include, we need to update the content after template load\n if (isDefined(popup._contentNode) && popup._contentNode.innerHTML.indexOf(\"ngInclude\") > -1) {\n var unregister = markerScope.$on('$includeContentLoaded', function() {\n updatePopup(popup);\n unregister();\n });\n }\n else {\n updatePopup(popup);\n }\n }\n }\n };\n\n var _manageOpenLabel = function(marker, markerData) {\n var markerScope = angular.isFunction(markerData.getMessageScope) ? markerData.getMessageScope() : $rootScope,\n labelScope = angular.isFunction(markerData.getLabelScope) ? markerData.getLabelScope() : markerScope,\n compileMessage = isDefined(markerData.compileMessage) ? markerData.compileMessage : true;\n\n if (Helpers.LabelPlugin.isLoaded() && isDefined(markerData.label)) {\n if (isDefined(markerData.label.options) && markerData.label.options.noHide === true) {\n marker.showLabel();\n }\n if (compileMessage) {\n $compile(marker.label._container)(labelScope);\n }\n }\n };\n\n return {\n resetMarkerGroup: _resetMarkerGroup,\n\n resetMarkerGroups: _resetMarkerGroups,\n\n deleteMarker: _deleteMarker,\n\n manageOpenPopup: _manageOpenPopup,\n\n manageOpenLabel: _manageOpenLabel,\n\n createMarker: function(markerData) {\n if (!isDefined(markerData) || !geoHlp.validateCoords(markerData)){\n $log.error(errorHeader + 'The marker definition is not valid.');\n return;\n }\n var coords = geoHlp.getCoords(markerData);\n\n if (!isDefined(coords)){\n $log.error(errorHeader + 'Unable to get coordinates from markerData.');\n return;\n }\n\n var markerOptions = {\n icon: createLeafletIcon(markerData.icon),\n title: isDefined(markerData.title) ? markerData.title : '',\n draggable: isDefined(markerData.draggable) ? markerData.draggable : false,\n clickable: isDefined(markerData.clickable) ? markerData.clickable : true,\n riseOnHover: isDefined(markerData.riseOnHover) ? markerData.riseOnHover : false,\n zIndexOffset: isDefined(markerData.zIndexOffset) ? markerData.zIndexOffset : 0,\n iconAngle: isDefined(markerData.iconAngle) ? markerData.iconAngle : 0\n };\n // Add any other options not added above to markerOptions\n for (var markerDatum in markerData) {\n if (markerData.hasOwnProperty(markerDatum) && !markerOptions.hasOwnProperty(markerDatum)) {\n markerOptions[markerDatum] = markerData[markerDatum];\n }\n }\n\n var marker = new L.marker(coords, markerOptions);\n\n if (!isString(markerData.message)) {\n marker.unbindPopup();\n }\n\n return marker;\n },\n\n addMarkerToGroup: function(marker, groupName, groupOptions, map) {\n if (!isString(groupName)) {\n $log.error(errorHeader + 'The marker group you have specified is invalid.');\n return;\n }\n\n if (!MarkerClusterPlugin.isLoaded()) {\n $log.error(errorHeader + \"The MarkerCluster plugin is not loaded.\");\n return;\n }\n if (!isDefined(groups[groupName])) {\n groups[groupName] = new L.MarkerClusterGroup(groupOptions);\n map.addLayer(groups[groupName]);\n }\n groups[groupName].addLayer(marker);\n },\n\n listenMarkerEvents: function(marker, markerData, leafletScope) {\n //these should be deregistered on destroy .. possible leake\n //handles should not be closures since they will need to be removed\n marker.on(\"popupopen\", function(/* event */) {\n safeApply(leafletScope, function() {\n markerData.focus = true;\n _manageOpenPopup(marker, markerData);//needed since markerData is now a copy\n });\n });\n marker.on(\"popupclose\", function(/* event */) {\n safeApply(leafletScope, function() {\n markerData.focus = false;\n });\n });\n marker.on(\"add\", function(/* event */) {\n safeApply(leafletScope, function() {\n if('label' in markerData)\n _manageOpenLabel(marker, markerData);\n });\n });\n },\n\n addMarkerWatcher: function(marker, name, leafletScope, layers, map, isDeepWatch) {\n var markerWatchPath = Helpers.getObjectArrayPath(\"markers.\" + name);\n isDeepWatch = defaultTo(isDeepWatch, true);\n //TODO:break up this 200 line function to be readable (nmccready)\n var clearWatch = leafletScope.$watch(markerWatchPath, function(markerData, oldMarkerData) {\n if (!isDefined(markerData)) {\n _deleteMarker(marker, map, layers);\n clearWatch();\n return;\n }\n\n if (!isDefined(oldMarkerData)) {\n return;\n }\n\n // Update the lat-lng property (always present in marker properties)\n if (!geoHlp.validateCoords(markerData)) {\n $log.warn('There are problems with lat-lng data, please verify your marker model');\n _deleteMarker(marker, map, layers);\n return;\n }\n\n // watch is being initialized if old and new object is the same\n var isInitializing = markerData === oldMarkerData;\n\n // Update marker rotation\n if (isDefined(markerData.iconAngle) && oldMarkerData.iconAngle !== markerData.iconAngle) {\n marker.setIconAngle(markerData.iconAngle);\n }\n\n // It is possible that the layer has been removed or the layer marker does not exist\n // Update the layer group if present or move it to the map if not\n if (!isString(markerData.layer)) {\n // There is no layer information, we move the marker to the map if it was in a layer group\n if (isString(oldMarkerData.layer)) {\n // Remove from the layer group that is supposed to be\n if (isDefined(layers.overlays[oldMarkerData.layer]) && layers.overlays[oldMarkerData.layer].hasLayer(marker)) {\n layers.overlays[oldMarkerData.layer].removeLayer(marker);\n marker.closePopup();\n }\n // Test if it is not on the map and add it\n if (!map.hasLayer(marker)) {\n map.addLayer(marker);\n }\n }\n }\n\n if ((isNumber(markerData.opacity) || isNumber(parseFloat(markerData.opacity))) && markerData.opacity !== oldMarkerData.opacity) {\n // There was a different opacity so we update it\n marker.setOpacity(markerData.opacity);\n }\n\n if (isString(markerData.layer) && oldMarkerData.layer !== markerData.layer) {\n // If it was on a layer group we have to remove it\n if (isString(oldMarkerData.layer) && isDefined(layers.overlays[oldMarkerData.layer]) && layers.overlays[oldMarkerData.layer].hasLayer(marker)) {\n layers.overlays[oldMarkerData.layer].removeLayer(marker);\n }\n marker.closePopup();\n\n // Remove it from the map in case the new layer is hidden or there is an error in the new layer\n if (map.hasLayer(marker)) {\n map.removeLayer(marker);\n }\n\n // The markerData.layer is defined so we add the marker to the layer if it is different from the old data\n if (!isDefined(layers.overlays[markerData.layer])) {\n $log.error(errorHeader + 'You must use a name of an existing layer');\n return;\n }\n // Is a group layer?\n var layerGroup = layers.overlays[markerData.layer];\n if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {\n $log.error(errorHeader + 'A marker can only be added to a layer of type \"group\" or \"featureGroup\"');\n return;\n }\n // The marker goes to a correct layer group, so first of all we add it\n layerGroup.addLayer(marker);\n // The marker is automatically added to the map depending on the visibility\n // of the layer, so we only have to open the popup if the marker is in the map\n if (map.hasLayer(marker) && markerData.focus === true) {\n _manageOpenPopup(marker, markerData);\n }\n }\n\n // Update the draggable property\n if (markerData.draggable !== true && oldMarkerData.draggable === true && (isDefined(marker.dragging))) {\n marker.dragging.disable();\n }\n\n if (markerData.draggable === true && oldMarkerData.draggable !== true) {\n // The markerData.draggable property must be true so we update if there wasn't a previous value or it wasn't true\n if (marker.dragging) {\n marker.dragging.enable();\n } else {\n if (L.Handler.MarkerDrag) {\n marker.dragging = new L.Handler.MarkerDrag(marker);\n marker.options.draggable = true;\n marker.dragging.enable();\n }\n }\n }\n\n // Update the icon property\n if (!isObject(markerData.icon)) {\n // If there is no icon property or it's not an object\n if (isObject(oldMarkerData.icon)) {\n // If there was an icon before restore to the default\n marker.setIcon(createLeafletIcon());\n marker.closePopup();\n marker.unbindPopup();\n if (isString(markerData.message)) {\n marker.bindPopup(markerData.message, markerData.popupOptions);\n }\n }\n }\n\n if (isObject(markerData.icon) && isObject(oldMarkerData.icon) && !angular.equals(markerData.icon, oldMarkerData.icon)) {\n var dragG = false;\n if (marker.dragging) {\n dragG = marker.dragging.enabled();\n }\n marker.setIcon(createLeafletIcon(markerData.icon));\n if (dragG) {\n marker.dragging.enable();\n }\n marker.closePopup();\n marker.unbindPopup();\n if (isString(markerData.message)) {\n marker.bindPopup(markerData.message, markerData.popupOptions);\n }\n }\n\n // Update the Popup message property\n if (!isString(markerData.message) && isString(oldMarkerData.message)) {\n marker.closePopup();\n marker.unbindPopup();\n }\n\n // Update the label content or bind a new label if the old one has been removed.\n if (Helpers.LabelPlugin.isLoaded()) {\n if (isDefined(markerData.label) && isDefined(markerData.label.message)) {\n if ('label' in oldMarkerData && 'message' in oldMarkerData.label && !angular.equals(markerData.label.message, oldMarkerData.label.message)) {\n marker.updateLabelContent(markerData.label.message);\n } else if (!angular.isFunction(marker.getLabel)) {\n marker.bindLabel(markerData.label.message, markerData.label.options);\n _manageOpenLabel(marker, markerData);\n } else {\n _manageOpenLabel(marker, markerData);\n }\n } else if (!('label' in markerData && !('message' in markerData.label))) {\n if (angular.isFunction(marker.unbindLabel)) {\n marker.unbindLabel();\n }\n }\n }\n\n // There is some text in the popup, so we must show the text or update existing\n if (isString(markerData.message) && !isString(oldMarkerData.message)) {\n // There was no message before so we create it\n marker.bindPopup(markerData.message, markerData.popupOptions);\n }\n\n if (isString(markerData.message) && isString(oldMarkerData.message) && markerData.message !== oldMarkerData.message) {\n // There was a different previous message so we update it\n marker.setPopupContent(markerData.message);\n }\n\n // Update the focus property\n var updatedFocus = false;\n if (markerData.focus !== true && oldMarkerData.focus === true) {\n // If there was a focus property and was true we turn it off\n marker.closePopup();\n updatedFocus = true;\n }\n\n // The markerData.focus property must be true so we update if there wasn't a previous value or it wasn't true\n if (markerData.focus === true && ( !isDefined(oldMarkerData.focus) || oldMarkerData.focus === false) || (isInitializing && markerData.focus === true)) {\n // Reopen the popup when focus is still true\n _manageOpenPopup(marker, markerData);\n updatedFocus = true;\n }\n\n // zIndexOffset adjustment\n if (oldMarkerData.zIndexOffset !== markerData.zIndexOffset) {\n marker.setZIndexOffset(markerData.zIndexOffset);\n }\n\n var markerLatLng = marker.getLatLng();\n var isCluster = (isString(markerData.layer) && Helpers.MarkerClusterPlugin.is(layers.overlays[markerData.layer]));\n // If the marker is in a cluster it has to be removed and added to the layer when the location is changed\n if (isCluster) {\n // The focus has changed even by a user click or programatically\n if (updatedFocus) {\n // We only have to update the location if it was changed programatically, because it was\n // changed by a user drag the marker data has already been updated by the internal event\n // listened by the directive\n if ((markerData.lat !== oldMarkerData.lat) || (markerData.lng !== oldMarkerData.lng)) {\n layers.overlays[markerData.layer].removeLayer(marker);\n marker.setLatLng([markerData.lat, markerData.lng]);\n layers.overlays[markerData.layer].addLayer(marker);\n }\n } else {\n // The marker has possibly moved. It can be moved by a user drag (marker location and data are equal but old\n // data is diferent) or programatically (marker location and data are diferent)\n if ((markerLatLng.lat !== markerData.lat) || (markerLatLng.lng !== markerData.lng)) {\n // The marker was moved by a user drag\n layers.overlays[markerData.layer].removeLayer(marker);\n marker.setLatLng([markerData.lat, markerData.lng]);\n layers.overlays[markerData.layer].addLayer(marker);\n } else if ((markerData.lat !== oldMarkerData.lat) || (markerData.lng !== oldMarkerData.lng)) {\n // The marker was moved programatically\n layers.overlays[markerData.layer].removeLayer(marker);\n marker.setLatLng([markerData.lat, markerData.lng]);\n layers.overlays[markerData.layer].addLayer(marker);\n } else if (isObject(markerData.icon) && isObject(oldMarkerData.icon) && !angular.equals(markerData.icon, oldMarkerData.icon)) {\n layers.overlays[markerData.layer].removeLayer(marker);\n layers.overlays[markerData.layer].addLayer(marker);\n }\n }\n } else if (markerLatLng.lat !== markerData.lat || markerLatLng.lng !== markerData.lng) {\n marker.setLatLng([markerData.lat, markerData.lng]);\n }\n }, isDeepWatch);\n },\n string: _string,\n log: _log\n };\n});\n","angular.module(\"leaflet-directive\").factory('leafletPathsHelpers', function ($rootScope, $log, leafletHelpers) {\n var isDefined = leafletHelpers.isDefined,\n isArray = leafletHelpers.isArray,\n isNumber = leafletHelpers.isNumber,\n isValidPoint = leafletHelpers.isValidPoint;\n var availableOptions = [\n // Path options\n 'stroke', 'weight', 'color', 'opacity',\n 'fill', 'fillColor', 'fillOpacity',\n 'dashArray', 'lineCap', 'lineJoin', 'clickable',\n 'pointerEvents', 'className',\n\n // Polyline options\n 'smoothFactor', 'noClip'\n ];\n function _convertToLeafletLatLngs(latlngs) {\n return latlngs.filter(function(latlng) {\n return isValidPoint(latlng);\n }).map(function (latlng) {\n return _convertToLeafletLatLng(latlng);\n });\n }\n\n function _convertToLeafletLatLng(latlng) {\n if (isArray(latlng)) {\n return new L.LatLng(latlng[0], latlng[1]);\n } else {\n return new L.LatLng(latlng.lat, latlng.lng);\n }\n }\n\n function _convertToLeafletMultiLatLngs(paths) {\n return paths.map(function(latlngs) {\n return _convertToLeafletLatLngs(latlngs);\n });\n }\n\n function _getOptions(path, defaults) {\n var options = {};\n for (var i = 0; i < availableOptions.length; i++) {\n var optionName = availableOptions[i];\n\n if (isDefined(path[optionName])) {\n options[optionName] = path[optionName];\n } else if (isDefined(defaults.path[optionName])) {\n options[optionName] = defaults.path[optionName];\n }\n }\n\n return options;\n }\n\n var _updatePathOptions = function (path, data) {\n var updatedStyle = {};\n for (var i = 0; i < availableOptions.length; i++) {\n var optionName = availableOptions[i];\n if (isDefined(data[optionName])) {\n updatedStyle[optionName] = data[optionName];\n }\n }\n path.setStyle(data);\n };\n\n var _isValidPolyline = function(latlngs) {\n if (!isArray(latlngs)) {\n return false;\n }\n for (var i = 0; i < latlngs.length; i++) {\n var point = latlngs[i];\n if (!isValidPoint(point)) {\n return false;\n }\n }\n return true;\n };\n\n var pathTypes = {\n polyline: {\n isValid: function(pathData) {\n var latlngs = pathData.latlngs;\n return _isValidPolyline(latlngs);\n },\n createPath: function(options) {\n return new L.Polyline([], options);\n },\n setPath: function(path, data) {\n path.setLatLngs(_convertToLeafletLatLngs(data.latlngs));\n _updatePathOptions(path, data);\n return;\n }\n },\n multiPolyline: {\n isValid: function(pathData) {\n var latlngs = pathData.latlngs;\n if (!isArray(latlngs)) {\n return false;\n }\n\n for (var i in latlngs) {\n var polyline = latlngs[i];\n if (!_isValidPolyline(polyline)) {\n return false;\n }\n }\n\n return true;\n },\n createPath: function(options) {\n return new L.multiPolyline([[[0,0],[1,1]]], options);\n },\n setPath: function(path, data) {\n path.setLatLngs(_convertToLeafletMultiLatLngs(data.latlngs));\n _updatePathOptions(path, data);\n return;\n }\n } ,\n polygon: {\n isValid: function(pathData) {\n var latlngs = pathData.latlngs;\n return _isValidPolyline(latlngs);\n },\n createPath: function(options) {\n return new L.Polygon([], options);\n },\n setPath: function(path, data) {\n path.setLatLngs(_convertToLeafletLatLngs(data.latlngs));\n _updatePathOptions(path, data);\n return;\n }\n },\n multiPolygon: {\n isValid: function(pathData) {\n var latlngs = pathData.latlngs;\n\n if (!isArray(latlngs)) {\n return false;\n }\n\n for (var i in latlngs) {\n var polyline = latlngs[i];\n if (!_isValidPolyline(polyline)) {\n return false;\n }\n }\n\n return true;\n },\n createPath: function(options) {\n return new L.MultiPolygon([[[0,0],[1,1],[0,1]]], options);\n },\n setPath: function(path, data) {\n path.setLatLngs(_convertToLeafletMultiLatLngs(data.latlngs));\n _updatePathOptions(path, data);\n return;\n }\n },\n rectangle: {\n isValid: function(pathData) {\n var latlngs = pathData.latlngs;\n\n if (!isArray(latlngs) || latlngs.length !== 2) {\n return false;\n }\n\n for (var i in latlngs) {\n var point = latlngs[i];\n if (!isValidPoint(point)) {\n return false;\n }\n }\n\n return true;\n },\n createPath: function(options) {\n return new L.Rectangle([[0,0],[1,1]], options);\n },\n setPath: function(path, data) {\n path.setBounds(new L.LatLngBounds(_convertToLeafletLatLngs(data.latlngs)));\n _updatePathOptions(path, data);\n }\n },\n circle: {\n isValid: function(pathData) {\n var point= pathData.latlngs;\n return isValidPoint(point) && isNumber(pathData.radius);\n },\n createPath: function(options) {\n return new L.Circle([0,0], 1, options);\n },\n setPath: function(path, data) {\n path.setLatLng(_convertToLeafletLatLng(data.latlngs));\n if (isDefined(data.radius)) {\n path.setRadius(data.radius);\n }\n _updatePathOptions(path, data);\n }\n },\n circleMarker: {\n isValid: function(pathData) {\n var point= pathData.latlngs;\n return isValidPoint(point) && isNumber(pathData.radius);\n },\n createPath: function(options) {\n return new L.CircleMarker([0,0], options);\n },\n setPath: function(path, data) {\n path.setLatLng(_convertToLeafletLatLng(data.latlngs));\n if (isDefined(data.radius)) {\n path.setRadius(data.radius);\n }\n _updatePathOptions(path, data);\n }\n }\n };\n\n var _getPathData = function(path) {\n var pathData = {};\n if (path.latlngs) {\n pathData.latlngs = path.latlngs;\n }\n\n if (path.radius) {\n pathData.radius = path.radius;\n }\n\n return pathData;\n };\n\n return {\n setPathOptions: function(leafletPath, pathType, data) {\n if(!isDefined(pathType)) {\n pathType = \"polyline\";\n }\n pathTypes[pathType].setPath(leafletPath, data);\n },\n createPath: function(name, path, defaults) {\n if(!isDefined(path.type)) {\n path.type = \"polyline\";\n }\n var options = _getOptions(path, defaults);\n var pathData = _getPathData(path);\n\n if (!pathTypes[path.type].isValid(pathData)) {\n $log.error(\"[AngularJS - Leaflet] Invalid data passed to the \" + path.type + \" path\");\n return;\n }\n\n return pathTypes[path.type].createPath(options);\n }\n };\n});\n","angular.module(\"leaflet-directive\")\n.service('leafletWatchHelpers', function (){\n\n var _maybe = function(scope, watchFunctionName, thingToWatchStr, watchOptions, initCb){\n //watchOptions.isDeep is/should be ignored in $watchCollection\n var unWatch = scope[watchFunctionName](thingToWatchStr, function(newValue, oldValue) {\n initCb(newValue, oldValue);\n if(!watchOptions.doWatch)\n unWatch();\n }, watchOptions.isDeep);\n\n return unWatch;\n };\n\n /*\n @name: maybeWatch\n @description: Utility to watch something once or forever.\n @returns unWatch function\n @param watchOptions - see markersWatchOptions and or derrivatives. This object is used\n to set watching to once and its watch depth.\n */\n var _maybeWatch = function(scope, thingToWatchStr, watchOptions, initCb){\n return _maybe(scope, '$watch', thingToWatchStr, watchOptions, initCb);\n };\n\n /*\n @name: _maybeWatchCollection\n @description: Utility to watch something once or forever.\n @returns unWatch function\n @param watchOptions - see markersWatchOptions and or derrivatives. This object is used\n to set watching to once and its watch depth.\n */\n var _maybeWatchCollection = function(scope, thingToWatchStr, watchOptions, initCb){\n return _maybe(scope, '$watchCollection', thingToWatchStr, watchOptions, initCb);\n };\n\n return {\n maybeWatch: _maybeWatch,\n maybeWatchCollection: _maybeWatchCollection\n };\n});\n","angular.module(\"leaflet-directive\").directive('bounds', function ($log, $timeout, leafletHelpers, leafletBoundsHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: [ 'leaflet', 'center' ],\n\n link: function(scope, element, attrs, controller) {\n var isDefined = leafletHelpers.isDefined,\n createLeafletBounds = leafletBoundsHelpers.createLeafletBounds,\n leafletScope = controller[0].getLeafletScope(),\n mapController = controller[0];\n\n var emptyBounds = function(bounds) {\n return (bounds._southWest.lat === 0 && bounds._southWest.lng === 0 &&\n bounds._northEast.lat === 0 && bounds._northEast.lng === 0);\n };\n\n mapController.getMap().then(function (map) {\n leafletScope.$on('boundsChanged', function (event) {\n var scope = event.currentScope;\n var bounds = map.getBounds();\n //$log.debug('updated map bounds...', bounds);\n if (emptyBounds(bounds) || scope.settingBoundsFromScope) {\n return;\n }\n var newScopeBounds = {\n northEast: {\n lat: bounds._northEast.lat,\n lng: bounds._northEast.lng\n },\n southWest: {\n lat: bounds._southWest.lat,\n lng: bounds._southWest.lng\n }\n };\n if (!angular.equals(scope.bounds, newScopeBounds)) {\n //$log.debug('Need to update scope bounds.');\n scope.bounds = newScopeBounds;\n }\n });\n leafletScope.$watch('bounds', function (bounds) {\n //$log.debug('updated bounds...', bounds);\n if (!isDefined(bounds)) {\n $log.error('[AngularJS - Leaflet] Invalid bounds');\n return;\n }\n var leafletBounds = createLeafletBounds(bounds);\n if (leafletBounds && !map.getBounds().equals(leafletBounds)) {\n //$log.debug('Need to update map bounds.');\n scope.settingBoundsFromScope = true;\n map.fitBounds(leafletBounds);\n $timeout( function() {\n //$log.debug('Allow bound updates.');\n scope.settingBoundsFromScope = false;\n });\n }\n }, true);\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('center',\n function ($log, $q, $location, $timeout, leafletMapDefaults, leafletHelpers, leafletBoundsHelpers, leafletEvents) {\n\n var isDefined = leafletHelpers.isDefined,\n isNumber = leafletHelpers.isNumber,\n isSameCenterOnMap = leafletHelpers.isSameCenterOnMap,\n safeApply = leafletHelpers.safeApply,\n isValidCenter = leafletHelpers.isValidCenter,\n isValidBounds = leafletBoundsHelpers.isValidBounds,\n isUndefinedOrEmpty = leafletHelpers.isUndefinedOrEmpty;\n\n var shouldInitializeMapWithBounds = function(bounds, center) {\n return isDefined(bounds) && isValidBounds(bounds) && isUndefinedOrEmpty(center);\n };\n\n var _leafletCenter;\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n controller: function () {\n _leafletCenter = $q.defer();\n this.getCenter = function() {\n return _leafletCenter.promise;\n };\n },\n link: function(scope, element, attrs, controller) {\n var leafletScope = controller.getLeafletScope(),\n centerModel = leafletScope.center;\n\n controller.getMap().then(function(map) {\n var defaults = leafletMapDefaults.getDefaults(attrs.id);\n\n if (attrs.center.search(\"-\") !== -1) {\n $log.error('The \"center\" variable can\\'t use a \"-\" on his key name: \"' + attrs.center + '\".');\n map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);\n return;\n } else if (shouldInitializeMapWithBounds(leafletScope.bounds, centerModel)) {\n map.fitBounds(leafletBoundsHelpers.createLeafletBounds(leafletScope.bounds));\n centerModel = map.getCenter();\n safeApply(leafletScope, function (scope) {\n scope.center = {\n lat: map.getCenter().lat,\n lng: map.getCenter().lng,\n zoom: map.getZoom(),\n autoDiscover: false\n };\n angular.extend(scope.center,{\n lat: map.getCenter().lat,\n lng: map.getCenter().lng,\n zoom: map.getZoom(),\n autoDiscover: false\n });\n });\n safeApply(leafletScope, function (scope) {\n var mapBounds = map.getBounds();\n scope.bounds = {\n northEast: {\n lat: mapBounds._northEast.lat,\n lng: mapBounds._northEast.lng\n },\n southWest: {\n lat: mapBounds._southWest.lat,\n lng: mapBounds._southWest.lng\n }\n };\n });\n } else if (!isDefined(centerModel)) {\n $log.error('The \"center\" property is not defined in the main scope');\n map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);\n return;\n } else if (!(isDefined(centerModel.lat) && isDefined(centerModel.lng)) && !isDefined(centerModel.autoDiscover)) {\n angular.copy(defaults.center, centerModel);\n }\n\n var urlCenterHash, mapReady;\n if (attrs.urlHashCenter === \"yes\") {\n var extractCenterFromUrl = function() {\n var search = $location.search();\n var centerParam;\n if (isDefined(search.c)) {\n var cParam = search.c.split(\":\");\n if (cParam.length === 3) {\n centerParam = { lat: parseFloat(cParam[0]), lng: parseFloat(cParam[1]), zoom: parseInt(cParam[2], 10) };\n }\n }\n return centerParam;\n };\n urlCenterHash = extractCenterFromUrl();\n\n leafletScope.$on('$locationChangeSuccess', function(event) {\n var scope = event.currentScope;\n //$log.debug(\"updated location...\");\n var urlCenter = extractCenterFromUrl();\n if (isDefined(urlCenter) && !isSameCenterOnMap(urlCenter, map)) {\n //$log.debug(\"updating center model...\", urlCenter);\n scope.center = {\n lat: urlCenter.lat,\n lng: urlCenter.lng,\n zoom: urlCenter.zoom\n };\n }\n });\n }\n\n leafletScope.$watch(\"center\", function(center) {\n //$log.debug(\"updated center model...\");\n // The center from the URL has priority\n if (isDefined(urlCenterHash)) {\n angular.copy(urlCenterHash, center);\n urlCenterHash = undefined;\n }\n\n if (!isValidCenter(center) && center.autoDiscover !== true) {\n $log.warn(\"[AngularJS - Leaflet] invalid 'center'\");\n //map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);\n return;\n }\n\n if (center.autoDiscover === true) {\n if (!isNumber(center.zoom)) {\n map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);\n }\n if (isNumber(center.zoom) && center.zoom > defaults.center.zoom) {\n map.locate({ setView: true, maxZoom: center.zoom });\n } else if (isDefined(defaults.maxZoom)) {\n map.locate({ setView: true, maxZoom: defaults.maxZoom });\n } else {\n map.locate({ setView: true });\n }\n return;\n }\n\n if (mapReady && isSameCenterOnMap(center, map)) {\n //$log.debug(\"no need to update map again.\");\n return;\n }\n\n //$log.debug(\"updating map center...\", center);\n leafletScope.settingCenterFromScope = true;\n map.setView([center.lat, center.lng], center.zoom);\n leafletEvents.notifyCenterChangedToBounds(leafletScope, map);\n $timeout(function() {\n leafletScope.settingCenterFromScope = false;\n //$log.debug(\"allow center scope updates\");\n });\n }, true);\n\n map.whenReady(function() {\n mapReady = true;\n });\n\n map.on(\"moveend\", function(/* event */) {\n // Resolve the center after the first map position\n _leafletCenter.resolve();\n leafletEvents.notifyCenterUrlHashChanged(leafletScope, map, attrs, $location.search());\n //$log.debug(\"updated center on map...\");\n if (isSameCenterOnMap(centerModel, map) || scope.settingCenterFromScope) {\n //$log.debug(\"same center in model, no need to update again.\");\n return;\n }\n safeApply(leafletScope, function(scope) {\n if (!leafletScope.settingCenterFromScope) {\n //$log.debug(\"updating center model...\", map.getCenter(), map.getZoom());\n \n angular.extend(scope.center,{\n lat: map.getCenter().lat,\n lng: map.getCenter().lng,\n zoom: map.getZoom(),\n autoDiscover: false\n });\n }\n leafletEvents.notifyCenterChangedToBounds(leafletScope, map);\n });\n });\n\n if (centerModel.autoDiscover === true) {\n map.on(\"locationerror\", function() {\n $log.warn(\"[AngularJS - Leaflet] The Geolocation API is unauthorized on this page.\");\n if (isValidCenter(centerModel)) {\n map.setView([centerModel.lat, centerModel.lng], centerModel.zoom);\n leafletEvents.notifyCenterChangedToBounds(leafletScope, map);\n } else {\n map.setView([defaults.center.lat, defaults.center.lng], defaults.center.zoom);\n leafletEvents.notifyCenterChangedToBounds(leafletScope, map);\n }\n });\n }\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('controls', function ($log, leafletHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: '?^leaflet',\n\n link: function(scope, element, attrs, controller) {\n if(!controller) {\n return;\n }\n\n var isDefined = leafletHelpers.isDefined,\n leafletScope = controller.getLeafletScope(),\n controls = leafletScope.controls;\n\n controller.getMap().then(function(map) {\n if (isDefined(L.Control.Draw) && isDefined(controls.draw)) {\n\n if (!isDefined(controls.edit)) {\n controls.edit = { featureGroup: new L.FeatureGroup() };\n map.addLayer(controls.edit.featureGroup);\n }\n\n var drawControl = new L.Control.Draw(controls);\n map.addControl(drawControl);\n }\n\n if (isDefined(controls.scale)) {\n var scaleControl = new L.control.scale(controls.scale);\n map.addControl(scaleControl);\n }\n\n if (isDefined(controls.custom)) {\n for(var i in controls.custom) {\n map.addControl(controls.custom[i]);\n }\n }\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive(\"decorations\", function($log, leafletHelpers) {\n\treturn {\n\t\trestrict: \"A\", \n\t\tscope: false,\n\t\treplace: false,\n\t\trequire: 'leaflet',\n\n\t\tlink: function(scope, element, attrs, controller) {\n\t\t\tvar leafletScope = controller.getLeafletScope(),\n\t\t\t\tPolylineDecoratorPlugin = leafletHelpers.PolylineDecoratorPlugin,\n\t\t\t\tisDefined = leafletHelpers.isDefined,\n\t\t\t\tleafletDecorations = {};\n\n\t\t\t/* Creates an \"empty\" decoration with a set of coordinates, but no pattern. */\n\t\t\tfunction createDecoration(options) {\n\t\t\t\tif (isDefined(options) && isDefined(options.coordinates)) {\n\t\t\t\t\tif (!PolylineDecoratorPlugin.isLoaded()) {\n\t\t\t\t\t\t$log.error('[AngularJS - Leaflet] The PolylineDecorator Plugin is not loaded.');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn L.polylineDecorator(options.coordinates);\n\t\t\t}\n\n\t\t\t/* Updates the path and the patterns for the provided decoration, and returns the decoration. */\n\t\t\tfunction setDecorationOptions(decoration, options) {\n\t\t\t\tif (isDefined(decoration) && isDefined(options)) {\n\t\t\t\t\tif (isDefined(options.coordinates) && isDefined(options.patterns)) {\n\t\t\t\t\t\tdecoration.setPaths(options.coordinates);\n\t\t\t\t\t\tdecoration.setPatterns(options.patterns);\n\t\t\t\t\t\treturn decoration;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcontroller.getMap().then(function(map) {\n\t\t\t\tleafletScope.$watch(\"decorations\", function(newDecorations) {\n\t\t\t\t\tfor (var name in leafletDecorations) {\n\t\t\t\t\t\tif (!isDefined(newDecorations) || !isDefined(newDecorations[name])) {\n\t\t\t\t\t\t\tmap.removeLayer(leafletDecorations[name]);\n\t\t\t\t\t\t\tdelete leafletDecorations[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tfor (var newName in newDecorations) {\n\t\t\t\t\t\tvar decorationData = newDecorations[newName],\n\t\t\t\t\t\t\tnewDecoration = createDecoration(decorationData);\n\n\t\t\t\t\t\tif (isDefined(newDecoration)) {\n\t\t\t\t\t\t\tleafletDecorations[newName] = newDecoration;\n\t\t\t\t\t\t\tmap.addLayer(newDecoration);\n\t\t\t\t\t\t\tsetDecorationOptions(newDecoration, decorationData);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, true);\n\t\t\t});\n\t\t}\n\t};\n});","angular.module(\"leaflet-directive\").directive('eventBroadcast', function ($log, $rootScope, leafletHelpers, leafletEvents) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n\n link: function(scope, element, attrs, controller) {\n var isObject = leafletHelpers.isObject,\n isDefined = leafletHelpers.isDefined,\n leafletScope = controller.getLeafletScope(),\n eventBroadcast = leafletScope.eventBroadcast,\n availableMapEvents = leafletEvents.getAvailableMapEvents(),\n genDispatchMapEvent = leafletEvents.genDispatchMapEvent;\n\n controller.getMap().then(function(map) {\n\n var mapEvents = [];\n var i;\n var eventName;\n var logic = \"broadcast\";\n\n // We have a possible valid object\n if (!isDefined(eventBroadcast.map)) {\n // We do not have events enable/disable do we do nothing (all enabled by default)\n mapEvents = availableMapEvents;\n } else if (!isObject(eventBroadcast.map)) {\n // Not a valid object\n $log.warn(\"[AngularJS - Leaflet] event-broadcast.map must be an object check your model.\");\n } else {\n // We have a possible valid map object\n // Event propadation logic\n if (eventBroadcast.map.logic !== \"emit\" && eventBroadcast.map.logic !== \"broadcast\") {\n // This is an error\n $log.warn(\"[AngularJS - Leaflet] Available event propagation logic are: 'emit' or 'broadcast'.\");\n } else {\n logic = eventBroadcast.map.logic;\n }\n\n if (!(isObject(eventBroadcast.map.enable) && eventBroadcast.map.enable.length >= 0)) {\n $log.warn(\"[AngularJS - Leaflet] event-broadcast.map.enable must be an object check your model.\");\n } else {\n // Enable events\n for (i = 0; i < eventBroadcast.map.enable.length; i++) {\n eventName = eventBroadcast.map.enable[i];\n // Do we have already the event enabled?\n if (mapEvents.indexOf(eventName) === -1 && availableMapEvents.indexOf(eventName) !== -1) {\n mapEvents.push(eventName);\n }\n }\n }\n\n }\n\n for (i = 0; i < mapEvents.length; i++) {\n eventName = mapEvents[i];\n map.on(eventName, genDispatchMapEvent(leafletScope, eventName, logic), {\n eventName: eventName\n });\n }\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\")\n.directive('geojson', function ($log, $rootScope, leafletData, leafletHelpers,\n leafletWatchHelpers, leafletDirectiveControlsHelpers,leafletIterators) {\n\n var _maybeWatchCollection = leafletWatchHelpers.maybeWatchCollection,\n _watchOptions = leafletHelpers.watchOptions,\n _extendDirectiveControls = leafletDirectiveControlsHelpers.extend,\n hlp = leafletHelpers,\n $it = leafletIterators;\n\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n\n link: function(scope, element, attrs, controller) {\n var safeApply = leafletHelpers.safeApply,\n isDefined = leafletHelpers.isDefined,\n leafletScope = controller.getLeafletScope(),\n leafletGeoJSON = {};\n\n controller.getMap().then(function(map) {\n var watchOptions = leafletScope.geojsonWatchOptions || _watchOptions;\n\n var _hookUpEvents = function(geojson){\n var resetStyleOnMouseout = geojson.resetStyleOnMouseout;\n var onEachFeature;\n\n if (angular.isFunction(geojson.onEachFeature)) {\n onEachFeature = geojson.onEachFeature;\n } else {\n onEachFeature = function(feature, layer) {\n if (leafletHelpers.LabelPlugin.isLoaded() && isDefined(geojson.label)) {\n layer.bindLabel(feature.properties.description);\n }\n\n layer.on({\n mouseover: function(e) {\n safeApply(leafletScope, function() {\n $rootScope.$broadcast('leafletDirectiveMap.geojsonMouseover', feature, e);\n });\n },\n mouseout: function(e) {\n if (resetStyleOnMouseout) {\n leafletGeoJSON.resetStyle(e.target);\n }\n safeApply(leafletScope, function() {\n $rootScope.$broadcast('leafletDirectiveMap.geojsonMouseout', e);\n });\n },\n click: function(e) {\n safeApply(leafletScope, function() {\n $rootScope.$broadcast('leafletDirectiveMap.geojsonClick', feature, e);\n });\n }\n });\n };\n }\n return onEachFeature;\n };\n\n var isNested = (hlp.isDefined(attrs.geojsonNested) &&\n hlp.isTruthy(attrs.geojsonNested));\n\n var _clean = function(){\n var _remove = function(lObject) {\n if (isDefined(lObject) && map.hasLayer(lObject)) {\n map.removeLayer(lObject);\n }\n };\n if(isNested) {\n $it.each(leafletGeoJSON, function(lObject) {\n _remove(lObject);\n });\n return;\n }\n _remove(leafletGeoJSON);\n };\n\n var _addGeojson = function(geojson, maybeName){\n if (!(isDefined(geojson) && isDefined(geojson.data))) {\n return;\n }\n var onEachFeature = _hookUpEvents(geojson);\n\n if (!isDefined(geojson.options)) {\n geojson.options = {\n style: geojson.style,\n filter: geojson.filter,\n onEachFeature: onEachFeature,\n pointToLayer: geojson.pointToLayer\n };\n }\n\n var lObject = L.geoJson(geojson.data, geojson.options);\n\n if(maybeName && hlp.isString(maybeName)){\n leafletGeoJSON[maybeName] = lObject;\n }\n else{\n leafletGeoJSON = lObject;\n }\n leafletData.setGeoJSON(leafletGeoJSON, attrs.id);\n lObject.addTo(map);\n };\n\n var _create = function(model){\n _clean();\n if(isNested) {\n if(!model || !Object.keys(model).length)\n return;\n $it.each(model, function(m, name) {\n //name could be layerName and or groupName\n //for now it is not tied to a layer\n _addGeojson(m,name);\n });\n return;\n }\n _addGeojson(model);\n };\n\n _extendDirectiveControls(attrs.id, 'geojson', _create, _clean);\n\n _maybeWatchCollection(leafletScope,'geojson', watchOptions, function(geojson){\n _create(geojson);\n });\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('layercontrol', function ($log, leafletData, leafletHelpers) {\n return {\n restrict: \"E\",\n scope: {\n },\n replace: true,\n transclude: false,\n require: '^leaflet',\n controller: function ($scope, $element, $sce) {\n $log.debug('[Angular Directive - Layers] layers', $scope, $element);\n var safeApply = leafletHelpers.safeApply,\n isDefined = leafletHelpers.isDefined;\n angular.extend($scope, {\n baselayer: '',\n icons: {\n uncheck: 'fa fa-check-square-o',\n check: 'fa fa-square-o',\n radio: 'fa fa-dot-circle-o',\n unradio: 'fa fa-circle-o',\n up: 'fa fa-angle-up',\n down: 'fa fa-angle-down',\n open: 'fa fa-angle-double-down',\n close: 'fa fa-angle-double-up'\n },\n changeBaseLayer: function(key, e) {\n leafletHelpers.safeApply($scope, function(scp) {\n scp.baselayer = key;\n leafletData.getMap().then(function(map) {\n leafletData.getLayers().then(function(leafletLayers) {\n if(map.hasLayer(leafletLayers.baselayers[key])) {\n return;\n }\n for(var i in scp.layers.baselayers) {\n scp.layers.baselayers[i].icon = scp.icons.unradio;\n if(map.hasLayer(leafletLayers.baselayers[i])) {\n map.removeLayer(leafletLayers.baselayers[i]);\n }\n }\n map.addLayer(leafletLayers.baselayers[key]);\n scp.layers.baselayers[key].icon = $scope.icons.radio;\n });\n });\n });\n e.preventDefault();\n },\n moveLayer: function(ly, newIndex, e) {\n var delta = Object.keys($scope.layers.baselayers).length;\n if(newIndex >= (1+delta) && newIndex <= ($scope.overlaysArray.length+delta)) {\n var oldLy;\n for(var key in $scope.layers.overlays) {\n if($scope.layers.overlays[key].index === newIndex) {\n oldLy = $scope.layers.overlays[key];\n break;\n }\n }\n if(oldLy) {\n safeApply($scope, function() {\n oldLy.index = ly.index;\n ly.index = newIndex;\n });\n }\n }\n e.stopPropagation();\n e.preventDefault();\n },\n initIndex: function(layer, idx) {\n var delta = Object.keys($scope.layers.baselayers).length;\n layer.index = isDefined(layer.index)? layer.index:idx+delta+1;\n },\n toggleOpacity: function(e, layer) {\n $log.debug('Event', e);\n if(layer.visible) {\n var el = angular.element(e.currentTarget);\n el.toggleClass($scope.icons.close + ' ' + $scope.icons.open);\n el = el.parents('.lf-row').find('.lf-opacity');\n el.toggle('fast', function() {\n safeApply($scope, function() {\n layer.opacityControl = !layer.opacityControl;\n });\n });\n }\n e.stopPropagation();\n e.preventDefault();\n },\n unsafeHTML: function(html) {\n return $sce.trustAsHtml(html);\n }\n });\n\n var div = $element.get(0);\n if (!L.Browser.touch) {\n L.DomEvent.disableClickPropagation(div);\n L.DomEvent.on(div, 'mousewheel', L.DomEvent.stopPropagation);\n } else {\n L.DomEvent.on(div, 'click', L.DomEvent.stopPropagation);\n }\n },\n template:\n '
' +\n '
' +\n '
' +\n '' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n ''+\n '
' +\n '
' +\n '' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
',\n link: function(scope, element, attrs, controller) {\n var isDefined = leafletHelpers.isDefined,\n leafletScope = controller.getLeafletScope(),\n layers = leafletScope.layers;\n\n // Setting layer stack order.\n attrs.order = (isDefined(attrs.order) && (attrs.order === 'normal' || attrs.order === 'reverse'))? attrs.order:'normal';\n scope.order = attrs.order === 'normal';\n scope.orderNumber = attrs.order === 'normal'? -1:1;\n\n scope.layers = layers;\n controller.getMap().then(function(map) {\n\n leafletScope.$watch('layers.baselayers', function(newBaseLayers) {\n leafletData.getLayers().then(function(leafletLayers) {\n var key;\n for(key in newBaseLayers) {\n if(map.hasLayer(leafletLayers.baselayers[key])) {\n newBaseLayers[key].icon = scope.icons.radio;\n } else {\n newBaseLayers[key].icon = scope.icons.unradio;\n }\n }\n });\n });\n\n leafletScope.$watch('layers.overlays', function(newOverlayLayers) {\n var overlaysArray = [];\n leafletData.getLayers().then(function(leafletLayers) {\n for(var key in newOverlayLayers) {\n newOverlayLayers[key].icon = scope.icons[(newOverlayLayers[key].visible? 'uncheck':'check')];\n overlaysArray.push(newOverlayLayers[key]);\n if(isDefined(newOverlayLayers[key].index) && leafletLayers.overlays[key].setZIndex) {\n leafletLayers.overlays[key].setZIndex(newOverlayLayers[key].index);\n }\n }\n });\n\n var unreg = scope.$watch(function() {\n if(element.children().size() > 1) {\n element.find('.lf-overlays').trigger('resize');\n return element.find('.lf-opacity').size() === Object.keys(layers.overlays).length;\n }\n }, function(el) {\n if(el === true) {\n if(isDefined(element.find('.lf-opacity-control').ionRangeSlider)) {\n element.find('.lf-opacity-control').each(function(idx, inp) {\n var delta = Object.keys(layers.baselayers).length,\n lyAux;\n for(var key in scope.overlaysArray) {\n if(scope.overlaysArray[key].index === idx+delta+1) {\n lyAux = scope.overlaysArray[key];\n }\n }\n\n var input = angular.element(inp),\n op = isDefined(lyAux) && isDefined(lyAux.layerOptions)?\n lyAux.layerOptions.opacity:undefined;\n input.ionRangeSlider({\n min: 0,\n from: isDefined(op)? Math.ceil(op*100):100,\n step: 1,\n max: 100,\n prettify: false,\n hasGrid: false,\n hideMinMax: true,\n onChange: function(val) {\n leafletData.getLayers().then(function(leafletLayers) {\n var key = val.input.data().key;\n var ly, layer;\n for(var k in layers.overlays) {\n if(layers.overlays[k].index === key) {\n ly = leafletLayers.overlays[k];\n layer = layers.overlays[k];\n break;\n }\n }\n if(map.hasLayer(ly)) {\n layer.layerOptions = isDefined(layer.layerOptions)? layer.layerOptions:{};\n layer.layerOptions.opacity = val.input.val()/100;\n if(ly.setOpacity) {\n ly.setOpacity(val.input.val()/100);\n }\n if(ly.getLayers && ly.eachLayer) {\n ly.eachLayer(function(lay) {\n if(lay.setOpacity) {\n lay.setOpacity(val.input.val()/100);\n }\n });\n }\n }\n });\n }\n });\n });\n } else {\n $log.warn('[AngularJS - Leaflet] Ion Slide Range Plugin is not loaded');\n }\n unreg();\n }\n });\n\n scope.overlaysArray = overlaysArray;\n }, true);\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('layers', function ($log, $q, leafletData, leafletHelpers, leafletLayerHelpers, leafletControlHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n controller: function ($scope) {\n $scope._leafletLayers = $q.defer();\n this.getLayers = function () {\n return $scope._leafletLayers.promise;\n };\n },\n link: function(scope, element, attrs, controller){\n var isDefined = leafletHelpers.isDefined,\n leafletLayers = {},\n leafletScope = controller.getLeafletScope(),\n layers = leafletScope.layers,\n createLayer = leafletLayerHelpers.createLayer,\n updateLayersControl = leafletControlHelpers.updateLayersControl,\n isLayersControlVisible = false;\n\n controller.getMap().then(function(map) {\n\n // We have baselayers to add to the map\n scope._leafletLayers.resolve(leafletLayers);\n leafletData.setLayers(leafletLayers, attrs.id);\n\n leafletLayers.baselayers = {};\n leafletLayers.overlays = {};\n\n var mapId = attrs.id;\n\n // Setup all baselayers definitions\n var oneVisibleLayer = false;\n for (var layerName in layers.baselayers) {\n var newBaseLayer = createLayer(layers.baselayers[layerName]);\n if (!isDefined(newBaseLayer)) {\n delete layers.baselayers[layerName];\n continue;\n }\n leafletLayers.baselayers[layerName] = newBaseLayer;\n // Only add the visible layer to the map, layer control manages the addition to the map\n // of layers in its control\n if (layers.baselayers[layerName].top === true) {\n map.addLayer(leafletLayers.baselayers[layerName]);\n oneVisibleLayer = true;\n }\n }\n\n // If there is no visible layer add first to the map\n if (!oneVisibleLayer && Object.keys(leafletLayers.baselayers).length > 0) {\n map.addLayer(leafletLayers.baselayers[Object.keys(layers.baselayers)[0]]);\n }\n\n // Setup the Overlays\n for (layerName in layers.overlays) {\n if(layers.overlays[layerName].type === 'cartodb') {\n\n }\n var newOverlayLayer = createLayer(layers.overlays[layerName]);\n if (!isDefined(newOverlayLayer)) {\n delete layers.overlays[layerName];\n continue;\n }\n leafletLayers.overlays[layerName] = newOverlayLayer;\n // Only add the visible overlays to the map\n if (layers.overlays[layerName].visible === true) {\n map.addLayer(leafletLayers.overlays[layerName]);\n }\n }\n\n // Watch for the base layers\n leafletScope.$watch('layers.baselayers', function(newBaseLayers) {\n // Delete layers from the array\n for (var name in leafletLayers.baselayers) {\n if (!isDefined(newBaseLayers[name])) {\n // Remove from the map if it's on it\n if (map.hasLayer(leafletLayers.baselayers[name])) {\n map.removeLayer(leafletLayers.baselayers[name]);\n }\n delete leafletLayers.baselayers[name];\n }\n }\n // add new layers\n for (var newName in newBaseLayers) {\n if (!isDefined(leafletLayers.baselayers[newName])) {\n var testBaseLayer = createLayer(newBaseLayers[newName]);\n if (isDefined(testBaseLayer)) {\n leafletLayers.baselayers[newName] = testBaseLayer;\n // Only add the visible layer to the map\n if (newBaseLayers[newName].top === true) {\n map.addLayer(leafletLayers.baselayers[newName]);\n }\n }\n } else {\n if (newBaseLayers[newName].top === true && !map.hasLayer(leafletLayers.baselayers[newName])) {\n map.addLayer(leafletLayers.baselayers[newName]);\n } else if (newBaseLayers[newName].top === false && map.hasLayer(leafletLayers.baselayers[newName])) {\n map.removeLayer(leafletLayers.baselayers[newName]);\n }\n }\n }\n\n //we have layers, so we need to make, at least, one active\n var found = false;\n // search for an active layer\n for (var key in leafletLayers.baselayers) {\n if (map.hasLayer(leafletLayers.baselayers[key])) {\n found = true;\n break;\n }\n }\n // If there is no active layer make one active\n if (!found && Object.keys(leafletLayers.baselayers).length > 0) {\n map.addLayer(leafletLayers.baselayers[Object.keys(leafletLayers.baselayers)[0]]);\n }\n\n // Only show the layers switch selector control if we have more than one baselayer + overlay\n isLayersControlVisible = updateLayersControl(map, mapId, isLayersControlVisible, newBaseLayers, layers.overlays, leafletLayers);\n }, true);\n\n // Watch for the overlay layers\n leafletScope.$watch('layers.overlays', function(newOverlayLayers) {\n // Delete layers from the array\n for (var name in leafletLayers.overlays) {\n if (!isDefined(newOverlayLayers[name])) {\n // Remove from the map if it's on it\n if (map.hasLayer(leafletLayers.overlays[name])) {\n map.removeLayer(leafletLayers.overlays[name]);\n }\n // TODO: Depending on the layer type we will have to delete what's included on it\n delete leafletLayers.overlays[name];\n }\n }\n\n // add new overlays\n for (var newName in newOverlayLayers) {\n if (!isDefined(leafletLayers.overlays[newName])) {\n var testOverlayLayer = createLayer(newOverlayLayers[newName]);\n if (isDefined(testOverlayLayer)) {\n leafletLayers.overlays[newName] = testOverlayLayer;\n if (newOverlayLayers[newName].visible === true) {\n map.addLayer(leafletLayers.overlays[newName]);\n }\n }\n }\n\n // check for the .visible property to hide/show overLayers\n if (newOverlayLayers[newName].visible && !map.hasLayer(leafletLayers.overlays[newName])) {\n map.addLayer(leafletLayers.overlays[newName]);\n } else if (newOverlayLayers[newName].visible === false && map.hasLayer(leafletLayers.overlays[newName])) {\n map.removeLayer(leafletLayers.overlays[newName]);\n }\n\n //refresh heatmap data if present\n if (newOverlayLayers[newName].visible && map._loaded && newOverlayLayers[newName].data && newOverlayLayers[newName].type === \"heatmap\") {\n leafletLayers.overlays[newName].setData(newOverlayLayers[newName].data);\n leafletLayers.overlays[newName].update();\n }\n }\n\n // Only add the layers switch selector control if we have more than one baselayer + overlay\n isLayersControlVisible = updateLayersControl(map, mapId, isLayersControlVisible, layers.baselayers, newOverlayLayers, leafletLayers);\n }, true);\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('legend', function ($log, $http, leafletHelpers, leafletLegendHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n\n link: function (scope, element, attrs, controller) {\n\n var isArray = leafletHelpers.isArray,\n isDefined = leafletHelpers.isDefined,\n isFunction = leafletHelpers.isFunction,\n leafletScope = controller.getLeafletScope(),\n legend = leafletScope.legend;\n\n var legendClass;\n var position;\n var leafletLegend;\n var type;\n\n leafletScope.$watch('legend', function (newLegend) {\n\n if (isDefined(newLegend)) {\n\n legendClass = newLegend.legendClass ? newLegend.legendClass : \"legend\";\n\n position = newLegend.position || 'bottomright';\n\n // default to arcgis\n type = newLegend.type || 'arcgis'; \n }\n\n }, true);\n\n controller.getMap().then(function (map) {\n\n leafletScope.$watch('legend', function (newLegend) {\n\n if (!isDefined(newLegend)) {\n\n if (isDefined(leafletLegend)) {\n leafletLegend.removeFrom(map);\n leafletLegend= null;\n }\n\n return;\n }\n\n if (!isDefined(newLegend.url) && (type === 'arcgis') && (!isArray(newLegend.colors) || !isArray(newLegend.labels) || newLegend.colors.length !== newLegend.labels.length)) {\n\n $log.warn(\"[AngularJS - Leaflet] legend.colors and legend.labels must be set.\");\n\n return;\n }\n\n if (isDefined(newLegend.url)) {\n\n $log.info(\"[AngularJS - Leaflet] loading legend service.\");\n\n return;\n }\n\n if (isDefined(leafletLegend)) {\n leafletLegend.removeFrom(map);\n leafletLegend= null;\n }\n\n leafletLegend = L.control({\n position: position\n });\n if (type === 'arcgis') {\n leafletLegend.onAdd = leafletLegendHelpers.getOnAddArrayLegend(newLegend, legendClass);\n }\n leafletLegend.addTo(map);\n\n });\n\n leafletScope.$watch('legend.url', function (newURL) {\n\n if (!isDefined(newURL)) {\n return;\n }\n $http.get(newURL)\n .success(function (legendData) {\n\n if (isDefined(leafletLegend)) {\n\n leafletLegendHelpers.updateLegend(leafletLegend.getContainer(), legendData, type, newURL);\n\n } else {\n\n leafletLegend = L.control({\n position: position\n });\n leafletLegend.onAdd = leafletLegendHelpers.getOnAddLegend(legendData, legendClass, type, newURL);\n leafletLegend.addTo(map);\n }\n\n if (isDefined(legend.loadedData) && isFunction(legend.loadedData)) {\n legend.loadedData();\n }\n })\n .error(function () {\n $log.warn('[AngularJS - Leaflet] legend.url not loaded.');\n });\n });\n\n });\n }\n };\n });\n","angular.module(\"leaflet-directive\").directive('markers',\n function ($log, $rootScope, $q, leafletData, leafletHelpers, leafletMapDefaults,\n leafletMarkersHelpers, leafletEvents, leafletIterators, leafletWatchHelpers,\n leafletDirectiveControlsHelpers) {\n //less terse vars to helpers\n var isDefined = leafletHelpers.isDefined,\n errorHeader = leafletHelpers.errorHeader,\n Helpers = leafletHelpers,\n isString = leafletHelpers.isString,\n addMarkerWatcher = leafletMarkersHelpers.addMarkerWatcher,\n listenMarkerEvents = leafletMarkersHelpers.listenMarkerEvents,\n addMarkerToGroup = leafletMarkersHelpers.addMarkerToGroup,\n bindMarkerEvents = leafletEvents.bindMarkerEvents,\n createMarker = leafletMarkersHelpers.createMarker,\n deleteMarker = leafletMarkersHelpers.deleteMarker,\n $it = leafletIterators,\n _markersWatchOptions = leafletHelpers.watchOptions,\n maybeWatch = leafletWatchHelpers.maybeWatch,\n extendDirectiveControls = leafletDirectiveControlsHelpers.extend;\n\n var _maybeAddMarkerToLayer = function(layerName, layers, model, marker, doIndividualWatch, map){\n\n if (!isString(layerName)) {\n $log.error(errorHeader + ' A layername must be a string');\n return false;\n }\n\n if (!isDefined(layers)) {\n $log.error(errorHeader + ' You must add layers to the directive if the markers are going to use this functionality.');\n return false;\n }\n\n if (!isDefined(layers.overlays) || !isDefined(layers.overlays[layerName])) {\n $log.error(errorHeader +' A marker can only be added to a layer of type \"group\"');\n return false;\n }\n var layerGroup = layers.overlays[layerName];\n if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {\n $log.error(errorHeader + ' Adding a marker to an overlay needs a overlay of the type \"group\" or \"featureGroup\"');\n return false;\n }\n\n // The marker goes to a correct layer group, so first of all we add it\n layerGroup.addLayer(marker);\n\n // The marker is automatically added to the map depending on the visibility\n // of the layer, so we only have to open the popup if the marker is in the map\n if (!doIndividualWatch && map.hasLayer(marker) && model.focus === true) {\n leafletMarkersHelpers.manageOpenPopup(marker, model);\n }\n return true;\n };\n //TODO: move to leafletMarkersHelpers??? or make a new class/function file (leafletMarkersHelpers is large already)\n var _addMarkers = function(markersToRender, map, layers, leafletMarkers, leafletScope,\n watchOptions, maybeLayerName){\n\n for (var newName in markersToRender) {\n if (newName.search(\"-\") !== -1) {\n $log.error('The marker can\\'t use a \"-\" on his key name: \"' + newName + '\".');\n continue;\n }\n\n if (!isDefined(leafletMarkers[newName])) {\n //(nmccready) very important to not have model changes when lObject is changed\n //this might be desirable in some cases but it causes two-way binding to lObject which is not ideal\n //if it is left as the reference then all changes from oldModel vs newModel are ignored\n //see _destroy (where modelDiff becomes meaningless if we do not copy here)\n var model = Helpers.copy(markersToRender[newName]);\n var marker = createMarker(model);\n var layerName = (model? model.layer : undefined) || maybeLayerName; //original way takes pref\n if (!isDefined(marker)) {\n $log.error(errorHeader + ' Received invalid data on the marker ' + newName + '.');\n continue;\n }\n leafletMarkers[newName] = marker;\n\n // Bind message\n if (isDefined(model.message)) {\n marker.bindPopup(model.message, model.popupOptions);\n }\n\n // Add the marker to a cluster group if needed\n if (isDefined(model.group)) {\n var groupOptions = isDefined(model.groupOption) ? model.groupOption : null;\n addMarkerToGroup(marker, model.group, groupOptions, map);\n }\n\n // Show label if defined\n if (Helpers.LabelPlugin.isLoaded() && isDefined(model.label) && isDefined(model.label.message)) {\n marker.bindLabel(model.label.message, model.label.options);\n }\n\n // Check if the marker should be added to a layer\n if (isDefined(model) && (isDefined(model.layer) || isDefined(maybeLayerName))){\n\n var pass = _maybeAddMarkerToLayer(layerName, layers, model, marker,\n watchOptions.individual.doWatch, map);\n if(!pass)\n continue; //something went wrong move on in the loop\n } else if (!isDefined(model.group)) {\n // We do not have a layer attr, so the marker goes to the map layer\n map.addLayer(marker);\n if (!watchOptions.individual.doWatch && model.focus === true) {\n leafletMarkersHelpers.manageOpenPopup(marker, model);\n }\n }\n var pathToMarker = Helpers.getObjectDotPath(maybeLayerName? [maybeLayerName, newName]: [newName]);\n if (watchOptions.individual.doWatch) {\n addMarkerWatcher(marker, pathToMarker, leafletScope, layers, map,\n watchOptions.individual.doWatch);\n }\n\n listenMarkerEvents(marker, model, leafletScope, watchOptions.individual.doWatch);\n bindMarkerEvents(marker, pathToMarker, model, leafletScope, layerName);\n }\n }\n };\n var _destroy = function(markerModels, oldMarkerModels, lMarkers, map, layers){\n // Delete markers from the array\n var hasLogged = false,\n modelIsDiff = false;\n var doCheckOldModel = isDefined(oldMarkerModels);\n for (var name in lMarkers) {\n if(!hasLogged) {\n $log.debug(errorHeader + \"[markers] destroy: \");\n hasLogged = true;\n }\n\n if(doCheckOldModel){\n //might want to make the option (in watch options) to disable deep checking\n //ie the options to only check !== (reference check) instead of angular.equals (slow)\n modelIsDiff = !angular.equals(markerModels[name],oldMarkerModels[name]);\n }\n if (!isDefined(markerModels) ||\n !Object.keys(markerModels).length ||\n !isDefined(markerModels[name]) ||\n !Object.keys(markerModels[name]).length ||\n modelIsDiff) {\n deleteMarker(lMarkers[name], map, layers);\n delete lMarkers[name];\n }\n }\n };\n\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: ['leaflet', '?layers'],\n\n link: function(scope, element, attrs, controller) {\n var mapController = controller[0],\n leafletScope = mapController.getLeafletScope();\n\n mapController.getMap().then(function(map) {\n var leafletMarkers = {}, getLayers;\n\n // If the layers attribute is used, we must wait until the layers are created\n if (isDefined(controller[1])) {\n getLayers = controller[1].getLayers;\n } else {\n getLayers = function() {\n var deferred = $q.defer();\n deferred.resolve();\n return deferred.promise;\n };\n }\n\n var watchOptions = leafletScope.markersWatchOptions || _markersWatchOptions;\n\n // backwards compat\n if(isDefined(attrs.watchMarkers))\n watchOptions.doWatch = watchOptions.individual.doWatch =\n (!isDefined(attrs.watchMarkers) || Helpers.isTruthy(attrs.watchMarkers));\n\n var isNested = (isDefined(attrs.markersNested) && Helpers.isTruthy(attrs.markersNested));\n\n getLayers().then(function(layers) {\n var _clean = function(models, oldModels){\n _destroy(models, oldModels, leafletMarkers, map, layers);\n };\n\n var _create = function(models, oldModels){\n _clean(models, oldModels);\n if(isNested) {\n $it.each(models, function(markersToAdd, layerName) {\n _addMarkers(markersToAdd, map, layers, leafletMarkers, leafletScope,\n watchOptions, layerName);\n });\n return;\n }\n _addMarkers(models, map, layers, leafletMarkers, leafletScope,\n watchOptions);\n };\n extendDirectiveControls(attrs.id, 'markers', _create, _clean);\n leafletData.setMarkers(leafletMarkers, attrs.id);\n\n maybeWatch(leafletScope,'markers', watchOptions, function(newMarkers, oldMarkers){\n _create(newMarkers, oldMarkers);\n });\n });\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('maxbounds', function ($log, leafletMapDefaults, leafletBoundsHelpers, leafletHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n\n link: function(scope, element, attrs, controller) {\n var leafletScope = controller.getLeafletScope(),\n isValidBounds = leafletBoundsHelpers.isValidBounds,\n isNumber = leafletHelpers.isNumber;\n\n\n controller.getMap().then(function(map) {\n leafletScope.$watch(\"maxbounds\", function (maxbounds) {\n if (!isValidBounds(maxbounds)) {\n // Unset any previous maxbounds\n map.setMaxBounds();\n return;\n }\n \n var leafletBounds = leafletBoundsHelpers.createLeafletBounds(maxbounds);\n if(isNumber(maxbounds.pad)) {\n leafletBounds = leafletBounds.pad(maxbounds.pad);\n }\n\n map.setMaxBounds(leafletBounds);\n if (!attrs.center) {\n map.fitBounds(leafletBounds);\n }\n });\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('paths', function ($log, $q, leafletData, leafletMapDefaults, leafletHelpers, leafletPathsHelpers, leafletEvents) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: ['leaflet', '?layers'],\n\n link: function(scope, element, attrs, controller) {\n var mapController = controller[0],\n isDefined = leafletHelpers.isDefined,\n isString = leafletHelpers.isString,\n leafletScope = mapController.getLeafletScope(),\n paths = leafletScope.paths,\n createPath = leafletPathsHelpers.createPath,\n bindPathEvents = leafletEvents.bindPathEvents,\n setPathOptions = leafletPathsHelpers.setPathOptions;\n\n mapController.getMap().then(function(map) {\n var defaults = leafletMapDefaults.getDefaults(attrs.id),\n getLayers;\n\n // If the layers attribute is used, we must wait until the layers are created\n if (isDefined(controller[1])) {\n getLayers = controller[1].getLayers;\n } else {\n getLayers = function() {\n var deferred = $q.defer();\n deferred.resolve();\n return deferred.promise;\n };\n }\n\n if (!isDefined(paths)) {\n return;\n }\n\n getLayers().then(function(layers) {\n\n var leafletPaths = {};\n leafletData.setPaths(leafletPaths, attrs.id);\n\n // Should we watch for every specific marker on the map?\n var shouldWatch = (!isDefined(attrs.watchPaths) || attrs.watchPaths === 'true');\n\n // Function for listening every single path once created\n var watchPathFn = function(leafletPath, name) {\n var clearWatch = leafletScope.$watch(\"paths[\\\"\"+name+\"\\\"]\", function(pathData, old) {\n if (!isDefined(pathData)) {\n if (isDefined(old.layer)) {\n for (var i in layers.overlays) {\n var overlay = layers.overlays[i];\n overlay.removeLayer(leafletPath);\n }\n }\n map.removeLayer(leafletPath);\n clearWatch();\n return;\n }\n setPathOptions(leafletPath, pathData.type, pathData);\n }, true);\n };\n\n leafletScope.$watchCollection(\"paths\", function (newPaths) {\n\n // Delete paths (by name) from the array\n for (var name in leafletPaths) {\n if (!isDefined(newPaths[name])) {\n map.removeLayer(leafletPaths[name]);\n delete leafletPaths[name];\n }\n }\n\n // Create the new paths\n for (var newName in newPaths) {\n if (newName.search('\\\\$') === 0) {\n continue;\n }\n if (newName.search(\"-\") !== -1) {\n $log.error('[AngularJS - Leaflet] The path name \"' + newName + '\" is not valid. It must not include \"-\" and a number.');\n continue;\n }\n\n if (!isDefined(leafletPaths[newName])) {\n var pathData = newPaths[newName];\n var newPath = createPath(newName, newPaths[newName], defaults);\n\n // bind popup if defined\n if (isDefined(newPath) && isDefined(pathData.message)) {\n newPath.bindPopup(pathData.message);\n }\n\n // Show label if defined\n if (leafletHelpers.LabelPlugin.isLoaded() && isDefined(pathData.label) && isDefined(pathData.label.message)) {\n newPath.bindLabel(pathData.label.message, pathData.label.options);\n }\n\n // Check if the marker should be added to a layer\n if (isDefined(pathData) && isDefined(pathData.layer)) {\n\n if (!isString(pathData.layer)) {\n $log.error('[AngularJS - Leaflet] A layername must be a string');\n continue;\n }\n if (!isDefined(layers)) {\n $log.error('[AngularJS - Leaflet] You must add layers to the directive if the markers are going to use this functionality.');\n continue;\n }\n\n if (!isDefined(layers.overlays) || !isDefined(layers.overlays[pathData.layer])) {\n $log.error('[AngularJS - Leaflet] A marker can only be added to a layer of type \"group\"');\n continue;\n }\n var layerGroup = layers.overlays[pathData.layer];\n if (!(layerGroup instanceof L.LayerGroup || layerGroup instanceof L.FeatureGroup)) {\n $log.error('[AngularJS - Leaflet] Adding a marker to an overlay needs a overlay of the type \"group\" or \"featureGroup\"');\n continue;\n }\n\n // Listen for changes on the new path\n leafletPaths[newName] = newPath;\n // The path goes to a correct layer group, so first of all we add it\n layerGroup.addLayer(newPath);\n\n if (shouldWatch) {\n watchPathFn(newPath, newName);\n } else {\n setPathOptions(newPath, pathData.type, pathData);\n }\n } else if (isDefined(newPath)) {\n // Listen for changes on the new path\n leafletPaths[newName] = newPath;\n map.addLayer(newPath);\n\n if (shouldWatch) {\n watchPathFn(newPath, newName);\n } else {\n setPathOptions(newPath, pathData.type, pathData);\n }\n }\n\n bindPathEvents(newPath, newName, pathData, leafletScope);\n }\n }\n });\n });\n });\n }\n };\n});\n","angular.module(\"leaflet-directive\").directive('tiles', function ($log, leafletData, leafletMapDefaults, leafletHelpers) {\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: 'leaflet',\n\n link: function(scope, element, attrs, controller) {\n var isDefined = leafletHelpers.isDefined,\n leafletScope = controller.getLeafletScope(),\n tiles = leafletScope.tiles;\n\n if (!isDefined(tiles) && !isDefined(tiles.url)) {\n $log.warn(\"[AngularJS - Leaflet] The 'tiles' definition doesn't have the 'url' property.\");\n return;\n }\n\n controller.getMap().then(function(map) {\n var defaults = leafletMapDefaults.getDefaults(attrs.id);\n var tileLayerObj;\n leafletScope.$watch(\"tiles\", function(tiles) {\n var tileLayerOptions = defaults.tileLayerOptions;\n var tileLayerUrl = defaults.tileLayer;\n\n // If no valid tiles are in the scope, remove the last layer\n if (!isDefined(tiles.url) && isDefined(tileLayerObj)) {\n map.removeLayer(tileLayerObj);\n return;\n }\n\n // No leafletTiles object defined yet\n if (!isDefined(tileLayerObj)) {\n if (isDefined(tiles.options)) {\n angular.copy(tiles.options, tileLayerOptions);\n }\n\n if (isDefined(tiles.url)) {\n tileLayerUrl = tiles.url;\n }\n\n tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions);\n tileLayerObj.addTo(map);\n leafletData.setTiles(tileLayerObj, attrs.id);\n return;\n }\n\n // If the options of the tilelayer is changed, we need to redraw the layer\n if (isDefined(tiles.url) && isDefined(tiles.options) && !angular.equals(tiles.options, tileLayerOptions)) {\n map.removeLayer(tileLayerObj);\n tileLayerOptions = defaults.tileLayerOptions;\n angular.copy(tiles.options, tileLayerOptions);\n tileLayerUrl = tiles.url;\n tileLayerObj = L.tileLayer(tileLayerUrl, tileLayerOptions);\n tileLayerObj.addTo(map);\n leafletData.setTiles(tileLayerObj, attrs.id);\n return;\n }\n\n // Only the URL of the layer is changed, update the tiles object\n if (isDefined(tiles.url)) {\n tileLayerObj.setUrl(tiles.url);\n }\n }, true);\n });\n }\n };\n});\n","/*\n Create multiple similar directives for watchOptions to support directiveControl\n instead. (when watches are disabled)\n NgAnnotate does not work here due to the functional creation\n*/\n['markers', 'geojson'].forEach(function(name){\n angular.module(\"leaflet-directive\").directive(name + 'WatchOptions', [\n '$log', '$rootScope', '$q', 'leafletData', 'leafletHelpers',\n function ($log, $rootScope, $q, leafletData, leafletHelpers) {\n\n var isDefined = leafletHelpers.isDefined,\n errorHeader = leafletHelpers.errorHeader,\n isObject = leafletHelpers.isObject,\n _watchOptions = leafletHelpers.watchOptions;\n\n return {\n restrict: \"A\",\n scope: false,\n replace: false,\n require: ['leaflet'],\n\n link: function (scope, element, attrs, controller) {\n var mapController = controller[0],\n leafletScope = mapController.getLeafletScope();\n\n mapController.getMap().then(function () {\n if (isDefined(scope[name + 'WatchOptions'])) {\n if (isObject(scope[name + 'WatchOptions']))\n angular.extend(_watchOptions, scope[name + 'WatchOptions']);\n else\n $log.error(errorHeader + '[' + name + 'WatchOptions] is not an object');\n leafletScope[name + 'WatchOptions'] = _watchOptions;\n }\n });\n }\n };\n }]);\n});\n","angular.module(\"leaflet-directive\")\n.factory('leafletEventsHelpers', function ($rootScope, $q, $log, leafletHelpers) {\n var safeApply = leafletHelpers.safeApply,\n isDefined = leafletHelpers.isDefined;\n\n var _fire = function(scope, broadcastName, logic, event, lObject, model, modelName, layerName){\n // Safely broadcast the event\n safeApply(scope, function(){\n var toSend = {\n leafletEvent: event,\n leafletObject: lObject,\n modelName: modelName,\n model: model\n };\n if (isDefined(layerName))\n angular.extend(toSend, {layerName: layerName});\n\n if (logic === \"emit\") {\n scope.$emit(broadcastName, toSend);\n } else {\n $rootScope.$broadcast(broadcastName, toSend);\n }\n });\n };\n\n return {\n fire: _fire\n }\n});\n","angular.module(\"leaflet-directive\")\n.factory('leafletLabelEvents', function ($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers) {\n var Helpers = leafletHelpers,\n fire = leafletEventsHelpers.fire;\n\n var _getAvailableLabelEvents = function () {\n return [\n 'click',\n 'dblclick',\n 'mousedown',\n 'mouseover',\n 'mouseout',\n 'contextmenu'\n ];\n };\n\n var _genDispatchLabelEvent = function (eventName, logic, leafletScope, label, name, model, layerName) {\n return function (e) {\n // Put together broadcast name\n var broadcastName = 'leafletDirectiveLabel.' + eventName;\n var markerName = scope_watch_name.replace('markers.', '');\n fire(leafletScope, broadcastName, logic, e, label, model, markerName, layerName);\n };\n };\n\n\n var _genLabelEvents = function (eventName, logic, leafletScope, lObject, name, model, layerName) {\n var labelEvents = _getAvailableLabelEvents();\n var scopeWatchName = Helpers.getObjectArrayPath(\"markers.\" + name);\n for (var i = 0; i < labelEvents.length; i++) {\n var eventName = labelEvents[i];\n lObject.label.on(eventName,\n _genDispatchLabelEvent(\n eventName, logic, leafletScope, lObject.label, scopeWatchName, model, layerName));\n }\n };\n\n return {\n getAvailableLabelEvents: _getAvailableLabelEvents,\n genDispatchLabelEvent: _genDispatchLabelEvent,\n genLabelEvents: _genLabelEvents\n };\n});\n","angular.module(\"leaflet-directive\")\n.factory('leafletMapEvents', function ($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers) {\n var safeApply = leafletHelpers.safeApply,\n isDefined = leafletHelpers.isDefined,\n isObject = leafletHelpers.isObject,\n Helpers = leafletHelpers,\n errorHeader = leafletHelpers.errorHeader,\n fire = leafletEventsHelpers.fire;\n\n var _getAvailableMapEvents = function() {\n return [\n 'click',\n 'dblclick',\n 'mousedown',\n 'mouseup',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'contextmenu',\n 'focus',\n 'blur',\n 'preclick',\n 'load',\n 'unload',\n 'viewreset',\n 'movestart',\n 'move',\n 'moveend',\n 'dragstart',\n 'drag',\n 'dragend',\n 'zoomstart',\n 'zoomend',\n 'zoomlevelschange',\n 'resize',\n 'autopanstart',\n 'layeradd',\n 'layerremove',\n 'baselayerchange',\n 'overlayadd',\n 'overlayremove',\n 'locationfound',\n 'locationerror',\n 'popupopen',\n 'popupclose',\n 'draw:created',\n 'draw:edited',\n 'draw:deleted',\n 'draw:drawstart',\n 'draw:drawstop',\n 'draw:editstart',\n 'draw:editstop',\n 'draw:deletestart',\n 'draw:deletestop'\n ];\n };\n\n var _genDispatchMapEvent = function(scope, eventName, logic) {\n return function(e) {\n // Put together broadcast name\n var broadcastName = 'leafletDirectiveMap.' + eventName;\n // Safely broadcast the event\n fire(scope, broadcastName, logic, e, e.target, scope)\n };\n };\n\n var _notifyCenterChangedToBounds = function(scope) {\n scope.$broadcast(\"boundsChanged\");\n };\n\n var _notifyCenterUrlHashChanged = function(scope, map, attrs, search) {\n if (!isDefined(attrs.urlHashCenter)) {\n return;\n }\n var center = map.getCenter();\n var centerUrlHash = (center.lat).toFixed(4) + \":\" + (center.lng).toFixed(4) + \":\" + map.getZoom();\n if (!isDefined(search.c) || search.c !== centerUrlHash) {\n //$log.debug(\"notified new center...\");\n scope.$emit(\"centerUrlHash\", centerUrlHash);\n }\n };\n\n return {\n getAvailableMapEvents: _getAvailableMapEvents,\n genDispatchMapEvent: _genDispatchMapEvent,\n notifyCenterChangedToBounds: _notifyCenterChangedToBounds,\n notifyCenterUrlHashChanged: _notifyCenterUrlHashChanged\n };\n});\n","angular.module(\"leaflet-directive\")\n.factory('leafletMarkerEvents', function ($rootScope, $q, $log, leafletHelpers, leafletEventsHelpers, leafletLabelEvents) {\n var safeApply = leafletHelpers.safeApply,\n isDefined = leafletHelpers.isDefined,\n isObject = leafletHelpers.isObject,\n Helpers = leafletHelpers,\n errorHeader = leafletHelpers.errorHeader,\n fire = leafletEventsHelpers.fire,\n lblHelp = leafletLabelEvents;\n\n /*\n argument: name: Note this can be a single string or dot notation\n Example:\n markerModel : {\n m1: { lat:_, lon: _}\n }\n //would yield name of\n name = \"m1\"\n\n If nested:\n markerModel : {\n cars: {\n m1: { lat:_, lon: _}\n }\n }\n //would yield name of\n name = \"cars.m1\"\n */\n var _genDispatchMarkerEvent = function (eventName, logic, leafletScope, lObject, name, model, layerName) {\n return function (e) {\n var broadcastName = 'leafletDirectiveMarker.' + eventName;\n\n // Broadcast old marker click name for backwards compatibility\n if (eventName === \"click\") {\n safeApply(leafletScope, function () {\n $rootScope.$broadcast('leafletDirectiveMarkersClick', name);\n });\n } else if (eventName === 'dragend') {\n safeApply(leafletScope, function () {\n model.lat = lObject.getLatLng().lat;\n model.lng = lObject.getLatLng().lng;\n });\n if (model.message && model.focus === true) {\n lObject.openPopup();\n }\n }\n\n fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName);\n };\n };\n\n var _getAvailableMarkerEvents = function () {\n return [\n 'click',\n 'dblclick',\n 'mousedown',\n 'mouseover',\n 'mouseout',\n 'contextmenu',\n 'dragstart',\n 'drag',\n 'dragend',\n 'move',\n 'remove',\n 'popupopen',\n 'popupclose'\n ];\n };\n\n return {\n getAvailableMarkerEvents: _getAvailableMarkerEvents,\n\n bindMarkerEvents: function (lObject, name, model, leafletScope, layerName) {\n var markerEvents = [];\n var i;\n var eventName;\n var logic = \"emit\";\n\n if (!isDefined(leafletScope.eventBroadcast)) {\n // Backward compatibility, if no event-broadcast attribute, all events are broadcasted\n markerEvents = _getAvailableMarkerEvents();\n } else if (!isObject(leafletScope.eventBroadcast)) {\n // Not a valid object\n $log.error(errorHeader + \"event-broadcast must be an object check your model.\");\n } else {\n // We have a possible valid object\n if (!isDefined(leafletScope.eventBroadcast.marker)) {\n // We do not have events enable/disable do we do nothing (all enabled by default)\n markerEvents = _getAvailableMarkerEvents();\n } else if (!isObject(leafletScope.eventBroadcast.marker)) {\n // Not a valid object\n $log.warn(errorHeader + \"event-broadcast.marker must be an object check your model.\");\n } else {\n // We have a possible valid map object\n // Event propadation logic\n if (leafletScope.eventBroadcast.marker.logic !== undefined && leafletScope.eventBroadcast.marker.logic !== null) {\n // We take care of possible propagation logic\n if (leafletScope.eventBroadcast.marker.logic !== \"emit\" && leafletScope.eventBroadcast.marker.logic !== \"broadcast\") {\n // This is an error\n $log.warn(errorHeader + \"Available event propagation logic are: 'emit' or 'broadcast'.\");\n } else if (leafletScope.eventBroadcast.marker.logic === \"emit\") {\n logic = \"emit\";\n }\n }\n // Enable / Disable\n var markerEventsEnable = false, markerEventsDisable = false;\n if (leafletScope.eventBroadcast.marker.enable !== undefined && leafletScope.eventBroadcast.marker.enable !== null) {\n if (typeof leafletScope.eventBroadcast.marker.enable === 'object') {\n markerEventsEnable = true;\n }\n }\n if (leafletScope.eventBroadcast.marker.disable !== undefined && leafletScope.eventBroadcast.marker.disable !== null) {\n if (typeof leafletScope.eventBroadcast.marker.disable === 'object') {\n markerEventsDisable = true;\n }\n }\n if (markerEventsEnable && markerEventsDisable) {\n // Both are active, this is an error\n $log.warn(errorHeader + \"can not enable and disable events at the same time\");\n } else if (!markerEventsEnable && !markerEventsDisable) {\n // Both are inactive, this is an error\n $log.warn(errorHeader + \"must enable or disable events\");\n } else {\n // At this point the marker object is OK, lets enable or disable events\n if (markerEventsEnable) {\n // Enable events\n for (i = 0; i < leafletScope.eventBroadcast.marker.enable.length; i++) {\n eventName = leafletScope.eventBroadcast.marker.enable[i];\n // Do we have already the event enabled?\n if (markerEvents.indexOf(eventName) !== -1) {\n // Repeated event, this is an error\n $log.warn(errorHeader + \"This event \" + eventName + \" is already enabled\");\n } else {\n // Does the event exists?\n if (_getAvailableMarkerEvents().indexOf(eventName) === -1) {\n // The event does not exists, this is an error\n $log.warn(errorHeader + \"This event \" + eventName + \" does not exist\");\n } else {\n // All ok enable the event\n markerEvents.push(eventName);\n }\n }\n }\n } else {\n // Disable events\n markerEvents = _getAvailableMarkerEvents();\n for (i = 0; i < leafletScope.eventBroadcast.marker.disable.length; i++) {\n eventName = leafletScope.eventBroadcast.marker.disable[i];\n var index = markerEvents.indexOf(eventName);\n if (index === -1) {\n // The event does not exist\n $log.warn(errorHeader + \"This event \" + eventName + \" does not exist or has been already disabled\");\n\n } else {\n markerEvents.splice(index, 1);\n }\n }\n }\n }\n }\n }\n\n for (i = 0; i < markerEvents.length; i++) {\n eventName = markerEvents[i];\n lObject.on(eventName,\n _genDispatchMarkerEvent(eventName, logic, leafletScope, lObject, name, model, layerName));\n }\n\n if (Helpers.LabelPlugin.isLoaded() && isDefined(lObject.label)) {\n lblHelp.genLabelEvents(name, logic, leafletScope, lObject, model, layerName);\n }\n }\n };\n});\n","angular.module(\"leaflet-directive\")\n.factory('leafletPathEvents', function ($rootScope, $q, $log, leafletHelpers, leafletLabelEvents) {\n var safeApply = leafletHelpers.safeApply,\n isDefined = leafletHelpers.isDefined,\n isObject = leafletHelpers.isObject,\n Helpers = leafletHelpers,\n errorHeader = leafletHelpers.errorHeader,\n lblHelp = leafletLabelEvents;\n\n var _genDispatchPathEvent = function (eventName, logic, leafletScope, lObject, name, model, layerName) {\n return function (e) {\n var broadcastName = 'leafletDirectivePath.' + eventName;\n\n fire(leafletScope, broadcastName, logic, e, e.target || lObject, model, name, layerName);\n };\n };\n\n var _bindPathEvents = function (lObject, name, model, leafletScope) {\n var pathEvents = [],\n i,\n eventName,\n logic = \"broadcast\";\n\n if (!isDefined(leafletScope.eventBroadcast)) {\n // Backward compatibility, if no event-broadcast attribute, all events are broadcasted\n pathEvents = _getAvailablePathEvents();\n } else if (!isObject(leafletScope.eventBroadcast)) {\n // Not a valid object\n $log.error(errorHeader + \"event-broadcast must be an object check your model.\");\n } else {\n // We have a possible valid object\n if (!isDefined(leafletScope.eventBroadcast.path)) {\n // We do not have events enable/disable do we do nothing (all enabled by default)\n pathEvents = _getAvailablePathEvents();\n } else if (isObject(leafletScope.eventBroadcast.paths)) {\n // Not a valid object\n $log.warn(errorHeader + \"event-broadcast.path must be an object check your model.\");\n } else {\n // We have a possible valid map object\n // Event propadation logic\n if (leafletScope.eventBroadcast.path.logic !== undefined && leafletScope.eventBroadcast.path.logic !== null) {\n // We take care of possible propagation logic\n if (leafletScope.eventBroadcast.path.logic !== \"emit\" && leafletScope.eventBroadcast.path.logic !== \"broadcast\") {\n // This is an error\n $log.warn(errorHeader + \"Available event propagation logic are: 'emit' or 'broadcast'.\");\n } else if (leafletScope.eventBroadcast.path.logic === \"emit\") {\n logic = \"emit\";\n }\n }\n // Enable / Disable\n var pathEventsEnable = false, pathEventsDisable = false;\n if (leafletScope.eventBroadcast.path.enable !== undefined && leafletScope.eventBroadcast.path.enable !== null) {\n if (typeof leafletScope.eventBroadcast.path.enable === 'object') {\n pathEventsEnable = true;\n }\n }\n if (leafletScope.eventBroadcast.path.disable !== undefined && leafletScope.eventBroadcast.path.disable !== null) {\n if (typeof leafletScope.eventBroadcast.path.disable === 'object') {\n pathEventsDisable = true;\n }\n }\n if (pathEventsEnable && pathEventsDisable) {\n // Both are active, this is an error\n $log.warn(errorHeader + \"can not enable and disable events at the same time\");\n } else if (!pathEventsEnable && !pathEventsDisable) {\n // Both are inactive, this is an error\n $log.warn(errorHeader + \"must enable or disable events\");\n } else {\n // At this point the path object is OK, lets enable or disable events\n if (pathEventsEnable) {\n // Enable events\n for (i = 0; i < leafletScope.eventBroadcast.path.enable.length; i++) {\n eventName = leafletScope.eventBroadcast.path.enable[i];\n // Do we have already the event enabled?\n if (pathEvents.indexOf(eventName) !== -1) {\n // Repeated event, this is an error\n $log.warn(errorHeader + \"This event \" + eventName + \" is already enabled\");\n } else {\n // Does the event exists?\n if (_getAvailablePathEvents().indexOf(eventName) === -1) {\n // The event does not exists, this is an error\n $log.warn(errorHeader + \"This event \" + eventName + \" does not exist\");\n } else {\n // All ok enable the event\n pathEvents.push(eventName);\n }\n }\n }\n } else {\n // Disable events\n pathEvents = _getAvailablePathEvents();\n for (i = 0; i < leafletScope.eventBroadcast.path.disable.length; i++) {\n eventName = leafletScope.eventBroadcast.path.disable[i];\n var index = pathEvents.indexOf(eventName);\n if (index === -1) {\n // The event does not exist\n $log.warn(errorHeader + \"This event \" + eventName + \" does not exist or has been already disabled\");\n\n } else {\n pathEvents.splice(index, 1);\n }\n }\n }\n }\n }\n }\n\n for (i = 0; i < pathEvents.length; i++) {\n eventName = pathEvents[i];\n lObject.on(eventName, _genDispatchPathEvent(eventName, logic, leafletScope, pathEvents, name));\n }\n\n if (Helpers.LabelPlugin.isLoaded() && isDefined(lObject.label)) {\n lblHelp.genLabelEvents(leafletScope, logic, lObject, name);\n }\n };\n\n var _getAvailablePathEvents = function () {\n return [\n 'click',\n 'dblclick',\n 'mousedown',\n 'mouseover',\n 'mouseout',\n 'contextmenu',\n 'add',\n 'remove',\n 'popupopen',\n 'popupclose'\n ];\n };\n\n return {\n getAvailablePathEvents: _getAvailablePathEvents,\n bindPathEvents: _bindPathEvents\n };\n});\n"]} \ No newline at end of file diff --git a/examples/0000-viewer.html b/examples/0000-viewer.html new file mode 100644 index 00000000..061ba993 --- /dev/null +++ b/examples/0000-viewer.html @@ -0,0 +1,80 @@ + + + + + + + Angular Leaflet Directive: Examples viewer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/simple-example.html b/examples/0100-basic-first-example.html similarity index 70% rename from examples/simple-example.html rename to examples/0100-basic-first-example.html index fad0d98a..c60adb4c 100644 --- a/examples/simple-example.html +++ b/examples/0100-basic-first-example.html @@ -7,12 +7,14 @@ - - + + + +

First steps, basic example

diff --git a/examples/center-example.html b/examples/0101-basic-center-example.html similarity index 60% rename from examples/center-example.html rename to examples/0101-basic-center-example.html index 5a7dfaf9..b67c2ce8 100644 --- a/examples/center-example.html +++ b/examples/0101-basic-center-example.html @@ -7,7 +7,7 @@ - - - + + + + + + + + +

Center map with URL synchronization example

+

This demo syncs the map center position with the URL, and viceversa, using the center-url-params property.

+
    +
  • Latitude
  • +
  • Longitude
  • +
  • Zoom
  • +
+

Direct locations

+ + + diff --git a/examples/custom-parameters-example.html b/examples/0104-basic-custom-parameters-example.html similarity index 78% rename from examples/custom-parameters-example.html rename to examples/0104-basic-custom-parameters-example.html index 409cecdb..b5469ea5 100644 --- a/examples/custom-parameters-example.html +++ b/examples/0104-basic-custom-parameters-example.html @@ -7,7 +7,7 @@ - - - + + +

Using custom default parameters

diff --git a/examples/bounds-example.html b/examples/0105-basic-bounds-example.html similarity index 77% rename from examples/bounds-example.html rename to examples/0105-basic-bounds-example.html index 45c30182..ff180325 100644 --- a/examples/bounds-example.html +++ b/examples/0105-basic-bounds-example.html @@ -8,7 +8,7 @@ - - + +

Map bounds example

South west

@@ -42,6 +37,5 @@

North east

Lat : Lng :
- diff --git a/examples/maxbounds-example.html b/examples/0106-basic-maxbounds-example.html similarity index 82% rename from examples/maxbounds-example.html rename to examples/0106-basic-maxbounds-example.html index 9122d100..2dacfe76 100644 --- a/examples/maxbounds-example.html +++ b/examples/0106-basic-maxbounds-example.html @@ -7,7 +7,7 @@ - - + + +

Setting MaxBounds in a map

+

With maxbounds the map visualization is limited to a defined zone. Try to pan on these regions to see how it works.

@@ -62,7 +59,6 @@
-

Maxbounds: NE(lat: {{ maxbounds.northEast.lat }}, lng: {{ maxbounds.northEast.lng }}) SW(lat: {{ maxbounds.southWest.lat }}, lng: {{ maxbounds.southWest.lng }})

diff --git a/examples/tiles-example.html b/examples/0107-basic-tiles-example.html similarity index 52% rename from examples/tiles-example.html rename to examples/0107-basic-tiles-example.html index 4b9a237f..c42e8e25 100644 --- a/examples/tiles-example.html +++ b/examples/0107-basic-tiles-example.html @@ -5,10 +5,9 @@ - - - -
-
- -
-

This is a map that can change tiles by demand

-
- -
-

- - - - -

-
- -
-

Current TileLayer Url: {{ tiles.url }}

-
- -
- -
-
-
- + + +

Changing tiles example

+

Change tiles clicking in the buttons below:

+

+ + + + +

+

Current TileLayer Url:

diff --git a/examples/tiles-zoom-changer-example.html b/examples/0108-basic-tiles-zoom-changer-example.html similarity index 62% rename from examples/tiles-zoom-changer-example.html rename to examples/0108-basic-tiles-zoom-changer-example.html index dba295d9..8fee4582 100644 --- a/examples/tiles-zoom-changer-example.html +++ b/examples/0108-basic-tiles-zoom-changer-example.html @@ -8,7 +8,7 @@ - - -
-
- -
-

This is a map with dynamic tile change depending on zoom level

-
- -
-

Current TileLayer Url: {{ tiles.url }}

-

Current Zoom Level: {{ london.zoom }}

-
- -
- -
-
-
- + + +

Dynamic tile changer based on zoom level

+

Zoom to level 13 to see how the tiles change:

+
    +
  • Current TileLayer Url:
  • +
  • Current Zoom Level:
  • +
diff --git a/examples/center-geoip-example.html b/examples/0109-basic-center-geoip-example.html similarity index 81% rename from examples/center-geoip-example.html rename to examples/0109-basic-center-geoip-example.html index d8c8771f..5653e873 100644 --- a/examples/center-geoip-example.html +++ b/examples/0109-basic-center-geoip-example.html @@ -7,7 +7,7 @@ - - - + + +

Legend example

diff --git a/examples/maxbounds-pad-example.html b/examples/0112-basic-maxbounds-pad-example.html similarity index 54% rename from examples/maxbounds-pad-example.html rename to examples/0112-basic-maxbounds-pad-example.html index d5a1c8b3..2efb3878 100644 --- a/examples/maxbounds-pad-example.html +++ b/examples/0112-basic-maxbounds-pad-example.html @@ -1,5 +1,6 @@ + @@ -7,19 +8,23 @@ - - -
- -
-
-

Extend Maxbounds with Pad

-

You can extend maxbounds with a pad property. Pad is a percentage by which the latLngBounds will be extended.

- -

-        

-        
-    
+ + + +

Extend Maxbounds with Pad

+

You can extend maxbounds with a pad property. Pad is a percentage by which the latLngBounds will be extended.

+

+    

 
+
 
diff --git a/examples/0113-basic-geojson-simple-example.html b/examples/0113-basic-geojson-simple-example.html
new file mode 100644
index 00000000..512a0de0
--- /dev/null
+++ b/examples/0113-basic-geojson-simple-example.html
@@ -0,0 +1,45 @@
+
+
+  
+    
+    
+    
+    
+    
+  
+  
+     
+     

Simple GeoJSON example

+ + diff --git a/examples/geojson-center-example.html b/examples/0114-basic-geojson-center-example.html similarity index 86% rename from examples/geojson-center-example.html rename to examples/0114-basic-geojson-center-example.html index 057558d7..7b5c5288 100644 --- a/examples/geojson-center-example.html +++ b/examples/0114-basic-geojson-center-example.html @@ -7,7 +7,7 @@ - - + + +

Center to GeoJSON example

diff --git a/examples/events-example.html b/examples/0115-basic-events-example.html similarity index 83% rename from examples/events-example.html rename to examples/0115-basic-events-example.html index 66d0dfd9..dee06432 100644 --- a/examples/events-example.html +++ b/examples/0115-basic-events-example.html @@ -7,7 +7,7 @@ - + +

Events example

All map events are propagated by default.

-
    +
    • event caught in listener.
    - diff --git a/examples/access-leaflet-object-example.html b/examples/0116-basic-access-leaflet-object-example.html similarity index 62% rename from examples/access-leaflet-object-example.html rename to examples/0116-basic-access-leaflet-object-example.html index 7b4bf6cc..50b8c259 100644 --- a/examples/access-leaflet-object-example.html +++ b/examples/0116-basic-access-leaflet-object-example.html @@ -7,7 +7,7 @@ + + + + + + + + +

    Angular routing show/hide map example

    +

    Show map / Hide map

    + + diff --git a/examples/double-map-events-example.html b/examples/0118-basic-double-map-events-example.html similarity index 62% rename from examples/double-map-events-example.html rename to examples/0118-basic-double-map-events-example.html index baa4e1d6..bb0f9108 100644 --- a/examples/double-map-events-example.html +++ b/examples/0118-basic-double-map-events-example.html @@ -5,14 +5,9 @@ - - +

    Different map events broadcasting

    We can filter which leaflet events we propagate upwars using the event-broadcast directive property, let's see how it works:

    -
    -

    This map propagates all events

    - -

    Event:

    -
    -
    -

    This map propagates the "click" and "dblclick" events

    - -

    Event:

    -
    -
    +

    This map propagates all events

    + +

    Event:

    +

    This map propagates the "click" and "dblclick" events

    + +

    Event:

    diff --git a/examples/double-map-example.html b/examples/0119-basic-double-map-access-map-object-example.html similarity index 59% rename from examples/double-map-example.html rename to examples/0119-basic-double-map-access-map-object-example.html index f0481c54..68d7eb46 100644 --- a/examples/double-map-example.html +++ b/examples/0119-basic-double-map-access-map-object-example.html @@ -13,7 +13,7 @@ - -

    Accesing the map object with two (or more) maps on screen

    -

    The leafletData service allows us to access the internals of the leaflet library (map object, markers, layers, etc.). If two or more maps are on screen we need to pass an id to the map, so we can retrieve the leaflet object of the map specified by that id.

    -
    - - + +
    +
    -
    - - +
    +
    + +

    Accesing the map object with two (or more) maps on screen

    +

    The leafletData service allows us to access the internals of the leaflet library (map object, markers, layers, etc.). If two or more maps are on screen we need to pass an id to the map, so we can retrieve the leaflet object of the map specified by that id.

    + +
    diff --git a/examples/double-map-sharing-attributes.html b/examples/0120-basic-double-map-sharing-attributes-example.html similarity index 80% rename from examples/double-map-sharing-attributes.html rename to examples/0120-basic-double-map-sharing-attributes-example.html index f0dbf29a..b189f608 100644 --- a/examples/double-map-sharing-attributes.html +++ b/examples/0120-basic-double-map-sharing-attributes-example.html @@ -5,16 +5,9 @@ - - -
    - + +
    +
    -
    - +
    +

    Two maps sharing center example

    Drag the center in any of the maps

    diff --git a/examples/double-map-toggle-example.html b/examples/0121-basic-double-map-toggle-example.html similarity index 70% rename from examples/double-map-toggle-example.html rename to examples/0121-basic-double-map-toggle-example.html index 6a08cf0e..a301e727 100644 --- a/examples/double-map-toggle-example.html +++ b/examples/0121-basic-double-map-toggle-example.html @@ -13,7 +13,7 @@ - + + +

    Toggle between two maps on screen

    View javascript console while toggling map

    -
    -

    Map1

    - -
    -
    -

    Map2

    -
    diff --git a/examples/geojson-update-example.html b/examples/0122-basic-geojson-update-example.html similarity index 95% rename from examples/geojson-update-example.html rename to examples/0122-basic-geojson-update-example.html index 11a3a776..5fc54d0e 100644 --- a/examples/geojson-update-example.html +++ b/examples/0122-basic-geojson-update-example.html @@ -7,7 +7,7 @@ - + +

    GeoJSON update example

    diff --git a/examples/hide-show-map.html b/examples/0123-basic-hide-show-map-example.html similarity index 58% rename from examples/hide-show-map.html rename to examples/0123-basic-hide-show-map-example.html index 7872fb03..8586c01d 100644 --- a/examples/hide-show-map.html +++ b/examples/0123-basic-hide-show-map-example.html @@ -7,42 +7,30 @@ - - -
    - Select to show the map -
    - -
    -
    -

    Map

    -
    -
    - -
    -
    - -
    -

    Center

    - {{ center }} -
    + + +

    Hide/Show map example

    +

    Select to show the map

    +

    Center: {{ center }}

    diff --git a/examples/0124-basic-geojson-non-nested-example.html b/examples/0124-basic-geojson-non-nested-example.html new file mode 100644 index 00000000..63954df1 --- /dev/null +++ b/examples/0124-basic-geojson-non-nested-example.html @@ -0,0 +1,82 @@ + + + + + + + + + + + +

    GeoJSON non nested example

    + + + + diff --git a/examples/0125-basic-geojson-nested-example.html b/examples/0125-basic-geojson-nested-example.html new file mode 100644 index 00000000..29cce085 --- /dev/null +++ b/examples/0125-basic-geojson-nested-example.html @@ -0,0 +1,79 @@ + + + + + + + + + + + +

    GeoJSON nested example

    + + + + diff --git a/examples/layers-simple-example.html b/examples/0201-layers-simple-example.html similarity index 57% rename from examples/layers-simple-example.html rename to examples/0201-layers-simple-example.html index 80ebc58d..5c90a3a1 100644 --- a/examples/layers-simple-example.html +++ b/examples/0201-layers-simple-example.html @@ -7,7 +7,7 @@ - - -
    - -
    -
    -

    Layers definition

    -

    You can easily add various layers to your map, including a layer selector on the top right, defining layers like this.

    -
    
    -    
    + + +

    Layers simple example

    +

    You can easily add various layers to your map, including a layer selector on the top right, defining layers object.

    diff --git a/examples/overlays-simple-example.html b/examples/0202-layers-overlays-simple-example.html similarity index 66% rename from examples/overlays-simple-example.html rename to examples/0202-layers-overlays-simple-example.html index 827a91b9..7ef79144 100644 --- a/examples/overlays-simple-example.html +++ b/examples/0202-layers-overlays-simple-example.html @@ -7,7 +7,7 @@ - - -
    - -
    -
    -

    Baselayer with overlay definition

    -

    You can add overlays to a baselayer, which will show a layer selector on the top right corner, defining layers like this.

    -
    
    -    
    + + +

    Baselayer with overlays

    +

    You can add overlays to a baselayer, which will show a layer selector on the top right corner, defining layers like in this example.

    diff --git a/examples/layers-imageoverlay-example.html b/examples/0203-layers-imageoverlay-example.html similarity index 82% rename from examples/layers-imageoverlay-example.html rename to examples/0203-layers-imageoverlay-example.html index f9c11715..f340c202 100644 --- a/examples/layers-imageoverlay-example.html +++ b/examples/0203-layers-imageoverlay-example.html @@ -7,7 +7,7 @@ - + +

    Layer with image overlay and maxBounds

    - diff --git a/examples/layers-add-remove.html b/examples/0204-layers-dynamic-addition-example.html similarity index 51% rename from examples/layers-add-remove.html rename to examples/0204-layers-dynamic-addition-example.html index 58e29d33..bc2657f8 100644 --- a/examples/layers-add-remove.html +++ b/examples/0204-layers-dynamic-addition-example.html @@ -1,22 +1,22 @@ - + - - - - - - -
    -
    -
    -

    Dynamic addition/removal of layers

    -
    - - - -
    -

    Layer definition:

    -
    
    -            
    -
    - -
    -
    -
    + + +

    Dynamic addition/removal of layers

    + + + + + + diff --git a/examples/googlemaps-example.html b/examples/0205-layers-googlemaps-example.html similarity index 93% rename from examples/googlemaps-example.html rename to examples/0205-layers-googlemaps-example.html index aa09dcd8..6454d785 100644 --- a/examples/googlemaps-example.html +++ b/examples/0205-layers-googlemaps-example.html @@ -3,7 +3,7 @@ - + @@ -48,8 +48,8 @@ -

    Google maps

    + +

    Google maps example

    Use the Layer Switch Control on the top rigth of the map to select another Google Maps Layer.

    - diff --git a/examples/googlemaps-fullsize-example.html b/examples/0206-layers-googlemaps-fullsize-example.html similarity index 77% rename from examples/googlemaps-fullsize-example.html rename to examples/0206-layers-googlemaps-fullsize-example.html index 1b749511..fb0938c2 100644 --- a/examples/googlemaps-fullsize-example.html +++ b/examples/0206-layers-googlemaps-fullsize-example.html @@ -3,7 +3,6 @@ - @@ -12,14 +11,7 @@ - - -
    - -
    -
    -

    Baselayer with overlay definition

    -

    You can add overlays to a baselayer, which will show a layer selector on the top right corner, defining layers like this.

    -
    
    -    
    + + +

    Baselayer hidden on switch selector to show only overlay

    +

    Open the layer switch selector to see it.

    +
    
     
     
    diff --git a/examples/esri-dynamiclayer-example.html b/examples/0208-layers-esri-dynamic-layer-example.html
    similarity index 82%
    rename from examples/esri-dynamiclayer-example.html
    rename to examples/0208-layers-esri-dynamic-layer-example.html
    index 9e58e374..5edddf82 100644
    --- a/examples/esri-dynamiclayer-example.html
    +++ b/examples/0208-layers-esri-dynamic-layer-example.html
    @@ -3,7 +3,6 @@
     
         
         
    -    
         
         
         
    @@ -11,7 +10,7 @@
         
         
     
    -
    +
    +    
         

    Esri ArcGIS Dynamic Map Layer

    Use the Layer Switch Control on the top rigth of the map to select another Esri Layer.

    - diff --git a/examples/esri-legend-example.html b/examples/0209-layers-esri-legend-service-example.html similarity index 79% rename from examples/esri-legend-example.html rename to examples/0209-layers-esri-legend-service-example.html index 6e9c4bea..9b7d34b1 100644 --- a/examples/esri-legend-example.html +++ b/examples/0209-layers-esri-legend-service-example.html @@ -3,15 +3,12 @@ - - - - + - + - + +

    Esri ArcGIS Legend Service

    Use the button to switch another Esri Legend.

    -
    diff --git a/examples/heatmap-example.html b/examples/0210-layers-webgl-heatmap-example.html similarity index 66% rename from examples/heatmap-example.html rename to examples/0210-layers-webgl-heatmap-example.html index 1cba1e2b..71574651 100644 --- a/examples/heatmap-example.html +++ b/examples/0210-layers-webgl-heatmap-example.html @@ -9,7 +9,7 @@ - - -
    - -
    -
    -

    HeatMap overlay example

    -

    You can use the WebGL HeatMap overlay plugin, like this. Please read the heatmap plugin documentation to use it.

    -
    
    -    
    + + +

    HeatMap WebGL overlay example

    +

    You can use the WebGL HeatMap overlay plugin, like this. Please read the heatmap plugin documentation to use it.

    +
    
     
     
    diff --git a/examples/layergroup-simple-example.html b/examples/0211-layers-layergroup-simple-example.html
    similarity index 71%
    rename from examples/layergroup-simple-example.html
    rename to examples/0211-layers-layergroup-simple-example.html
    index a852d9f7..fde7c238 100644
    --- a/examples/layergroup-simple-example.html
    +++ b/examples/0211-layers-layergroup-simple-example.html
    @@ -8,7 +8,7 @@
         
         
    -    
     
    -
    -    
    - -
    -
    -

    Layer Groups with nested layer definitions

    -

    You can add layer groups to a map. In this case, a UTF Grid and Tile Layer are grouped. Notice that the layers show as one in the layer selector control.

    -

    You hovered over:

    -
    
    -    
    + + +

    Layer Groups with nested layer definitions

    +

    You can add layer groups to a map. In this case, a UTF Grid and Tile Layer are grouped. Notice that the layers show as one in the layer selector control.

    +

    You hovered over:

    +
    
     
    -
    \ No newline at end of file
    +
    diff --git a/examples/overlays-hide-overlay-on-selector-example.html b/examples/0212-layers-hide-overlays-on-selector-example.html
    similarity index 65%
    rename from examples/overlays-hide-overlay-on-selector-example.html
    rename to examples/0212-layers-hide-overlays-on-selector-example.html
    index 236b5249..cc87e292 100644
    --- a/examples/overlays-hide-overlay-on-selector-example.html
    +++ b/examples/0212-layers-hide-overlays-on-selector-example.html
    @@ -7,7 +7,7 @@
         
         
    -    
     
    -
    -    
    - -
    -
    -

    Overlay not shown in selector

    -

    You can hide the enable/disable functionality of the overlay in the selector, using this attribute in the layerOptions object:

    -
    layerOptions: {
    +
    +    
    +    

    Overlay not shown in selector

    +

    You can hide the enable/disable functionality of the overlay in the selector, using this attribute in the layerOptions object:

    +
    layerOptions: {
         showOnSelector: false
     }
    -
    diff --git a/examples/bingmaps-example.html b/examples/0213-layers-bingmaps-example.html similarity index 89% rename from examples/bingmaps-example.html rename to examples/0213-layers-bingmaps-example.html index 8244834b..8808dc99 100644 --- a/examples/bingmaps-example.html +++ b/examples/0213-layers-bingmaps-example.html @@ -3,7 +3,6 @@ - @@ -11,7 +10,7 @@ - + +

    Bing maps

    Use the Layer Switch Control on the top rigth of the map to select another Bing Maps Layer.

    - diff --git a/examples/utfgrid-example.html b/examples/0214-layers-utfgrid-example.html similarity index 70% rename from examples/utfgrid-example.html rename to examples/0214-layers-utfgrid-example.html index 15949741..ee37303e 100644 --- a/examples/utfgrid-example.html +++ b/examples/0214-layers-utfgrid-example.html @@ -8,7 +8,7 @@ - - -
    - -

    {{interactivity}}

    -
    -
    -

    Baselayer with UTFGrid interactivity in Overlay

    -

    You can add UTFGrid intactivity in overlays to a baselayer, which will show in the layer selector in the top right corner, defining layers like this.

    -
    
    -    
    + + +

    Baselayer with UTFGrid interactivity in Overlay

    +

    Mouse over the map regions to interact with UTFGrid.

    +

    {{interactivity}}

    +

    diff --git a/examples/overlays-markercluster-example.html b/examples/0216-layers-overlays-markercluster-example.html similarity index 73% rename from examples/overlays-markercluster-example.html rename to examples/0216-layers-overlays-markercluster-example.html index 0e3d5742..f9384b8a 100644 --- a/examples/overlays-markercluster-example.html +++ b/examples/0216-layers-overlays-markercluster-example.html @@ -6,13 +6,12 @@ - - -
    -
    -

    This is a map with overlays and a markercluster

    -
    -
    -

    - In this example we use a MarkerCluster overlay to group the markers instead of a LayerGroup. - The layer is defined as any other overlay. The possible options can be found in the MarkerCluster docs -

    -
    -
    -

    - Layer definition: -

    -

    -

    +
    +    
    +    

    This is a map with overlays and a markercluster

    +

    + In this example we use a MarkerCluster overlay to group the markers instead of a LayerGroup. + The layer is defined as any other overlay. The possible options can be found in the MarkerCluster docs +

    +

    + Layer definition: +

    +

    +

     cars: {
         name: 'Cars',
         type: 'markercluster',
         visible: true
     }
    -                
    -

    -
    -
    - -
    -
    -

    -

    - The MarkerCluster, at this moment, does not support the location change of the markers and they have to be - removed and added again to the cluster. So, as we remove & add markers when the model is changed, you can - experience a slight glitch during this operation. You can test it clicking the button below. -
    -

    -

    - -

    + +

    +

    +

    + The MarkerCluster, at this moment, does not support the location change of the markers and they have to be + removed and added again to the cluster. So, as we remove & add markers when the model is changed, you can + experience a slight glitch during this operation. You can test it clicking the button below.
    -
    +

    +

    + +

    diff --git a/examples/0218-layers-overlays-markers-nested-example.html b/examples/0218-layers-overlays-markers-nested-example.html new file mode 100644 index 00000000..e20e37db --- /dev/null +++ b/examples/0218-layers-overlays-markers-nested-example.html @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + +

    Layers and overlays with nested markers example

    + +
    Markers: {{lMarkers}}
    +
    m1: {{hasM1}}
    +
    m2: {{hasM2}}
    +
    +
    + + diff --git a/examples/overlays-paths-example.html b/examples/0219-layers-overlays-paths-example.html similarity index 89% rename from examples/overlays-paths-example.html rename to examples/0219-layers-overlays-paths-example.html index 9ebb13e7..0b750c3e 100644 --- a/examples/overlays-paths-example.html +++ b/examples/0219-layers-overlays-paths-example.html @@ -5,11 +5,10 @@ - - -
    -
    -
    -

    This is a map with different overlays for paths

    -
    -
    -

    - In this example we create two layer groups lines, and shapes. We insert markers in both layers (note that on is initially - visible and one not). -

    -
    -
    - -
    -
    -
    + + +

    Different overlays for paths

    +

    + In this example we create two layer groups lines, and shapes. We insert markers in both layers (note that on is initially + visible and one not). diff --git a/examples/wms-with-different-projection-example.html b/examples/0220-layers-wms-with-different-projection-example.html similarity index 92% rename from examples/wms-with-different-projection-example.html rename to examples/0220-layers-wms-with-different-projection-example.html index 73367796..d590be21 100644 --- a/examples/wms-with-different-projection-example.html +++ b/examples/0220-layers-wms-with-different-projection-example.html @@ -8,9 +8,9 @@ - +

    Load a map in non standard projection

    diff --git a/examples/paths-simple-example.html b/examples/0300-paths-simple-example.html similarity index 86% rename from examples/paths-simple-example.html rename to examples/0300-paths-simple-example.html index 78b09266..98f66a59 100644 --- a/examples/paths-simple-example.html +++ b/examples/0300-paths-simple-example.html @@ -9,7 +9,7 @@ - - - + + +

    Paths simple example

    Click on red route (Popup) or hover over green route (Label) to get more information

    diff --git a/examples/paths-types-example.html b/examples/0301-paths-types-example.html similarity index 69% rename from examples/paths-types-example.html rename to examples/0301-paths-types-example.html index 74e34e52..1be19da9 100644 --- a/examples/paths-types-example.html +++ b/examples/0301-paths-types-example.html @@ -5,10 +5,9 @@ - - - -
    -
    + + +

    Types of paths

    -
    -

    Types of paths

    -
    - -
    -
    - - - - - - - -
    -
    -
    -
    - -
    -
    -
    + + + + + + + diff --git a/examples/path-ajax-load-example.html b/examples/0302-paths-ajax-load-example.html similarity index 83% rename from examples/path-ajax-load-example.html rename to examples/0302-paths-ajax-load-example.html index b79246cd..eeeedc1e 100644 --- a/examples/path-ajax-load-example.html +++ b/examples/0302-paths-ajax-load-example.html @@ -9,7 +9,7 @@ - - - + + +

    Load remote paths example

    Click on red route (Popup) or hover over green route (Label) to get more information

    diff --git a/examples/path-3000-items.html b/examples/0303-paths-3000-items-example.html similarity index 94% rename from examples/path-3000-items.html rename to examples/0303-paths-3000-items-example.html index e9c41937..0cbe416a 100644 --- a/examples/path-3000-items.html +++ b/examples/0303-paths-3000-items-example.html @@ -9,7 +9,7 @@ - - - + + +

    3000 items in a map performance

    diff --git a/examples/paths-example.html b/examples/0304-paths-advanced-example.html similarity index 97% rename from examples/paths-example.html rename to examples/0304-paths-advanced-example.html index d62fbbc7..e2657312 100644 --- a/examples/paths-example.html +++ b/examples/0304-paths-advanced-example.html @@ -28,7 +28,7 @@ - + + +

    Advanced Paths Example

    Center

    @@ -187,6 +189,5 @@

    Paths

    - diff --git a/examples/path-change-in-group-layer.html b/examples/0305-paths-change-in-group-layer-example.html similarity index 92% rename from examples/path-change-in-group-layer.html rename to examples/0305-paths-change-in-group-layer-example.html index c42c79cb..cde88186 100644 --- a/examples/path-change-in-group-layer.html +++ b/examples/0305-paths-change-in-group-layer-example.html @@ -7,7 +7,7 @@ - + +

    Path change in group layer

    diff --git a/examples/decorations-simple-example.html b/examples/0306-paths-decorations-simple-example.html similarity index 93% rename from examples/decorations-simple-example.html rename to examples/0306-paths-decorations-simple-example.html index 92b1a3a6..490f335e 100644 --- a/examples/decorations-simple-example.html +++ b/examples/0306-paths-decorations-simple-example.html @@ -8,7 +8,7 @@ - + + +

    Path decoration example

    - diff --git a/examples/layer-control-example.html b/examples/0400-controls-custom-layer-control-example.html similarity index 78% rename from examples/layer-control-example.html rename to examples/0400-controls-custom-layer-control-example.html index bb5942e2..080ef52e 100644 --- a/examples/layer-control-example.html +++ b/examples/0400-controls-custom-layer-control-example.html @@ -2,19 +2,16 @@ - - - - - - +

    Scale control example

    diff --git a/examples/markers-simple-example.html b/examples/0500-markers-simple-example.html similarity index 86% rename from examples/markers-simple-example.html rename to examples/0500-markers-simple-example.html index 7c48ac17..a5b17cd0 100644 --- a/examples/markers-simple-example.html +++ b/examples/0500-markers-simple-example.html @@ -7,7 +7,7 @@ - + + +

    Markers simple example

    Marker (lat/lng):

    - diff --git a/examples/marker-add-example.html b/examples/0501-markers-events-add-example.html similarity index 80% rename from examples/marker-add-example.html rename to examples/0501-markers-events-add-example.html index 85373cd8..ec172c1a 100644 --- a/examples/marker-add-example.html +++ b/examples/0501-markers-events-add-example.html @@ -7,7 +7,7 @@ - -

    Click on the map to add a marker

    - + + +

    Markers with events example

    +

    Click on the map to add a marker

    diff --git a/examples/markers-dynamic-addremove-example.html b/examples/0502-markers-add-remove-example.html similarity index 83% rename from examples/markers-dynamic-addremove-example.html rename to examples/0502-markers-add-remove-example.html index bb3c541a..8b2191ad 100644 --- a/examples/markers-dynamic-addremove-example.html +++ b/examples/0502-markers-add-remove-example.html @@ -7,7 +7,7 @@ - - Remove markers # - Add markers - + + +

    Add/remove markers easily example

    + + diff --git a/examples/0503-markers-icons-example.html b/examples/0503-markers-icons-example.html new file mode 100644 index 00000000..9f9bbebe --- /dev/null +++ b/examples/0503-markers-icons-example.html @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + +

    Changing the marker icons

    + + + + +

    AwesomeMarker Icons

    + + + + + + + + + +

    MakiMarker Icons

    + + + + +

    ExtraMarker Icons

    + + + + + + diff --git a/examples/0504-markers-popup-example.html b/examples/0504-markers-popup-example.html new file mode 100644 index 00000000..cd0f1f47 --- /dev/null +++ b/examples/0504-markers-popup-example.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + +

    Marker Popup properties

    +

    Marker position

    + Latitude: + Longitue: + +

    Marker focus

    + + +

    Popup message

    + + +

    Draggable marker

    + Draggable + Not draggable + + diff --git a/examples/markers-label-example.html b/examples/0505-markers-label-example.html similarity index 64% rename from examples/markers-label-example.html rename to examples/0505-markers-label-example.html index caa5198b..9d57fd99 100644 --- a/examples/markers-label-example.html +++ b/examples/0505-markers-label-example.html @@ -12,7 +12,7 @@ - - - + + +

    Marker with label example

    diff --git a/examples/markers-groups-example.html b/examples/0506-markers-groups-example.html similarity index 76% rename from examples/markers-groups-example.html rename to examples/0506-markers-groups-example.html index 32c05a57..92d5a04a 100644 --- a/examples/markers-groups-example.html +++ b/examples/0506-markers-groups-example.html @@ -5,14 +5,11 @@ - - - - - -
    -
    - -
    -

    Setting Icon Rotation

    -
    - -
    - -
    + + +

    Changing Icon Rotation

    diff --git a/examples/markers-change-opacity-example.html b/examples/0507-markers-change-opacity-example.html similarity index 85% rename from examples/markers-change-opacity-example.html rename to examples/0507-markers-change-opacity-example.html index 38767e89..bbb5eb49 100644 --- a/examples/markers-change-opacity-example.html +++ b/examples/0507-markers-change-opacity-example.html @@ -7,7 +7,7 @@ - +

    Change icon opacity

    +

    Move the slider to change the icon opacity.

    diff --git a/examples/markers-clustering-example.html b/examples/0508-markers-clustering-example.html similarity index 82% rename from examples/markers-clustering-example.html rename to examples/0508-markers-clustering-example.html index 5199152c..f86e345b 100644 --- a/examples/markers-clustering-example.html +++ b/examples/0508-markers-clustering-example.html @@ -10,7 +10,7 @@ - -
    -

    Marker clustering example without layers

    - -
    + + +

    Marker clustering example without layers

    diff --git a/examples/markers-modal.html b/examples/0510-markers-modal-markercluster-example.html similarity index 65% rename from examples/markers-modal.html rename to examples/0510-markers-modal-markercluster-example.html index 98e662d8..be615260 100644 --- a/examples/markers-modal.html +++ b/examples/0510-markers-modal-markercluster-example.html @@ -1,5 +1,5 @@ - + @@ -7,31 +7,15 @@ - - - - - -
    diff --git a/examples/markers-clustering-10000.html b/examples/0511-markers-clustering-10000-markers-example.html similarity index 95% rename from examples/markers-clustering-10000.html rename to examples/0511-markers-clustering-10000-markers-example.html index 0f61d578..10cca967 100644 --- a/examples/markers-clustering-10000.html +++ b/examples/0511-markers-clustering-10000-markers-example.html @@ -11,7 +11,7 @@ - + +

    Marker Events example

    -
      +
      • event caught in listener.
      - diff --git a/examples/markers-delayed-events-example.html b/examples/0513-markers-delayed-events.html similarity index 83% rename from examples/markers-delayed-events-example.html rename to examples/0513-markers-delayed-events.html index e046ea9b..4e8990ac 100644 --- a/examples/markers-delayed-events-example.html +++ b/examples/0513-markers-delayed-events.html @@ -7,7 +7,7 @@ - - Remove markers # - Add markers -
        + + +

        Markers delayed events example

        + + +
        • event caught in listener.
        • -
        - +
      diff --git a/examples/markers-angular-template-example.html b/examples/0514-markers-angular-template-example.html similarity index 87% rename from examples/markers-angular-template-example.html rename to examples/0514-markers-angular-template-example.html index 0c8a7732..f89673bb 100644 --- a/examples/markers-angular-template-example.html +++ b/examples/0514-markers-angular-template-example.html @@ -12,7 +12,7 @@ - - Remove markers # - Add markers - + + +

      Markers angular template example

      + + diff --git a/examples/markers-two-maps-events-example.html b/examples/0515-markers-two-maps-events-example.html similarity index 79% rename from examples/markers-two-maps-events-example.html rename to examples/0515-markers-two-maps-events-example.html index ab3ba758..055f18d6 100644 --- a/examples/markers-two-maps-events-example.html +++ b/examples/0515-markers-two-maps-events-example.html @@ -1,5 +1,5 @@ - + @@ -63,18 +63,14 @@ alert('Marker in map 1 clicked'); }); - }]); - - - app.controller("leafletMarker2Controller", ['$scope', 'leafletData', function ($scope, $modalInstance, leafletData) { - var markers = []; - markers.push({ + var markers2 = []; + markers2.push({ lat: 52.229676, lng: 21.012229, draggable: false }); - markers.push({ + markers2.push({ lat: 52.219081, lng: 21.025386, draggable: false @@ -82,12 +78,12 @@ angular.extend($scope, { - defaults: { + defaults2: { maxZoom: 18, minZoom: 0, scrollWheelZoom: false }, - events: { + events2: { map: { enable: [], logic: 'emit' @@ -97,7 +93,7 @@ logic: 'emit' } }, - layers: { + layers2: { baselayers: { mapbox: { name: 'Mapbox Terrain', @@ -106,12 +102,12 @@ } } }, - center: { + center2: { zoom: 13, lat: 52.229676, lng: 21.012229 }, - markers: markers + markers: markers2 }); $scope.$on('leafletDirectiveMarker.click', function (e, args) { @@ -121,14 +117,9 @@ }]); - - -
      - + + +

      Two maps with markers and events

      diff --git a/examples/image-legend-example.html b/examples/0600-mixed-image-legend-example.html similarity index 100% rename from examples/image-legend-example.html rename to examples/0600-mixed-image-legend-example.html diff --git a/examples/geojson-example.html b/examples/0601-mixed-geojson-events-example.html similarity index 91% rename from examples/geojson-example.html rename to examples/0601-mixed-geojson-events-example.html index e855735b..e1f0d44f 100644 --- a/examples/geojson-example.html +++ b/examples/0601-mixed-geojson-events-example.html @@ -13,7 +13,7 @@ body, html { height: 100%; } - .info { + .worldmap { background: rgba(255, 255, 255, 0.9); border-radius: 5px; } @@ -39,7 +39,7 @@ margin-right: 8px; } - div.box { + div.worldmap.box { position: absolute; top: 1em; right: 1em; @@ -48,7 +48,7 @@ text-align: center; } - div.country { + div.worldmap.country { font-size: 2em; font-weight: bold; position: absolute; @@ -62,7 +62,7 @@ + + + + + + + +

      Mapbox tiles and Mapbox GeoJSON loading

      +
      
      +
      +
      diff --git a/examples/geojson-layers-example.html b/examples/0603-mixed-layers-overlays-geojson-example.html
      similarity index 86%
      rename from examples/geojson-layers-example.html
      rename to examples/0603-mixed-layers-overlays-geojson-example.html
      index a505f7b1..d9647b49 100644
      --- a/examples/geojson-layers-example.html
      +++ b/examples/0603-mixed-layers-overlays-geojson-example.html
      @@ -1,19 +1,13 @@
      -
      +
       
       	
       	
       	
       	
       	
      -
      -
       	
      -
      -	
      + + +

      GeoJSON TileLayers

      - -

      Data source: Openstreetmap (buildings data)

      -
      +

      Data source: Openstreetmap (buildings data)

      diff --git a/examples/0604-mixed-markers-nested-events-example.html b/examples/0604-mixed-markers-nested-events-example.html new file mode 100644 index 00000000..41500d6f --- /dev/null +++ b/examples/0604-mixed-markers-nested-events-example.html @@ -0,0 +1,92 @@ + + + + + + + + + + + + +

      Marker Events example

      +
        +
      • show map:
      • +
      • eventDetected: {{eventDetected}}
      • +
      • args: {{args}}
      • +
      + + diff --git a/examples/0605-mixed-overlays-markers-nested-no-watch-example.html b/examples/0605-mixed-overlays-markers-nested-no-watch-example.html new file mode 100644 index 00000000..1ac307f5 --- /dev/null +++ b/examples/0605-mixed-overlays-markers-nested-no-watch-example.html @@ -0,0 +1,168 @@ + + + + + + + + + + + + + +

      Overlays with nested markers no watchers example

      +
    +
    + + diff --git a/examples/add-remove-map-example.html b/examples/add-remove-map-example.html deleted file mode 100644 index d9ff250d..00000000 --- a/examples/add-remove-map-example.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/examples/css/viewer.css b/examples/css/viewer.css new file mode 100644 index 00000000..ec7fdb67 --- /dev/null +++ b/examples/css/viewer.css @@ -0,0 +1,274 @@ +/******************************* +Global +*******************************/ + +html, +body { + font-size: 15px; + font-family: "Open Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif; + background: #FFFFFF; + margin: 0px; + padding: 0px; + color: #555555; + min-height: 1000px; + text-rendering: optimizeLegibility; + min-width: 320px; +} + +p { + text-align: justify; +} + +.leftside { + background-color: #f7f7f7; + padding-bottom: 10em; +} + +.ui.header { + font-family: 'Source Sans Pro', "Helvetica Neue", "Helvetica", "Arial", sans-serif; +} + +.page { + background-color: #FFFFFF; + padding: 2em 0em; +} + +input[type=range] { + width: 100%; +} + +.ui .header a { + color: #333; +} + +.current { + float: right; + margin: 0.5em 0em 0em 1em; +} + +.middle.column { + padding: 1em 2em; +} + +.middle.column h2 { + margin-top: 0em; +} + +.right.column { + padding: 1em 2em; + background-color: #FFFFFF; +} + +.info { + background-color: #fff; + border: 2px #444 solid; + border-radius: 7px; + -webkit-box-shadow: 4px 4px 5px 0px rgba(50, 50, 50, 0.75); + -moz-box-shadow: 4px 4px 5px 0px rgba(50, 50, 50, 0.75); + box-shadow: 4px 4px 5px 0px rgba(50, 50, 50, 0.75); + color: #111; + font-size: 32px; + position: absolute; + bottom: 1em; + left: 1em; + z-index: 100; + font-weight: bold; + padding: .2em .5em; + white-space: nowrap; + line-height: 1.1em; + text-align: center; +} + +.info:before { + border-top: 6px solid transparent; + border-bottom: 6px solid transparent; + content: ""; + border-right: 6px solid black; + border-right-color: inherit; + position: absolute; + left: -8px; + top: 20px; +} + +.render-html .popup-label { + padding: 1px; + margin: 0; +} + +.render-html .popup-label img { + border-radius: 4px; + padding: 0; + margin: 0; +} + +@media only screen and (max-width : 1250px) { + .left.column > .menu .item { + font-size: 1rem; + } +} + +.fullscreen { + width: 100%; + height: 480px; +} + +.info { + padding: 20px; + font-family: 'Lato', sans-serif; + font-size: 1em; + background: rgba(255, 255, 255, 0.9); + box-shadow: 0 0 15px rgba(0, 0, 0, 0.4); +} +.info h4 { + margin: 0 0 5px; + color: #3D3938; +} + +.legend { + text-align: left; + font: 14px/16px Arial, Helvetica, sans-serif; + background: rgba(255,255,255, 0.9); + box-shadow: 0 0 15px rgba(0,0,0,0.2); + border-radius: 5px; + padding: 6px 8px; + width: 260px; + max-height: 300px; + overflow: auto; + line-height: 18px; + color: #555; +} +.legend i { + width: 16px; + height: 16px; + float: left; + margin-right: 8px; + opacity: 0.7; +} + +.legend-esri { + text-align: left; + font: 14px/16px Arial, Helvetica, sans-serif; + background: rgba(255,255,255, 0.9); + box-shadow: 0 0 15px rgba(0,0,0,0.2); + border-radius: 5px; + padding: 6px 8px; + width: 260px; + max-height: 300px; + overflow: auto; + line-height: 18px; + color: #555; +} +.legend-esri i { + width: 16px; + height: 16px; + float: left; + margin-right: 8px; + opacity: 0.7; +} + +.legend-esri .outline { + border: 1px solid #CCCCCC; + border-radius: 6px 6px 6px 6px; + float: left; + height: 12px; + margin: 3px 10px 3px 3px; + padding: 2px; + width: 12px; +} +.legend-esri .outline i { + border-radius: 4px 4px 4px 4px; + float: left; + height: 6px; + width: 6px; +} +.legend-esri .inline { + clear: both; + float: left; + margin-right: 10px; +} +.legend-esri .info-title { + clear: both; + float: left; + font-size: 0.9em; + font-weight: bold; + margin: 5px 0; + width: 100%; +} +.legend-esri .info-label { + float: left; + width: 170px; + font-size: 0.8em; +} + +.angular-leaflet-control-layers { + position: absolute; + background: white; + z-index: 100; + left: 10px; + top: 100px; + width: 200px; + box-shadow: 1px 1px 5px #333; + padding: 5px; +} + +.angular-leaflet-control-layers .lf-row label { + cursor: pointer; + width: 100%; +} + +.angular-leaflet-control-layers .lf-row label .lf-icons { + float: right; +} + +.angular-leaflet-control-layers .lf-row label .lf-icon { + cursor: pointer; + float: left; + margin-right: 5px; + padding-top: 2px; +} + +.angular-leaflet-control-layers .lf-row label .lf-text { + float: left; +} + +.red { + border-radius: 120px; + opacity: .75; + background-color: #FF0000; +} + +.blue { + border-radius: 120px; + opacity: .75; + background-color: #0000FF; +} + +.angular-leaflet-map { + height: 480px; +} + +.worldmap { + background: rgba(255, 255, 255, 0.9); + border-radius: 5px; +} + +div.worldmap.box { + position: absolute; + top: 2em; + right: 2em; + z-index: 100; + padding: 1em; + text-align: center; +} + +div.worldmap.country { + font-size: 2em; + font-weight: bold; + position: absolute; + bottom: 3em; + left: 1em; + z-index: 100; + padding: .2em .5em; + line-height: 1.1em; + text-align: center; +} diff --git a/examples/geojson-external-update-example.html b/examples/geojson-external-update-example.html deleted file mode 100644 index bed0543c..00000000 --- a/examples/geojson-external-update-example.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - -
    -
    - {{ geojson.selected.properties.name || 'No country'}} -
    -
    Map center: [ lat: {{ center.lat | number:4 }}, lng: {{ center.lng | number:4 }} ]
    - - - - diff --git a/examples/image-overlay-example.html b/examples/image-overlay-example.html deleted file mode 100644 index 75927d00..00000000 --- a/examples/image-overlay-example.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - -

    Click on the map to add a marker

    - - - - diff --git a/examples/img/andes.jpg b/examples/images/andes.jpg similarity index 100% rename from examples/img/andes.jpg rename to examples/images/andes.jpg diff --git a/examples/js/controllers.js b/examples/js/controllers.js new file mode 100644 index 00000000..d1a064a8 --- /dev/null +++ b/examples/js/controllers.js @@ -0,0 +1,3575 @@ +(function(angular){ +var app = angular.module('webapp'); + app.controller("BasicAccessLeafletObjectController", [ "$scope", "$log", "leafletData", function($scope, $log, leafletData) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + } + }); + $scope.fitBounds = function() { + leafletData.getMap().then(function(map) { + map.fitBounds([ [40.712, -74.227], [40.774, -74.125] ]); + }); + }; + }]); + app.controller("BasicBoundsController", [ "$scope", "leafletData", "leafletBoundsHelpers", function($scope, leafletData, leafletBoundsHelpers) { + var bounds = leafletBoundsHelpers.createBoundsFromArray([ + [ 51.508742458803326, -0.087890625 ], + [ 51.508742458803326, -0.087890625 ] + ]); + angular.extend($scope, { + bounds: bounds, + center: {} + }); + }]); + app.controller('BasicCenterAutodiscoverController', [ '$scope', function($scope) { + angular.extend($scope, { + center: { + autoDiscover: true + } + }); + }]); + app.controller('BasicCenterController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + } + }); + }]); + app.controller('BasicCenterGeoIPController', [ '$scope', '$http', function($scope, $http) { + angular.extend($scope, { + center: { + lat: 0, + lng: 0, + zoom: 2 + } + }); + $scope.searchIP = function(ip) { + var url = "http://freegeoip.net/json/" + ip; + $http.get(url).success(function(res) { + $scope.center = { + lat: res.latitude, + lng: res.longitude, + zoom: 10 + } + $scope.ip = res.ip; + }) + }; + $scope.searchIP(""); + }]); + app.controller('BasicCenterUrlHashController', [ '$scope', '$location', function($scope, $location) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + } + }); + $scope.$on("centerUrlHash", function(event, centerHash) { + console.log("url", centerHash); + $location.search({ c: centerHash }); + }); + $scope.changeLocation = function(centerHash) { + $location.search({ c: centerHash }); + } + }]); + app.controller('BasicCustomParametersController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + defaults: { + tileLayer: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png", + zoomControlPosition: 'topright', + tileLayerOptions: { + opacity: 0.9, + detectRetina: true, + reuseTiles: true, + }, + scrollWheelZoom: false + } + }); + }]); + app.controller("BasicDoubleMapAccessMapObjectController", [ "$scope", "$log", "leafletData", function($scope, $log, leafletData) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + markers: { + london: { + lat: 51.505, + lng: -0.09, + draggable: true + } + }, + defaults: { + tileLayer: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png", + } + }); + $scope.logLeafletData = function(name) { + leafletData.getMap(name).then(function(map) { + $log.info(map); + }); + }; + }]); + app.controller("BasicDoubleMapEventsController", [ "$scope", "$log", "leafletData", "leafletEvents", function($scope, $log, leafletData, leafletEvents) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + markers: { + london: { + lat: 51.505, + lng: -0.09, + draggable: true + } + }, + defaults: { + tileLayer: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png", + } + }); + $scope.events = { + map: { + enable: leafletEvents.getAvailableMapEvents(), + logic: 'emit' + } + }; + var mapEvents = leafletEvents.getAvailableMapEvents(); + for (var k in mapEvents) { + var eventName = 'leafletDirectiveMap.' + mapEvents[k]; + $scope.$on(eventName, function(event){ + $scope.eventDetected = event.name; + }); + } + angular.extend($scope, { + spain: { + lat: 40.095, + lng: -3.823, + zoom: 4 + }, + markers2: { + spain: { + lat: 51.505, + lng: -0.09, + draggable: true + } + }, + defaults: { + tileLayer: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png", + } + }); + $scope.events2 = { + map: { + enable: ['click', 'dblclick'], + logic: 'emit' + } + }; + var mapEvents2 = $scope.events2.map.enable; + for (var j in mapEvents2) { + var eventName2 = 'leafletDirectiveMap.' + mapEvents[j]; + $scope.$on(eventName2, function(event){ + $scope.eventDetected2 = event.name; + }); + } + }]); + app.controller("BasicDoubleMapSharingAttributesController", [ "$scope", "$log", "$http", "leafletData", function($scope, $log, $http, leafletData) { + angular.extend($scope, { + center: { + lat: 43.7350, + lng: -79.3734, + zoom: 11 + }, + defaults: { + scrollWheelZoom: false + }, + markers1: { + one: { + lat: 43.75, + lng: -79.56 + }, + two: { + lat: 43.76, + lng: -79.50 + } + }, + markers2: { + one: { + lat: 43.75, + lng: -79.56 + }, + two: { + lat: 43.75, + lng: -79.45 + }, + three: { + lat: 43.81, + lng: -79.26 + } + } + }); + $http.get('json/toronto1.json').success(function(data, status) { + $scope.toronto1 = data; + }); + $http.get('json/toronto2.json').success(function(data, status) { + $scope.toronto2 = data; + }); + }]); + app.controller("BasicDoubleMapToggleController", [ "$scope", "$log", "leafletData", function($scope, $log, leafletData) { + angular.extend($scope, { + center: { + lat: 51.505, + lng: -0.09, + zoom: 5 + }, + paths: { + p1: { + color: 'blue', + weight: 8, + latlngs: [{ + lat: 51.50, + lng: -0.082 + }, { + lat: 48.83, + lng: 2.37 + }, { + lat: 41.91, + lng: 12.48 + }] + } + }, + }); + angular.extend($scope, { + center2: { + lat: 51.505, + lng: -0.09, + zoom: 5 + }, + tiles2: { + name: 'Mapbox Outdoors', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + options: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia3no0m' + } + }, + paths2: { + p1: { + color: 'red', + weight: 8, + latlngs: [{ + lat: 51.50, + lng: -0.082 + }, { + lat: 48.83, + lng: 2.37 + }, { + lat: 41.91, + lng: 12.48 + }] + } + }, + }); + }]); + app.config(function ($routeProvider) { + $routeProvider.when('/map', { + template: '', + controller: 'BasicDynamicAddRemoveMapExample' + }); + }); + app.controller('BasicDynamicAddRemoveMapExample', [ '$scope', 'leafletData', function($scope, leafletData) { + } ]); + app.controller("BasicEventsController", [ "$scope", "leafletEvents", function($scope, leafletEvents) { + $scope.center = { + lat: 51.505, + lng: -0.09, + zoom: 8 + }; + $scope.eventDetected = "No events yet..."; + var mapEvents = leafletEvents.getAvailableMapEvents(); + for (var k in mapEvents){ + var eventName = 'leafletDirectiveMap.' + mapEvents[k]; + $scope.$on(eventName, function(event){ + $scope.eventDetected = event.name; + }); + } + }]); + app.controller("BasicFirstController", [ "$scope", function($scope) { + // Nothing here! + }]); + app.controller("BasicGeoJSONUpdateController", [ '$scope', '$http', 'leafletData', function($scope, $http, leafletData) { + angular.extend($scope, { + center: { + lat: 31.99, + lng: -33.43, + zoom: 3 + }, + geojson : { + data: { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -49.92187499999999, + 13.239945499286312 + ], + [ + -49.92187499999999, + 54.57206165565852 + ], + [ + -13.7109375, + 54.57206165565852 + ], + [ + -13.7109375, + 13.239945499286312 + ], + [ + -49.92187499999999, + 13.239945499286312 + ] + ] + ] + } + } + ] + }, + style: { + fillColor: "green", + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + } + } + }); + $scope.updateGeojson = function() { + $scope.geojson.data = { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -41.8359375, + 28.92163128242129 + ], + [ + -41.8359375, + 38.272688535980976 + ], + [ + -26.015625, + 38.272688535980976 + ], + [ + -26.015625, + 28.92163128242129 + ], + [ + -41.8359375, + 28.92163128242129 + ] + ] + ] + } + } + ] + } + } + }]); + app.controller('BasicHideShowMapController', function($scope, $timeout, leafletData) { + $scope.center = { + lat: 35, + lng: 0, + zoom: 8 + }; + $scope.showMap = false; + $scope.$watch("showMap", function(value) { + if (value === true) { + leafletData.getMap().then(function(map) { + $timeout(function() { + map.invalidateSize(); + }, 300); + }); + } + }); + }); + app.controller('BasicLegendController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 12 + }, + legend: { + position: 'bottomleft', + colors: [ '#ff0000', '#28c9ff', '#0000ff', '#ecf386' ], + labels: [ 'National Cycle Route', 'Regional Cycle Route', 'Local Cycle Network', 'Cycleway' ] + }, + defaults: { + tileLayer: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png" + } + }); + } ]); + app.controller('BasicMapWithoutAnimationsController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + defaults: { + zoomAnimation: false, + markerZoomAnimation: false, + fadeAnimation: false + }, + markers: { + london: { + lat: 51.505, + lng: -0.09, + } + } + }); + } ]); + app.controller("BasicMaxBoundsController", [ "$scope", "leafletData", function($scope, leafletData) { + $scope.regions = { + london: { + northEast: { + lat: 51.51280224425956, + lng: -0.11681556701660155 + }, + southWest: { + lat: 51.50211782162702, + lng: -0.14428138732910156 + } + }, + lisbon: { + southWest: { + lat: 38.700247900602726, + lng: -9.165430068969727 + }, + northEast: { + lat: 38.72703673982525, + lng: -9.110498428344725 + } + }, + warszawa: { + southWest: { + lat: 52.14823737817847, + lng: 20.793685913085934 + }, + northEast: { + lat: 52.31645452105213, + lng: 21.233139038085938 + } + } + }; + angular.extend($scope, { + maxbounds: $scope.regions.london + }); + } ]); + app.controller("BasicMaxBoundsPadController", ["$scope", "leafletBoundsHelpers", function($scope, leafletBoundsHelpers) { + var maxbounds = leafletBoundsHelpers.createBoundsFromArray([ + [37.8866, -79.4877], + [39.7230, -74.9863] + ]); + maxbounds.pad = 1.0; + angular.extend($scope, { + bounds: maxbounds, + center: { + lat: 37.8866, + lng: -79-4877, + zoom: 4 + }, + layers: { + baselayers: { + xyz: { + name: 'OpenStreetMap (XYZ)', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + }, + overlays: {} + }, + markers: { + northeast: { + lat: 39.7230, + lng: -74.9863, + focus: true, + title: "Northeast", + }, + southwest: { + lat: 37.8866, + lng: -79.4877, + title: "Southwest", + } + }, + maxbounds: maxbounds + }); + }]); + app.controller('BasicTilesController', [ '$scope', function($scope) { + var tilesDict = { + openstreetmap: { + url: "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", + options: { + attribution: '© OpenStreetMap contributors' + } + }, + opencyclemap: { + url: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png", + options: { + attribution: 'All maps © OpenCycleMap, map data © OpenStreetMap (ODbL' + } + }, + mapbox_outdoors: { + name: 'Mapbox Outdoors', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + options: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia3no0m' + } + }, + mapbox_wheat: { + name: 'Mapbox Wheat Paste', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + options: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia35jfp' + } + } + }; + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + tiles: tilesDict.mapbox_wheat + }); + $scope.changeTiles = function(tiles) { + $scope.tiles = tilesDict[tiles]; + }; + } ]); + app.controller('BasicTilesZoomChangerController', [ "$scope", function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 10 + }, + tiles: { + url: "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" + } + }); + $scope.$watch("london.zoom", function(zoom) { + $scope.tiles.url = (zoom > 12) + ? "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" + : "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"; + }); + } ]); + app.controller('ControlsCustomLayerControlController', [ '$scope', function($scope) { + angular.extend($scope, { + ripoll: { + lat: 42.20133, + lng: 2.19110, + zoom: 11 + }, + markers: { + m1: { + lat: 42.20133, + lng: 2.19110 + } + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + }, + cycle: { + name: 'OpenCycleMap', + type: 'xyz', + url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenCycleMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + hillshade: { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + }, + fire: { + name: 'OpenFireMap', + type: 'xyz', + url: 'http://openfiremap.org/hytiles/{z}/{x}/{y}.png', + layerOptions: { + attribution: '© OpenFireMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + } + } + }, + removeFireLayer: function() { + delete this.layers.overlays.fire; + }, + addFireLayer: function() { + this.layers.overlays.fire = { + name: 'OpenFireMap', + type: 'xyz', + url: 'http://openfiremap.org/hytiles/{z}/{x}/{y}.png', + layerOptions: { + attribution: '© OpenFireMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + }; + }, + existsFireLayer: function() { + return ('fire' in this.layers.overlays); + }, + removeHillshadeLayer: function() { + delete this.layers.overlays.hillshade; + }, + addHillshadeLayer: function() { + this.layers.overlays.hillshade = { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + }; + }, + existsHillshadeLayer: function() { + return ('hillshade' in this.layers.overlays); + } + }); + } ]); + app.controller("ControlsDrawController", [ "$scope", "leafletData", function($scope, leafletData) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + controls: { + draw: {} + } + }); + leafletData.getMap().then(function(map) { + var drawnItems = $scope.controls.edit.featureGroup; + map.on('draw:created', function (e) { + var layer = e.layer; + drawnItems.addLayer(layer); + console.log(JSON.stringify(layer.toGeoJSON())); + }); + }); + }]); + app.controller("ControlsScaleController", [ "$scope", function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + controls: { + scale: true + } + }); + }]); + app.controller("GeoJSONCenterController", [ '$scope', '$http', 'leafletData', function($scope, $http, leafletData) { + angular.extend($scope, { + japan: { + lat: 27.26, + lng: 78.86, + zoom: 2 + }, + defaults: { + scrollWheelZoom: false + } + }); + $scope.centerJSON = function() { + leafletData.getMap().then(function(map) { + var latlngs = []; + for (var i in $scope.geojson.data.features[0].geometry.coordinates) { + var coord = $scope.geojson.data.features[0].geometry.coordinates[i]; + for (var j in coord) { + var points = coord[j]; + for (var k in points) { + latlngs.push(L.GeoJSON.coordsToLatLng(points[k])); + } + } + } + map.fitBounds(latlngs); + }); + }; + // Get the countries geojson data from a JSON + $http.get("json/JPN.geo.json").success(function(data, status) { + angular.extend($scope, { + geojson: { + data: data, + style: { + fillColor: "green", + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + } + } + }); + }); + } ]); + app.controller("GeoJSONController", [ '$scope', '$http', 'leafletData', function($scope, $http, leafletData) { + angular.extend($scope, { + japan: { + lat: 38.51, + lng: 139, + zoom: 4 + }, + defaults: { + scrollWheelZoom: false + } + }); + // Get the countries geojson data from a JSON + $http.get("json/JPN.geo.json").success(function(data, status) { + angular.extend($scope, { + geojson: { + data: data, + style: { + fillColor: "green", + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + } + } + }); + }); + } ]); + app.controller("GeoJSONNestedController", [ '$scope', '$http', 'leafletData', function($scope, $http, leafletData) { + angular.extend($scope, { + japan: { + lat: 27.26, + lng: 78.86, + zoom: 2 + }, + defaults: { + scrollWheelZoom: false + }, + geojson:{} + }); + $scope.centerJSON = function(name) { + leafletData.getMap().then(function(map) { + var latlngs = []; + for (var i in $scope.geojson[name].data.features[0].geometry.coordinates) { + var coord = $scope.geojson[name].data.features[0].geometry.coordinates[i]; + for (var j in coord) { + var points = coord[j]; + for (var k in points) { + latlngs.push(L.GeoJSON.coordsToLatLng(points[k])); + } + } + } + map.fitBounds(latlngs); + }); + }; + // Get the countries geojson data from a JSON + $http.get("json/JPN.geo.json").success(function(data, status) { + angular.extend($scope.geojson, { + japan: { + data: data, + style: { + fillColor: "green", + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + } + } + }); + }); + $http.get("json/USA.geo.json").success(function(data, status) { + angular.extend($scope.geojson, { + usa:{ + data: data, + style: { + fillColor: "blue", + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + } + } + }); + }); + } ]); + app.controller("GeoJSONNonNestedController", [ '$scope', '$http', 'leafletData', function($scope, $http, leafletData) { + var getColor = function(id){ + return id == 'USA'? 'blue' : 'green'; + }; + var getStyle = function(feature){ + return { + fillColor: getColor(feature.id), + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + }; + }; + var createGeoJsonObject = function (data){ + return { + data: data, + style: getStyle + }; + }; + angular.extend($scope, { + japan: { + lat: 27.26, + lng: 78.86, + zoom: 2 + }, + defaults: { + scrollWheelZoom: false + }, + }); + $scope.centerJSON = function(index) { + leafletData.getMap().then(function(map) { + var latlngs = []; + for (var i in $scope.geojson.data.features[index].geometry.coordinates) { + var coord = $scope.geojson.data.features[index].geometry.coordinates[i]; + for (var j in coord) { + var points = coord[j]; + for (var k in points) { + latlngs.push(L.GeoJSON.coordsToLatLng(points[k])); + } + } + } + map.fitBounds(latlngs); + }); + }; + // Get the countries geojson data from a JSON + $http.get("json/JPN.geo.json").success(function(data, status) { + if(!$scope.geojson){ + $scope.geojson = createGeoJsonObject(data); + } + }); + $http.get("json/USA.geo.json").success(function(data, status) { + var features = $scope.geojson.data.features.concat(data.features); + var copy = angular.extend({}, $scope.geojson.data); + copy.features = features; + $scope.geojson.data = copy; + }); + } ]); + app.controller("GoogleMapsController", [ "$scope", function($scope) { + angular.extend($scope, { + berlin: { + lat: 52.52, + lng: 13.40, + zoom: 14 + }, + markers: { + m1: { + lat: 52.52, + lng: 13.40 + } + }, + layers: { + baselayers: { + googleTerrain: { + name: 'Google Terrain', + layerType: 'TERRAIN', + type: 'google' + }, + googleHybrid: { + name: 'Google Hybrid', + layerType: 'HYBRID', + type: 'google' + }, + googleRoadmap: { + name: 'Google Streets', + layerType: 'ROADMAP', + type: 'google' + } + } + } + }); + }]); + app.controller("GoogleMapsFullsizeController", [ "$scope", "$element", function($scope, $element) { + angular.extend($scope, { + berlin: { + lat: 52.52, + lng: 13.40, + zoom: 14 + }, + markers: { + m1: { + lat: 52.52, + lng: 13.40 + } + }, + layers: { + baselayers: { + googleTerrain: { + name: 'Google Terrain', + layerType: 'TERRAIN', + type: 'google' + }, + googleHybrid: { + name: 'Google Hybrid', + layerType: 'HYBRID', + type: 'google' + }, + googleRoadmap: { + name: 'Google Streets', + layerType: 'ROADMAP', + type: 'google' + } + } + } + }); + }]); + app.controller("ImageLegendServiceController", [ "$scope", function($scope) { + angular.extend($scope, { + options: { + controls: { + layers: { + visible: false + } + } + }, + usa: { + lat: 39.931486, + lng: -101.406250, + zoom: 3 + }, + markers: { + m1: { + lat: 39.931486, + lng: -101.406250, + } + }, + layers: { + baselayers: { + googleTerrain: { + name: 'Google Terrain', + layerType: 'TERRAIN', + type: 'google' + } + }, + overlays: { + sst: { + name: 'Analyses - Sea Surface Temperature', + type: 'wms', + url: 'http://nowcoast.noaa.gov/wms/com.esri.wms.Esrimap/analyses', + visible: true, + layerOptions: { + layers: 'NCEP_RAS_ANAL_RTG_SST,NCEP_POLY_ANAL_RTG_SST', + format: 'image/png', + transparent: true, + attribution: 'NOAA/NOS nowCOAST', + } + }, + wave: { + name: 'Forecasts - Wave height', + type: 'wms', + url: 'http://nowcoast.noaa.gov/wms/com.esri.wms.Esrimap/forecasts', + visible: false, + layerOptions: { + layers: 'NDFD_RAS_WAVEH_3_00,NDFD_POLY_WAVEH_3_00', + format: 'image/png', + transparent: true, + attribution: 'NOAA/NOS nowCOAST', + } + } + } + }, + legend: { + url: "http://nowcoast.noaa.gov/LayerInfo?layer=NCEP_RAS_ANAL_RTG_SST&data=legend", + legendClass: "info legend", + position: "bottomleft", + type: "image" + }, + legendURL1: "http://nowcoast.noaa.gov/LayerInfo?layer=NCEP_RAS_ANAL_RTG_SST&data=legend", + legendURL2: "http://nowcoast.noaa.gov/LayerInfo?layer=NDFD_RAS_WAVEH_3_00&data=legend", + switchLegend: function() { + $scope.layers.overlays.sst.visible = !$scope.layers.overlays.sst.visible; + $scope.layers.overlays.wave.visible = !$scope.layers.overlays.wave.visible; + $scope.legend.url == $scope.legendURL1? $scope.legendURL2:$scope.legendURL1; + } + }); + }]); + app.controller("LayersBingMapsController", [ "$scope", function($scope) { + angular.extend($scope, { + bastia: { + lat: 42.7029, + lng: 9.4529, + zoom: 13 + }, + markers: { + bastia: { + lat: 67.6755, + lng: 9.4529 + } + }, + layers: { + baselayers: { + bingAerial: { + name: 'Bing Aerial', + type: 'bing', + key: 'Aj6XtE1Q1rIvehmjn2Rh1LR2qvMGZ-8vPS9Hn3jCeUiToM77JFnf-kFRzyMELDol', + layerOptions: { + type: 'Aerial' + } + }, + bingRoad: { + name: 'Bing Road', + type: 'bing', + key: 'Aj6XtE1Q1rIvehmjn2Rh1LR2qvMGZ-8vPS9Hn3jCeUiToM77JFnf-kFRzyMELDol', + layerOptions: { + type: 'Road' + } + }, + bingAerialWithLabels: { + name: 'Bing Aerial With Labels', + type: 'bing', + key: 'Aj6XtE1Q1rIvehmjn2Rh1LR2qvMGZ-8vPS9Hn3jCeUiToM77JFnf-kFRzyMELDol', + layerOptions: { + type: 'AerialWithLabels' + } + }, + } + } + }); + }]); + app.controller("LayersDynamicAdditionController", [ "$scope", function($scope) { + $scope.definedLayers = { + mapbox_wheat: { + name: 'Mapbox Wheat Paste', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + layerOptions: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia35jfp' + } + }, + osm: { + name: 'OpenStreetMap', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + }; + $scope.definedOverlays = { + hillshade: { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + } + }; + angular.extend($scope, { + bern: { + lat: 46.916, + lng: 7.466, + zoom: 10 + }, + layers: { + baselayers: { + osm: $scope.definedLayers.osm, + mapbox_wheat: $scope.definedLayers.mapbox_wheat + }, + overlays: { + hillshade: $scope.definedOverlays.hillshade + } + } + }); + $scope.toggleLayer = function(layerName) { + var baselayers = $scope.layers.baselayers; + if (baselayers.hasOwnProperty(layerName)) { + delete baselayers[layerName]; + } else { + baselayers[layerName] = $scope.definedLayers[layerName]; + } + }; + $scope.toggleOverlay = function(overlayName) { + var overlays = $scope.layers.overlays; + if (overlays.hasOwnProperty(overlayName)) { + delete overlays[overlayName]; + } else { + overlays[overlayName] = $scope.definedOverlays[overlayName]; + } + }; + }]); + app.controller("LayersEsriDynamicLayerController", [ "$scope", function($scope) { + angular.extend($scope, { + bogota: { + lat: 4.649, + lng: -74.086, + zoom: 15 + }, + markers: { + m1: { + lat: 4.649, + lng: -74.086, + } + }, + layers: { + baselayers: { + world: { + name: "Imagery", + type: "dynamic", + url: "http://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer", + visible: false, + layerOptions: { + layers: [0, 1, 2, 3], + opacity: 1, + attribution: "Copyright:© 2014 Esri, DeLorme, HERE, TomTom" + } + }, + topo: { + name: "World Topographic", + type: "dynamic", + url: "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer", + visible: false, + layerOptions: { + layers: [0], + opacity: 0.9, + attribution: "Copyright:© 2014 Esri, FAO, NOAA" + } + }, + }, + }, + }); + }]); + app.controller("LayersEsriLegendServiceController", [ "$scope", function($scope) { + angular.extend($scope, { + options: { + controls: { + layers: { + visible: false + } + } + }, + usa: { + lat: 39.931486, + lng: -101.406250, + zoom: 3 + }, + markers: { + m1: { + lat: 39.931486, + lng: -101.406250, + } + }, + layers: { + baselayers: { + mapbox_light: { + name: 'Mapbox Light', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + layerOptions: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia22g09' + } + } + }, + overlays: { + usa_pop: { + name: "USA 2000-2010 Population Change", + type: "dynamic", + url: "http://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_1990-2000_Population_Change/MapServer", + visible: true, + layerOptions: { + opacity: 0.85, + attribution: "Copyright:© 2014 Esri, DeLorme, HERE, TomTom" + } + }, + usa_social: { + name: "USA Social Vulnerability Index", + type: "dynamic", + url: "http://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_Social_Vulnerability_Index/MapServer", + visible: false, + layerOptions: { + opacity: 0.85, + attribution: "Copyright:© 2014 Esri, FAO, NOAA" + } + }, + }, + }, + legend: { + url: "http://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_1990-2000_Population_Change/MapServer/legend?f=json", + legendClass: "info legend-esri", + position: "bottomleft", + }, + legendURL1: "http://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_1990-2000_Population_Change/MapServer/legend?f=json", + legendURL2: "http://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_Social_Vulnerability_Index/MapServer/legend?f=json", + switchLegend: function() { + $scope.layers.overlays.usa_social.visible = !$scope.layers.overlays.usa_social.visible; + $scope.legend.url = + $scope.legend.url == $scope.legendURL1? $scope.legendURL2:$scope.legendURL1; + } + }); + }]); + app.controller("LayersHideBaselayerOnSelectorController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 39, + lng: -100, + zoom: 4 + }, + layers: { + baselayers: { + xyz: { + name: 'OpenStreetMap (XYZ)', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz', + layerOptions: { + showOnSelector: false + } + } + }, + overlays: { + wms: { + name: 'EEUU States (WMS)', + type: 'wms', + visible: true, + url: 'http://suite.opengeo.org/geoserver/usa/wms', + layerParams: { + layers: 'usa:states', + format: 'image/png', + transparent: true + } + } + } + } + }); + }]); + app.controller("LayersHideOverlaysOnSelectorController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 39, + lng: -100, + zoom: 4 + }, + layers: { + baselayers: { + xyz: { + name: 'Mapbox Streets', + url: 'http://a.tiles.mapbox.com/v3/examples.map-i86nkdio/{z}/{x}/{y}.png', + type: 'xyz', + layerOptions: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.ll5em372' + } + } + }, + overlays: { + wms: { + name: 'EEUU States (WMS)', + type: 'wms', + visible: true, + url: 'http://suite.opengeo.org/geoserver/usa/wms', + layerParams: { + showOnSelector: false, + layers: 'usa:states', + format: 'image/png', + transparent: true + } + } + } + } + }); + }]); + app.controller("LayersImageOverlayController", [ "$scope", "$log", "leafletData", "leafletBoundsHelpers", function($scope, $log, leafletData, leafletBoundsHelpers) { + var maxBounds = leafletBoundsHelpers.createBoundsFromArray([[-540, -960], [540, 960]]); + angular.extend($scope, { + defaults: { + scrollWheelZoom: false, + crs: 'Simple', + maxZoom: 2 + }, + center: { + lat: 0, + lng: 0, + zoom: 0 + }, + maxBounds: maxBounds, + layers: { + baselayers: { + sanfrancisco: { + name: 'Andes', + type: 'imageOverlay', + url: 'images/andes.jpg', + bounds: [[-540, -960], [540, 960]], + layerParams: { + noWrap: true, + attribution: 'Creative Commons image found here' + } + } + }, + } + }); + }]); + app.controller("LayersLayergroupSimpleController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 39, + lng: -100, + zoom: 3 + }, + layers: { + baselayers: { + xyz: { + name: 'OpenStreetMap (XYZ)', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + }, + overlays: {} + } + }); + var tileLayer = { + name: 'Countries', + type: 'xyz', + url: 'http://{s}.tiles.mapbox.com/v3/milkator.press_freedom/{z}/{x}/{y}.png', + visible: true, + layerOptions: { + attribution: 'Map data © 2013 Natural Earth | Data © 2013 ROG/RSF', + maxZoom: 5 + } + }; + var utfGrid = { + name: 'UtfGrid', + type: 'utfGrid', + url: 'http://{s}.tiles.mapbox.com/v3/milkator.press_freedom/{z}/{x}/{y}.grid.json?callback={cb}', + visible: true, + pluginOptions: { + maxZoom: 5, + resolution: 4 + } + }; + var group = { + name: 'Group Layer', + type: 'group', + visible: true, + layerOptions: { + layers: [ tileLayer, utfGrid], + maxZoom: 5 + } + }; + $scope.layers['overlays']['Group Layer'] = group; + $scope.$on('leafletDirectiveMap.utfgridMouseover', function(event, leafletEvent) { + $scope.country = leafletEvent.data.name; + }); + }]); + app.controller('LayersOverlaysMarkerclusterController', [ '$scope', function($scope) { + angular.extend($scope, { + ripoll: { + lat: 42.20133, + lng: 2.19110, + zoom: 8 + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + }, + cycle: { + name: 'OpenCycleMap', + type: 'xyz', + url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenCycleMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + hillshade: { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + }, + cars: { + name: 'Cars', + type: 'markercluster', + visible: true + } + } + }, + markers: { + m1: { + lat: 42.20133, + lng: 2.19110, + layer: 'cars', + message: "I'm a moving car" + }, + m2: { + lat: 42.21133, + lng: 2.18110, + layer: 'cars', + message: "I'm a car" + }, + m3: { + lat: 42.19133, + lng: 2.18110, + layer: 'cars', + message: 'A bike!!' + }, + m4: { + lat: 42.3, + lng: 2.16110, + layer: 'cars' + }, + m5: { + lat: 42.1, + lng: 2.16910, + layer: 'cars' + }, + m6: { + lat: 42.15, + lng: 2.17110, + layer: 'cars' + } + } + }); + $scope.move = function() { + $scope.markers.m1.lng = $scope.markers.m1.lng + 0.1; + } + } ]); + app.controller('LayersOverlaysMarkersNestedController', ['$scope', 'leafletData','$timeout', + function ($scope, leafletData, $timeout) { + var _map; + leafletData.getMap().then(function(map){ + _map = map; + }); + angular.extend($scope, { + eraseMarkers: function(){ + $scope.markers = { + cars: { + m1: { + lat: 42.20133, + lng: 2.19110, + message: "I'm a car" + } + } + }; + //$scope.$apply(); + leafletData.getMarkers().then(function(lmarkers) { + $scope.hasM1 = _map.hasLayer(lmarkers.m1); + $scope.hasM2 = _map.hasLayer(lmarkers.m2); + }); + $timeout(function(){ + leafletData.getMarkers().then(function(lmarkers){ + $scope.lMarkers = Object.keys(lmarkers); + $scope.hasM1 = _map.hasLayer(lmarkers.m1); + $scope.hasM2 = _map.hasLayer(lmarkers.m2); + }); + },1000); + }, + lMarkers:{}, + ripoll: { + lat: 42.20133, + lng: 2.19110, + zoom: 11 + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + }, + cycle: { + name: 'OpenCycleMap', + type: 'xyz', + url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenCycleMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + hillshade: { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + }, + fire: { + name: 'OpenFireMap', + type: 'xyz', + url: 'http://openfiremap.org/hytiles/{z}/{x}/{y}.png', + layerOptions: { + attribution: '© OpenFireMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + }, + cars: { + name: 'Cars', + type: 'group', + visible: true + }, + bikes: { + name: 'Bicycles', + type: 'group', + visible: false + }, + runners:{ + name: 'Runners', + type: 'group', + visible: false + } + } + }, + markers: { + cars: { + m1: { + lat: 42.20133, + lng: 2.19110, + message: "I'm a car" + }, + m2: { + lat: 42.21133, + lng: 2.18110, + message: "I'm a car" + } + }, + bikes: { + m3: { + lat: 42.19133, + lng: 2.18110, + layer: 'bikes', + message: 'A bike!!' + }, + m4: { + lat: 42.3, + lng: 2.16110, + layer: 'bikes' + } + }, + runners: { + m5: { + lat: 42.1, + lng: 2.16910 + }, + m6: { + lat: 42.15, + lng: 2.17110 + } + } + } + }); + }]); + app.controller('LayersOverlaysPathsController', [ '$scope', function($scope) { + var markers = { + London : { + lat: 51.50, + lng: -0.082, + draggable: false + }, + Manchester: { + lat: 53.48, + lng: -2.24, + draggable: true + }, + Lincoln: { + lat: 53.230495, + lng: -0.53936, + draggable: true + }, + Northhampton: { + lat: 52.237892, + lng: -0.90087, + draggable: true + }, + Worcester: { + lat: 52.187404, + lng: -2.20275, + draggable: true + }, + York: { + lat: 53.959317, + lng: -1.08215, + draggable: true + } + }; + angular.extend($scope, { + cen: { + lat: 53, + lng: -3, + zoom: 6 + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + }, + cycle: { + name: 'OpenCycleMap', + type: 'xyz', + url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenCycleMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + hillshade: { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + }, + fire: { + name: 'OpenFireMap', + type: 'xyz', + url: 'http://openfiremap.org/hytiles/{z}/{x}/{y}.png', + layerOptions: { + attribution: '© OpenFireMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + }, + lines: { + name: 'Lines', + type: 'group', + visible: true + }, + shapes: { + name: 'Shapes', + type: 'group', + visible: false + } + } + }, + markers: markers, + paths: { + p1: { + color: '#008000', + weight: 4, + latlngs: [ markers.London, markers.Manchester ], + layer: 'lines' + }, + p2: { + weight: 3, + opacity: 0.5, + latlngs: [ + [ markers.London, markers.Lincoln ], + [ markers.Manchester, markers.Worcester] + ], + type: 'multiPolyline', + layer: 'lines' + }, + c1: { + weight: 2, + color: '#ff612f', + latlngs: markers.Northhampton, + radius: 10000, + type: 'circle', + layer: 'shapes' + }, + c2: { + weight: 2, + color: '#ff612f', + latlngs: markers.Lincoln, + radius: 50, + type: 'circleMarker', + layer: 'shapes' + }, + pg1: { + latlngs: [ markers.London, markers.Worcester, markers.Lincoln ], + stroke: false, + fillColor: '#ff69b4', + type: 'polygon', + layer: 'shapes' + }, + pg2: { + weight: 1, + color: '#2e3974', + latlngs: [ + [ markers.London, markers.Worcester, markers.Northhampton ], + [ markers.Manchester, markers.Lincoln, markers.York ] + ], + type: 'multiPolygon', + layer: 'shapes' + }, + r1: { + latlngs: [ markers.Lincoln, markers.York ], + type: 'rectangle', + layer: 'shapes' + } + } + }); + } ]); + app.controller("LayersOverlaysSimpleController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 39, + lng: -100, + zoom: 4 + }, + layers: { + baselayers: { + xyz: { + name: 'OpenStreetMap (XYZ)', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + }, + overlays: { + wms: { + name: 'EEUU States (WMS)', + type: 'wms', + visible: true, + url: 'http://suite.opengeo.org/geoserver/usa/wms', + layerParams: { + layers: 'usa:states', + format: 'image/png', + transparent: true + } + } + } + } + }); + }]); + app.controller("LayersSimpleController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 25.0391667, + lng: 121.525, + zoom: 6 + }, + markers: { + taipei: { + lat: 25.0391667, + lng: 121.525, + } + }, + layers: { + baselayers: { + mapbox_light: { + name: 'Mapbox Light', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + layerOptions: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia22g09' + } + }, + osm: { + name: 'OpenStreetMap', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + } + } + }); + }]); + app.controller("LayersUTFGridController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 0, + lng: 0, + zoom: 1 + }, + layers: { + baselayers: { + xyz: { + name: 'OpenStreetMap', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + }, + overlays: { + demosutfgrid: { + name: 'UTFGrid Interactivity', + type: 'utfGrid', + url: 'http://{s}.tiles.mapbox.com/v3/mapbox.geography-class/{z}/{x}/{y}.grid.json?callback={cb}', + visible: true + } + } + } + }); + $scope.interactivity = ""; + $scope.flag = ""; + $scope.$on('leafletDirectiveMap.utfgridMouseover', function(event, leafletEvent) { + // the UTFGrid information is on leafletEvent.data + $scope.interactivity = leafletEvent.data.admin; + $scope.flag = "data:image/png;base64," + leafletEvent.data.flag_png; + }); + $scope.$on('leafletDirectiveMap.utfgridMouseout', function(event, leafletEvent) { + $scope.interactivity = ""; + $scope.flag = ""; + }); + }]); + // For more info take a look at https://github.com/kartena/Proj4Leaflet proj4leaflet.js + app.controller('LayersWMSWithDifferentProjectionController', [ '$scope', '$location', function($scope) { + $scope.map = { + defaults: { + crs: new L.Proj.CRS('EPSG:3006', '+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs', + { + resolutions: [ + 8192, 4096, 2048, 1024, 512, 256, 128, + 64, 32, 16, 8, 4, 2, 1, 0.5 + ], + origin: [0, 0] + }), + continuousWorld: true + }, + malmo: { + lat: 55.5902, + lng: 12.9956, + zoom: 3 + }, + layers: { + baselayers: { + malmo: { + name: 'Fishery', + type: 'wms', + url: 'http://geodatatest.havochvatten.se/geoservices/ows', + visible: true, + layerOptions: { + layers: 'hav-fisketsgeografier:havet-ostersjons-delomraden', + format: 'image/png', + maxZoom: 14, + minZoom: 0, + continuousWorld: true, + attribution: '© Havs- och vattenmyndigheten (Swedish Agency for Marine and Water Management)' + } + } + } + } + }; + }]); + app.controller("LayersWebGLHeatmapController", [ "$scope", function($scope) { + var dataPoints = [ + [44.651144316,-63.586260171, 0.5], + [44.75, -63.5, 0.8] ]; + angular.extend($scope, { + center: { + lat: 44.8091, + lng: -63.3636, + zoom: 9 + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + }, + overlays: { + heatmap: { + name: 'Heat Map', + type: 'heatmap', + data: dataPoints, + visible: true + } + } + } + }); + }]); + app.controller('MarkersAddRemoveController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + markers: {} + }); + $scope.addMarkers = function() { + angular.extend($scope, { + markers: { + m1: { + lat: 51.505, + lng: -0.09, + message: "I'm a static marker", + }, + m2: { + lat: 51, + lng: 0, + focus: true, + message: "Hey, drag me if you want", + draggable: true + } + } + }); + }; + $scope.removeMarkers = function() { + $scope.markers = {}; + } + $scope.addMarkers(); + } ]); + app.controller('MarkersAngularTemplateController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + data: {markers: {}} + }); + $scope.addMarkers = function() { + $scope.data.markers = {}; + angular.extend($scope.data, { angularInterpolatedMessage : "Angular interpolated message!"}); + angular.extend($scope.data, { + markers: { + m1: { + lat: 51.505, + lng: -0.09, + compileMessage: false, + message: "I'm a static marker", + }, + m2: { + lat: 51, + lng: 0, + focus: true, + message: "
    ", + draggable: true, + }, + m3: { + lat: 51, + lng: -1, + getMessageScope: function () { return $scope; }, + message: "

    {{data.angularInterpolatedMessage}}

    ", + compileMessage: true + } + } + }); + }; + $scope.removeMarkers = function() { + $scope.data.markers = {}; + } + $scope.addMarkers(); + } ]); + app.controller('ViewController', ['$scope', function($scope) { + $scope.user = {} + $scope.greet = function(user) { + alert('hello ' + user.name) + } + } ]); + app.controller('MarkersChangeOpacityController', [ '$scope', function($scope) { + angular.extend($scope, { + chicago: { + lat: 41.85, + lng: -87.65, + zoom: 8 + }, + markers: { + m1: { + lat: 41.85, + lng: -87.65, + message: "I'm a static marker with defaultIcon", + focus: false, + opacity: 1 + }, + } + }); + } ]); + app.controller("MarkersClustering10000MarkersController", [ "$scope", function($scope) { + var addressPointsToMarkers = function(points) { + return points.map(function(ap) { + return { + layer: 'realworld', + lat: ap[0], + lng: ap[1] + }; + }); + }; + angular.extend($scope, { + center: { + lat: -37.9212959167, + lng: 175.5604435167, + zoom: 11 + }, + events: { + map: { + enable: ['moveend', 'popupopen'], + logic: 'emit' + }, + marker: { + enable: [], + logic: 'emit' + } + }, + markers: addressPointsToMarkers(addressPoints), + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + realworld: { + name: "Real world data", + type: "markercluster", + visible: true, + "layerOptions": { + "chunkedLoading": true, + "showCoverageOnHover": false, + "removeOutsideVisibleBounds": true + } + }, + } + } + }); + }]); + app.controller("MarkersClusteringController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 24.0391667, + lng: 121.525, + zoom: 6 + }, + markers: { + taipei: { + layer: "northTaiwan", + lat: 25.0391667, + lng: 121.525, + }, + yangmei: { + layer: "northTaiwan", + lat: 24.9166667, + lng: 121.1333333 + }, + hsinchu: { + layer: "northTaiwan", + lat: 24.8047222, + lng: 120.9713889 + }, + miaoli: { + layer: "northTaiwan", + lat: 24.5588889, + lng: 120.8219444 + }, + tainan: { + layer: "southTaiwan", + lat: 22.9933333, + lng: 120.2036111 + }, + puzi: { + layer: "southTaiwan", + lat: 23.4611, + lng: 120.242 + }, + kaohsiung: { + layer: "southTaiwan", + lat: 22.6252777778, + lng: 120.3088888889 + }, + taitun: { + layer: "southTaiwan", + lat: 22.75, + lng: 121.15 + } + }, + layers: { + baselayers: { + mapbox_light: { + name: 'Mapbox Light', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + layerOptions: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia22g09' + } + } + }, + overlays: { + northTaiwan: { + name: "North cities", + type: "markercluster", + visible: true + }, + southTaiwan: { + name: "South cities", + type: "markercluster", + visible: true + } + } + } + }); + }]); + app.controller('MarkersClusteringWithoutOverlaysController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + markers: { + stoke: { + group: 'london', + lat: 51.5615, + lng: -0.0731, + label: { + message: "Stoke", + options: { + noHide: true + } + } + }, + dalston: { + group: 'london', + lat: 51.545, + lng: -0.070, + label: { + message: "Dalston", + options: { + noHide: true + } + } + }, + wandsworth: { + group: 'london', + lat: 51.4644, + lng:-0.1924, + label: { + message: "Wandsworth", + options: { + noHide: true + } + } + }, + battersea: { + group: 'london', + lat: 51.4638, + lng: -0.1677, + label: { + message: "Battersea", + options: { + noHide: true + } + } + } + }, + }); + } ]); + app.controller("MarkersDelayedEventsController", ["$scope", "leafletEvents", function($scope, leafletEvents){ + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + markers: {} + }); + $scope.addMarkers = function() { + angular.extend($scope, { + markers: { + m1: { + lat: 51.505, + lng: -0.09, + message: "I'm a static marker", + }, + m2: { + lat: 51, + lng: 0, + focus: true, + message: "Hey, drag me if you want", + draggable: true + } + } + }); + }; + $scope.events = { + markers: { + enable: leafletEvents.getAvailableMarkerEvents(), + } + }; + $scope.eventDetected = "No events yet..."; + var markerEvents = leafletEvents.getAvailableMarkerEvents(); + for (var k in markerEvents){ + var eventName = 'leafletDirectiveMarker.' + markerEvents[k]; + $scope.$on(eventName, function(event, args){ + $scope.eventDetected = event.name; + }); + } + $scope.removeMarkers = function() { + $scope.markers = {}; + } + //$scope.addMarkers(); + }]); + app.controller('MarkersEventsAddController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + events: {} + }); + $scope.markers = new Array(); + $scope.$on("leafletDirectiveMap.click", function(event, args){ + var leafEvent = args.leafletEvent; + $scope.markers.push({ + lat: leafEvent.latlng.lat, + lng: leafEvent.latlng.lng, + message: "My Added Marker" + }); + }); + } ]); + app.controller("MarkersEventsController", [ "$scope", "leafletEvents", function($scope, leafletEvents) { + $scope.center = { + lat: 51.505, + lng: -0.09, + zoom: 8 + }; + $scope.markers = { + london: { + lat: 51.505, + lng: -0.09, + draggable: true, + message: "I'm a draggable marker", + focus: true + } + } + $scope.events = { + markers: { + enable: leafletEvents.getAvailableMarkerEvents(), + } + }; + $scope.eventDetected = "No events yet..."; + var markerEvents = leafletEvents.getAvailableMarkerEvents(); + for (var k in markerEvents){ + var eventName = 'leafletDirectiveMarker.' + markerEvents[k]; + $scope.$on(eventName, function(event, args){ + $scope.eventDetected = event.name; + }); + } + }]); + app.controller('MarkersGroupController', [ '$scope', function($scope) { + var icons = { + blue: { + type: 'div', + iconSize: [10, 10], + className: 'blue', + iconAnchor: [5, 5] + }, + red: { + type: 'div', + iconSize: [10, 10], + className: 'red', + iconAnchor: [5, 5] + } + } + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 11 + }, + layers: { + baselayers: { + openStreetMap: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png' + } + }, + overlays: { + red: { + type: 'group', + name: 'red', + visible: false + }, + blue: { + type: 'group', + name: 'blue', + visible: false + } + } + }, + markers: { + stoke: { + layer: 'blue', + lat: 51.5615, + lng: -0.0731, + icon: icons.blue + }, + dalston: { + layer: 'blue', + lat: 51.545, + lng: -0.070, + icon: icons.blue + }, + wandsworth: { + layer: 'red', + lat: 51.4644, + lng:-0.1924, + icon: icons.red + }, + battersea: { + layer: 'red', + lat: 51.4638, + lng: -0.1677, + icon: icons.red + } + }, + toggleLayer: function(type) + { + $scope.layers.overlays[type].visible = !$scope.layers.overlays[type].visible; + } + }); + } ]); + app.controller('MarkersIconsController', [ '$scope', function($scope) { + angular.extend($scope, { + chicago: { + lat: 41.85, + lng: -87.65, + zoom: 8 + }, + markers: { + m1: { + lat: 41.85, + lng: -87.65, + message: "I'm a static marker with defaultIcon", + focus: false, + icon: {}, + }, + }, + defaultIcon: {}, + leafIcon: { + iconUrl: 'img/leaf-green.png', + shadowUrl: 'img/leaf-shadow.png', + iconSize: [38, 95], // size of the icon + shadowSize: [50, 64], // size of the shadow + iconAnchor: [22, 94], // point of the icon which will correspond to marker's location + shadowAnchor: [4, 62], // the same for the shadow + popupAnchor: [-3, -76] // point from which the popup should open relative to the iconAnchor + }, + orangeLeafIcon: { + iconUrl: 'img/leaf-orange.png', + shadowUrl: 'img/leaf-shadow.png', + iconSize: [38, 95], + shadowSize: [50, 64], + iconAnchor: [22, 94], + shadowAnchor: [4, 62], + popupAnchor: [-3, -76] // point from which the popup should open relative to the iconAnchor + }, + divIcon: { + type: 'div', + iconSize: [200, 0], + popupAnchor: [0, 0], + html: 'Using Bold text as an icon:' + }, + awesomeMarkerIcon: { + type: 'awesomeMarker', + icon: 'tag', + markerColor: 'red' + }, + makiMarkerIcon: { + type: 'makiMarker', + icon: 'beer', + color: '#f00', + size: "l" + }, + extraMarkerIcon: { + type: 'extraMarker', + icon: 'fa-star', + color: '#f00', + prefix: 'fa', + shape: 'circle' + } + }); + } ]); + app.controller('MarkersLabelController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + markers: { + main_marker: { + lat: 51.5, + lng: 0, + focus: true, + //message: "Hey, drag me if you want", + title: "Marker", + draggable: true, + label: { + message: "Hey, drag me if you want", + options: { + noHide: true + } + } + } + } + }); + } ]); + app.controller("MarkersModalMarkerClusterController", ['$scope', 'leafletData', function ($scope, leafletData) { + $scope.oneAtATime = false; + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; + var markers = []; + markers.push({ + lat: 52.229676, + lng: 21.012229, + draggable: false, + group: 'markers' + }); + markers.push({ + lat: 52.219081, + lng: 21.025386, + draggable: false, + group: 'markers' + }); + angular.extend($scope, { + defaults: { + maxZoom: 18, + minZoom: 0 + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + } + } + }, + center: { + zoom: 10, + lat: 52.229676, + lng: 21.012229 + }, + markers: markers + }); + }]); + app.controller('MarkersPopupController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + markers: { + m1: { + lat: 51.505, + lng: -0.09, + focus: true, + draggable: false, + message: "Hi there!", + icon: {} + } + }, + }); + $scope.$on('leafletDirectiveMarker.click', function(e, args) { + // Args will contain the marker name and other relevant information + console.log("Leaflet Click"); + }); + $scope.$on('leafletDirectiveMarker.popupopen', function(e, args) { + // Args will contain the marker name and other relevant information + console.log("Leaflet Popup Open"); + }); + $scope.$on('leafletDirectiveMarker.popupclose', function(e, args) { + // Args will contain the marker name and other relevant information + console.log("Leaflet Popup Close"); + }); + } ]); + app.controller('MarkersRotationController', [ '$scope', function($scope) { + var markers = { + m1: { + lat: 41.95, + lng: -87.65, + message: "I'm a static marker at 0 degrees", + focus: false, + iconAngle: 0 + }, + m2: { + lat: 41.85, + lng: -87.95, + message: "I'm a static marker at 270 degrees", + focus: false, + iconAngle: 270 + }, + m3: { + lat: 41.85, + lng: -87.05, + message: "I'm a static marker at 90 degrees", + focus: false, + iconAngle: 90 + }, + m4: { + lat: 41.35, + lng: -87.65, + message: "I'm a static marker at 180 degrees", + focus: false, + iconAngle: 180 + } + }; + angular.extend($scope, { + chicago: { + lat: 41.85, + lng: -87.65, + zoom: 8 + }, + markers: markers + }); + } ]); + app.controller('MarkersSimpleController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + markers: { + mainMarker: { + lat: 51, + lng: 0, + focus: true, + message: "Hey, drag me if you want", + draggable: true + } + } + }); + } ]); + app.controller('MixedGeoJSONEventsController', [ "$scope", "$http", function($scope, $http) { + $scope.$on("leafletDirectiveMap.geojsonMouseover", function(ev, feature, leafletEvent) { + countryMouseover(feature, leafletEvent); + }); + $scope.$on("leafletDirectiveMap.geojsonClick", function(ev, featureSelected, leafletEvent) { + countryClick(featureSelected, leafletEvent); + }); + var continentProperties= { + "009": { + name: 'Oceania', + colors: [ '#CC0066', '#993366', '#990066', '#CC3399', '#CC6699' ] + }, + "019": { + name: 'America', + colors: [ '#006699', '#336666', '#003366', '#3399CC', '#6699CC' ] + }, + "150": { + name: 'Europe', + colors: [ '#FF0000', '#CC3333', '#990000', '#FF3333', '#FF6666' ] + }, + "002": { + name: 'Africa', + colors: [ '#00CC00', '#339933', '#009900', '#33FF33', '#66FF66' ] + }, + "142": { + name: 'Asia', + colors: [ '#FFCC00', '#CC9933', '#999900', '#FFCC33', '#FFCC66' ] + }, + }; + angular.extend($scope, { + center: { + lat: 40.8471, + lng: 14.0625, + zoom: 2 + }, + legend: { + colors: [ '#CC0066', '#006699', '#FF0000', '#00CC00', '#FFCC00' ], + labels: [ 'Oceania', 'America', 'Europe', 'Africa', 'Asia' ] + } + }); + function countryClick(country, event) { + console.log(country.properties.name); + } + // Get a country paint color from the continents array of colors + function getColor(country) { + if (!country || !country["region-code"]) { + return "#FFF"; + } + var colors = continentProperties[country["region-code"]].colors; + var index = country["alpha-3"].charCodeAt(0) % colors.length ; + return colors[index]; + } + function style(feature) { + return { + fillColor: getColor($scope.countries[feature.id]), + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + }; + } + // Mouse over function, called from the Leaflet Map Events + function countryMouseover(feature, leafletEvent) { + var layer = leafletEvent.target; + layer.setStyle({ + weight: 2, + color: '#666', + fillColor: 'white' + }); + layer.bringToFront(); + $scope.selectedCountry = feature; + console.log(feature); + } + // Get the countries data from a JSON + $http.get("json/all.json").success(function(data, status) { + // Put the countries on an associative array + $scope.countries = {}; + for (var i=0; i< data.length; i++) { + var country = data[i]; + $scope.countries[country['alpha-3']] = country; + } + // Get the countries geojson data from a JSON + $http.get("json/countries.geo.json").success(function(data, status) { + angular.extend($scope, { + geojson: { + data: data, + style: style, + resetStyleOnMouseout: true + }, + selectedCountry: {} + }); + }); + }); + }]); + app.controller("MixedLayersOverlaysGeoJSONController", ["$scope", function($scope){ + angular.extend($scope, { + sanfrancisco: { + lat: 37.79, + lng: -122.4, + zoom: 17 + }, + defaults: { + scrollWheelZoom: false + }, + layers:{ + baselayers: { + osm:{ + name: "OpenStreetMap (XYZ)", + type: "xyz", + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + } + } + , + overlays: { + buildings: { + name:'Buildings', + type: 'geoJSON', + url:'http://tile.openstreetmap.us/vectiles-buildings/{z}/{x}/{y}.json', + layerOptions: { + style: { + "color": "#00D", + "fillColor": "#00D", + "weight": 1.0, + "opacity": 0.6, + "fillOpacity": .2 + } + }, + pluginOptions:{ + cliptiles: true + } + }, + Roads:{ + name:'Roads', + type: 'geoJSON', + url: 'http://tile.openstreetmap.us/vectiles-skeletron/{z}/{x}/{y}.json', + layerOptions: { + style: { + "color": "#DD0000 ", + "fillColor": "#DD0000", + "weight": 1.0, + "fillOpacity": .4 + } + }, + pluginOptions:{ + cliptiles: false + } + } + } + } + }) + }]); +app.controller('MixedMOverlaysMarkersNestedNoWatchController', function ($scope, leafletData, $timeout) { + var _clonedMarkers; + $timeout(function () { + //should do nothing (not watched) and only see one destroy + _clonedMarkers = angular.extend({},$scope.markers); + $scope.markers = {}; + },1000); + $timeout(function () { + leafletData.getDirectiveControls().then(function (controls) { + //move all markers by a few decimal points + for (var layer in _clonedMarkers) { + var markerSet = _clonedMarkers[layer]; + for (var markerName in markerSet) { + var marker = markerSet[markerName]; + marker.lat += .05; + } + } + //force manual update + $scope.markers = _clonedMarkers; + controls.markers.create($scope.markers); + }); + }, 4000); + angular.extend($scope, { + markersWatchOptions: { + doWatch: false, + isDeep: false, + individual: { + doWatch: false, + isDeep: false + } + }, + center: { + lat: 42.20133, + lng: 2.19110, + zoom: 11 + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + }, + cycle: { + name: 'OpenCycleMap', + type: 'xyz', + url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenCycleMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + hillshade: { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + }, + fire: { + name: 'OpenFireMap', + type: 'xyz', + url: 'http://openfiremap.org/hytiles/{z}/{x}/{y}.png', + layerOptions: { + attribution: '© OpenFireMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + }, + cars: { + name: 'Cars', + type: 'group', + visible: true + }, + bikes: { + name: 'Bicycles', + type: 'group', + visible: false + }, + runners: { + name: 'Runners', + type: 'group', + visible: false + } + } + }, + markers: { + cars: { + m1: { + lat: 42.20133, + lng: 2.19110, + message: "I'm a car" + }, + m2: { + lat: 42.21133, + lng: 2.18110, + message: "I'm a car" + } + }, + bikes: { + m3: { + lat: 42.19133, + lng: 2.18110, + layer: 'bikes', + message: 'A bike!!' + }, + m4: { + lat: 42.3, + lng: 2.16110, + layer: 'bikes' + } + }, + runners: { + m5: { + lat: 42.1, + lng: 2.16910 + }, + m6: { + lat: 42.15, + lng: 2.17110 + } + } + } + }); +}); + app.controller("MixedMapboxTilesGeojsonController", [ "$scope", "$http", function($scope, $http) { + angular.extend($scope, { + center: { + lat: -33.8979173, + lng: 151.2323598, + zoom: 14 + }, + tiles: { + name: 'Mapbox Park', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + options: { + apikey: 'pk.eyJ1IjoiZmVlbGNyZWF0aXZlIiwiYSI6Ik1Gak9FXzAifQ.9eB142zVCM4JMg7btDDaZQ', + mapid: 'feelcreative.llm8dpdk' + } + }, + geojson: {} + }); + $http.get("https://a.tiles.mapbox.com/v4/feelcreative.llm8dpdk/features.json?access_token=pk.eyJ1IjoiZmVlbGNyZWF0aXZlIiwiYSI6Ik1Gak9FXzAifQ.9eB142zVCM4JMg7btDDaZQ").success(function(data) { + $scope.geojson.data = data; + console.log(data); + }); + }]); + app.controller("MixedMarkersNestedEventsController", ["$scope", "leafletEvents", function ($scope, leafletEvents) { + $scope.map = { + show: true + }; + $scope.layers = { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + london: { + name: 'London', + type: 'group', + visible: true + } + } + }; + $scope.center = { + lat: 51.505, + lng: -0.09, + zoom: 8 + }; + $scope.markers = { + london: { + 1: { + lat: 51.505, + lng: -0.09, + draggable: true, + focus: true + } + } + }; + $scope.events = { + markers: { + enable: leafletEvents.getAvailableMarkerEvents() + } + }; + $scope.eventDetected = "No events yet..."; + var markerEvents = leafletEvents.getAvailableMarkerEvents(); + for (var k in markerEvents) { + var eventName = 'leafletDirectiveMarker.' + markerEvents[k]; + $scope.$on(eventName, function (event, args) { + $scope.eventDetected = event.name; + $scope.args = { + layerName: args.layerName, + model: args.model, + modelName: args.modelName + }; + }); + } + }]); + app.controller("PathSimpleController", [ "$scope", function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + europeanPaths: { + p1: { + color: 'red', + weight: 8, + latlngs: [ + { lat: 51.50, lng: -0.082 }, + { lat: 48.83, lng: 2.37 }, + { lat: 41.91, lng: 12.48 } + ], + message: "

    Route from London to Rome

    Distance: 1862km

    ", + }, + p2: { + color: 'green', + weight: 8, + latlngs: [ + { lat: 48.2083537, lng: 16.3725042 }, + { lat: 48.8534, lng: 2.3485 } + ], + label: {message: "

    Route from Vienna to Paris

    Distance: 1211km

    "} + } + } + }); + }]); + app.controller('PathTypesController', [ '$scope', function($scope) { + var europeCapitals = { + Madrid: { + lat: 40.4, + lng: -3.6833333 + }, + Rome: { + lat: 41.9, + lng: 12.4833333 + }, + London: { + lat: 51.5, + lng: -0.116667 + }, + Lisbon: { + lat: 38.7166667, + lng: -9.1333333 + }, + Berlin: { + lat: 52.5166667, + lng: 13.4 + }, + Paris: { + lat: 48.866667, + lng: 2.333333 + }, + Brussels: { + lat: 50.8333, + lng: 4 + } + }; + var pathsDict = { + polyline: { + type: "polyline", + latlngs: [ europeCapitals.London, europeCapitals.Madrid, europeCapitals.Rome ] + }, + multiPolyline: { + type: "multiPolyline", + latlngs: [ + [ europeCapitals.London, europeCapitals.Lisbon ], + [ europeCapitals.Paris, europeCapitals.Madrid ], + [ europeCapitals.Rome, europeCapitals.Berlin ] + ] + }, + polygon: { + type: "polygon", + latlngs: [ europeCapitals.London, europeCapitals.Lisbon , europeCapitals.Madrid, europeCapitals.Paris ] + }, + multiPolygon: { + type: "multiPolygon", + latlngs: [ + [ europeCapitals.London, europeCapitals.Lisbon , europeCapitals.Madrid, europeCapitals.Paris ], + [ europeCapitals.Berlin, europeCapitals.Rome, europeCapitals.Brussels ] + ] + }, + rectangle: { + type: "rectangle", + latlngs: [ europeCapitals.Berlin, europeCapitals.Lisbon ] + }, + circle: { + type: "circle", + radius: 500 * 1000, + latlngs: europeCapitals.Brussels + }, + circleMarker: { + type: "circleMarker", + radius: 50, + latlngs: europeCapitals.Rome + } + }; + angular.extend($scope, { + center: { + lat: 51.505, + lng: -0.09, + zoom: 3 + }, + paths: {} + }); + $scope.addShape = function(shape) { + $scope.paths = {}; + $scope.paths[shape] = pathsDict[shape]; + }; + } ]); + app.controller('Paths3000ItemsController', ['$scope', 'leafletData', 'LocationDataService', function ($scope, leafletData, LocationDataService) { + //map properties + angular.extend($scope, { + defaults: { + scrollWheelZoom: false + }, + //restrict map panning for this region + maxbounds: { + northEast: { + lat: 90, + lng: -180 + }, + southWest: { + lat: -90, + lng: 180 + } + }, + centroid: { + lat: 50, + lng: 10, + zoom: 3 + }, + layers: { + baselayers: { + stamen: { + name: 'StamenWatercolor', + url: 'http://c.tile.stamen.com/watercolor/{z}/{x}/{y}.png', + type: 'xyz', + } + } + } + }); + // set up circle rendering + //namespace leaflet path + $scope.paths = {}; + //bind locationGrid to zoom level + $scope.$watch("centroid.zoom", function (zoom) { + if (zoom <= 3) { + //clear path object + $scope.paths = {}; + //get location data and initialize leaflet circles + LocationDataService.getLocationsTenGrid().then(function (res) { + angular.forEach(res.data, function (value, key) { + if (value.lat !== null && value.lon !== null) { + $scope.paths['circle' + key] = { + type: 'circle', + className: 'testClass', + fillColor: 'DarkSlateGray', + color: '#000000', + weight: 0, + opacity: 1, + fillOpacity: 0.8, + stroke: false, + clickable: false, + latlngs: [parseFloat(value.lat), parseFloat(value.lon)], + radius: Math.sqrt(value.location_count) * 5000 + }; + } + }); + }, function (error) { + console.log('An error occured!', error); + }); + } + if (zoom >= 4) { + //clear path object + $scope.paths = {}; + //get location data and initialize leaflet circles + LocationDataService.getLocationsZeroOneGrid().then(function (res) { + angular.forEach(res.data, function (value, key) { + if (value.lat !== null && value.lon !== null) { + $scope.paths['circle' + key] = { + type: 'circle', + className: 'testClass', + fillColor: 'DarkSlateGray', + color: '#000000', + weight: 0, + opacity: 1, + fillOpacity: 0.8, + stroke: false, + clickable: false, + latlngs: [parseFloat(value.lat), parseFloat(value.lon)], + radius: Math.sqrt(value.location_count) * 2000 + }; + } + }); + }, function (error) { + console.log('An error occured!', error); + }); + } + }); + }]); + // getting data with a factory + app.factory('LocationDataService', LocationDataService); + /* @ngInject */ + function LocationDataService($http) { + var srv = {}; + // Service implementation for gridsize = 10 + srv.getLocationsTenGrid = function () { + return $http.get('json/mockupTenGrid.json', { + cache: true + }); + }; + // Service implementation for gridsize = 0.1 + srv.getLocationsZeroOneGrid = function () { + return $http.get('json/mockupZeroOneGrid.json', { + cache: true + }); + }; + // Public API + return { + getLocationsTenGrid: function () { + return srv.getLocationsTenGrid(); + }, + getLocationsZeroOneGrid: function () { + return srv.getLocationsZeroOneGrid(); + } + }; + }; + app.controller('PathsAdvancedController', [ '$scope', function($scope) { + $scope.addMarker = function() { + var m_key = document.getElementById('new_mm_name').value; + if ($scope.markers[m_key]) return; + $scope.markers[m_key] = { + lat: document.getElementById('new_mm_lat').value, + lng: document.getElementById('new_mm_lng').value, + draggable: true + }; + $scope.paths.p1.latlngs.push($scope.markers[m_key]); + }; + $scope.deleteMarker = function(m_key) { + var marker = $scope.markers[m_key]; + for (var pkey in $scope.paths) { + for (var j in $scope.paths[pkey].latlngs) { + var p = $scope.paths[pkey].latlngs[j]; + if (p === marker) { + $scope.paths[pkey].latlngs.splice(j, 1); + } + } + } + delete $scope.markers[m_key]; + }; + angular.extend($scope, { + // set up map center + cen: { + lat: 53, + lng: -3, + zoom: 6 + }, + // set up multiple markers on map + markers: { + London : { + lat: 51.50, + lng: -0.082, + draggable: false + }, + Manchester: { + lat: 53.48, + lng: -2.24, + draggable: true + }, + Lincoln: { + lat: 53.230495, + lng: -0.53936, + draggable: true + }, + Northhampton: { + lat: 52.237892, + lng: -0.90087, + draggable: true + }, + Worcester: { + lat: 52.187404, + lng: -2.20275, + draggable: true + }, + York: { + lat: 53.959317, + lng: -1.08215, + draggable: true + } + } + }); + angular.extend($scope, { + paths: { + p1: { + color: '#008000', + weight: 4, + latlngs: [ $scope.markers.London, $scope.markers.Manchester ] + }, + p2: { + weight: 3, + opacity: 0.5, + latlngs: [ + [ $scope.markers.London, $scope.markers.Lincoln ], + [ $scope.markers.Manchester, $scope.markers.Worcester] + ], + type: 'multiPolyline' + }, + c1: { + weight: 2, + color: '#ff612f', + latlngs: $scope.markers.Northhampton, + radius: 10000, + type: 'circle' + }, + c2: { + weight: 2, + color: '#ff612f', + latlngs: $scope.markers.Lincoln, + radius: 50, + type: 'circleMarker' + }, + pg1: { + latlngs: [ $scope.markers.London, $scope.markers.Worcester, $scope.markers.Lincoln ], + stroke: false, + fillColor: '#ff69b4', + type: 'polygon' + }, + pg2: { + weight: 1, + color: '#2e3974', + latlngs: [ + [ $scope.markers.London, $scope.markers.Worcester, $scope.markers.Northhampton ], + [ $scope.markers.Manchester, $scope.markers.Lincoln, $scope.markers.York ] + ], + type: 'multiPolygon' + }, + r1: { + latlngs: [ $scope.markers.Lincoln, $scope.markers.York ], + type: 'rectangle' + } + } + }); + } ]); + app.controller("PathsAjaxLoadController", [ "$scope", "$http", function($scope, $http) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + europeanPaths: {} + }); + $scope.loadPaths = function loadPaths() { + $http.get('json/paths.json').success(function(data) { + $scope.europeanPaths = data; + }); + }; + $scope.changePaths = function changePaths() { + console.log($scope.europeanPaths); + $scope.europeanPaths.p1.latlngs[0] = { + lat: 53, + lng: -0.1 + }; + }; + }]); + app.controller('PathsChangeInGroupLayerController', function($scope, leafletData) { + $scope.changePaths = function() { + $scope.paths = { + p2: { + color: '#FC0', + weight: 8, + latlngs: [ { lat: 52.50, lng: -0.082 }, { lat: 42.91, lng: 12.48 } ], + layer: 'test' + } + }; + }; + angular.extend($scope, { + center: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + paths : { + p1: { + color: '#000', + weight: 8, + latlngs: [{ lat: 51.50, lng: -0.082 }, { lat: 41.91, lng: 12.48 }], + layer: 'test' + } + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://otile{s}.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.jpeg', + layerOptions: { + subdomains: '1234', + attribution: 'test' + } + } + }, + overlays: { + test: { + name: 'Test', + visible: true, + type: 'group' + } + } + } + }); + }); + app.controller('PathsDecorationsSimpleController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + decorations: { + markers: { + coordinates: [[51.9, -0.4], [51.505, -0.09], [51.0, -0.4]], + patterns: [ + { offset: 12, repeat: 25, symbol: L.Symbol.dash({pixelSize: 10, pathOptions: {color: '#f00', weight: 2}}) }, + { offset: 0, repeat: 25, symbol: L.Symbol.dash({pixelSize: 0}) } + ] + } + } + }); + $scope.changePattern = function(type) { + if (type === 'dot') { + $scope.decorations.markers.patterns = [ {offset: 0, repeat: 10, symbol: L.Symbol.dash({pixelSize: 0})} ]; + } else if (type === 'slash') { + $scope.decorations.markers.patterns = [ {offset: 12, repeat: 25, symbol: L.Symbol.dash({pixelSize: 10, pathOptions: {color: '#f00', weight: 2}})} ]; + } else if (type === 'slashdot') { + $scope.decorations.markers.patterns = [ + { offset: 12, repeat: 25, symbol: L.Symbol.dash({pixelSize: 10, pathOptions: {color: '#f00', weight: 2}}) }, + { offset: 0, repeat: 25, symbol: L.Symbol.dash({pixelSize: 0}) } + ]; + } else if (type === 'arrow') { + $scope.decorations.markers.patterns = [ + {offset: 12, repeat: 25, symbol: L.Symbol.dash({pixelSize: 18, pathOptions: {color: '#f00', weight: 4}})}, + {offset: '10%', repeat: 25, symbol: L.Symbol.arrowHead({pixelSize: 10, polygon: false, pathOptions: {stroke: true}})} + ] + } + }; + } ]); + app.controller("leafletMarkerController", ['$scope', 'leafletData', function ($scope, $modalInstance, leafletData) { + var markers = []; + markers.push({ + lat: 52.229676, + lng: 21.012229, + draggable: false + }); + markers.push({ + lat: 52.219081, + lng: 21.025386, + draggable: false + }); + angular.extend($scope, { + defaults: { + maxZoom: 18, + minZoom: 0, + scrollWheelZoom: false + }, + events: { + map: { + enable: [], + logic: 'emit' + }, + marker: { + enable: [ 'click' ], + logic: 'emit' + } + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + } + } + }, + center: { + zoom: 13, + lat: 52.229676, + lng: 21.012229 + }, + markers: markers + }); + $scope.$on('leafletDirectiveMarker.click', function (e, args) { + alert('Marker in map 1 clicked'); + }); + var markers2 = []; + markers2.push({ + lat: 52.229676, + lng: 21.012229, + draggable: false + }); + markers2.push({ + lat: 52.219081, + lng: 21.025386, + draggable: false + }); + angular.extend($scope, { + defaults2: { + maxZoom: 18, + minZoom: 0, + scrollWheelZoom: false + }, + events2: { + map: { + enable: [], + logic: 'emit' + }, + marker: { + enable: [ 'click' ], + logic: 'emit' + } + }, + layers2: { + baselayers: { + mapbox: { + name: 'Mapbox Terrain', + url: 'http://a.tiles.mapbox.com/v3/examples.map-i86nkdio/{z}/{x}/{y}.png', + type: 'xyz' + } + } + }, + center2: { + zoom: 13, + lat: 52.229676, + lng: 21.012229 + }, + markers: markers2 + }); + $scope.$on('leafletDirectiveMarker.click', function (e, args) { + alert('Marker in map 2 clicked'); + }); + }]);}(angular)); \ No newline at end of file diff --git a/examples/js/controllers/BasicAccessLeafletObjectController.js b/examples/js/controllers/BasicAccessLeafletObjectController.js new file mode 100644 index 00000000..89b6ef94 --- /dev/null +++ b/examples/js/controllers/BasicAccessLeafletObjectController.js @@ -0,0 +1,14 @@ + app.controller("BasicAccessLeafletObjectController", [ "$scope", "$log", "leafletData", function($scope, $log, leafletData) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + } + }); + $scope.fitBounds = function() { + leafletData.getMap().then(function(map) { + map.fitBounds([ [40.712, -74.227], [40.774, -74.125] ]); + }); + }; + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicBoundsController.js b/examples/js/controllers/BasicBoundsController.js new file mode 100644 index 00000000..4a20b82c --- /dev/null +++ b/examples/js/controllers/BasicBoundsController.js @@ -0,0 +1,10 @@ + app.controller("BasicBoundsController", [ "$scope", "leafletData", "leafletBoundsHelpers", function($scope, leafletData, leafletBoundsHelpers) { + var bounds = leafletBoundsHelpers.createBoundsFromArray([ + [ 51.508742458803326, -0.087890625 ], + [ 51.508742458803326, -0.087890625 ] + ]); + angular.extend($scope, { + bounds: bounds, + center: {} + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicCenterAutodiscoverController.js b/examples/js/controllers/BasicCenterAutodiscoverController.js new file mode 100644 index 00000000..fa538f82 --- /dev/null +++ b/examples/js/controllers/BasicCenterAutodiscoverController.js @@ -0,0 +1,7 @@ + app.controller('BasicCenterAutodiscoverController', [ '$scope', function($scope) { + angular.extend($scope, { + center: { + autoDiscover: true + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicCenterController.js b/examples/js/controllers/BasicCenterController.js new file mode 100644 index 00000000..f6b0bbd7 --- /dev/null +++ b/examples/js/controllers/BasicCenterController.js @@ -0,0 +1,9 @@ + app.controller('BasicCenterController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicCenterGeoIPController.js b/examples/js/controllers/BasicCenterGeoIPController.js new file mode 100644 index 00000000..0083edd2 --- /dev/null +++ b/examples/js/controllers/BasicCenterGeoIPController.js @@ -0,0 +1,21 @@ + app.controller('BasicCenterGeoIPController', [ '$scope', '$http', function($scope, $http) { + angular.extend($scope, { + center: { + lat: 0, + lng: 0, + zoom: 2 + } + }); + $scope.searchIP = function(ip) { + var url = "http://freegeoip.net/json/" + ip; + $http.get(url).success(function(res) { + $scope.center = { + lat: res.latitude, + lng: res.longitude, + zoom: 10 + } + $scope.ip = res.ip; + }) + }; + $scope.searchIP(""); + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicCenterUrlHashController.js b/examples/js/controllers/BasicCenterUrlHashController.js new file mode 100644 index 00000000..5f7961f7 --- /dev/null +++ b/examples/js/controllers/BasicCenterUrlHashController.js @@ -0,0 +1,16 @@ + app.controller('BasicCenterUrlHashController', [ '$scope', '$location', function($scope, $location) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + } + }); + $scope.$on("centerUrlHash", function(event, centerHash) { + console.log("url", centerHash); + $location.search({ c: centerHash }); + }); + $scope.changeLocation = function(centerHash) { + $location.search({ c: centerHash }); + } + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicCustomParametersController.js b/examples/js/controllers/BasicCustomParametersController.js new file mode 100644 index 00000000..e9cef030 --- /dev/null +++ b/examples/js/controllers/BasicCustomParametersController.js @@ -0,0 +1,19 @@ + app.controller('BasicCustomParametersController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + defaults: { + tileLayer: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png", + zoomControlPosition: 'topright', + tileLayerOptions: { + opacity: 0.9, + detectRetina: true, + reuseTiles: true, + }, + scrollWheelZoom: false + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicDoubleMapAccessMapObjectController.js b/examples/js/controllers/BasicDoubleMapAccessMapObjectController.js new file mode 100644 index 00000000..0a2059e2 --- /dev/null +++ b/examples/js/controllers/BasicDoubleMapAccessMapObjectController.js @@ -0,0 +1,24 @@ + app.controller("BasicDoubleMapAccessMapObjectController", [ "$scope", "$log", "leafletData", function($scope, $log, leafletData) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + markers: { + london: { + lat: 51.505, + lng: -0.09, + draggable: true + } + }, + defaults: { + tileLayer: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png", + } + }); + $scope.logLeafletData = function(name) { + leafletData.getMap(name).then(function(map) { + $log.info(map); + }); + }; + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicDoubleMapEventsController.js b/examples/js/controllers/BasicDoubleMapEventsController.js new file mode 100644 index 00000000..825759cc --- /dev/null +++ b/examples/js/controllers/BasicDoubleMapEventsController.js @@ -0,0 +1,62 @@ + app.controller("BasicDoubleMapEventsController", [ "$scope", "$log", "leafletData", "leafletEvents", function($scope, $log, leafletData, leafletEvents) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + markers: { + london: { + lat: 51.505, + lng: -0.09, + draggable: true + } + }, + defaults: { + tileLayer: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png", + } + }); + $scope.events = { + map: { + enable: leafletEvents.getAvailableMapEvents(), + logic: 'emit' + } + }; + var mapEvents = leafletEvents.getAvailableMapEvents(); + for (var k in mapEvents) { + var eventName = 'leafletDirectiveMap.' + mapEvents[k]; + $scope.$on(eventName, function(event){ + $scope.eventDetected = event.name; + }); + } + angular.extend($scope, { + spain: { + lat: 40.095, + lng: -3.823, + zoom: 4 + }, + markers2: { + spain: { + lat: 51.505, + lng: -0.09, + draggable: true + } + }, + defaults: { + tileLayer: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png", + } + }); + $scope.events2 = { + map: { + enable: ['click', 'dblclick'], + logic: 'emit' + } + }; + var mapEvents2 = $scope.events2.map.enable; + for (var j in mapEvents2) { + var eventName2 = 'leafletDirectiveMap.' + mapEvents[j]; + $scope.$on(eventName2, function(event){ + $scope.eventDetected2 = event.name; + }); + } + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicDoubleMapSharingAttributesController.js b/examples/js/controllers/BasicDoubleMapSharingAttributesController.js new file mode 100644 index 00000000..53bb46cd --- /dev/null +++ b/examples/js/controllers/BasicDoubleMapSharingAttributesController.js @@ -0,0 +1,42 @@ + app.controller("BasicDoubleMapSharingAttributesController", [ "$scope", "$log", "$http", "leafletData", function($scope, $log, $http, leafletData) { + angular.extend($scope, { + center: { + lat: 43.7350, + lng: -79.3734, + zoom: 11 + }, + defaults: { + scrollWheelZoom: false + }, + markers1: { + one: { + lat: 43.75, + lng: -79.56 + }, + two: { + lat: 43.76, + lng: -79.50 + } + }, + markers2: { + one: { + lat: 43.75, + lng: -79.56 + }, + two: { + lat: 43.75, + lng: -79.45 + }, + three: { + lat: 43.81, + lng: -79.26 + } + } + }); + $http.get('json/toronto1.json').success(function(data, status) { + $scope.toronto1 = data; + }); + $http.get('json/toronto2.json').success(function(data, status) { + $scope.toronto2 = data; + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicDoubleMapToggleController.js b/examples/js/controllers/BasicDoubleMapToggleController.js new file mode 100644 index 00000000..bdc75862 --- /dev/null +++ b/examples/js/controllers/BasicDoubleMapToggleController.js @@ -0,0 +1,57 @@ + app.controller("BasicDoubleMapToggleController", [ "$scope", "$log", "leafletData", function($scope, $log, leafletData) { + angular.extend($scope, { + center: { + lat: 51.505, + lng: -0.09, + zoom: 5 + }, + paths: { + p1: { + color: 'blue', + weight: 8, + latlngs: [{ + lat: 51.50, + lng: -0.082 + }, { + lat: 48.83, + lng: 2.37 + }, { + lat: 41.91, + lng: 12.48 + }] + } + }, + }); + angular.extend($scope, { + center2: { + lat: 51.505, + lng: -0.09, + zoom: 5 + }, + tiles2: { + name: 'Mapbox Outdoors', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + options: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia3no0m' + } + }, + paths2: { + p1: { + color: 'red', + weight: 8, + latlngs: [{ + lat: 51.50, + lng: -0.082 + }, { + lat: 48.83, + lng: 2.37 + }, { + lat: 41.91, + lng: 12.48 + }] + } + }, + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicDynamicAddRemoveMapExample.js b/examples/js/controllers/BasicDynamicAddRemoveMapExample.js new file mode 100644 index 00000000..25d9fc06 --- /dev/null +++ b/examples/js/controllers/BasicDynamicAddRemoveMapExample.js @@ -0,0 +1,8 @@ + app.config(function ($routeProvider) { + $routeProvider.when('/map', { + template: '', + controller: 'BasicDynamicAddRemoveMapExample' + }); + }); + app.controller('BasicDynamicAddRemoveMapExample', [ '$scope', 'leafletData', function($scope, leafletData) { + } ]); \ No newline at end of file diff --git a/examples/js/controllers/BasicEventsController.js b/examples/js/controllers/BasicEventsController.js new file mode 100644 index 00000000..01503ccc --- /dev/null +++ b/examples/js/controllers/BasicEventsController.js @@ -0,0 +1,15 @@ + app.controller("BasicEventsController", [ "$scope", "leafletEvents", function($scope, leafletEvents) { + $scope.center = { + lat: 51.505, + lng: -0.09, + zoom: 8 + }; + $scope.eventDetected = "No events yet..."; + var mapEvents = leafletEvents.getAvailableMapEvents(); + for (var k in mapEvents){ + var eventName = 'leafletDirectiveMap.' + mapEvents[k]; + $scope.$on(eventName, function(event){ + $scope.eventDetected = event.name; + }); + } + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicFirstController.js b/examples/js/controllers/BasicFirstController.js new file mode 100644 index 00000000..84860220 --- /dev/null +++ b/examples/js/controllers/BasicFirstController.js @@ -0,0 +1,3 @@ + app.controller("BasicFirstController", [ "$scope", function($scope) { + // Nothing here! + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicGeoJSONUpdateController.js b/examples/js/controllers/BasicGeoJSONUpdateController.js new file mode 100644 index 00000000..18cd9e76 --- /dev/null +++ b/examples/js/controllers/BasicGeoJSONUpdateController.js @@ -0,0 +1,93 @@ + app.controller("BasicGeoJSONUpdateController", [ '$scope', '$http', 'leafletData', function($scope, $http, leafletData) { + angular.extend($scope, { + center: { + lat: 31.99, + lng: -33.43, + zoom: 3 + }, + geojson : { + data: { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -49.92187499999999, + 13.239945499286312 + ], + [ + -49.92187499999999, + 54.57206165565852 + ], + [ + -13.7109375, + 54.57206165565852 + ], + [ + -13.7109375, + 13.239945499286312 + ], + [ + -49.92187499999999, + 13.239945499286312 + ] + ] + ] + } + } + ] + }, + style: { + fillColor: "green", + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + } + } + }); + $scope.updateGeojson = function() { + $scope.geojson.data = { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -41.8359375, + 28.92163128242129 + ], + [ + -41.8359375, + 38.272688535980976 + ], + [ + -26.015625, + 38.272688535980976 + ], + [ + -26.015625, + 28.92163128242129 + ], + [ + -41.8359375, + 28.92163128242129 + ] + ] + ] + } + } + ] + } + } + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicHideShowMapController.js b/examples/js/controllers/BasicHideShowMapController.js new file mode 100644 index 00000000..c02c3abd --- /dev/null +++ b/examples/js/controllers/BasicHideShowMapController.js @@ -0,0 +1,17 @@ + app.controller('BasicHideShowMapController', function($scope, $timeout, leafletData) { + $scope.center = { + lat: 35, + lng: 0, + zoom: 8 + }; + $scope.showMap = false; + $scope.$watch("showMap", function(value) { + if (value === true) { + leafletData.getMap().then(function(map) { + $timeout(function() { + map.invalidateSize(); + }, 300); + }); + } + }); + }); \ No newline at end of file diff --git a/examples/js/controllers/BasicLegendController.js b/examples/js/controllers/BasicLegendController.js new file mode 100644 index 00000000..9a78acd8 --- /dev/null +++ b/examples/js/controllers/BasicLegendController.js @@ -0,0 +1,17 @@ + app.controller('BasicLegendController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 12 + }, + legend: { + position: 'bottomleft', + colors: [ '#ff0000', '#28c9ff', '#0000ff', '#ecf386' ], + labels: [ 'National Cycle Route', 'Regional Cycle Route', 'Local Cycle Network', 'Cycleway' ] + }, + defaults: { + tileLayer: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png" + } + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/BasicMapWithoutAnimationsController.js b/examples/js/controllers/BasicMapWithoutAnimationsController.js new file mode 100644 index 00000000..7a90bef1 --- /dev/null +++ b/examples/js/controllers/BasicMapWithoutAnimationsController.js @@ -0,0 +1,20 @@ + app.controller('BasicMapWithoutAnimationsController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + defaults: { + zoomAnimation: false, + markerZoomAnimation: false, + fadeAnimation: false + }, + markers: { + london: { + lat: 51.505, + lng: -0.09, + } + } + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/BasicMaxBoundsController.js b/examples/js/controllers/BasicMaxBoundsController.js new file mode 100644 index 00000000..abff321c --- /dev/null +++ b/examples/js/controllers/BasicMaxBoundsController.js @@ -0,0 +1,37 @@ + app.controller("BasicMaxBoundsController", [ "$scope", "leafletData", function($scope, leafletData) { + $scope.regions = { + london: { + northEast: { + lat: 51.51280224425956, + lng: -0.11681556701660155 + }, + southWest: { + lat: 51.50211782162702, + lng: -0.14428138732910156 + } + }, + lisbon: { + southWest: { + lat: 38.700247900602726, + lng: -9.165430068969727 + }, + northEast: { + lat: 38.72703673982525, + lng: -9.110498428344725 + } + }, + warszawa: { + southWest: { + lat: 52.14823737817847, + lng: 20.793685913085934 + }, + northEast: { + lat: 52.31645452105213, + lng: 21.233139038085938 + } + } + }; + angular.extend($scope, { + maxbounds: $scope.regions.london + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/BasicMaxBoundsPadController.js b/examples/js/controllers/BasicMaxBoundsPadController.js new file mode 100644 index 00000000..5e041d9f --- /dev/null +++ b/examples/js/controllers/BasicMaxBoundsPadController.js @@ -0,0 +1,39 @@ + app.controller("BasicMaxBoundsPadController", ["$scope", "leafletBoundsHelpers", function($scope, leafletBoundsHelpers) { + var maxbounds = leafletBoundsHelpers.createBoundsFromArray([ + [37.8866, -79.4877], + [39.7230, -74.9863] + ]); + maxbounds.pad = 1.0; + angular.extend($scope, { + bounds: maxbounds, + center: { + lat: 37.8866, + lng: -79-4877, + zoom: 4 + }, + layers: { + baselayers: { + xyz: { + name: 'OpenStreetMap (XYZ)', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + }, + overlays: {} + }, + markers: { + northeast: { + lat: 39.7230, + lng: -74.9863, + focus: true, + title: "Northeast", + }, + southwest: { + lat: 37.8866, + lng: -79.4877, + title: "Southwest", + } + }, + maxbounds: maxbounds + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/BasicTilesController.js b/examples/js/controllers/BasicTilesController.js new file mode 100644 index 00000000..198c59b1 --- /dev/null +++ b/examples/js/controllers/BasicTilesController.js @@ -0,0 +1,45 @@ + app.controller('BasicTilesController', [ '$scope', function($scope) { + var tilesDict = { + openstreetmap: { + url: "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", + options: { + attribution: '© OpenStreetMap contributors' + } + }, + opencyclemap: { + url: "http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png", + options: { + attribution: 'All maps © OpenCycleMap, map data © OpenStreetMap (ODbL' + } + }, + mapbox_outdoors: { + name: 'Mapbox Outdoors', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + options: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia3no0m' + } + }, + mapbox_wheat: { + name: 'Mapbox Wheat Paste', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + options: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia35jfp' + } + } + }; + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + tiles: tilesDict.mapbox_wheat + }); + $scope.changeTiles = function(tiles) { + $scope.tiles = tilesDict[tiles]; + }; + } ]); \ No newline at end of file diff --git a/examples/js/controllers/BasicTilesZoomChangerController.js b/examples/js/controllers/BasicTilesZoomChangerController.js new file mode 100644 index 00000000..a352d22d --- /dev/null +++ b/examples/js/controllers/BasicTilesZoomChangerController.js @@ -0,0 +1,17 @@ + app.controller('BasicTilesZoomChangerController', [ "$scope", function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 10 + }, + tiles: { + url: "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" + } + }); + $scope.$watch("london.zoom", function(zoom) { + $scope.tiles.url = (zoom > 12) + ? "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" + : "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"; + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/ControlsCustomLayerControlController.js b/examples/js/controllers/ControlsCustomLayerControlController.js new file mode 100644 index 00000000..39472d2e --- /dev/null +++ b/examples/js/controllers/ControlsCustomLayerControlController.js @@ -0,0 +1,101 @@ + app.controller('ControlsCustomLayerControlController', [ '$scope', function($scope) { + angular.extend($scope, { + ripoll: { + lat: 42.20133, + lng: 2.19110, + zoom: 11 + }, + markers: { + m1: { + lat: 42.20133, + lng: 2.19110 + } + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + }, + cycle: { + name: 'OpenCycleMap', + type: 'xyz', + url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenCycleMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + hillshade: { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + }, + fire: { + name: 'OpenFireMap', + type: 'xyz', + url: 'http://openfiremap.org/hytiles/{z}/{x}/{y}.png', + layerOptions: { + attribution: '© OpenFireMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + } + } + }, + removeFireLayer: function() { + delete this.layers.overlays.fire; + }, + addFireLayer: function() { + this.layers.overlays.fire = { + name: 'OpenFireMap', + type: 'xyz', + url: 'http://openfiremap.org/hytiles/{z}/{x}/{y}.png', + layerOptions: { + attribution: '© OpenFireMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + }; + }, + existsFireLayer: function() { + return ('fire' in this.layers.overlays); + }, + removeHillshadeLayer: function() { + delete this.layers.overlays.hillshade; + }, + addHillshadeLayer: function() { + this.layers.overlays.hillshade = { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + }; + }, + existsHillshadeLayer: function() { + return ('hillshade' in this.layers.overlays); + } + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/ControlsDrawController.js b/examples/js/controllers/ControlsDrawController.js new file mode 100644 index 00000000..d3f32040 --- /dev/null +++ b/examples/js/controllers/ControlsDrawController.js @@ -0,0 +1,20 @@ + app.controller("ControlsDrawController", [ "$scope", "leafletData", function($scope, leafletData) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + controls: { + draw: {} + } + }); + leafletData.getMap().then(function(map) { + var drawnItems = $scope.controls.edit.featureGroup; + map.on('draw:created', function (e) { + var layer = e.layer; + drawnItems.addLayer(layer); + console.log(JSON.stringify(layer.toGeoJSON())); + }); + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/ControlsScaleController.js b/examples/js/controllers/ControlsScaleController.js new file mode 100644 index 00000000..b072544f --- /dev/null +++ b/examples/js/controllers/ControlsScaleController.js @@ -0,0 +1,12 @@ + app.controller("ControlsScaleController", [ "$scope", function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + controls: { + scale: true + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/GeoJSONCenterController.js b/examples/js/controllers/GeoJSONCenterController.js new file mode 100644 index 00000000..a5de5211 --- /dev/null +++ b/examples/js/controllers/GeoJSONCenterController.js @@ -0,0 +1,43 @@ + app.controller("GeoJSONCenterController", [ '$scope', '$http', 'leafletData', function($scope, $http, leafletData) { + angular.extend($scope, { + japan: { + lat: 27.26, + lng: 78.86, + zoom: 2 + }, + defaults: { + scrollWheelZoom: false + } + }); + $scope.centerJSON = function() { + leafletData.getMap().then(function(map) { + var latlngs = []; + for (var i in $scope.geojson.data.features[0].geometry.coordinates) { + var coord = $scope.geojson.data.features[0].geometry.coordinates[i]; + for (var j in coord) { + var points = coord[j]; + for (var k in points) { + latlngs.push(L.GeoJSON.coordsToLatLng(points[k])); + } + } + } + map.fitBounds(latlngs); + }); + }; + // Get the countries geojson data from a JSON + $http.get("json/JPN.geo.json").success(function(data, status) { + angular.extend($scope, { + geojson: { + data: data, + style: { + fillColor: "green", + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + } + } + }); + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/GeoJSONController.js b/examples/js/controllers/GeoJSONController.js new file mode 100644 index 00000000..534b5093 --- /dev/null +++ b/examples/js/controllers/GeoJSONController.js @@ -0,0 +1,28 @@ + app.controller("GeoJSONController", [ '$scope', '$http', 'leafletData', function($scope, $http, leafletData) { + angular.extend($scope, { + japan: { + lat: 38.51, + lng: 139, + zoom: 4 + }, + defaults: { + scrollWheelZoom: false + } + }); + // Get the countries geojson data from a JSON + $http.get("json/JPN.geo.json").success(function(data, status) { + angular.extend($scope, { + geojson: { + data: data, + style: { + fillColor: "green", + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + } + } + }); + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/GeoJSONNestedController.js b/examples/js/controllers/GeoJSONNestedController.js new file mode 100644 index 00000000..382270e9 --- /dev/null +++ b/examples/js/controllers/GeoJSONNestedController.js @@ -0,0 +1,59 @@ + app.controller("GeoJSONNestedController", [ '$scope', '$http', 'leafletData', function($scope, $http, leafletData) { + angular.extend($scope, { + japan: { + lat: 27.26, + lng: 78.86, + zoom: 2 + }, + defaults: { + scrollWheelZoom: false + }, + geojson:{} + }); + $scope.centerJSON = function(name) { + leafletData.getMap().then(function(map) { + var latlngs = []; + for (var i in $scope.geojson[name].data.features[0].geometry.coordinates) { + var coord = $scope.geojson[name].data.features[0].geometry.coordinates[i]; + for (var j in coord) { + var points = coord[j]; + for (var k in points) { + latlngs.push(L.GeoJSON.coordsToLatLng(points[k])); + } + } + } + map.fitBounds(latlngs); + }); + }; + // Get the countries geojson data from a JSON + $http.get("json/JPN.geo.json").success(function(data, status) { + angular.extend($scope.geojson, { + japan: { + data: data, + style: { + fillColor: "green", + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + } + } + }); + }); + $http.get("json/USA.geo.json").success(function(data, status) { + angular.extend($scope.geojson, { + usa:{ + data: data, + style: { + fillColor: "blue", + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + } + } + }); + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/GeoJSONNonNestedController.js b/examples/js/controllers/GeoJSONNonNestedController.js new file mode 100644 index 00000000..ae5d99e4 --- /dev/null +++ b/examples/js/controllers/GeoJSONNonNestedController.js @@ -0,0 +1,58 @@ + app.controller("GeoJSONNonNestedController", [ '$scope', '$http', 'leafletData', function($scope, $http, leafletData) { + var getColor = function(id){ + return id == 'USA'? 'blue' : 'green'; + }; + var getStyle = function(feature){ + return { + fillColor: getColor(feature.id), + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + }; + }; + var createGeoJsonObject = function (data){ + return { + data: data, + style: getStyle + }; + }; + angular.extend($scope, { + japan: { + lat: 27.26, + lng: 78.86, + zoom: 2 + }, + defaults: { + scrollWheelZoom: false + }, + }); + $scope.centerJSON = function(index) { + leafletData.getMap().then(function(map) { + var latlngs = []; + for (var i in $scope.geojson.data.features[index].geometry.coordinates) { + var coord = $scope.geojson.data.features[index].geometry.coordinates[i]; + for (var j in coord) { + var points = coord[j]; + for (var k in points) { + latlngs.push(L.GeoJSON.coordsToLatLng(points[k])); + } + } + } + map.fitBounds(latlngs); + }); + }; + // Get the countries geojson data from a JSON + $http.get("json/JPN.geo.json").success(function(data, status) { + if(!$scope.geojson){ + $scope.geojson = createGeoJsonObject(data); + } + }); + $http.get("json/USA.geo.json").success(function(data, status) { + var features = $scope.geojson.data.features.concat(data.features); + var copy = angular.extend({}, $scope.geojson.data); + copy.features = features; + $scope.geojson.data = copy; + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/GoogleMapsController.js b/examples/js/controllers/GoogleMapsController.js new file mode 100644 index 00000000..1419e166 --- /dev/null +++ b/examples/js/controllers/GoogleMapsController.js @@ -0,0 +1,34 @@ + app.controller("GoogleMapsController", [ "$scope", function($scope) { + angular.extend($scope, { + berlin: { + lat: 52.52, + lng: 13.40, + zoom: 14 + }, + markers: { + m1: { + lat: 52.52, + lng: 13.40 + } + }, + layers: { + baselayers: { + googleTerrain: { + name: 'Google Terrain', + layerType: 'TERRAIN', + type: 'google' + }, + googleHybrid: { + name: 'Google Hybrid', + layerType: 'HYBRID', + type: 'google' + }, + googleRoadmap: { + name: 'Google Streets', + layerType: 'ROADMAP', + type: 'google' + } + } + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/GoogleMapsFullsizeController.js b/examples/js/controllers/GoogleMapsFullsizeController.js new file mode 100644 index 00000000..3d6c41bd --- /dev/null +++ b/examples/js/controllers/GoogleMapsFullsizeController.js @@ -0,0 +1,34 @@ + app.controller("GoogleMapsFullsizeController", [ "$scope", "$element", function($scope, $element) { + angular.extend($scope, { + berlin: { + lat: 52.52, + lng: 13.40, + zoom: 14 + }, + markers: { + m1: { + lat: 52.52, + lng: 13.40 + } + }, + layers: { + baselayers: { + googleTerrain: { + name: 'Google Terrain', + layerType: 'TERRAIN', + type: 'google' + }, + googleHybrid: { + name: 'Google Hybrid', + layerType: 'HYBRID', + type: 'google' + }, + googleRoadmap: { + name: 'Google Streets', + layerType: 'ROADMAP', + type: 'google' + } + } + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/ImageLegendServiceController.js b/examples/js/controllers/ImageLegendServiceController.js new file mode 100644 index 00000000..79e055de --- /dev/null +++ b/examples/js/controllers/ImageLegendServiceController.js @@ -0,0 +1,70 @@ + app.controller("ImageLegendServiceController", [ "$scope", function($scope) { + angular.extend($scope, { + options: { + controls: { + layers: { + visible: false + } + } + }, + usa: { + lat: 39.931486, + lng: -101.406250, + zoom: 3 + }, + markers: { + m1: { + lat: 39.931486, + lng: -101.406250, + } + }, + layers: { + baselayers: { + googleTerrain: { + name: 'Google Terrain', + layerType: 'TERRAIN', + type: 'google' + } + }, + overlays: { + sst: { + name: 'Analyses - Sea Surface Temperature', + type: 'wms', + url: 'http://nowcoast.noaa.gov/wms/com.esri.wms.Esrimap/analyses', + visible: true, + layerOptions: { + layers: 'NCEP_RAS_ANAL_RTG_SST,NCEP_POLY_ANAL_RTG_SST', + format: 'image/png', + transparent: true, + attribution: 'NOAA/NOS nowCOAST', + } + }, + wave: { + name: 'Forecasts - Wave height', + type: 'wms', + url: 'http://nowcoast.noaa.gov/wms/com.esri.wms.Esrimap/forecasts', + visible: false, + layerOptions: { + layers: 'NDFD_RAS_WAVEH_3_00,NDFD_POLY_WAVEH_3_00', + format: 'image/png', + transparent: true, + attribution: 'NOAA/NOS nowCOAST', + } + } + } + }, + legend: { + url: "http://nowcoast.noaa.gov/LayerInfo?layer=NCEP_RAS_ANAL_RTG_SST&data=legend", + legendClass: "info legend", + position: "bottomleft", + type: "image" + }, + legendURL1: "http://nowcoast.noaa.gov/LayerInfo?layer=NCEP_RAS_ANAL_RTG_SST&data=legend", + legendURL2: "http://nowcoast.noaa.gov/LayerInfo?layer=NDFD_RAS_WAVEH_3_00&data=legend", + switchLegend: function() { + $scope.layers.overlays.sst.visible = !$scope.layers.overlays.sst.visible; + $scope.layers.overlays.wave.visible = !$scope.layers.overlays.wave.visible; + $scope.legend.url == $scope.legendURL1? $scope.legendURL2:$scope.legendURL1; + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersBingMapsController.js b/examples/js/controllers/LayersBingMapsController.js new file mode 100644 index 00000000..a980c49a --- /dev/null +++ b/examples/js/controllers/LayersBingMapsController.js @@ -0,0 +1,43 @@ + app.controller("LayersBingMapsController", [ "$scope", function($scope) { + angular.extend($scope, { + bastia: { + lat: 42.7029, + lng: 9.4529, + zoom: 13 + }, + markers: { + bastia: { + lat: 67.6755, + lng: 9.4529 + } + }, + layers: { + baselayers: { + bingAerial: { + name: 'Bing Aerial', + type: 'bing', + key: 'Aj6XtE1Q1rIvehmjn2Rh1LR2qvMGZ-8vPS9Hn3jCeUiToM77JFnf-kFRzyMELDol', + layerOptions: { + type: 'Aerial' + } + }, + bingRoad: { + name: 'Bing Road', + type: 'bing', + key: 'Aj6XtE1Q1rIvehmjn2Rh1LR2qvMGZ-8vPS9Hn3jCeUiToM77JFnf-kFRzyMELDol', + layerOptions: { + type: 'Road' + } + }, + bingAerialWithLabels: { + name: 'Bing Aerial With Labels', + type: 'bing', + key: 'Aj6XtE1Q1rIvehmjn2Rh1LR2qvMGZ-8vPS9Hn3jCeUiToM77JFnf-kFRzyMELDol', + layerOptions: { + type: 'AerialWithLabels' + } + }, + } + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersDynamicAdditionController.js b/examples/js/controllers/LayersDynamicAdditionController.js new file mode 100644 index 00000000..e167b7e4 --- /dev/null +++ b/examples/js/controllers/LayersDynamicAdditionController.js @@ -0,0 +1,65 @@ + app.controller("LayersDynamicAdditionController", [ "$scope", function($scope) { + $scope.definedLayers = { + mapbox_wheat: { + name: 'Mapbox Wheat Paste', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + layerOptions: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia35jfp' + } + }, + osm: { + name: 'OpenStreetMap', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + }; + $scope.definedOverlays = { + hillshade: { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + } + }; + angular.extend($scope, { + bern: { + lat: 46.916, + lng: 7.466, + zoom: 10 + }, + layers: { + baselayers: { + osm: $scope.definedLayers.osm, + mapbox_wheat: $scope.definedLayers.mapbox_wheat + }, + overlays: { + hillshade: $scope.definedOverlays.hillshade + } + } + }); + $scope.toggleLayer = function(layerName) { + var baselayers = $scope.layers.baselayers; + if (baselayers.hasOwnProperty(layerName)) { + delete baselayers[layerName]; + } else { + baselayers[layerName] = $scope.definedLayers[layerName]; + } + }; + $scope.toggleOverlay = function(overlayName) { + var overlays = $scope.layers.overlays; + if (overlays.hasOwnProperty(overlayName)) { + delete overlays[overlayName]; + } else { + overlays[overlayName] = $scope.definedOverlays[overlayName]; + } + }; + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersEsriDynamicLayerController.js b/examples/js/controllers/LayersEsriDynamicLayerController.js new file mode 100644 index 00000000..aaf5a20f --- /dev/null +++ b/examples/js/controllers/LayersEsriDynamicLayerController.js @@ -0,0 +1,41 @@ + app.controller("LayersEsriDynamicLayerController", [ "$scope", function($scope) { + angular.extend($scope, { + bogota: { + lat: 4.649, + lng: -74.086, + zoom: 15 + }, + markers: { + m1: { + lat: 4.649, + lng: -74.086, + } + }, + layers: { + baselayers: { + world: { + name: "Imagery", + type: "dynamic", + url: "http://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer", + visible: false, + layerOptions: { + layers: [0, 1, 2, 3], + opacity: 1, + attribution: "Copyright:© 2014 Esri, DeLorme, HERE, TomTom" + } + }, + topo: { + name: "World Topographic", + type: "dynamic", + url: "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer", + visible: false, + layerOptions: { + layers: [0], + opacity: 0.9, + attribution: "Copyright:© 2014 Esri, FAO, NOAA" + } + }, + }, + }, + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersEsriLegendServiceController.js b/examples/js/controllers/LayersEsriLegendServiceController.js new file mode 100644 index 00000000..a7c96593 --- /dev/null +++ b/examples/js/controllers/LayersEsriLegendServiceController.js @@ -0,0 +1,69 @@ + app.controller("LayersEsriLegendServiceController", [ "$scope", function($scope) { + angular.extend($scope, { + options: { + controls: { + layers: { + visible: false + } + } + }, + usa: { + lat: 39.931486, + lng: -101.406250, + zoom: 3 + }, + markers: { + m1: { + lat: 39.931486, + lng: -101.406250, + } + }, + layers: { + baselayers: { + mapbox_light: { + name: 'Mapbox Light', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + layerOptions: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia22g09' + } + } + }, + overlays: { + usa_pop: { + name: "USA 2000-2010 Population Change", + type: "dynamic", + url: "http://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_1990-2000_Population_Change/MapServer", + visible: true, + layerOptions: { + opacity: 0.85, + attribution: "Copyright:© 2014 Esri, DeLorme, HERE, TomTom" + } + }, + usa_social: { + name: "USA Social Vulnerability Index", + type: "dynamic", + url: "http://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_Social_Vulnerability_Index/MapServer", + visible: false, + layerOptions: { + opacity: 0.85, + attribution: "Copyright:© 2014 Esri, FAO, NOAA" + } + }, + }, + }, + legend: { + url: "http://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_1990-2000_Population_Change/MapServer/legend?f=json", + legendClass: "info legend-esri", + position: "bottomleft", + }, + legendURL1: "http://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_1990-2000_Population_Change/MapServer/legend?f=json", + legendURL2: "http://services.arcgisonline.com/arcgis/rest/services/Demographics/USA_Social_Vulnerability_Index/MapServer/legend?f=json", + switchLegend: function() { + $scope.layers.overlays.usa_social.visible = !$scope.layers.overlays.usa_social.visible; + $scope.legend.url = + $scope.legend.url == $scope.legendURL1? $scope.legendURL2:$scope.legendURL1; + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersHideBaselayerOnSelectorController.js b/examples/js/controllers/LayersHideBaselayerOnSelectorController.js new file mode 100644 index 00000000..3a3ad13b --- /dev/null +++ b/examples/js/controllers/LayersHideBaselayerOnSelectorController.js @@ -0,0 +1,34 @@ + app.controller("LayersHideBaselayerOnSelectorController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 39, + lng: -100, + zoom: 4 + }, + layers: { + baselayers: { + xyz: { + name: 'OpenStreetMap (XYZ)', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz', + layerOptions: { + showOnSelector: false + } + } + }, + overlays: { + wms: { + name: 'EEUU States (WMS)', + type: 'wms', + visible: true, + url: 'http://suite.opengeo.org/geoserver/usa/wms', + layerParams: { + layers: 'usa:states', + format: 'image/png', + transparent: true + } + } + } + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersHideOverlaysOnSelectorController.js b/examples/js/controllers/LayersHideOverlaysOnSelectorController.js new file mode 100644 index 00000000..2325653f --- /dev/null +++ b/examples/js/controllers/LayersHideOverlaysOnSelectorController.js @@ -0,0 +1,36 @@ + app.controller("LayersHideOverlaysOnSelectorController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 39, + lng: -100, + zoom: 4 + }, + layers: { + baselayers: { + xyz: { + name: 'Mapbox Streets', + url: 'http://a.tiles.mapbox.com/v3/examples.map-i86nkdio/{z}/{x}/{y}.png', + type: 'xyz', + layerOptions: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.ll5em372' + } + } + }, + overlays: { + wms: { + name: 'EEUU States (WMS)', + type: 'wms', + visible: true, + url: 'http://suite.opengeo.org/geoserver/usa/wms', + layerParams: { + showOnSelector: false, + layers: 'usa:states', + format: 'image/png', + transparent: true + } + } + } + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersImageOverlayController.js b/examples/js/controllers/LayersImageOverlayController.js new file mode 100644 index 00000000..68e3d63f --- /dev/null +++ b/examples/js/controllers/LayersImageOverlayController.js @@ -0,0 +1,30 @@ + app.controller("LayersImageOverlayController", [ "$scope", "$log", "leafletData", "leafletBoundsHelpers", function($scope, $log, leafletData, leafletBoundsHelpers) { + var maxBounds = leafletBoundsHelpers.createBoundsFromArray([[-540, -960], [540, 960]]); + angular.extend($scope, { + defaults: { + scrollWheelZoom: false, + crs: 'Simple', + maxZoom: 2 + }, + center: { + lat: 0, + lng: 0, + zoom: 0 + }, + maxBounds: maxBounds, + layers: { + baselayers: { + sanfrancisco: { + name: 'Andes', + type: 'imageOverlay', + url: 'images/andes.jpg', + bounds: [[-540, -960], [540, 960]], + layerParams: { + noWrap: true, + attribution: 'Creative Commons image found here' + } + } + }, + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersLayergroupSimpleController.js b/examples/js/controllers/LayersLayergroupSimpleController.js new file mode 100644 index 00000000..55b6aec9 --- /dev/null +++ b/examples/js/controllers/LayersLayergroupSimpleController.js @@ -0,0 +1,52 @@ + app.controller("LayersLayergroupSimpleController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 39, + lng: -100, + zoom: 3 + }, + layers: { + baselayers: { + xyz: { + name: 'OpenStreetMap (XYZ)', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + }, + overlays: {} + } + }); + var tileLayer = { + name: 'Countries', + type: 'xyz', + url: 'http://{s}.tiles.mapbox.com/v3/milkator.press_freedom/{z}/{x}/{y}.png', + visible: true, + layerOptions: { + attribution: 'Map data © 2013 Natural Earth | Data © 2013 ROG/RSF', + maxZoom: 5 + } + }; + var utfGrid = { + name: 'UtfGrid', + type: 'utfGrid', + url: 'http://{s}.tiles.mapbox.com/v3/milkator.press_freedom/{z}/{x}/{y}.grid.json?callback={cb}', + visible: true, + pluginOptions: { + maxZoom: 5, + resolution: 4 + } + }; + var group = { + name: 'Group Layer', + type: 'group', + visible: true, + layerOptions: { + layers: [ tileLayer, utfGrid], + maxZoom: 5 + } + }; + $scope.layers['overlays']['Group Layer'] = group; + $scope.$on('leafletDirectiveMap.utfgridMouseover', function(event, leafletEvent) { + $scope.country = leafletEvent.data.name; + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersOverlaysMarkerclusterController.js b/examples/js/controllers/LayersOverlaysMarkerclusterController.js new file mode 100644 index 00000000..bf64ecec --- /dev/null +++ b/examples/js/controllers/LayersOverlaysMarkerclusterController.js @@ -0,0 +1,91 @@ + app.controller('LayersOverlaysMarkerclusterController', [ '$scope', function($scope) { + angular.extend($scope, { + ripoll: { + lat: 42.20133, + lng: 2.19110, + zoom: 8 + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + }, + cycle: { + name: 'OpenCycleMap', + type: 'xyz', + url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenCycleMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + hillshade: { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + }, + cars: { + name: 'Cars', + type: 'markercluster', + visible: true + } + } + }, + markers: { + m1: { + lat: 42.20133, + lng: 2.19110, + layer: 'cars', + message: "I'm a moving car" + }, + m2: { + lat: 42.21133, + lng: 2.18110, + layer: 'cars', + message: "I'm a car" + }, + m3: { + lat: 42.19133, + lng: 2.18110, + layer: 'cars', + message: 'A bike!!' + }, + m4: { + lat: 42.3, + lng: 2.16110, + layer: 'cars' + }, + m5: { + lat: 42.1, + lng: 2.16910, + layer: 'cars' + }, + m6: { + lat: 42.15, + lng: 2.17110, + layer: 'cars' + } + } + }); + $scope.move = function() { + $scope.markers.m1.lng = $scope.markers.m1.lng + 0.1; + } + } ]); \ No newline at end of file diff --git a/examples/overlays-markers-nested-example.html b/examples/js/controllers/LayersOverlaysMarkersNestedController.js similarity index 77% rename from examples/overlays-markers-nested-example.html rename to examples/js/controllers/LayersOverlaysMarkersNestedController.js index 67252679..db69a63d 100644 --- a/examples/overlays-markers-nested-example.html +++ b/examples/js/controllers/LayersOverlaysMarkersNestedController.js @@ -1,27 +1,39 @@ - - - - - - - - - - - - -
    - -
    - - - + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersOverlaysPathsController.js b/examples/js/controllers/LayersOverlaysPathsController.js new file mode 100644 index 00000000..e3778fd3 --- /dev/null +++ b/examples/js/controllers/LayersOverlaysPathsController.js @@ -0,0 +1,156 @@ + app.controller('LayersOverlaysPathsController', [ '$scope', function($scope) { + var markers = { + London : { + lat: 51.50, + lng: -0.082, + draggable: false + }, + Manchester: { + lat: 53.48, + lng: -2.24, + draggable: true + }, + Lincoln: { + lat: 53.230495, + lng: -0.53936, + draggable: true + }, + Northhampton: { + lat: 52.237892, + lng: -0.90087, + draggable: true + }, + Worcester: { + lat: 52.187404, + lng: -2.20275, + draggable: true + }, + York: { + lat: 53.959317, + lng: -1.08215, + draggable: true + } + }; + angular.extend($scope, { + cen: { + lat: 53, + lng: -3, + zoom: 6 + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + }, + cycle: { + name: 'OpenCycleMap', + type: 'xyz', + url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenCycleMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + hillshade: { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + }, + fire: { + name: 'OpenFireMap', + type: 'xyz', + url: 'http://openfiremap.org/hytiles/{z}/{x}/{y}.png', + layerOptions: { + attribution: '© OpenFireMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + }, + lines: { + name: 'Lines', + type: 'group', + visible: true + }, + shapes: { + name: 'Shapes', + type: 'group', + visible: false + } + } + }, + markers: markers, + paths: { + p1: { + color: '#008000', + weight: 4, + latlngs: [ markers.London, markers.Manchester ], + layer: 'lines' + }, + p2: { + weight: 3, + opacity: 0.5, + latlngs: [ + [ markers.London, markers.Lincoln ], + [ markers.Manchester, markers.Worcester] + ], + type: 'multiPolyline', + layer: 'lines' + }, + c1: { + weight: 2, + color: '#ff612f', + latlngs: markers.Northhampton, + radius: 10000, + type: 'circle', + layer: 'shapes' + }, + c2: { + weight: 2, + color: '#ff612f', + latlngs: markers.Lincoln, + radius: 50, + type: 'circleMarker', + layer: 'shapes' + }, + pg1: { + latlngs: [ markers.London, markers.Worcester, markers.Lincoln ], + stroke: false, + fillColor: '#ff69b4', + type: 'polygon', + layer: 'shapes' + }, + pg2: { + weight: 1, + color: '#2e3974', + latlngs: [ + [ markers.London, markers.Worcester, markers.Northhampton ], + [ markers.Manchester, markers.Lincoln, markers.York ] + ], + type: 'multiPolygon', + layer: 'shapes' + }, + r1: { + latlngs: [ markers.Lincoln, markers.York ], + type: 'rectangle', + layer: 'shapes' + } + } + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/LayersOverlaysSimpleController.js b/examples/js/controllers/LayersOverlaysSimpleController.js new file mode 100644 index 00000000..b2e3ab83 --- /dev/null +++ b/examples/js/controllers/LayersOverlaysSimpleController.js @@ -0,0 +1,31 @@ + app.controller("LayersOverlaysSimpleController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 39, + lng: -100, + zoom: 4 + }, + layers: { + baselayers: { + xyz: { + name: 'OpenStreetMap (XYZ)', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + }, + overlays: { + wms: { + name: 'EEUU States (WMS)', + type: 'wms', + visible: true, + url: 'http://suite.opengeo.org/geoserver/usa/wms', + layerParams: { + layers: 'usa:states', + format: 'image/png', + transparent: true + } + } + } + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersSimpleController.js b/examples/js/controllers/LayersSimpleController.js new file mode 100644 index 00000000..2a44030c --- /dev/null +++ b/examples/js/controllers/LayersSimpleController.js @@ -0,0 +1,33 @@ + app.controller("LayersSimpleController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 25.0391667, + lng: 121.525, + zoom: 6 + }, + markers: { + taipei: { + lat: 25.0391667, + lng: 121.525, + } + }, + layers: { + baselayers: { + mapbox_light: { + name: 'Mapbox Light', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + layerOptions: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia22g09' + } + }, + osm: { + name: 'OpenStreetMap', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + } + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersUTFGridController.js b/examples/js/controllers/LayersUTFGridController.js new file mode 100644 index 00000000..195d67a5 --- /dev/null +++ b/examples/js/controllers/LayersUTFGridController.js @@ -0,0 +1,37 @@ + app.controller("LayersUTFGridController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 0, + lng: 0, + zoom: 1 + }, + layers: { + baselayers: { + xyz: { + name: 'OpenStreetMap', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + }, + overlays: { + demosutfgrid: { + name: 'UTFGrid Interactivity', + type: 'utfGrid', + url: 'http://{s}.tiles.mapbox.com/v3/mapbox.geography-class/{z}/{x}/{y}.grid.json?callback={cb}', + visible: true + } + } + } + }); + $scope.interactivity = ""; + $scope.flag = ""; + $scope.$on('leafletDirectiveMap.utfgridMouseover', function(event, leafletEvent) { + // the UTFGrid information is on leafletEvent.data + $scope.interactivity = leafletEvent.data.admin; + $scope.flag = "data:image/png;base64," + leafletEvent.data.flag_png; + }); + $scope.$on('leafletDirectiveMap.utfgridMouseout', function(event, leafletEvent) { + $scope.interactivity = ""; + $scope.flag = ""; + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersWMSWithDifferentProjectionController.js b/examples/js/controllers/LayersWMSWithDifferentProjectionController.js new file mode 100644 index 00000000..3c48ddd4 --- /dev/null +++ b/examples/js/controllers/LayersWMSWithDifferentProjectionController.js @@ -0,0 +1,39 @@ + // For more info take a look at https://github.com/kartena/Proj4Leaflet proj4leaflet.js + app.controller('LayersWMSWithDifferentProjectionController', [ '$scope', '$location', function($scope) { + $scope.map = { + defaults: { + crs: new L.Proj.CRS('EPSG:3006', '+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs', + { + resolutions: [ + 8192, 4096, 2048, 1024, 512, 256, 128, + 64, 32, 16, 8, 4, 2, 1, 0.5 + ], + origin: [0, 0] + }), + continuousWorld: true + }, + malmo: { + lat: 55.5902, + lng: 12.9956, + zoom: 3 + }, + layers: { + baselayers: { + malmo: { + name: 'Fishery', + type: 'wms', + url: 'http://geodatatest.havochvatten.se/geoservices/ows', + visible: true, + layerOptions: { + layers: 'hav-fisketsgeografier:havet-ostersjons-delomraden', + format: 'image/png', + maxZoom: 14, + minZoom: 0, + continuousWorld: true, + attribution: '© Havs- och vattenmyndigheten (Swedish Agency for Marine and Water Management)' + } + } + } + } + }; + }]); \ No newline at end of file diff --git a/examples/js/controllers/LayersWebGLHeatmapController.js b/examples/js/controllers/LayersWebGLHeatmapController.js new file mode 100644 index 00000000..8ab2627a --- /dev/null +++ b/examples/js/controllers/LayersWebGLHeatmapController.js @@ -0,0 +1,29 @@ + app.controller("LayersWebGLHeatmapController", [ "$scope", function($scope) { + var dataPoints = [ + [44.651144316,-63.586260171, 0.5], + [44.75, -63.5, 0.8] ]; + angular.extend($scope, { + center: { + lat: 44.8091, + lng: -63.3636, + zoom: 9 + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + type: 'xyz' + } + }, + overlays: { + heatmap: { + name: 'Heat Map', + type: 'heatmap', + data: dataPoints, + visible: true + } + } + } + }); + }]); \ No newline at end of file diff --git a/examples/markers-example.html b/examples/js/controllers/MarkersAddRemoveController.js similarity index 55% rename from examples/markers-example.html rename to examples/js/controllers/MarkersAddRemoveController.js index bb3c541a..32b19a18 100644 --- a/examples/markers-example.html +++ b/examples/js/controllers/MarkersAddRemoveController.js @@ -1,13 +1,4 @@ - - - - - - - - - - - Remove markers # - Add markers - - - + } ]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersAngularTemplateController.js b/examples/js/controllers/MarkersAngularTemplateController.js new file mode 100644 index 00000000..8c2c60aa --- /dev/null +++ b/examples/js/controllers/MarkersAngularTemplateController.js @@ -0,0 +1,48 @@ + app.controller('MarkersAngularTemplateController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + data: {markers: {}} + }); + $scope.addMarkers = function() { + $scope.data.markers = {}; + angular.extend($scope.data, { angularInterpolatedMessage : "Angular interpolated message!"}); + angular.extend($scope.data, { + markers: { + m1: { + lat: 51.505, + lng: -0.09, + compileMessage: false, + message: "I'm a static marker", + }, + m2: { + lat: 51, + lng: 0, + focus: true, + message: "
    ", + draggable: true, + }, + m3: { + lat: 51, + lng: -1, + getMessageScope: function () { return $scope; }, + message: "

    {{data.angularInterpolatedMessage}}

    ", + compileMessage: true + } + } + }); + }; + $scope.removeMarkers = function() { + $scope.data.markers = {}; + } + $scope.addMarkers(); + } ]); + app.controller('ViewController', ['$scope', function($scope) { + $scope.user = {} + $scope.greet = function(user) { + alert('hello ' + user.name) + } + } ]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersChangeOpacityController.js b/examples/js/controllers/MarkersChangeOpacityController.js new file mode 100644 index 00000000..0f8f511c --- /dev/null +++ b/examples/js/controllers/MarkersChangeOpacityController.js @@ -0,0 +1,18 @@ + app.controller('MarkersChangeOpacityController', [ '$scope', function($scope) { + angular.extend($scope, { + chicago: { + lat: 41.85, + lng: -87.65, + zoom: 8 + }, + markers: { + m1: { + lat: 41.85, + lng: -87.65, + message: "I'm a static marker with defaultIcon", + focus: false, + opacity: 1 + }, + } + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersClustering10000MarkersController.js b/examples/js/controllers/MarkersClustering10000MarkersController.js new file mode 100644 index 00000000..8e166c36 --- /dev/null +++ b/examples/js/controllers/MarkersClustering10000MarkersController.js @@ -0,0 +1,55 @@ + app.controller("MarkersClustering10000MarkersController", [ "$scope", function($scope) { + var addressPointsToMarkers = function(points) { + return points.map(function(ap) { + return { + layer: 'realworld', + lat: ap[0], + lng: ap[1] + }; + }); + }; + angular.extend($scope, { + center: { + lat: -37.9212959167, + lng: 175.5604435167, + zoom: 11 + }, + events: { + map: { + enable: ['moveend', 'popupopen'], + logic: 'emit' + }, + marker: { + enable: [], + logic: 'emit' + } + }, + markers: addressPointsToMarkers(addressPoints), + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + realworld: { + name: "Real world data", + type: "markercluster", + visible: true, + "layerOptions": { + "chunkedLoading": true, + "showCoverageOnHover": false, + "removeOutsideVisibleBounds": true + } + }, + } + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersClusteringController.js b/examples/js/controllers/MarkersClusteringController.js new file mode 100644 index 00000000..bc4d52e6 --- /dev/null +++ b/examples/js/controllers/MarkersClusteringController.js @@ -0,0 +1,76 @@ + app.controller("MarkersClusteringController", [ "$scope", function($scope) { + angular.extend($scope, { + center: { + lat: 24.0391667, + lng: 121.525, + zoom: 6 + }, + markers: { + taipei: { + layer: "northTaiwan", + lat: 25.0391667, + lng: 121.525, + }, + yangmei: { + layer: "northTaiwan", + lat: 24.9166667, + lng: 121.1333333 + }, + hsinchu: { + layer: "northTaiwan", + lat: 24.8047222, + lng: 120.9713889 + }, + miaoli: { + layer: "northTaiwan", + lat: 24.5588889, + lng: 120.8219444 + }, + tainan: { + layer: "southTaiwan", + lat: 22.9933333, + lng: 120.2036111 + }, + puzi: { + layer: "southTaiwan", + lat: 23.4611, + lng: 120.242 + }, + kaohsiung: { + layer: "southTaiwan", + lat: 22.6252777778, + lng: 120.3088888889 + }, + taitun: { + layer: "southTaiwan", + lat: 22.75, + lng: 121.15 + } + }, + layers: { + baselayers: { + mapbox_light: { + name: 'Mapbox Light', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + layerOptions: { + apikey: 'pk.eyJ1IjoiYnVmYW51dm9scyIsImEiOiJLSURpX0pnIn0.2_9NrLz1U9bpwMQBhVk97Q', + mapid: 'bufanuvols.lia22g09' + } + } + }, + overlays: { + northTaiwan: { + name: "North cities", + type: "markercluster", + visible: true + }, + southTaiwan: { + name: "South cities", + type: "markercluster", + visible: true + } + } + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersClusteringWithoutOverlaysController.js b/examples/js/controllers/MarkersClusteringWithoutOverlaysController.js new file mode 100644 index 00000000..4854c739 --- /dev/null +++ b/examples/js/controllers/MarkersClusteringWithoutOverlaysController.js @@ -0,0 +1,55 @@ + app.controller('MarkersClusteringWithoutOverlaysController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + markers: { + stoke: { + group: 'london', + lat: 51.5615, + lng: -0.0731, + label: { + message: "Stoke", + options: { + noHide: true + } + } + }, + dalston: { + group: 'london', + lat: 51.545, + lng: -0.070, + label: { + message: "Dalston", + options: { + noHide: true + } + } + }, + wandsworth: { + group: 'london', + lat: 51.4644, + lng:-0.1924, + label: { + message: "Wandsworth", + options: { + noHide: true + } + } + }, + battersea: { + group: 'london', + lat: 51.4638, + lng: -0.1677, + label: { + message: "Battersea", + options: { + noHide: true + } + } + } + }, + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersDelayedEventsController.js b/examples/js/controllers/MarkersDelayedEventsController.js new file mode 100644 index 00000000..7b8c21b2 --- /dev/null +++ b/examples/js/controllers/MarkersDelayedEventsController.js @@ -0,0 +1,45 @@ + app.controller("MarkersDelayedEventsController", ["$scope", "leafletEvents", function($scope, leafletEvents){ + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + markers: {} + }); + $scope.addMarkers = function() { + angular.extend($scope, { + markers: { + m1: { + lat: 51.505, + lng: -0.09, + message: "I'm a static marker", + }, + m2: { + lat: 51, + lng: 0, + focus: true, + message: "Hey, drag me if you want", + draggable: true + } + } + }); + }; + $scope.events = { + markers: { + enable: leafletEvents.getAvailableMarkerEvents(), + } + }; + $scope.eventDetected = "No events yet..."; + var markerEvents = leafletEvents.getAvailableMarkerEvents(); + for (var k in markerEvents){ + var eventName = 'leafletDirectiveMarker.' + markerEvents[k]; + $scope.$on(eventName, function(event, args){ + $scope.eventDetected = event.name; + }); + } + $scope.removeMarkers = function() { + $scope.markers = {}; + } + //$scope.addMarkers(); + }]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersEventsAddController.js b/examples/js/controllers/MarkersEventsAddController.js new file mode 100644 index 00000000..b9c14ef2 --- /dev/null +++ b/examples/js/controllers/MarkersEventsAddController.js @@ -0,0 +1,19 @@ + app.controller('MarkersEventsAddController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + events: {} + }); + $scope.markers = new Array(); + $scope.$on("leafletDirectiveMap.click", function(event, args){ + var leafEvent = args.leafletEvent; + $scope.markers.push({ + lat: leafEvent.latlng.lat, + lng: leafEvent.latlng.lng, + message: "My Added Marker" + }); + }); + } ]); \ No newline at end of file diff --git a/examples/marker-events-example.html b/examples/js/controllers/MarkersEventsController.js similarity index 52% rename from examples/marker-events-example.html rename to examples/js/controllers/MarkersEventsController.js index d9bebaea..61229e2a 100644 --- a/examples/marker-events-example.html +++ b/examples/js/controllers/MarkersEventsController.js @@ -1,20 +1,9 @@ - - - - - - - - - - -

    Marker Events example

    -
      -
    • event caught in listener.
    • -
    - - - + }]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersGroupController.js b/examples/js/controllers/MarkersGroupController.js new file mode 100644 index 00000000..0cefdaa8 --- /dev/null +++ b/examples/js/controllers/MarkersGroupController.js @@ -0,0 +1,74 @@ + app.controller('MarkersGroupController', [ '$scope', function($scope) { + var icons = { + blue: { + type: 'div', + iconSize: [10, 10], + className: 'blue', + iconAnchor: [5, 5] + }, + red: { + type: 'div', + iconSize: [10, 10], + className: 'red', + iconAnchor: [5, 5] + } + } + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 11 + }, + layers: { + baselayers: { + openStreetMap: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png' + } + }, + overlays: { + red: { + type: 'group', + name: 'red', + visible: false + }, + blue: { + type: 'group', + name: 'blue', + visible: false + } + } + }, + markers: { + stoke: { + layer: 'blue', + lat: 51.5615, + lng: -0.0731, + icon: icons.blue + }, + dalston: { + layer: 'blue', + lat: 51.545, + lng: -0.070, + icon: icons.blue + }, + wandsworth: { + layer: 'red', + lat: 51.4644, + lng:-0.1924, + icon: icons.red + }, + battersea: { + layer: 'red', + lat: 51.4638, + lng: -0.1677, + icon: icons.red + } + }, + toggleLayer: function(type) + { + $scope.layers.overlays[type].visible = !$scope.layers.overlays[type].visible; + } + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersIconsController.js b/examples/js/controllers/MarkersIconsController.js new file mode 100644 index 00000000..b28ffcab --- /dev/null +++ b/examples/js/controllers/MarkersIconsController.js @@ -0,0 +1,61 @@ + app.controller('MarkersIconsController', [ '$scope', function($scope) { + angular.extend($scope, { + chicago: { + lat: 41.85, + lng: -87.65, + zoom: 8 + }, + markers: { + m1: { + lat: 41.85, + lng: -87.65, + message: "I'm a static marker with defaultIcon", + focus: false, + icon: {}, + }, + }, + defaultIcon: {}, + leafIcon: { + iconUrl: 'img/leaf-green.png', + shadowUrl: 'img/leaf-shadow.png', + iconSize: [38, 95], // size of the icon + shadowSize: [50, 64], // size of the shadow + iconAnchor: [22, 94], // point of the icon which will correspond to marker's location + shadowAnchor: [4, 62], // the same for the shadow + popupAnchor: [-3, -76] // point from which the popup should open relative to the iconAnchor + }, + orangeLeafIcon: { + iconUrl: 'img/leaf-orange.png', + shadowUrl: 'img/leaf-shadow.png', + iconSize: [38, 95], + shadowSize: [50, 64], + iconAnchor: [22, 94], + shadowAnchor: [4, 62], + popupAnchor: [-3, -76] // point from which the popup should open relative to the iconAnchor + }, + divIcon: { + type: 'div', + iconSize: [200, 0], + popupAnchor: [0, 0], + html: 'Using Bold text as an icon:' + }, + awesomeMarkerIcon: { + type: 'awesomeMarker', + icon: 'tag', + markerColor: 'red' + }, + makiMarkerIcon: { + type: 'makiMarker', + icon: 'beer', + color: '#f00', + size: "l" + }, + extraMarkerIcon: { + type: 'extraMarker', + icon: 'fa-star', + color: '#f00', + prefix: 'fa', + shape: 'circle' + } + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersLabelController.js b/examples/js/controllers/MarkersLabelController.js new file mode 100644 index 00000000..6d4913c3 --- /dev/null +++ b/examples/js/controllers/MarkersLabelController.js @@ -0,0 +1,25 @@ + app.controller('MarkersLabelController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + markers: { + main_marker: { + lat: 51.5, + lng: 0, + focus: true, + //message: "Hey, drag me if you want", + title: "Marker", + draggable: true, + label: { + message: "Hey, drag me if you want", + options: { + noHide: true + } + } + } + } + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersModalMarkerClusterController.js b/examples/js/controllers/MarkersModalMarkerClusterController.js new file mode 100644 index 00000000..a03325ca --- /dev/null +++ b/examples/js/controllers/MarkersModalMarkerClusterController.js @@ -0,0 +1,45 @@ + app.controller("MarkersModalMarkerClusterController", ['$scope', 'leafletData', function ($scope, leafletData) { + $scope.oneAtATime = false; + $scope.cancel = function () { + $modalInstance.dismiss('cancel'); + }; + var markers = []; + markers.push({ + lat: 52.229676, + lng: 21.012229, + draggable: false, + group: 'markers' + }); + markers.push({ + lat: 52.219081, + lng: 21.025386, + draggable: false, + group: 'markers' + }); + angular.extend($scope, { + defaults: { + maxZoom: 18, + minZoom: 0 + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + } + } + }, + center: { + zoom: 10, + lat: 52.229676, + lng: 21.012229 + }, + markers: markers + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersPopupController.js b/examples/js/controllers/MarkersPopupController.js new file mode 100644 index 00000000..da3c6b3d --- /dev/null +++ b/examples/js/controllers/MarkersPopupController.js @@ -0,0 +1,31 @@ + app.controller('MarkersPopupController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + markers: { + m1: { + lat: 51.505, + lng: -0.09, + focus: true, + draggable: false, + message: "Hi there!", + icon: {} + } + }, + }); + $scope.$on('leafletDirectiveMarker.click', function(e, args) { + // Args will contain the marker name and other relevant information + console.log("Leaflet Click"); + }); + $scope.$on('leafletDirectiveMarker.popupopen', function(e, args) { + // Args will contain the marker name and other relevant information + console.log("Leaflet Popup Open"); + }); + $scope.$on('leafletDirectiveMarker.popupclose', function(e, args) { + // Args will contain the marker name and other relevant information + console.log("Leaflet Popup Close"); + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersRotationController.js b/examples/js/controllers/MarkersRotationController.js new file mode 100644 index 00000000..024a4861 --- /dev/null +++ b/examples/js/controllers/MarkersRotationController.js @@ -0,0 +1,40 @@ + app.controller('MarkersRotationController', [ '$scope', function($scope) { + var markers = { + m1: { + lat: 41.95, + lng: -87.65, + message: "I'm a static marker at 0 degrees", + focus: false, + iconAngle: 0 + }, + m2: { + lat: 41.85, + lng: -87.95, + message: "I'm a static marker at 270 degrees", + focus: false, + iconAngle: 270 + }, + m3: { + lat: 41.85, + lng: -87.05, + message: "I'm a static marker at 90 degrees", + focus: false, + iconAngle: 90 + }, + m4: { + lat: 41.35, + lng: -87.65, + message: "I'm a static marker at 180 degrees", + focus: false, + iconAngle: 180 + } + }; + angular.extend($scope, { + chicago: { + lat: 41.85, + lng: -87.65, + zoom: 8 + }, + markers: markers + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/MarkersSimpleController.js b/examples/js/controllers/MarkersSimpleController.js new file mode 100644 index 00000000..c68d2f02 --- /dev/null +++ b/examples/js/controllers/MarkersSimpleController.js @@ -0,0 +1,18 @@ + app.controller('MarkersSimpleController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + markers: { + mainMarker: { + lat: 51, + lng: 0, + focus: true, + message: "Hey, drag me if you want", + draggable: true + } + } + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/MixedGeoJSONEventsController.js b/examples/js/controllers/MixedGeoJSONEventsController.js new file mode 100644 index 00000000..68f4d278 --- /dev/null +++ b/examples/js/controllers/MixedGeoJSONEventsController.js @@ -0,0 +1,95 @@ + app.controller('MixedGeoJSONEventsController', [ "$scope", "$http", function($scope, $http) { + $scope.$on("leafletDirectiveMap.geojsonMouseover", function(ev, feature, leafletEvent) { + countryMouseover(feature, leafletEvent); + }); + $scope.$on("leafletDirectiveMap.geojsonClick", function(ev, featureSelected, leafletEvent) { + countryClick(featureSelected, leafletEvent); + }); + var continentProperties= { + "009": { + name: 'Oceania', + colors: [ '#CC0066', '#993366', '#990066', '#CC3399', '#CC6699' ] + }, + "019": { + name: 'America', + colors: [ '#006699', '#336666', '#003366', '#3399CC', '#6699CC' ] + }, + "150": { + name: 'Europe', + colors: [ '#FF0000', '#CC3333', '#990000', '#FF3333', '#FF6666' ] + }, + "002": { + name: 'Africa', + colors: [ '#00CC00', '#339933', '#009900', '#33FF33', '#66FF66' ] + }, + "142": { + name: 'Asia', + colors: [ '#FFCC00', '#CC9933', '#999900', '#FFCC33', '#FFCC66' ] + }, + }; + angular.extend($scope, { + center: { + lat: 40.8471, + lng: 14.0625, + zoom: 2 + }, + legend: { + colors: [ '#CC0066', '#006699', '#FF0000', '#00CC00', '#FFCC00' ], + labels: [ 'Oceania', 'America', 'Europe', 'Africa', 'Asia' ] + } + }); + function countryClick(country, event) { + console.log(country.properties.name); + } + // Get a country paint color from the continents array of colors + function getColor(country) { + if (!country || !country["region-code"]) { + return "#FFF"; + } + var colors = continentProperties[country["region-code"]].colors; + var index = country["alpha-3"].charCodeAt(0) % colors.length ; + return colors[index]; + } + function style(feature) { + return { + fillColor: getColor($scope.countries[feature.id]), + weight: 2, + opacity: 1, + color: 'white', + dashArray: '3', + fillOpacity: 0.7 + }; + } + // Mouse over function, called from the Leaflet Map Events + function countryMouseover(feature, leafletEvent) { + var layer = leafletEvent.target; + layer.setStyle({ + weight: 2, + color: '#666', + fillColor: 'white' + }); + layer.bringToFront(); + $scope.selectedCountry = feature; + console.log(feature); + } + // Get the countries data from a JSON + $http.get("json/all.json").success(function(data, status) { + // Put the countries on an associative array + $scope.countries = {}; + for (var i=0; i< data.length; i++) { + var country = data[i]; + $scope.countries[country['alpha-3']] = country; + } + // Get the countries geojson data from a JSON + $http.get("json/countries.geo.json").success(function(data, status) { + angular.extend($scope, { + geojson: { + data: data, + style: style, + resetStyleOnMouseout: true + }, + selectedCountry: {} + }); + }); + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/MixedLayersOverlaysGeoJSONController.js b/examples/js/controllers/MixedLayersOverlaysGeoJSONController.js new file mode 100644 index 00000000..ebb6fbf5 --- /dev/null +++ b/examples/js/controllers/MixedLayersOverlaysGeoJSONController.js @@ -0,0 +1,62 @@ + app.controller("MixedLayersOverlaysGeoJSONController", ["$scope", function($scope){ + angular.extend($scope, { + sanfrancisco: { + lat: 37.79, + lng: -122.4, + zoom: 17 + }, + defaults: { + scrollWheelZoom: false + }, + layers:{ + baselayers: { + osm:{ + name: "OpenStreetMap (XYZ)", + type: "xyz", + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + } + } + , + overlays: { + buildings: { + name:'Buildings', + type: 'geoJSON', + url:'http://tile.openstreetmap.us/vectiles-buildings/{z}/{x}/{y}.json', + layerOptions: { + style: { + "color": "#00D", + "fillColor": "#00D", + "weight": 1.0, + "opacity": 0.6, + "fillOpacity": .2 + } + }, + pluginOptions:{ + cliptiles: true + } + }, + Roads:{ + name:'Roads', + type: 'geoJSON', + url: 'http://tile.openstreetmap.us/vectiles-skeletron/{z}/{x}/{y}.json', + layerOptions: { + style: { + "color": "#DD0000 ", + "fillColor": "#DD0000", + "weight": 1.0, + "fillOpacity": .4 + } + }, + pluginOptions:{ + cliptiles: false + } + } + } + } + }) + }]); \ No newline at end of file diff --git a/examples/js/controllers/MixedMOverlaysMarkersNestedNoWatchController.js b/examples/js/controllers/MixedMOverlaysMarkersNestedNoWatchController.js new file mode 100644 index 00000000..add86d39 --- /dev/null +++ b/examples/js/controllers/MixedMOverlaysMarkersNestedNoWatchController.js @@ -0,0 +1,138 @@ +app.controller('MixedMOverlaysMarkersNestedNoWatchController', function ($scope, leafletData, $timeout) { + var _clonedMarkers; + $timeout(function () { + //should do nothing (not watched) and only see one destroy + _clonedMarkers = angular.extend({},$scope.markers); + $scope.markers = {}; + },1000); + $timeout(function () { + leafletData.getDirectiveControls().then(function (controls) { + //move all markers by a few decimal points + for (var layer in _clonedMarkers) { + var markerSet = _clonedMarkers[layer]; + for (var markerName in markerSet) { + var marker = markerSet[markerName]; + marker.lat += .05; + } + } + //force manual update + $scope.markers = _clonedMarkers; + controls.markers.create($scope.markers); + }); + }, 4000); + angular.extend($scope, { + markersWatchOptions: { + doWatch: false, + isDeep: false, + individual: { + doWatch: false, + isDeep: false + } + }, + center: { + lat: 42.20133, + lng: 2.19110, + zoom: 11 + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + }, + cycle: { + name: 'OpenCycleMap', + type: 'xyz', + url: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenCycleMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + hillshade: { + name: 'Hillshade Europa', + type: 'wms', + url: 'http://129.206.228.72/cached/hillshade', + visible: true, + layerOptions: { + layers: 'europe_wms:hs_srtm_europa', + format: 'image/png', + opacity: 0.25, + attribution: 'Hillshade layer by GIScience http://www.osm-wms.de', + crs: L.CRS.EPSG900913 + } + }, + fire: { + name: 'OpenFireMap', + type: 'xyz', + url: 'http://openfiremap.org/hytiles/{z}/{x}/{y}.png', + layerOptions: { + attribution: '© OpenFireMap contributors - © OpenStreetMap contributors', + continuousWorld: true + } + }, + cars: { + name: 'Cars', + type: 'group', + visible: true + }, + bikes: { + name: 'Bicycles', + type: 'group', + visible: false + }, + runners: { + name: 'Runners', + type: 'group', + visible: false + } + } + }, + markers: { + cars: { + m1: { + lat: 42.20133, + lng: 2.19110, + message: "I'm a car" + }, + m2: { + lat: 42.21133, + lng: 2.18110, + message: "I'm a car" + } + }, + bikes: { + m3: { + lat: 42.19133, + lng: 2.18110, + layer: 'bikes', + message: 'A bike!!' + }, + m4: { + lat: 42.3, + lng: 2.16110, + layer: 'bikes' + } + }, + runners: { + m5: { + lat: 42.1, + lng: 2.16910 + }, + m6: { + lat: 42.15, + lng: 2.17110 + } + } + } + }); +}); \ No newline at end of file diff --git a/examples/js/controllers/MixedMapboxTilesGeojsonController.js b/examples/js/controllers/MixedMapboxTilesGeojsonController.js new file mode 100644 index 00000000..fce63c91 --- /dev/null +++ b/examples/js/controllers/MixedMapboxTilesGeojsonController.js @@ -0,0 +1,23 @@ + app.controller("MixedMapboxTilesGeojsonController", [ "$scope", "$http", function($scope, $http) { + angular.extend($scope, { + center: { + lat: -33.8979173, + lng: 151.2323598, + zoom: 14 + }, + tiles: { + name: 'Mapbox Park', + url: 'http://api.tiles.mapbox.com/v4/{mapid}/{z}/{x}/{y}.png?access_token={apikey}', + type: 'xyz', + options: { + apikey: 'pk.eyJ1IjoiZmVlbGNyZWF0aXZlIiwiYSI6Ik1Gak9FXzAifQ.9eB142zVCM4JMg7btDDaZQ', + mapid: 'feelcreative.llm8dpdk' + } + }, + geojson: {} + }); + $http.get("https://a.tiles.mapbox.com/v4/feelcreative.llm8dpdk/features.json?access_token=pk.eyJ1IjoiZmVlbGNyZWF0aXZlIiwiYSI6Ik1Gak9FXzAifQ.9eB142zVCM4JMg7btDDaZQ").success(function(data) { + $scope.geojson.data = data; + console.log(data); + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/MixedMarkersNestedEventsController.js b/examples/js/controllers/MixedMarkersNestedEventsController.js new file mode 100644 index 00000000..40cf9b70 --- /dev/null +++ b/examples/js/controllers/MixedMarkersNestedEventsController.js @@ -0,0 +1,59 @@ + app.controller("MixedMarkersNestedEventsController", ["$scope", "leafletEvents", function ($scope, leafletEvents) { + $scope.map = { + show: true + }; + $scope.layers = { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + } + }, + overlays: { + london: { + name: 'London', + type: 'group', + visible: true + } + } + }; + $scope.center = { + lat: 51.505, + lng: -0.09, + zoom: 8 + }; + $scope.markers = { + london: { + 1: { + lat: 51.505, + lng: -0.09, + draggable: true, + focus: true + } + } + }; + $scope.events = { + markers: { + enable: leafletEvents.getAvailableMarkerEvents() + } + }; + $scope.eventDetected = "No events yet..."; + var markerEvents = leafletEvents.getAvailableMarkerEvents(); + for (var k in markerEvents) { + var eventName = 'leafletDirectiveMarker.' + markerEvents[k]; + $scope.$on(eventName, function (event, args) { + $scope.eventDetected = event.name; + $scope.args = { + layerName: args.layerName, + model: args.model, + modelName: args.modelName + }; + }); + } + }]); \ No newline at end of file diff --git a/examples/js/controllers/PathSimpleController.js b/examples/js/controllers/PathSimpleController.js new file mode 100644 index 00000000..fec7f6d8 --- /dev/null +++ b/examples/js/controllers/PathSimpleController.js @@ -0,0 +1,30 @@ + app.controller("PathSimpleController", [ "$scope", function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + europeanPaths: { + p1: { + color: 'red', + weight: 8, + latlngs: [ + { lat: 51.50, lng: -0.082 }, + { lat: 48.83, lng: 2.37 }, + { lat: 41.91, lng: 12.48 } + ], + message: "

    Route from London to Rome

    Distance: 1862km

    ", + }, + p2: { + color: 'green', + weight: 8, + latlngs: [ + { lat: 48.2083537, lng: 16.3725042 }, + { lat: 48.8534, lng: 2.3485 } + ], + label: {message: "

    Route from Vienna to Paris

    Distance: 1211km

    "} + } + } + }); + }]); \ No newline at end of file diff --git a/examples/js/controllers/PathTypesController.js b/examples/js/controllers/PathTypesController.js new file mode 100644 index 00000000..96a2f83b --- /dev/null +++ b/examples/js/controllers/PathTypesController.js @@ -0,0 +1,83 @@ + app.controller('PathTypesController', [ '$scope', function($scope) { + var europeCapitals = { + Madrid: { + lat: 40.4, + lng: -3.6833333 + }, + Rome: { + lat: 41.9, + lng: 12.4833333 + }, + London: { + lat: 51.5, + lng: -0.116667 + }, + Lisbon: { + lat: 38.7166667, + lng: -9.1333333 + }, + Berlin: { + lat: 52.5166667, + lng: 13.4 + }, + Paris: { + lat: 48.866667, + lng: 2.333333 + }, + Brussels: { + lat: 50.8333, + lng: 4 + } + }; + var pathsDict = { + polyline: { + type: "polyline", + latlngs: [ europeCapitals.London, europeCapitals.Madrid, europeCapitals.Rome ] + }, + multiPolyline: { + type: "multiPolyline", + latlngs: [ + [ europeCapitals.London, europeCapitals.Lisbon ], + [ europeCapitals.Paris, europeCapitals.Madrid ], + [ europeCapitals.Rome, europeCapitals.Berlin ] + ] + }, + polygon: { + type: "polygon", + latlngs: [ europeCapitals.London, europeCapitals.Lisbon , europeCapitals.Madrid, europeCapitals.Paris ] + }, + multiPolygon: { + type: "multiPolygon", + latlngs: [ + [ europeCapitals.London, europeCapitals.Lisbon , europeCapitals.Madrid, europeCapitals.Paris ], + [ europeCapitals.Berlin, europeCapitals.Rome, europeCapitals.Brussels ] + ] + }, + rectangle: { + type: "rectangle", + latlngs: [ europeCapitals.Berlin, europeCapitals.Lisbon ] + }, + circle: { + type: "circle", + radius: 500 * 1000, + latlngs: europeCapitals.Brussels + }, + circleMarker: { + type: "circleMarker", + radius: 50, + latlngs: europeCapitals.Rome + } + }; + angular.extend($scope, { + center: { + lat: 51.505, + lng: -0.09, + zoom: 3 + }, + paths: {} + }); + $scope.addShape = function(shape) { + $scope.paths = {}; + $scope.paths[shape] = pathsDict[shape]; + }; + } ]); \ No newline at end of file diff --git a/examples/js/controllers/Paths3000ItemsController.js b/examples/js/controllers/Paths3000ItemsController.js new file mode 100644 index 00000000..ac85afe1 --- /dev/null +++ b/examples/js/controllers/Paths3000ItemsController.js @@ -0,0 +1,118 @@ + app.controller('Paths3000ItemsController', ['$scope', 'leafletData', 'LocationDataService', function ($scope, leafletData, LocationDataService) { + //map properties + angular.extend($scope, { + defaults: { + scrollWheelZoom: false + }, + //restrict map panning for this region + maxbounds: { + northEast: { + lat: 90, + lng: -180 + }, + southWest: { + lat: -90, + lng: 180 + } + }, + centroid: { + lat: 50, + lng: 10, + zoom: 3 + }, + layers: { + baselayers: { + stamen: { + name: 'StamenWatercolor', + url: 'http://c.tile.stamen.com/watercolor/{z}/{x}/{y}.png', + type: 'xyz', + } + } + } + }); + // set up circle rendering + //namespace leaflet path + $scope.paths = {}; + //bind locationGrid to zoom level + $scope.$watch("centroid.zoom", function (zoom) { + if (zoom <= 3) { + //clear path object + $scope.paths = {}; + //get location data and initialize leaflet circles + LocationDataService.getLocationsTenGrid().then(function (res) { + angular.forEach(res.data, function (value, key) { + if (value.lat !== null && value.lon !== null) { + $scope.paths['circle' + key] = { + type: 'circle', + className: 'testClass', + fillColor: 'DarkSlateGray', + color: '#000000', + weight: 0, + opacity: 1, + fillOpacity: 0.8, + stroke: false, + clickable: false, + latlngs: [parseFloat(value.lat), parseFloat(value.lon)], + radius: Math.sqrt(value.location_count) * 5000 + }; + } + }); + }, function (error) { + console.log('An error occured!', error); + }); + } + if (zoom >= 4) { + //clear path object + $scope.paths = {}; + //get location data and initialize leaflet circles + LocationDataService.getLocationsZeroOneGrid().then(function (res) { + angular.forEach(res.data, function (value, key) { + if (value.lat !== null && value.lon !== null) { + $scope.paths['circle' + key] = { + type: 'circle', + className: 'testClass', + fillColor: 'DarkSlateGray', + color: '#000000', + weight: 0, + opacity: 1, + fillOpacity: 0.8, + stroke: false, + clickable: false, + latlngs: [parseFloat(value.lat), parseFloat(value.lon)], + radius: Math.sqrt(value.location_count) * 2000 + }; + } + }); + }, function (error) { + console.log('An error occured!', error); + }); + } + }); + }]); + // getting data with a factory + app.factory('LocationDataService', LocationDataService); + /* @ngInject */ + function LocationDataService($http) { + var srv = {}; + // Service implementation for gridsize = 10 + srv.getLocationsTenGrid = function () { + return $http.get('json/mockupTenGrid.json', { + cache: true + }); + }; + // Service implementation for gridsize = 0.1 + srv.getLocationsZeroOneGrid = function () { + return $http.get('json/mockupZeroOneGrid.json', { + cache: true + }); + }; + // Public API + return { + getLocationsTenGrid: function () { + return srv.getLocationsTenGrid(); + }, + getLocationsZeroOneGrid: function () { + return srv.getLocationsZeroOneGrid(); + } + }; + }; \ No newline at end of file diff --git a/examples/js/controllers/PathsAdvancedController.js b/examples/js/controllers/PathsAdvancedController.js new file mode 100644 index 00000000..1fd95c53 --- /dev/null +++ b/examples/js/controllers/PathsAdvancedController.js @@ -0,0 +1,116 @@ + app.controller('PathsAdvancedController', [ '$scope', function($scope) { + $scope.addMarker = function() { + var m_key = document.getElementById('new_mm_name').value; + if ($scope.markers[m_key]) return; + $scope.markers[m_key] = { + lat: document.getElementById('new_mm_lat').value, + lng: document.getElementById('new_mm_lng').value, + draggable: true + }; + $scope.paths.p1.latlngs.push($scope.markers[m_key]); + }; + $scope.deleteMarker = function(m_key) { + var marker = $scope.markers[m_key]; + for (var pkey in $scope.paths) { + for (var j in $scope.paths[pkey].latlngs) { + var p = $scope.paths[pkey].latlngs[j]; + if (p === marker) { + $scope.paths[pkey].latlngs.splice(j, 1); + } + } + } + delete $scope.markers[m_key]; + }; + angular.extend($scope, { + // set up map center + cen: { + lat: 53, + lng: -3, + zoom: 6 + }, + // set up multiple markers on map + markers: { + London : { + lat: 51.50, + lng: -0.082, + draggable: false + }, + Manchester: { + lat: 53.48, + lng: -2.24, + draggable: true + }, + Lincoln: { + lat: 53.230495, + lng: -0.53936, + draggable: true + }, + Northhampton: { + lat: 52.237892, + lng: -0.90087, + draggable: true + }, + Worcester: { + lat: 52.187404, + lng: -2.20275, + draggable: true + }, + York: { + lat: 53.959317, + lng: -1.08215, + draggable: true + } + } + }); + angular.extend($scope, { + paths: { + p1: { + color: '#008000', + weight: 4, + latlngs: [ $scope.markers.London, $scope.markers.Manchester ] + }, + p2: { + weight: 3, + opacity: 0.5, + latlngs: [ + [ $scope.markers.London, $scope.markers.Lincoln ], + [ $scope.markers.Manchester, $scope.markers.Worcester] + ], + type: 'multiPolyline' + }, + c1: { + weight: 2, + color: '#ff612f', + latlngs: $scope.markers.Northhampton, + radius: 10000, + type: 'circle' + }, + c2: { + weight: 2, + color: '#ff612f', + latlngs: $scope.markers.Lincoln, + radius: 50, + type: 'circleMarker' + }, + pg1: { + latlngs: [ $scope.markers.London, $scope.markers.Worcester, $scope.markers.Lincoln ], + stroke: false, + fillColor: '#ff69b4', + type: 'polygon' + }, + pg2: { + weight: 1, + color: '#2e3974', + latlngs: [ + [ $scope.markers.London, $scope.markers.Worcester, $scope.markers.Northhampton ], + [ $scope.markers.Manchester, $scope.markers.Lincoln, $scope.markers.York ] + ], + type: 'multiPolygon' + }, + r1: { + latlngs: [ $scope.markers.Lincoln, $scope.markers.York ], + type: 'rectangle' + } + } + }); + } ]); \ No newline at end of file diff --git a/examples/js/controllers/PathsAjaxLoadController.js b/examples/js/controllers/PathsAjaxLoadController.js new file mode 100644 index 00000000..b5ad0878 --- /dev/null +++ b/examples/js/controllers/PathsAjaxLoadController.js @@ -0,0 +1,22 @@ + app.controller("PathsAjaxLoadController", [ "$scope", "$http", function($scope, $http) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + europeanPaths: {} + }); + $scope.loadPaths = function loadPaths() { + $http.get('json/paths.json').success(function(data) { + $scope.europeanPaths = data; + }); + }; + $scope.changePaths = function changePaths() { + console.log($scope.europeanPaths); + $scope.europeanPaths.p1.latlngs[0] = { + lat: 53, + lng: -0.1 + }; + }; + }]); \ No newline at end of file diff --git a/examples/js/controllers/PathsChangeInGroupLayerController.js b/examples/js/controllers/PathsChangeInGroupLayerController.js new file mode 100644 index 00000000..802ef53c --- /dev/null +++ b/examples/js/controllers/PathsChangeInGroupLayerController.js @@ -0,0 +1,47 @@ + app.controller('PathsChangeInGroupLayerController', function($scope, leafletData) { + $scope.changePaths = function() { + $scope.paths = { + p2: { + color: '#FC0', + weight: 8, + latlngs: [ { lat: 52.50, lng: -0.082 }, { lat: 42.91, lng: 12.48 } ], + layer: 'test' + } + }; + }; + angular.extend($scope, { + center: { + lat: 51.505, + lng: -0.09, + zoom: 4 + }, + paths : { + p1: { + color: '#000', + weight: 8, + latlngs: [{ lat: 51.50, lng: -0.082 }, { lat: 41.91, lng: 12.48 }], + layer: 'test' + } + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://otile{s}.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.jpeg', + layerOptions: { + subdomains: '1234', + attribution: 'test' + } + } + }, + overlays: { + test: { + name: 'Test', + visible: true, + type: 'group' + } + } + } + }); + }); \ No newline at end of file diff --git a/examples/js/controllers/PathsDecorationsSimpleController.js b/examples/js/controllers/PathsDecorationsSimpleController.js new file mode 100644 index 00000000..58ba2d8c --- /dev/null +++ b/examples/js/controllers/PathsDecorationsSimpleController.js @@ -0,0 +1,35 @@ + app.controller('PathsDecorationsSimpleController', [ '$scope', function($scope) { + angular.extend($scope, { + london: { + lat: 51.505, + lng: -0.09, + zoom: 8 + }, + decorations: { + markers: { + coordinates: [[51.9, -0.4], [51.505, -0.09], [51.0, -0.4]], + patterns: [ + { offset: 12, repeat: 25, symbol: L.Symbol.dash({pixelSize: 10, pathOptions: {color: '#f00', weight: 2}}) }, + { offset: 0, repeat: 25, symbol: L.Symbol.dash({pixelSize: 0}) } + ] + } + } + }); + $scope.changePattern = function(type) { + if (type === 'dot') { + $scope.decorations.markers.patterns = [ {offset: 0, repeat: 10, symbol: L.Symbol.dash({pixelSize: 0})} ]; + } else if (type === 'slash') { + $scope.decorations.markers.patterns = [ {offset: 12, repeat: 25, symbol: L.Symbol.dash({pixelSize: 10, pathOptions: {color: '#f00', weight: 2}})} ]; + } else if (type === 'slashdot') { + $scope.decorations.markers.patterns = [ + { offset: 12, repeat: 25, symbol: L.Symbol.dash({pixelSize: 10, pathOptions: {color: '#f00', weight: 2}}) }, + { offset: 0, repeat: 25, symbol: L.Symbol.dash({pixelSize: 0}) } + ]; + } else if (type === 'arrow') { + $scope.decorations.markers.patterns = [ + {offset: 12, repeat: 25, symbol: L.Symbol.dash({pixelSize: 18, pathOptions: {color: '#f00', weight: 4}})}, + {offset: '10%', repeat: 25, symbol: L.Symbol.arrowHead({pixelSize: 10, polygon: false, pathOptions: {stroke: true}})} + ] + } + }; + } ]); \ No newline at end of file diff --git a/examples/js/controllers/leafletMarkerController.js b/examples/js/controllers/leafletMarkerController.js new file mode 100644 index 00000000..751b0ab0 --- /dev/null +++ b/examples/js/controllers/leafletMarkerController.js @@ -0,0 +1,99 @@ + app.controller("leafletMarkerController", ['$scope', 'leafletData', function ($scope, $modalInstance, leafletData) { + var markers = []; + markers.push({ + lat: 52.229676, + lng: 21.012229, + draggable: false + }); + markers.push({ + lat: 52.219081, + lng: 21.025386, + draggable: false + }); + angular.extend($scope, { + defaults: { + maxZoom: 18, + minZoom: 0, + scrollWheelZoom: false + }, + events: { + map: { + enable: [], + logic: 'emit' + }, + marker: { + enable: [ 'click' ], + logic: 'emit' + } + }, + layers: { + baselayers: { + osm: { + name: 'OpenStreetMap', + type: 'xyz', + url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + layerOptions: { + subdomains: ['a', 'b', 'c'], + attribution: '© OpenStreetMap contributors', + continuousWorld: true + } + } + } + }, + center: { + zoom: 13, + lat: 52.229676, + lng: 21.012229 + }, + markers: markers + }); + $scope.$on('leafletDirectiveMarker.click', function (e, args) { + alert('Marker in map 1 clicked'); + }); + var markers2 = []; + markers2.push({ + lat: 52.229676, + lng: 21.012229, + draggable: false + }); + markers2.push({ + lat: 52.219081, + lng: 21.025386, + draggable: false + }); + angular.extend($scope, { + defaults2: { + maxZoom: 18, + minZoom: 0, + scrollWheelZoom: false + }, + events2: { + map: { + enable: [], + logic: 'emit' + }, + marker: { + enable: [ 'click' ], + logic: 'emit' + } + }, + layers2: { + baselayers: { + mapbox: { + name: 'Mapbox Terrain', + url: 'http://a.tiles.mapbox.com/v3/examples.map-i86nkdio/{z}/{x}/{y}.png', + type: 'xyz' + } + } + }, + center2: { + zoom: 13, + lat: 52.229676, + lng: 21.012229 + }, + markers: markers2 + }); + $scope.$on('leafletDirectiveMarker.click', function (e, args) { + alert('Marker in map 2 clicked'); + }); + }]); \ No newline at end of file diff --git a/examples/realworld.10000.js b/examples/js/realworld.10000.js similarity index 100% rename from examples/realworld.10000.js rename to examples/js/realworld.10000.js diff --git a/examples/js/viewer.js b/examples/js/viewer.js new file mode 100644 index 00000000..3d47e764 --- /dev/null +++ b/examples/js/viewer.js @@ -0,0 +1,143 @@ +'use strict'; + +(function() { + + var app = angular.module('webapp', ['ngRoute', 'leaflet-directive']); + + app.config(function($routeProvider) { + $routeProvider.when('/:section/:example', { + templateUrl: function(attrs) { + return 'partials/example.html'; + }, + reloadOnSearch: false + }); + }); + + app.directive('ngExample', [ '$http', '$compile', function($http, $compile, $ocLazyLoad) { + return { + restrict: 'A', + scope: { + url: '=' + }, + replace: true, + template: '
    ', + link: function(scope, element, attrs) { + scope.$watch('url', function(url) { + $http.get(url).success(function(data) { + var $doc = new DOMParser().parseFromString(data, "text/html"); + var body = $doc.body; + var ctlr = $doc.body.getAttribute('ng-controller'); + var compiled = $compile('
    ' + body.innerHTML + '
    ')(scope); + element.append(compiled); + }); + + }); + + } + }; + }]); + + app.directive('ngCode', [ '$http', '$timeout', function($http, $timeout) { + return { + restrict: 'A', + scope: { + url: '=' + }, + replace: true, + templateUrl: 'partials/source.html', + link: function(scope, element, attrs) { + scope.$watch('url', function(url) { + $http.get(url).success(function(data) { + scope.source = data; + + var $doc = new DOMParser().parseFromString(data, "text/html"); + + $timeout(function() { + Prism.highlightAll(); + }, 200); + }); + }) + } + }; + }]); + + app.controller('MainController', [ '$scope', '$http', '$q', '$timeout', '$location', function($scope, $http, $q, $timeout, $location) { + var examples = $q.defer(); + $scope.sections = []; + + var getExample = function(id, section, examples) { + var df = $q.defer(); + examples.promise.then(function(examples) { + var sectionExamples = examples[section]; + for (var i in sectionExamples) { + var e = sectionExamples[i]; + if (e.id === '/' + section + '/' + id) { + df.resolve(e); + break; + } + } + }); + return df.promise; + }; + + $timeout(function() { + if (!$scope.example) { + $location.url('/basic/first-example'); + } + },300); + + $scope.$on('$routeChangeSuccess', function(event, route) { + var id = route.params.example; + var section = route.params.section; + + $scope.setActiveSection(section); + getExample(id, section, examples).then(function(example) { + $scope.example = example; + }); + + }); + + var extractSections = function(examples) { + return Object.keys(examples).map(function(section) { + return { + id: section, + name: section.charAt(0).toUpperCase() + section.slice(1), + active: false + } + }); + }; + + $scope.setActiveSection = function(id) { + $scope.sections.map(function(section) { + section.active = (id === section.id); + }); + }; + + var getActiveSection = function(sections) { + var active; + for (var i=0; i