├── .editorconfig ├── .eslintrc.json ├── .gitignore ├── .npmignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── bower.json ├── coffeelint.json ├── dist ├── ui-leaflet-layers.js ├── ui-leaflet-layers.js.map └── ui-leaflet-layers.min.js ├── examples ├── 0101-layers-googlemaps-example.html ├── 0102-layers-googlemaps-lf1-example.html ├── 0201-mapboxgl-example.html ├── 0202-mapbox-basic-example.html ├── 0301-layers-bingmaps-example.html └── 0401-layers-yandexmaps-example.html ├── gulp ├── .eslintrc.json ├── .githubreleaser.json.example ├── index.js └── tasks │ ├── browser-sync.js │ ├── build.js │ ├── clean.js │ ├── index.js │ ├── release.js │ ├── test.js │ └── uglify.js ├── gulpfile.js ├── package.json ├── src ├── services │ ├── leafletHelpers.es6 │ ├── leafletLayerHelpers.es6 │ └── logger.es6 └── wrap │ └── dist.js └── test ├── .eslintrc.json ├── karma.conf.js └── unit ├── layersDirective.google.spec.js ├── layersDirective.mapbox.spec.js ├── layersDirective.yandex.spec.js └── leafletHelper.spec.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | 8 | [*] 9 | 10 | # Change these settings to your own preference 11 | indent_style = space 12 | indent_size = 2 13 | 14 | # We recommend you to keep these unchanged 15 | end_of_line = lf 16 | charset = utf-8 17 | trim_trailing_whitespace = true 18 | insert_final_newline = true 19 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "parserOptions": { 3 | "ecmaVersion": 6, 4 | "sourceType": "script", 5 | "ecmaFeatures": { 6 | "jsx": true 7 | } 8 | }, 9 | "env": { 10 | "browser": true, 11 | "amd": true, 12 | "mocha": true, 13 | "jquery": true 14 | }, 15 | "extends": "eslint:recommended", 16 | "rules": { 17 | "semi": 1, 18 | "eqeqeq": 1, 19 | "quotes": [1, "single"], 20 | "indent": [1, 2, {"SwitchCase": 1}], 21 | "no-trailing-spaces": 1, 22 | "camelcase": 1, 23 | "comma-dangle": 1, 24 | "curly": 1 25 | }, 26 | "globals": { 27 | "angular": true, 28 | "L": true, 29 | "lvector": true 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | 29 | # Bower 30 | bower_components 31 | 32 | # Others 33 | .githubreleaser.json 34 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .* 2 | test/ 3 | *.json 4 | .gitignore 5 | travis.yml 6 | *.html 7 | package.js 8 | *.md 9 | src/ 10 | gulp/ 11 | scripts/ 12 | node_modules/ 13 | bower_components/ 14 | tmp/ 15 | .versions 16 | *.coffee 17 | *.es6 18 | dist/coverage/ 19 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - "6.1" 5 | 6 | before_install: 7 |   - npm install -g npm 8 | 9 | before_script: 10 |   - npm install -g gulp 11 |   - npm install -g bower 12 | - bower install --config.interactive=false 13 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | ## [0.1.3](https://github.com/elesdoar/ui-leaflet-layers/compare/0.1.2...v0.1.3) (2016-10-04) 3 | 4 | 5 | ### Bug Fixes 6 | 7 | * **mapbox:** change mapbox layer to current specs ([2b087a5](https://github.com/elesdoar/ui-leaflet-layers/commit/2b087a5)) 8 | 9 | 10 | 11 | 12 | ## 0.1.2 (2016-09-27) 13 | 14 | 15 | ### Bug Fixes 16 | 17 | * **markercluster:** drop support ([638b310](https://github.com/elesdoar/ui-leaflet-layers/commit/638b310)) 18 | 19 | 20 | ### Features 21 | 22 | * **layers:** add suport for multiples services ([59206fc](https://github.com/elesdoar/ui-leaflet-layers/commit/59206fc)) 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Michael Salgado 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ui-leaflet-layers 2 | 3 | [![Build Status](https://travis-ci.org/elesdoar/ui-leaflet-layers.svg?branch=master)](https://travis-ci.org/elesdoar/ui-leaflet-layers) 4 | [![dependencies Status](https://david-dm.org/elesdoar/ui-leaflet-layers/status.svg)](https://david-dm.org/elesdoar/ui-leaflet-layers) 5 | [![devDependencies Status](https://david-dm.org/elesdoar/ui-leaflet-layers/dev-status.svg)](https://david-dm.org/elesdoar/ui-leaflet-layers?type=dev) 6 | 7 | Angular UI Leaflet Layers Plugin, it extend layer capabilities for [ui-leaflet](http://angular-ui.github.io/ui-leaflet) layers directive. 8 | 9 | ### Supported Layers: 10 | 11 | * [Bing](https://www.bingmapsportal.com/) 12 | * China 13 | * [esri-leaflet](http://esri.github.io/esri-leaflet/) 14 | * [Google Maps](https://developers.google.com/maps/) 15 | * HeatLayer 16 | * [Here Maps](https://developer.here.com/lp/mapAPIs) 17 | * [MapboxGL](https://github.com/mapbox/mapbox-gl-leaflet) 18 | * [Mapbox](http://mapbox.com/) 19 | * MarkerCluster 20 | * Yandex 21 | * WebGLHeatMapLayer 22 | * UTFGrid 23 | * WFS 24 | 25 | ### Coming Soon: 26 | 27 | * [CartoDB](http://cartodb.com/) 28 | 29 | ### MapboxGL Example 30 | 31 | **Controller:** 32 | 33 | ```js 34 | angular.extend($scope, { 35 | center: { 36 | lat: 38.91275, 37 | lng: -77.032194, 38 | zoom: 15 39 | }, 40 | layers: { 41 | baselayers: { 42 | mapboxGlLayer: { 43 | name: 'Sample', 44 | type: 'mapboxGL', 45 | layerOptions: { 46 | accessToken: [token], 47 | style: 'mapbox://styles/mapbox/streets-v8' 48 | } 49 | } 50 | }, 51 | overlays: {} 52 | } 53 | }) 54 | ``` 55 | 56 | **HTML:** 57 | 58 | ```html 59 | 60 | ``` 61 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui-leaflet-layers", 3 | "version": "0.1.3", 4 | "homepage": "https://github.com/elesdoar/ui-leaflet-layers", 5 | "authors": [ 6 | "Michael Salgado " 7 | ], 8 | "description": "Angular UI Leaflet Layers Plugin", 9 | "main": "dist/ui-leaflet-layers.min.js", 10 | "moduleType": [ 11 | "amd", 12 | "es6" 13 | ], 14 | "keywords": [ 15 | "angularjs", 16 | "ui-leaflet", 17 | "leaflet", 18 | "maps", 19 | "cartodb", 20 | "mapbox", 21 | "esri" 22 | ], 23 | "license": "MIT", 24 | "ignore": [ 25 | "**/.*", 26 | "node_modules", 27 | "bower_components", 28 | "test", 29 | "tests" 30 | ], 31 | "dependencies": { 32 | "leaflet": "0.7.x", 33 | "angular": "^1.5.x", 34 | "ui-leaflet": "~2.0.0" 35 | }, 36 | "devDependencies": { 37 | "azgs-leaflet": "azgs/azgs-leaflet", 38 | "angular-mocks": "^1.5.x", 39 | "leaflet-plugins": "~1.3.12" 40 | }, 41 | "resolutions": { 42 | "angular": "1.5.x" 43 | }, 44 | "ignore": [ 45 | ".*", 46 | "spec", 47 | "*.coffee", 48 | "*.json", 49 | ".gitignore", 50 | ".travis.yml", 51 | "*.html", 52 | "package.js", 53 | "*.md", 54 | "src", 55 | "gulp", 56 | "scripts", 57 | "node_modules", 58 | "bower_components", 59 | "tmp" 60 | ] 61 | } 62 | -------------------------------------------------------------------------------- /coffeelint.json: -------------------------------------------------------------------------------- 1 | { 2 | "camel_case_classes": { 3 | "level": "error" 4 | }, 5 | "max_line_length": { 6 | "value": 125, 7 | "level": "ignore", 8 | "limitComments": false 9 | }, 10 | "no_backticks": { 11 | "level": "ignore" 12 | }, 13 | "no_debugger": { 14 | "level": "warn" 15 | }, 16 | "no_plusplus": { 17 | "level": "error" 18 | }, 19 | "no_stand_alone_at": { 20 | "level": "ignore" 21 | }, 22 | "no_tabs": { 23 | "level": "error" 24 | }, 25 | "no_throwing_strings": { 26 | "level": "ignore" 27 | }, 28 | "no_trailing_semicolons": { 29 | "level": "error" 30 | }, 31 | "no_trailing_whitespace": { 32 | "level": "error", 33 | "allowed_in_comments": true, 34 | "allowed_in_empty_lines": true 35 | }, 36 | "no_unnecessary_double_quotes": { 37 | "level": "error" 38 | }, 39 | "no_unnecessary_fat_arrows": { 40 | "level": "error" 41 | }, 42 | "non_empty_constructor_needs_parens": { 43 | "level": "ignore" 44 | }, 45 | "no_interpolation_in_single_quotes":{ 46 | "level": "error" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /dist/ui-leaflet-layers.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ui-leaflet-layers 3 | * 4 | * @version: 0.1.3 5 | * @author: Michael Salgado 6 | * @date: Thu Oct 27 2016 17:46:04 GMT-0500 (COT) 7 | * @license: MIT 8 | */ 9 | (function (window, angular){ 10 | 'use strict'; 11 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 12 | 13 | angular.module('ui-leaflet').config(['$provide', function ($provide) { 14 | return $provide.decorator('leafletHelpers', ['$delegate', 'leafletLayersLogger', function ($delegate, leafletLayersLogger) { 15 | var $log = leafletLayersLogger; 16 | 17 | var _versionCompare = function _versionCompare(left, right) { 18 | if ((typeof left === 'undefined' ? 'undefined' : _typeof(left)) + (typeof right === 'undefined' ? 'undefined' : _typeof(right)) !== 'stringstring') { 19 | return false; 20 | } 21 | 22 | var a = left.split('.'); 23 | var b = right.split('.'); 24 | var i = 0, 25 | len = Math.max(a.length, b.length); 26 | 27 | for (; i < len; i++) { 28 | if (a[i] && !b[i] && parseInt(a[i]) > 0 || parseInt(a[i]) > parseInt(b[i])) { 29 | return 1; 30 | } else if (b[i] && !a[i] && parseInt(b[i]) > 0 || parseInt(a[i]) < parseInt(b[i])) { 31 | return -1; 32 | } 33 | } 34 | 35 | return 0; 36 | }; 37 | 38 | var basicFunction = function basicFunction(layerType) { 39 | return { 40 | isLoaded: function isLoaded() { 41 | return angular.isDefined(layerType); 42 | }, 43 | is: function is(layer) { 44 | if (this.isLoaded()) { 45 | return layer instanceof layerType; 46 | } 47 | return false; 48 | } 49 | }; 50 | }; 51 | 52 | var plugins = { 53 | // Please keep keys order by alphabetical sort. 54 | BingLayerPlugin: basicFunction(L.BingLayer), 55 | ChinaLayerPlugin: basicFunction(L.tileLayer.chinaProvider), 56 | HeatLayerPlugin: basicFunction(L.heatLayer), 57 | LeafletProviderPlugin: basicFunction(L.TileLayer.Provider), 58 | MapboxGL: basicFunction(L.mapboxGL), 59 | UTFGridPlugin: basicFunction(L.UtfGrid), 60 | WebGLHeatMapLayerPlugin: basicFunction(L.TileLayer.WebGLHeatMap), 61 | WFSLayerPlugin: basicFunction(L.GeoJSON.WFS), 62 | YandexLayerPlugin: basicFunction(L.Yandex) 63 | }; 64 | 65 | if (_versionCompare(L.version, '1.0.0') === -1) { 66 | plugins.GoogleLayerPlugin = basicFunction(L.Google); 67 | } else { 68 | plugins.GoogleLayerPlugin = basicFunction(L.GridLayer.GoogleMutant); 69 | } 70 | plugins.versionCompare = _versionCompare; 71 | 72 | if (angular.isDefined(L.esri)) { 73 | angular.extend(plugins, { 74 | AGSBaseLayerPlugin: basicFunction(L.esri.basemapLayer), 75 | AGSClusteredLayerPlugin: basicFunction(L.esri.clusteredFeatureLayer), 76 | AGSDynamicMapLayerPlugin: basicFunction(L.esri.dynamicMapLayer), 77 | AGSFeatureLayerPlugin: basicFunction(L.esri.featureLayer), 78 | AGSImageMapLayerPlugin: basicFunction(L.esri.imageMapLayer), 79 | AGSHeatmapLayerPlugin: basicFunction(L.esri.heatmapFeatureLayer), 80 | AGSTiledMapLayerPlugin: basicFunction(L.esri.tiledMapLayer) 81 | }); 82 | } else { 83 | angular.extend(plugins, { 84 | AGSBaseLayerPlugin: basicFunction(), 85 | AGSClusteredLayerPlugin: basicFunction(), 86 | AGSDynamicMapLayerPlugin: basicFunction(), 87 | AGSFeatureLayerPlugin: basicFunction(), 88 | AGSImageMapLayerPlugin: basicFunction(), 89 | AGSHeatmapLayerPlugin: basicFunction(), 90 | AGSTiledMapLayerPlugin: basicFunction() 91 | }); 92 | } 93 | 94 | if (angular.isDefined(window.lvector)) { 95 | angular.extend(plugins, { 96 | AGSLayerPlugin: basicFunction(window.lvector.AGS) 97 | }); 98 | } else { 99 | angular.extend(plugins, { 100 | AGSLayerPlugin: basicFunction() 101 | }); 102 | } 103 | 104 | angular.extend($delegate, plugins); 105 | 106 | $log.info('[ui-leaflet-layers] - Layers plugin is loaded'); 107 | 108 | return $delegate; 109 | }]); 110 | }]); 111 | angular.module('ui-leaflet').config(['$provide', function ($provide) { 112 | return $provide.decorator('leafletLayerHelpers', ['$delegate', '$rootScope', '$q', 'leafletHelpers', 'leafletLayersLogger', function ($delegate, $rootScope, $q, leafletHelpers, leafletLayersLogger) { 113 | var $log = leafletLayersLogger; 114 | var isArray = leafletHelpers.isArray; 115 | var isObject = leafletHelpers.isObject; 116 | var isDefined = leafletHelpers.isDefined; 117 | var errorHeader = leafletHelpers.errorHeader; 118 | 119 | var utfGridCreateLayer = function utfGridCreateLayer(params) { 120 | if (!leafletHelpers.UTFGridPlugin.isLoaded()) { 121 | $log.error(errorHeader + ' The UTFGrid plugin is not loaded.'); 122 | return; 123 | } 124 | 125 | var utfgrid = new L.UtfGrid(params.url, params.pluginOptions); 126 | 127 | utfgrid.on('mouseover', function (e) { 128 | $rootScope.$broadcast('leafletDirectiveMap.utfgridMouseover', e); 129 | }); 130 | 131 | utfgrid.on('mouseout', function (e) { 132 | $rootScope.$broadcast('leafletDirectiveMap.utfgridMouseout', e); 133 | }); 134 | 135 | utfgrid.on('click', function (e) { 136 | $rootScope.$broadcast('leafletDirectiveMap.utfgridClick', e); 137 | }); 138 | 139 | utfgrid.on('mousemove', function (e) { 140 | $rootScope.$broadcast('leafletDirectiveMap.utfgridMousemove', e); 141 | }); 142 | 143 | return utfgrid; 144 | }; 145 | 146 | angular.extend($delegate.layerTypes, { 147 | ags: { 148 | mustHaveUrl: true, 149 | createLayer: function createLayer(params) { 150 | if (!leafletHelpers.AGSLayerPlugin.isLoaded()) { 151 | return; 152 | } 153 | 154 | var options = angular.copy(params.options); 155 | angular.extend(options, { 156 | url: params.url 157 | }); 158 | var layer = new lvector.AGS(options); 159 | layer.onAdd = function (map) { 160 | this.setMap(map); 161 | }; 162 | layer.onRemove = function () { 163 | this.setMap(null); 164 | }; 165 | return layer; 166 | } 167 | }, 168 | agsBase: { 169 | mustHaveLayer: true, 170 | createLayer: function createLayer(params) { 171 | if (!leafletHelpers.AGSBaseLayerPlugin.isLoaded()) { 172 | return; 173 | } 174 | return L.esri.basemapLayer(params.layer, params.options); 175 | } 176 | }, 177 | agsClustered: { 178 | mustHaveUrl: true, 179 | createLayer: function createLayer(params) { 180 | if (!leafletHelpers.AGSClusteredLayerPlugin.isLoaded()) { 181 | $log.warn(errorHeader + ' The esri clustered layer plugin is not loaded.'); 182 | return; 183 | } 184 | 185 | if (!leafletHelpers.MarkerClusterPlugin.isLoaded()) { 186 | $log.warn(errorHeader + ' The markercluster plugin is not loaded.'); 187 | return; 188 | } 189 | return L.esri.clusteredFeatureLayer(params.url, params.options); 190 | } 191 | }, 192 | agsDynamic: { 193 | mustHaveUrl: true, 194 | createLayer: function createLayer(params) { 195 | if (!leafletHelpers.AGSDynamicMapLayerPlugin.isLoaded()) { 196 | $log.warn(errorHeader + ' The esri plugin is not loaded.'); 197 | return; 198 | } 199 | 200 | params.options.url = params.url; 201 | 202 | return L.esri.dynamicMapLayer(params.options); 203 | } 204 | }, 205 | agsFeature: { 206 | mustHaveUrl: true, 207 | createLayer: function createLayer(params) { 208 | if (!leafletHelpers.AGSFeatureLayerPlugin.isLoaded()) { 209 | $log.warn(errorHeader + ' The esri plugin is not loaded.'); 210 | return; 211 | } 212 | 213 | params.options.url = params.url; 214 | 215 | var layer = L.esri.featureLayer(params.options); 216 | var load = function load() { 217 | if (isDefined(params.options.loadedDefer)) { 218 | params.options.loadedDefer.resolve(); 219 | } 220 | }; 221 | layer.on('loading', function () { 222 | params.options.loadedDefer = $q.defer(); 223 | layer.off('load', load); 224 | layer.on('load', load); 225 | }); 226 | 227 | return layer; 228 | } 229 | }, 230 | agsHeatmap: { 231 | mustHaveUrl: true, 232 | createLayer: function createLayer(params) { 233 | if (!leafletHelpers.AGSHeatmapLayerPlugin.isLoaded()) { 234 | $log.warn(errorHeader + ' The esri heatmap layer plugin is not loaded.'); 235 | return; 236 | } 237 | 238 | if (!leafletHelpers.HeatLayerPlugin.isLoaded()) { 239 | $log.warn(errorHeader + ' The heatlayer plugin is not loaded.'); 240 | return; 241 | } 242 | return L.esri.heatmapFeatureLayer(params.url, params.options); 243 | } 244 | }, 245 | agsImage: { 246 | mustHaveUrl: true, 247 | createLayer: function createLayer(params) { 248 | if (!leafletHelpers.AGSImageMapLayerPlugin.isLoaded()) { 249 | $log.warn(errorHeader + ' The esri plugin is not loaded.'); 250 | return; 251 | } 252 | params.options.url = params.url; 253 | 254 | return L.esri.imageMapLayer(params.options); 255 | } 256 | }, 257 | agsTiled: { 258 | mustHaveUrl: true, 259 | createLayer: function createLayer(params) { 260 | if (!leafletHelpers.AGSTiledMapLayerPlugin.isLoaded()) { 261 | $log.warn(errorHeader + ' The esri plugin is not loaded.'); 262 | return; 263 | } 264 | 265 | params.options.url = params.url; 266 | 267 | return L.esri.tiledMapLayer(params.options); 268 | } 269 | }, 270 | bing: { 271 | mustHaveUrl: false, 272 | createLayer: function createLayer(params) { 273 | if (!leafletHelpers.BingLayerPlugin.isLoaded()) { 274 | $log.error(errorHeader + ' The Bing plugin is not loaded.'); 275 | return; 276 | } 277 | return new L.BingLayer(params.key, params.options); 278 | } 279 | }, 280 | 281 | china: { 282 | mustHaveUrl: false, 283 | createLayer: function createLayer(params) { 284 | var type = params.type || ''; 285 | if (!leafletHelpers.ChinaLayerPlugin.isLoaded()) { 286 | $log.error(errorHeader + ' The ChinaLayer plugin is not loaded.'); 287 | return; 288 | } 289 | return L.tileLayer.chinaProvider(type, params.options); 290 | } 291 | }, 292 | 293 | google: { 294 | mustHaveUrl: false, 295 | createLayer: function createLayer(params) { 296 | var type = params.type || 'SATELLITE'; 297 | if (!leafletHelpers.GoogleLayerPlugin.isLoaded()) { 298 | $log.error(errorHeader + ' The GoogleLayer plugin is not loaded.'); 299 | return; 300 | } 301 | var layer = null; 302 | 303 | if (leafletHelpers.versionCompare(L.version, '1.0.0') === -1) { 304 | layer = new L.Google(type.toUpperCase(), params.options); 305 | } else { 306 | layer = new L.GridLayer.GoogleMutant({ 307 | type: type.toLowerCase() 308 | }); 309 | } 310 | return layer; 311 | } 312 | }, 313 | 314 | heat: { 315 | mustHaveUrl: false, 316 | mustHaveData: true, 317 | createLayer: function createLayer(params) { 318 | if (!leafletHelpers.HeatLayerPlugin.isLoaded()) { 319 | $log.error(errorHeader + ' The HeatMapLayer plugin is not loaded.'); 320 | return; 321 | } 322 | var layer = new L.heatLayer(); 323 | if (isArray(params.data)) { 324 | layer.setLatLngs(params.data); 325 | } 326 | if (isObject(params.options)) { 327 | layer.setOptions(params.options); 328 | } 329 | return layer; 330 | } 331 | }, 332 | 333 | here: { 334 | mustHaveUrl: false, 335 | createLayer: function createLayer(params) { 336 | var provider = params.provider || 'HERE.terrainDay'; 337 | if (!leafletHelpers.LeafletProviderPlugin.isLoaded()) { 338 | return; 339 | } 340 | return new L.TileLayer.Provider(provider, params.options); 341 | } 342 | }, 343 | 344 | mapbox: { 345 | mustHaveKey: true, 346 | createLayer: function createLayer(params) { 347 | var url = '//api.mapbox.com/styles/v1/{user}/{mapId}/tiles/256/{z}/{x}/{y}?access_token={apiKey}'; 348 | return L.tileLayer(url, angular.extend(params.options, { 349 | mapId: params.key, 350 | user: params.user, 351 | apiKey: params.apiKey 352 | })); 353 | } 354 | }, 355 | 356 | mapboxGL: { 357 | createLayer: function createLayer(params) { 358 | if (!leafletHelpers.MapboxGL.isLoaded()) { 359 | $log.error(errorHeader + ' The MapboxGL plugin is not loaded.'); 360 | return; 361 | } 362 | return new L.mapboxGL(params.options); 363 | } 364 | }, 365 | 366 | utfGrid: { 367 | mustHaveUrl: true, 368 | createLayer: utfGridCreateLayer 369 | }, 370 | 371 | webGLHeatmap: { 372 | mustHaveUrl: false, 373 | mustHaveData: true, 374 | createLayer: function createLayer(params) { 375 | if (!leafletHelpers.WebGLHeatMapLayerPlugin.isLoaded()) { 376 | $log.error(errorHeader + ' The WebGLHeatMapLayer plugin is not loaded.'); 377 | return; 378 | } 379 | var layer = new L.TileLayer.WebGLHeatMap(params.options); 380 | if (isDefined(params.data)) { 381 | layer.setData(params.data); 382 | } 383 | return layer; 384 | } 385 | }, 386 | 387 | wfs: { 388 | mustHaveUrl: true, 389 | mustHaveLayer: true, 390 | createLayer: function createLayer(params) { 391 | if (!leafletHelpers.WFSLayerPlugin.isLoaded()) { 392 | $log.error(errorHeader + ' The WFSLayer plugin is not loaded.'); 393 | return; 394 | } 395 | var options = angular.copy(params.options); 396 | if (options.crs && 'string' === typeof options.crs) { 397 | options.crs = eval(options.crs); 398 | } 399 | return new L.GeoJSON.WFS(params.url, params.layer, options); 400 | } 401 | }, 402 | 403 | yandex: { 404 | mustHaveUrl: false, 405 | createLayer: function createLayer(params) { 406 | var type = params.type || 'map'; 407 | if (!leafletHelpers.YandexLayerPlugin.isLoaded()) { 408 | $log.error(errorHeader + ' The YandexLayer plugin is not loaded.'); 409 | return; 410 | } 411 | return new L.Yandex(type, params.options); 412 | } 413 | } 414 | }); 415 | 416 | return $delegate; 417 | }]); 418 | }]); 419 | angular.module('ui-leaflet').service('leafletLayersLogger', ['nemSimpleLogger', function (nemSimpleLogger) { 420 | return nemSimpleLogger.spawn(); 421 | }]); 422 | //# sourceMappingURL=ui-leaflet-layers.js.map 423 | 424 | })(window, angular); -------------------------------------------------------------------------------- /dist/ui-leaflet-layers.js.map: -------------------------------------------------------------------------------- 1 | /** 2 | * ui-leaflet-layers 3 | * 4 | * @version: 0.1.3 5 | * @author: Michael Salgado 6 | * @date: Thu Oct 27 2016 17:46:04 GMT-0500 (COT) 7 | * @license: MIT 8 | */ 9 | (function (window, angular){ 10 | 'use strict'; 11 | {"version":3,"sources":["leafletHelpers.es6","leafletLayerHelpers.es6","logger.es6"],"names":["angular","module","config","$provide","decorator","$delegate","leafletLayersLogger","$log","_versionCompare","left","right","a","split","b","i","len","Math","max","length","parseInt","basicFunction","isLoaded","isDefined","layerType","is","layer","plugins","BingLayerPlugin","L","BingLayer","ChinaLayerPlugin","tileLayer","chinaProvider","HeatLayerPlugin","heatLayer","LeafletProviderPlugin","TileLayer","Provider","MapboxGL","mapboxGL","UTFGridPlugin","UtfGrid","WebGLHeatMapLayerPlugin","WebGLHeatMap","WFSLayerPlugin","GeoJSON","WFS","YandexLayerPlugin","Yandex","version","GoogleLayerPlugin","Google","GridLayer","GoogleMutant","versionCompare","esri","extend","AGSBaseLayerPlugin","basemapLayer","AGSClusteredLayerPlugin","clusteredFeatureLayer","AGSDynamicMapLayerPlugin","dynamicMapLayer","AGSFeatureLayerPlugin","featureLayer","AGSImageMapLayerPlugin","imageMapLayer","AGSHeatmapLayerPlugin","heatmapFeatureLayer","AGSTiledMapLayerPlugin","tiledMapLayer","window","lvector","AGSLayerPlugin","AGS","info","$rootScope","$q","leafletHelpers","isArray","isObject","errorHeader","utfGridCreateLayer","error","utfgrid","params","url","pluginOptions","on","e","$broadcast","layerTypes","ags","mustHaveUrl","createLayer","options","copy","onAdd","map","setMap","onRemove","agsBase","mustHaveLayer","agsClustered","warn","MarkerClusterPlugin","agsDynamic","agsFeature","load","loadedDefer","resolve","defer","off","agsHeatmap","agsImage","agsTiled","bing","key","china","type","google","toUpperCase","toLowerCase","heat","mustHaveData","data","setLatLngs","setOptions","here","provider","mapbox","mustHaveKey","mapId","user","apiKey","utfGrid","webGLHeatmap","setData","wfs","crs","eval","yandex","service","nemSimpleLogger","spawn"],"mappings":"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","file":"ui-leaflet-layers.js","sourcesContent":["angular.module('ui-leaflet')\n .config(['$provide', $provide =>\n $provide.decorator('leafletHelpers', ['$delegate', 'leafletLayersLogger', ($delegate, leafletLayersLogger) => {\n const $log = leafletLayersLogger;\n\n const _versionCompare = (left, right) => {\n if(typeof left + typeof right !== 'stringstring') {\n return false;\n }\n\n let a = left.split('.');\n let b = right.split('.');\n let i = 0, len = Math.max(a.length, b.length);\n\n for (; i < len; i++) {\n if ((a[i] && !b[i] && parseInt(a[i]) > 0) || (parseInt(a[i]) > parseInt(b[i]))) {\n return 1;\n } else if ((b[i] && !a[i] && parseInt(b[i]) > 0) || (parseInt(a[i]) < parseInt(b[i]))) {\n return -1;\n }\n }\n\n return 0;\n };\n\n const basicFunction = layerType =>\n ({\n isLoaded() {\n return angular.isDefined(layerType);\n },\n is(layer) {\n if (this.isLoaded()) {\n return layer instanceof layerType;\n }\n return false;\n }\n });\n\n const plugins = {\n // Please keep keys order by alphabetical sort.\n BingLayerPlugin: basicFunction(L.BingLayer),\n ChinaLayerPlugin: basicFunction(L.tileLayer.chinaProvider),\n HeatLayerPlugin: basicFunction(L.heatLayer),\n LeafletProviderPlugin: basicFunction(L.TileLayer.Provider),\n MapboxGL: basicFunction(L.mapboxGL),\n UTFGridPlugin: basicFunction(L.UtfGrid),\n WebGLHeatMapLayerPlugin: basicFunction(L.TileLayer.WebGLHeatMap),\n WFSLayerPlugin: basicFunction(L.GeoJSON.WFS),\n YandexLayerPlugin: basicFunction(L.Yandex)\n };\n\n if(_versionCompare(L.version, '1.0.0') === -1) {\n plugins.GoogleLayerPlugin = basicFunction(L.Google);\n } else {\n plugins.GoogleLayerPlugin = basicFunction(L.GridLayer.GoogleMutant);\n }\n plugins.versionCompare = _versionCompare;\n\n if(angular.isDefined(L.esri)) {\n angular.extend(plugins, {\n AGSBaseLayerPlugin: basicFunction(L.esri.basemapLayer),\n AGSClusteredLayerPlugin: basicFunction(L.esri.clusteredFeatureLayer),\n AGSDynamicMapLayerPlugin: basicFunction(L.esri.dynamicMapLayer),\n AGSFeatureLayerPlugin: basicFunction(L.esri.featureLayer),\n AGSImageMapLayerPlugin: basicFunction(L.esri.imageMapLayer),\n AGSHeatmapLayerPlugin: basicFunction(L.esri.heatmapFeatureLayer),\n AGSTiledMapLayerPlugin: basicFunction(L.esri.tiledMapLayer)\n });\n } else {\n angular.extend(plugins, {\n AGSBaseLayerPlugin: basicFunction(),\n AGSClusteredLayerPlugin: basicFunction(),\n AGSDynamicMapLayerPlugin: basicFunction(),\n AGSFeatureLayerPlugin: basicFunction(),\n AGSImageMapLayerPlugin: basicFunction(),\n AGSHeatmapLayerPlugin: basicFunction(),\n AGSTiledMapLayerPlugin: basicFunction()\n });\n }\n\n if(angular.isDefined(window.lvector)) {\n angular.extend(plugins, {\n AGSLayerPlugin: basicFunction(window.lvector.AGS)\n });\n } else {\n angular.extend(plugins, {\n AGSLayerPlugin: basicFunction()\n });\n }\n\n angular.extend($delegate, plugins);\n\n $log.info('[ui-leaflet-layers] - Layers plugin is loaded');\n\n return $delegate;\n }])\n ]);\n","angular.module('ui-leaflet')\n .config(['$provide', $provide =>\n $provide.decorator('leafletLayerHelpers',\n ['$delegate', '$rootScope', '$q', 'leafletHelpers', 'leafletLayersLogger',\n ($delegate, $rootScope, $q, leafletHelpers, leafletLayersLogger) => {\n let $log = leafletLayersLogger;\n let { isArray } = leafletHelpers;\n let { isObject } = leafletHelpers;\n let { isDefined } = leafletHelpers;\n let { errorHeader } = leafletHelpers;\n let utfGridCreateLayer = params => {\n if (!leafletHelpers.UTFGridPlugin.isLoaded()) {\n $log.error(errorHeader + ' The UTFGrid plugin is not loaded.');\n return;\n }\n\n let 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 utfgrid.on('mousemove', function(e) {\n $rootScope.$broadcast('leafletDirectiveMap.utfgridMousemove', e);\n });\n\n return utfgrid;\n };\n\n angular.extend($delegate.layerTypes, {\n ags: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!leafletHelpers.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 agsBase: {\n mustHaveLayer : true,\n createLayer: function (params) {\n if (!leafletHelpers.AGSBaseLayerPlugin.isLoaded()) {\n return;\n }\n return L.esri.basemapLayer(params.layer, params.options);\n }\n },\n agsClustered: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!leafletHelpers.AGSClusteredLayerPlugin.isLoaded()) {\n $log.warn(errorHeader + ' The esri clustered layer plugin is not loaded.');\n return;\n }\n\n if(!leafletHelpers.MarkerClusterPlugin.isLoaded()) {\n $log.warn(errorHeader + ' The markercluster plugin is not loaded.');\n return;\n }\n return L.esri.clusteredFeatureLayer(params.url, params.options);\n }\n },\n agsDynamic: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!leafletHelpers.AGSDynamicMapLayerPlugin.isLoaded()) {\n $log.warn(errorHeader + ' The esri plugin is not loaded.');\n return;\n }\n\n params.options.url = params.url;\n\n return L.esri.dynamicMapLayer(params.options);\n }\n },\n agsFeature: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!leafletHelpers.AGSFeatureLayerPlugin.isLoaded()) {\n $log.warn(errorHeader + ' The esri plugin is not loaded.');\n return;\n }\n\n params.options.url = params.url;\n\n var layer = L.esri.featureLayer(params.options);\n var load = function() {\n if(isDefined(params.options.loadedDefer)) {\n params.options.loadedDefer.resolve();\n }\n };\n layer.on('loading', function() {\n params.options.loadedDefer = $q.defer();\n layer.off('load', load);\n layer.on('load', load);\n });\n\n return layer;\n }\n },\n agsHeatmap: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!leafletHelpers.AGSHeatmapLayerPlugin.isLoaded()) {\n $log.warn(errorHeader + ' The esri heatmap layer plugin is not loaded.');\n return;\n }\n\n if(!leafletHelpers.HeatLayerPlugin.isLoaded()) {\n $log.warn(errorHeader + ' The heatlayer plugin is not loaded.');\n return;\n }\n return L.esri.heatmapFeatureLayer(params.url, params.options);\n }\n },\n agsImage: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!leafletHelpers.AGSImageMapLayerPlugin.isLoaded()) {\n $log.warn(errorHeader + ' The esri plugin is not loaded.');\n return;\n }\n params.options.url = params.url;\n\n return L.esri.imageMapLayer(params.options);\n }\n },\n agsTiled: {\n mustHaveUrl: true,\n createLayer: function(params) {\n if (!leafletHelpers.AGSTiledMapLayerPlugin.isLoaded()) {\n $log.warn(errorHeader + ' The esri plugin is not loaded.');\n return;\n }\n\n params.options.url = params.url;\n\n return L.esri.tiledMapLayer(params.options);\n }\n },\n bing: {\n mustHaveUrl: false,\n createLayer(params) {\n if (!leafletHelpers.BingLayerPlugin.isLoaded()) {\n $log.error(errorHeader + ' The Bing plugin is not loaded.');\n return;\n }\n return new L.BingLayer(params.key, params.options);\n }\n },\n\n china: {\n mustHaveUrl:false,\n createLayer(params) {\n let type = params.type || '';\n if (!leafletHelpers.ChinaLayerPlugin.isLoaded()) {\n $log.error(errorHeader + ' The ChinaLayer plugin is not loaded.');\n return;\n }\n return L.tileLayer.chinaProvider(type, params.options);\n }\n },\n\n google: {\n mustHaveUrl: false,\n createLayer(params) {\n let type = params.type || 'SATELLITE';\n if (!leafletHelpers.GoogleLayerPlugin.isLoaded()) {\n $log.error(errorHeader + ' The GoogleLayer plugin is not loaded.');\n return;\n }\n let layer = null;\n\n if(leafletHelpers.versionCompare(L.version, '1.0.0') === -1) {\n layer = new L.Google(type.toUpperCase(), params.options);\n } else {\n layer = new L.GridLayer.GoogleMutant({\n type: type.toLowerCase()\n });\n }\n return layer;\n }\n },\n\n heat: {\n mustHaveUrl: false,\n mustHaveData: true,\n createLayer(params) {\n if (!leafletHelpers.HeatLayerPlugin.isLoaded()) {\n $log.error(errorHeader + ' The HeatMapLayer plugin is not loaded.');\n return;\n }\n let layer = new L.heatLayer();\n if (isArray(params.data)) {\n layer.setLatLngs(params.data);\n }\n if (isObject(params.options)) {\n layer.setOptions(params.options);\n }\n return layer;\n }\n },\n\n here: {\n mustHaveUrl: false,\n createLayer: function(params) {\n var provider = params.provider || 'HERE.terrainDay';\n if (!leafletHelpers.LeafletProviderPlugin.isLoaded()) {\n return;\n }\n return new L.TileLayer.Provider(provider, params.options);\n }\n },\n\n mapbox: {\n mustHaveKey: true,\n createLayer(params) {\n let url = '//api.mapbox.com/styles/v1/{user}/{mapId}/tiles/256/{z}/{x}/{y}?access_token={apiKey}';\n return L.tileLayer(url, angular.extend(params.options, {\n mapId: params.key,\n user: params.user,\n apiKey: params.apiKey\n }));\n }\n },\n\n mapboxGL: {\n createLayer(params) {\n if (!leafletHelpers.MapboxGL.isLoaded()) {\n $log.error(errorHeader + ' The MapboxGL plugin is not loaded.');\n return;\n }\n return new L.mapboxGL(params.options);\n }\n },\n\n utfGrid: {\n mustHaveUrl: true,\n createLayer: utfGridCreateLayer\n },\n\n webGLHeatmap: {\n mustHaveUrl: false,\n mustHaveData: true,\n createLayer(params) {\n if (!leafletHelpers.WebGLHeatMapLayerPlugin.isLoaded()) {\n $log.error(errorHeader + ' The WebGLHeatMapLayer plugin is not loaded.');\n return;\n }\n let layer = new L.TileLayer.WebGLHeatMap(params.options);\n if (isDefined(params.data)) {\n layer.setData(params.data);\n }\n return layer;\n }\n },\n\n wfs: {\n mustHaveUrl: true,\n mustHaveLayer: true,\n createLayer(params) {\n if (!leafletHelpers.WFSLayerPlugin.isLoaded()) {\n $log.error(errorHeader + ' The WFSLayer plugin is not loaded.');\n return;\n }\n let options = angular.copy(params.options);\n if (options.crs && 'string' === typeof options.crs) {\n options.crs = eval(options.crs);\n }\n return new L.GeoJSON.WFS(params.url, params.layer, options);\n }\n },\n\n yandex: {\n mustHaveUrl: false,\n createLayer(params) {\n let type = params.type || 'map';\n if (!leafletHelpers.YandexLayerPlugin.isLoaded()) {\n $log.error(errorHeader + ' The YandexLayer plugin is not loaded.');\n return;\n }\n return new L.Yandex(type, params.options);\n }\n }\n });\n\n return $delegate;\n }])\n ]);\n","angular.module('ui-leaflet')\n .service('leafletLayersLogger', ['nemSimpleLogger', nemSimpleLogger => nemSimpleLogger.spawn()]);\n"]} 12 | })(window, angular); -------------------------------------------------------------------------------- /dist/ui-leaflet-layers.min.js: -------------------------------------------------------------------------------- 1 | !function(window,angular){"use strict";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};angular.module("ui-leaflet").config(["$provide",function($provide){return $provide.decorator("leafletHelpers",["$delegate","leafletLayersLogger",function($delegate,leafletLayersLogger){var $log=leafletLayersLogger,_versionCompare=function(left,right){if(("undefined"==typeof left?"undefined":_typeof(left))+("undefined"==typeof right?"undefined":_typeof(right))!=="stringstring")return!1;for(var a=left.split("."),b=right.split("."),i=0,len=Math.max(a.length,b.length);i0||parseInt(a[i])>parseInt(b[i]))return 1;if(b[i]&&!a[i]&&parseInt(b[i])>0||parseInt(a[i]) 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 51 | 52 | 53 | 54 |

Google maps example

55 |

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

56 | 57 | 58 | -------------------------------------------------------------------------------- /examples/0102-layers-googlemaps-lf1-example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 51 | 52 | 53 | 54 |

Google maps example

55 |

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

56 | 57 | 58 | -------------------------------------------------------------------------------- /examples/0201-mapboxgl-example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Mapbox WebGL Example 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 71 | 72 | 73 | 74 | 75 | 76 | 77 |

Mapbox GL Example

78 | 79 |
    80 |
  • 81 | 82 | 83 |
  • 84 |
  • 85 |

    {{error}}

    86 |
  • 87 |
  • 88 | 89 | 90 |
  • 91 |
92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /examples/0202-mapbox-basic-example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Mapbox Basic Example 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 46 | 47 | 48 | 49 |

Mapbox Basic Example

50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /examples/0301-layers-bingmaps-example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 61 | 62 | 63 | 64 |

Bing maps

65 |

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

66 | 67 | 68 | -------------------------------------------------------------------------------- /examples/0401-layers-yandexmaps-example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 50 | 51 | 52 | 53 |

Yandex maps example

54 |

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

55 | 56 | 57 | -------------------------------------------------------------------------------- /gulp/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true, 4 | "es6": true 5 | }, 6 | "rules": { 7 | "quotes": ["error", "single", { "allowTemplateLiterals": true }] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /gulp/.githubreleaser.json.example: -------------------------------------------------------------------------------- 1 | { 2 | "token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 3 | } 4 | -------------------------------------------------------------------------------- /gulp/index.js: -------------------------------------------------------------------------------- 1 | require('./tasks/'); 2 | const gulp = require('gulp'); 3 | 4 | gulp.task('build-release', gulp.series('build', 'test', 'min')); 5 | gulp.task('default', gulp.series('build-release', 'browser-sync')); 6 | -------------------------------------------------------------------------------- /gulp/tasks/browser-sync.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const gulp = require('gulp'); 4 | let browserSync = require('browser-sync').create(); 5 | 6 | gulp.task('browser-sync', function() { 7 | browserSync.init({ 8 | open: false, 9 | server: { 10 | baseDir: './', 11 | directory: true 12 | } 13 | }); 14 | 15 | const reload = (done) => { 16 | browserSync.reload(); 17 | done(); 18 | }; 19 | 20 | gulp.watch('./src/**/*.es6', gulp.series('build-release')); 21 | gulp.watch('./test/**/*.spec.js', gulp.series('test')); 22 | gulp.watch('./dist/**/*.min.js', reload); 23 | gulp.watch('./examples/**/*.html', reload); 24 | }); 25 | -------------------------------------------------------------------------------- /gulp/tasks/build.js: -------------------------------------------------------------------------------- 1 | const gulp = require('gulp'); 2 | const concat = require('gulp-concat'); 3 | const insert = require('gulp-insert'); 4 | const babel = require('gulp-babel'); 5 | const sourcemaps = require('gulp-sourcemaps'); 6 | const jf = require('jsonfile'); 7 | const wrap = require('gulp-wrap'); 8 | require('./clean.js'); 9 | 10 | let date = new Date(); 11 | 12 | let pkgFn = () => jf.readFileSync('package.json'); 13 | 14 | let header = () => { 15 | let ourPackage = pkgFn(); 16 | return `/** 17 | * ${ourPackage.name} 18 | * 19 | * @version: ${ourPackage.version} 20 | * @author: ${ourPackage.author} 21 | * @date: ${date.toString()} 22 | * @license: ${ourPackage.license} 23 | */\n`; 24 | }; 25 | 26 | let build = (source, out = 'index.js') => { 27 | return gulp.src(source) 28 | .pipe(sourcemaps.init()) 29 | .pipe(babel({ 30 | presets: ['es2015'], 31 | compact: false, 32 | plugins: ['transform-remove-strict-mode'] 33 | })) 34 | .pipe(concat(out)) 35 | .pipe(sourcemaps.write('.')) 36 | .pipe(wrap({src: 'src/wrap/dist.js'})) 37 | .pipe(insert.prepend(header())) 38 | .pipe(gulp.dest('dist')); 39 | }; 40 | 41 | gulp.task('build', () => 42 | build([ 43 | 'src/services/leafletHelpers.es6', 44 | 'src/services/leafletLayerHelpers.es6', 45 | 'src/services/logger.es6' 46 | ], 'ui-leaflet-layers.js') 47 | ); 48 | -------------------------------------------------------------------------------- /gulp/tasks/clean.js: -------------------------------------------------------------------------------- 1 | const gulp = require('gulp'); 2 | const del = require('del'); 3 | 4 | gulp.task('clean', done => del(['tmp', 'dist', '*.log'], done)); 5 | 6 | gulp.task('cleanTmp', done => del(['tmp'], done)); 7 | -------------------------------------------------------------------------------- /gulp/tasks/index.js: -------------------------------------------------------------------------------- 1 | const requireDirectory = require('require-directory'); 2 | module.exports = requireDirectory(module); 3 | -------------------------------------------------------------------------------- /gulp/tasks/release.js: -------------------------------------------------------------------------------- 1 | const gulp = require('gulp'); 2 | const conventionalChangelog = require('gulp-conventional-changelog'); 3 | const conventionalGithubReleaser = require('conventional-github-releaser'); 4 | const bump = require('gulp-bump'); 5 | const gutil = require('gulp-util'); 6 | const git = require('gulp-git'); 7 | const fs = require('fs'); 8 | 9 | gulp.task('changelog', () => { 10 | return gulp.src('CHANGELOG.md', { 11 | buffer: true 12 | }) 13 | .pipe(conventionalChangelog({ 14 | preset: 'angular' // Or to any other commit message convention you use. 15 | })) 16 | .pipe(gulp.dest('./')); 17 | }); 18 | 19 | gulp.task('github-release', done => { 20 | const token = JSON.parse(fs.readFileSync('./gulp/.githubreleaser.json', 'utf8')).token; 21 | conventionalGithubReleaser({ 22 | type: 'oauth', 23 | token: token 24 | }, { 25 | preset: 'angular' // Or to any other commit message convention you use. 26 | }, done); 27 | }); 28 | 29 | gulp.task('bump-version', () => { 30 | // We hardcode the version change type to 'patch' but it may be a good idea to 31 | // use minimist (https://www.npmjs.com/package/minimist) to determine with a 32 | // command argument whether you are doing a 'major', 'minor' or a 'patch' change. 33 | return gulp.src(['./bower.json', './package.json']) 34 | .pipe(bump({type: 'patch'}).on('error', gutil.log)) 35 | .pipe(gulp.dest('./')); 36 | }); 37 | 38 | gulp.task('commit-changes', () => { 39 | return gulp.src('.') 40 | .pipe(git.add()) 41 | .pipe(git.commit('[Prerelease] Bumped version number')); 42 | }); 43 | 44 | gulp.task('push-changes', (cb) => { 45 | git.push('origin', 'master', cb); 46 | }); 47 | 48 | gulp.task('create-new-tag', (cb) => { 49 | const getPackageJsonVersion = () => { 50 | // We parse the json file instead of using require because require caches 51 | // multiple calls so the version number won't be updated 52 | return JSON.parse(fs.readFileSync('./package.json', 'utf8')).version; 53 | }; 54 | const version = getPackageJsonVersion(); 55 | 56 | git.tag(version, 'Created Tag for version: ' + version, error => { 57 | if (error) { 58 | return cb(error); 59 | } 60 | git.push('origin', 'master', {args: '--tags'}, cb); 61 | }); 62 | }); 63 | 64 | gulp.task('release', gulp.series( 65 | 'bump-version', 66 | 'changelog', 67 | 'commit-changes', 68 | 'push-changes', 69 | 'create-new-tag', 70 | 'github-release' 71 | )); 72 | -------------------------------------------------------------------------------- /gulp/tasks/test.js: -------------------------------------------------------------------------------- 1 | const gulp = require('gulp'); 2 | const Karma = require('karma').Server; 3 | const open = require('open'); 4 | const { log } = require('gulp-util'); 5 | 6 | let karmaRunner = (done) => { 7 | log('-- Karma Setup --'); 8 | const karmaConf = require.resolve('../../test/karma.conf.js'); 9 | try { 10 | new Karma({ 11 | configFile: karmaConf, 12 | singleRun: true 13 | }, (code) => { 14 | log(`Karma Callback Code: ${code}`); 15 | done(); 16 | }).start(); 17 | } catch(e) { 18 | log(`KARMA ERROR: ${e}`); 19 | done(e); 20 | } 21 | }; 22 | 23 | gulp.task('karma', done => karmaRunner(done)); 24 | 25 | gulp.task('test', gulp.parallel('karma')); 26 | 27 | let doOpen = (name = '') => done => open(`dist/coverage/lib${name}/index.html`, 'Google Chrome', done) ; 28 | gulp.task('coverage', doOpen()); 29 | -------------------------------------------------------------------------------- /gulp/tasks/uglify.js: -------------------------------------------------------------------------------- 1 | const gulp = require('gulp'); 2 | const concat = require('gulp-concat'); 3 | const uglify = require('gulp-uglify'); 4 | 5 | gulp.task('min', () => { 6 | return gulp.src('./dist/ui-leaflet-layers.js') 7 | .pipe(uglify({mangle: false})) 8 | .pipe(concat('ui-leaflet-layers.min.js')) 9 | .pipe(gulp.dest('./dist')); 10 | }); 11 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | /* 2 | gulpfile.js 3 | =========== 4 | Rather than manage one giant configuration file responsible 5 | for creating multiple tasks, each task has been broken out into 6 | its own file in gulp/tasks. Any file in that folder gets automatically 7 | required by the loop in ./gulp/index.js (required below). 8 | To add a new task, simply add a new task file to gulp/tasks. 9 | */ 10 | require('./gulp'); 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui-leaflet-layers", 3 | "version": "0.1.3", 4 | "description": "Angular UI Leaflet Layers Plugin", 5 | "main": "dist/ui-leaflet-layers.js", 6 | "scripts": { 7 | "start": "node_modules/gulp/bin/gulp.js", 8 | "test": "node_modules/gulp/bin/gulp.js test" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/elesdoar/ui-leaflet-layers.git" 13 | }, 14 | "keywords": [ 15 | "ui-leaflet", 16 | "leaflet", 17 | "maps", 18 | "gis", 19 | "mapbox", 20 | "esri", 21 | "cartodb", 22 | "wms" 23 | ], 24 | "author": "Michael Salgado ", 25 | "license": "MIT", 26 | "bugs": { 27 | "url": "https://github.com/elesdoar/ui-leaflet-layers/issues" 28 | }, 29 | "homepage": "https://github.com/elesdoar/ui-leaflet-layers", 30 | "devDependencies": { 31 | "angular-mocks": "^1.4.7", 32 | "babel-plugin-transform-remove-strict-mode": "0.0.2", 33 | "babel-preset-es2015": "^6.14.0", 34 | "browser-sync": "^2.16.0", 35 | "conventional-github-releaser": "^1.1.3", 36 | "del": "^2.0.2", 37 | "gulp": "git://github.com/gulpjs/gulp.git#4.0", 38 | "gulp-babel": "^6.1.2", 39 | "gulp-bump": "^2.4.0", 40 | "gulp-concat": "^2.6.0", 41 | "gulp-conventional-changelog": "^1.1.0", 42 | "gulp-git": "^1.6.0", 43 | "gulp-if": "^2.0.0", 44 | "gulp-insert": "^0.5.0", 45 | "gulp-replace": "^0.5.4", 46 | "gulp-sourcemaps": "^1.6.0", 47 | "gulp-uglify": "^2.0.0", 48 | "gulp-util": "^3.0.7", 49 | "gulp-wrap": "~0.13.0", 50 | "jasmine-core": "2.x", 51 | "jsonfile": "^2.2.3", 52 | "karma": "^1.3.x", 53 | "karma-babel-preprocessor": "^6.0.1", 54 | "karma-chrome-launcher": "~2.x", 55 | "karma-coverage": "~1.1.x", 56 | "karma-jasmine": "~1.0.x", 57 | "karma-mocha-reporter": "~2.x", 58 | "karma-phantomjs-launcher": "~1.0.x", 59 | "open": "0.0.5", 60 | "phantomjs": "^2.1.7", 61 | "require-directory": "^2.x" 62 | }, 63 | "dependencies": { 64 | "angular": "^1.5.x", 65 | "leaflet": "^0.7.7", 66 | "ui-leaflet": "^1.0.2" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/services/leafletHelpers.es6: -------------------------------------------------------------------------------- 1 | angular.module('ui-leaflet') 2 | .config(['$provide', $provide => 3 | $provide.decorator('leafletHelpers', ['$delegate', 'leafletLayersLogger', ($delegate, leafletLayersLogger) => { 4 | const $log = leafletLayersLogger; 5 | 6 | const _versionCompare = (left, right) => { 7 | if(typeof left + typeof right !== 'stringstring') { 8 | return false; 9 | } 10 | 11 | let a = left.split('.'); 12 | let b = right.split('.'); 13 | let i = 0, len = Math.max(a.length, b.length); 14 | 15 | for (; i < len; i++) { 16 | if ((a[i] && !b[i] && parseInt(a[i]) > 0) || (parseInt(a[i]) > parseInt(b[i]))) { 17 | return 1; 18 | } else if ((b[i] && !a[i] && parseInt(b[i]) > 0) || (parseInt(a[i]) < parseInt(b[i]))) { 19 | return -1; 20 | } 21 | } 22 | 23 | return 0; 24 | }; 25 | 26 | const basicFunction = layerType => 27 | ({ 28 | isLoaded() { 29 | return angular.isDefined(layerType); 30 | }, 31 | is(layer) { 32 | if (this.isLoaded()) { 33 | return layer instanceof layerType; 34 | } 35 | return false; 36 | } 37 | }); 38 | 39 | const plugins = { 40 | // Please keep keys order by alphabetical sort. 41 | BingLayerPlugin: basicFunction(L.BingLayer), 42 | ChinaLayerPlugin: basicFunction(L.tileLayer.chinaProvider), 43 | HeatLayerPlugin: basicFunction(L.heatLayer), 44 | LeafletProviderPlugin: basicFunction(L.TileLayer.Provider), 45 | MapboxGL: basicFunction(L.mapboxGL), 46 | UTFGridPlugin: basicFunction(L.UtfGrid), 47 | WebGLHeatMapLayerPlugin: basicFunction(L.TileLayer.WebGLHeatMap), 48 | WFSLayerPlugin: basicFunction(L.GeoJSON.WFS), 49 | YandexLayerPlugin: basicFunction(L.Yandex) 50 | }; 51 | 52 | if(_versionCompare(L.version, '1.0.0') === -1) { 53 | plugins.GoogleLayerPlugin = basicFunction(L.Google); 54 | } else { 55 | plugins.GoogleLayerPlugin = basicFunction(L.GridLayer.GoogleMutant); 56 | } 57 | plugins.versionCompare = _versionCompare; 58 | 59 | if(angular.isDefined(L.esri)) { 60 | angular.extend(plugins, { 61 | AGSBaseLayerPlugin: basicFunction(L.esri.basemapLayer), 62 | AGSClusteredLayerPlugin: basicFunction(L.esri.clusteredFeatureLayer), 63 | AGSDynamicMapLayerPlugin: basicFunction(L.esri.dynamicMapLayer), 64 | AGSFeatureLayerPlugin: basicFunction(L.esri.featureLayer), 65 | AGSImageMapLayerPlugin: basicFunction(L.esri.imageMapLayer), 66 | AGSHeatmapLayerPlugin: basicFunction(L.esri.heatmapFeatureLayer), 67 | AGSTiledMapLayerPlugin: basicFunction(L.esri.tiledMapLayer) 68 | }); 69 | } else { 70 | angular.extend(plugins, { 71 | AGSBaseLayerPlugin: basicFunction(), 72 | AGSClusteredLayerPlugin: basicFunction(), 73 | AGSDynamicMapLayerPlugin: basicFunction(), 74 | AGSFeatureLayerPlugin: basicFunction(), 75 | AGSImageMapLayerPlugin: basicFunction(), 76 | AGSHeatmapLayerPlugin: basicFunction(), 77 | AGSTiledMapLayerPlugin: basicFunction() 78 | }); 79 | } 80 | 81 | if(angular.isDefined(window.lvector)) { 82 | angular.extend(plugins, { 83 | AGSLayerPlugin: basicFunction(window.lvector.AGS) 84 | }); 85 | } else { 86 | angular.extend(plugins, { 87 | AGSLayerPlugin: basicFunction() 88 | }); 89 | } 90 | 91 | angular.extend($delegate, plugins); 92 | 93 | $log.info('[ui-leaflet-layers] - Layers plugin is loaded'); 94 | 95 | return $delegate; 96 | }]) 97 | ]); 98 | -------------------------------------------------------------------------------- /src/services/leafletLayerHelpers.es6: -------------------------------------------------------------------------------- 1 | angular.module('ui-leaflet') 2 | .config(['$provide', $provide => 3 | $provide.decorator('leafletLayerHelpers', 4 | ['$delegate', '$rootScope', '$q', 'leafletHelpers', 'leafletLayersLogger', 5 | ($delegate, $rootScope, $q, leafletHelpers, leafletLayersLogger) => { 6 | let $log = leafletLayersLogger; 7 | let { isArray } = leafletHelpers; 8 | let { isObject } = leafletHelpers; 9 | let { isDefined } = leafletHelpers; 10 | let { errorHeader } = leafletHelpers; 11 | let utfGridCreateLayer = params => { 12 | if (!leafletHelpers.UTFGridPlugin.isLoaded()) { 13 | $log.error(errorHeader + ' The UTFGrid plugin is not loaded.'); 14 | return; 15 | } 16 | 17 | let utfgrid = new L.UtfGrid(params.url, params.pluginOptions); 18 | 19 | utfgrid.on('mouseover', function(e) { 20 | $rootScope.$broadcast('leafletDirectiveMap.utfgridMouseover', e); 21 | }); 22 | 23 | utfgrid.on('mouseout', function(e) { 24 | $rootScope.$broadcast('leafletDirectiveMap.utfgridMouseout', e); 25 | }); 26 | 27 | utfgrid.on('click', function(e) { 28 | $rootScope.$broadcast('leafletDirectiveMap.utfgridClick', e); 29 | }); 30 | 31 | utfgrid.on('mousemove', function(e) { 32 | $rootScope.$broadcast('leafletDirectiveMap.utfgridMousemove', e); 33 | }); 34 | 35 | return utfgrid; 36 | }; 37 | 38 | angular.extend($delegate.layerTypes, { 39 | ags: { 40 | mustHaveUrl: true, 41 | createLayer: function(params) { 42 | if (!leafletHelpers.AGSLayerPlugin.isLoaded()) { 43 | return; 44 | } 45 | 46 | var options = angular.copy(params.options); 47 | angular.extend(options, { 48 | url: params.url 49 | }); 50 | var layer = new lvector.AGS(options); 51 | layer.onAdd = function(map) { 52 | this.setMap(map); 53 | }; 54 | layer.onRemove = function() { 55 | this.setMap(null); 56 | }; 57 | return layer; 58 | } 59 | }, 60 | agsBase: { 61 | mustHaveLayer : true, 62 | createLayer: function (params) { 63 | if (!leafletHelpers.AGSBaseLayerPlugin.isLoaded()) { 64 | return; 65 | } 66 | return L.esri.basemapLayer(params.layer, params.options); 67 | } 68 | }, 69 | agsClustered: { 70 | mustHaveUrl: true, 71 | createLayer: function(params) { 72 | if (!leafletHelpers.AGSClusteredLayerPlugin.isLoaded()) { 73 | $log.warn(errorHeader + ' The esri clustered layer plugin is not loaded.'); 74 | return; 75 | } 76 | 77 | if(!leafletHelpers.MarkerClusterPlugin.isLoaded()) { 78 | $log.warn(errorHeader + ' The markercluster plugin is not loaded.'); 79 | return; 80 | } 81 | return L.esri.clusteredFeatureLayer(params.url, params.options); 82 | } 83 | }, 84 | agsDynamic: { 85 | mustHaveUrl: true, 86 | createLayer: function(params) { 87 | if (!leafletHelpers.AGSDynamicMapLayerPlugin.isLoaded()) { 88 | $log.warn(errorHeader + ' The esri plugin is not loaded.'); 89 | return; 90 | } 91 | 92 | params.options.url = params.url; 93 | 94 | return L.esri.dynamicMapLayer(params.options); 95 | } 96 | }, 97 | agsFeature: { 98 | mustHaveUrl: true, 99 | createLayer: function(params) { 100 | if (!leafletHelpers.AGSFeatureLayerPlugin.isLoaded()) { 101 | $log.warn(errorHeader + ' The esri plugin is not loaded.'); 102 | return; 103 | } 104 | 105 | params.options.url = params.url; 106 | 107 | var layer = L.esri.featureLayer(params.options); 108 | var load = function() { 109 | if(isDefined(params.options.loadedDefer)) { 110 | params.options.loadedDefer.resolve(); 111 | } 112 | }; 113 | layer.on('loading', function() { 114 | params.options.loadedDefer = $q.defer(); 115 | layer.off('load', load); 116 | layer.on('load', load); 117 | }); 118 | 119 | return layer; 120 | } 121 | }, 122 | agsHeatmap: { 123 | mustHaveUrl: true, 124 | createLayer: function(params) { 125 | if (!leafletHelpers.AGSHeatmapLayerPlugin.isLoaded()) { 126 | $log.warn(errorHeader + ' The esri heatmap layer plugin is not loaded.'); 127 | return; 128 | } 129 | 130 | if(!leafletHelpers.HeatLayerPlugin.isLoaded()) { 131 | $log.warn(errorHeader + ' The heatlayer plugin is not loaded.'); 132 | return; 133 | } 134 | return L.esri.heatmapFeatureLayer(params.url, params.options); 135 | } 136 | }, 137 | agsImage: { 138 | mustHaveUrl: true, 139 | createLayer: function(params) { 140 | if (!leafletHelpers.AGSImageMapLayerPlugin.isLoaded()) { 141 | $log.warn(errorHeader + ' The esri plugin is not loaded.'); 142 | return; 143 | } 144 | params.options.url = params.url; 145 | 146 | return L.esri.imageMapLayer(params.options); 147 | } 148 | }, 149 | agsTiled: { 150 | mustHaveUrl: true, 151 | createLayer: function(params) { 152 | if (!leafletHelpers.AGSTiledMapLayerPlugin.isLoaded()) { 153 | $log.warn(errorHeader + ' The esri plugin is not loaded.'); 154 | return; 155 | } 156 | 157 | params.options.url = params.url; 158 | 159 | return L.esri.tiledMapLayer(params.options); 160 | } 161 | }, 162 | bing: { 163 | mustHaveUrl: false, 164 | createLayer(params) { 165 | if (!leafletHelpers.BingLayerPlugin.isLoaded()) { 166 | $log.error(errorHeader + ' The Bing plugin is not loaded.'); 167 | return; 168 | } 169 | return new L.BingLayer(params.key, params.options); 170 | } 171 | }, 172 | 173 | china: { 174 | mustHaveUrl:false, 175 | createLayer(params) { 176 | let type = params.type || ''; 177 | if (!leafletHelpers.ChinaLayerPlugin.isLoaded()) { 178 | $log.error(errorHeader + ' The ChinaLayer plugin is not loaded.'); 179 | return; 180 | } 181 | return L.tileLayer.chinaProvider(type, params.options); 182 | } 183 | }, 184 | 185 | google: { 186 | mustHaveUrl: false, 187 | createLayer(params) { 188 | let type = params.type || 'SATELLITE'; 189 | if (!leafletHelpers.GoogleLayerPlugin.isLoaded()) { 190 | $log.error(errorHeader + ' The GoogleLayer plugin is not loaded.'); 191 | return; 192 | } 193 | let layer = null; 194 | 195 | if(leafletHelpers.versionCompare(L.version, '1.0.0') === -1) { 196 | layer = new L.Google(type.toUpperCase(), params.options); 197 | } else { 198 | layer = new L.GridLayer.GoogleMutant({ 199 | type: type.toLowerCase() 200 | }); 201 | } 202 | return layer; 203 | } 204 | }, 205 | 206 | heat: { 207 | mustHaveUrl: false, 208 | mustHaveData: true, 209 | createLayer(params) { 210 | if (!leafletHelpers.HeatLayerPlugin.isLoaded()) { 211 | $log.error(errorHeader + ' The HeatMapLayer plugin is not loaded.'); 212 | return; 213 | } 214 | let layer = new L.heatLayer(); 215 | if (isArray(params.data)) { 216 | layer.setLatLngs(params.data); 217 | } 218 | if (isObject(params.options)) { 219 | layer.setOptions(params.options); 220 | } 221 | return layer; 222 | } 223 | }, 224 | 225 | here: { 226 | mustHaveUrl: false, 227 | createLayer: function(params) { 228 | var provider = params.provider || 'HERE.terrainDay'; 229 | if (!leafletHelpers.LeafletProviderPlugin.isLoaded()) { 230 | return; 231 | } 232 | return new L.TileLayer.Provider(provider, params.options); 233 | } 234 | }, 235 | 236 | mapbox: { 237 | mustHaveKey: true, 238 | createLayer(params) { 239 | let url = '//api.mapbox.com/styles/v1/{user}/{mapId}/tiles/256/{z}/{x}/{y}?access_token={apiKey}'; 240 | return L.tileLayer(url, angular.extend(params.options, { 241 | mapId: params.key, 242 | user: params.user, 243 | apiKey: params.apiKey 244 | })); 245 | } 246 | }, 247 | 248 | mapboxGL: { 249 | createLayer(params) { 250 | if (!leafletHelpers.MapboxGL.isLoaded()) { 251 | $log.error(errorHeader + ' The MapboxGL plugin is not loaded.'); 252 | return; 253 | } 254 | return new L.mapboxGL(params.options); 255 | } 256 | }, 257 | 258 | utfGrid: { 259 | mustHaveUrl: true, 260 | createLayer: utfGridCreateLayer 261 | }, 262 | 263 | webGLHeatmap: { 264 | mustHaveUrl: false, 265 | mustHaveData: true, 266 | createLayer(params) { 267 | if (!leafletHelpers.WebGLHeatMapLayerPlugin.isLoaded()) { 268 | $log.error(errorHeader + ' The WebGLHeatMapLayer plugin is not loaded.'); 269 | return; 270 | } 271 | let layer = new L.TileLayer.WebGLHeatMap(params.options); 272 | if (isDefined(params.data)) { 273 | layer.setData(params.data); 274 | } 275 | return layer; 276 | } 277 | }, 278 | 279 | wfs: { 280 | mustHaveUrl: true, 281 | mustHaveLayer: true, 282 | createLayer(params) { 283 | if (!leafletHelpers.WFSLayerPlugin.isLoaded()) { 284 | $log.error(errorHeader + ' The WFSLayer plugin is not loaded.'); 285 | return; 286 | } 287 | let options = angular.copy(params.options); 288 | if (options.crs && 'string' === typeof options.crs) { 289 | options.crs = eval(options.crs); 290 | } 291 | return new L.GeoJSON.WFS(params.url, params.layer, options); 292 | } 293 | }, 294 | 295 | yandex: { 296 | mustHaveUrl: false, 297 | createLayer(params) { 298 | let type = params.type || 'map'; 299 | if (!leafletHelpers.YandexLayerPlugin.isLoaded()) { 300 | $log.error(errorHeader + ' The YandexLayer plugin is not loaded.'); 301 | return; 302 | } 303 | return new L.Yandex(type, params.options); 304 | } 305 | } 306 | }); 307 | 308 | return $delegate; 309 | }]) 310 | ]); 311 | -------------------------------------------------------------------------------- /src/services/logger.es6: -------------------------------------------------------------------------------- 1 | angular.module('ui-leaflet') 2 | .service('leafletLayersLogger', ['nemSimpleLogger', nemSimpleLogger => nemSimpleLogger.spawn()]); 3 | -------------------------------------------------------------------------------- /src/wrap/dist.js: -------------------------------------------------------------------------------- 1 | (function (window, angular){ 2 | 'use strict'; 3 | <%= contents %> 4 | })(window, angular); 5 | -------------------------------------------------------------------------------- /test/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true, 4 | "es6": true 5 | }, 6 | "rules": { 7 | "quotes": ["error", "single", { "allowTemplateLiterals": true }] 8 | }, 9 | "globals": { 10 | "inject": true, 11 | "expect": true 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/karma.conf.js: -------------------------------------------------------------------------------- 1 | module.exports = (config) => { 2 | return config.set({ 3 | basePath: './', 4 | frameworks: ['jasmine'], 5 | preprocessors: { 6 | '../test/**/*.js': ['babel'], 7 | '../dist/ui-leaflet-layers.js': ['coverage'] 8 | }, 9 | babelPreprocessor: { 10 | options: { 11 | presets: ['es2015'], 12 | sourceMap: 'inline' 13 | }, 14 | filename: function (file) { 15 | return file.originalPath.replace(/\.js$/, '.es5.js'); 16 | }, 17 | sourceFileName: function (file) { 18 | return file.originalPath; 19 | } 20 | }, 21 | coverageReporter: { 22 | reporters: [ 23 | { 24 | type: 'html', 25 | dir: 'dist/coverage/', 26 | subdir: 'lib' 27 | }, { 28 | type: 'cobertura', 29 | dir: 'dist/coverage/', 30 | subdir: 'lib' 31 | } 32 | ] 33 | }, 34 | files: [ 35 | '../bower_components/leaflet/dist/leaflet.js', 36 | '../bower_components/angular/angular.js', 37 | '../bower_components/angular-mocks/angular-mocks.js', 38 | '../bower_components/angular-simple-logger/dist/angular-simple-logger.js', 39 | 'http://maps.google.com/maps/api/js?key=AIzaSyBazU_OOTAZRmxQfaiirM1EDPLCiUSTlrY', 40 | 'http://api-maps.yandex.ru/2.1/?lang=en_US', 41 | '../bower_components/leaflet-plugins/layer/tile/Google.js', 42 | '../bower_components/leaflet-plugins/layer/tile/Yandex.js', 43 | '../bower_components/ui-leaflet/dist/ui-leaflet.js', 44 | '../dist/ui-leaflet-layers.js', 45 | 'unit/*.spec.js' 46 | ], 47 | exclude: [], 48 | reporters: ['mocha', 'coverage'], 49 | port: 9876, 50 | colors: true, 51 | logLevel: config.LOG_INFO, 52 | autoWatch: false, 53 | browsers: ['PhantomJS'], 54 | captureTimeout: 60000, 55 | singleRun: false 56 | }); 57 | }; 58 | -------------------------------------------------------------------------------- /test/unit/layersDirective.google.spec.js: -------------------------------------------------------------------------------- 1 | describe('layersDirective', () => { 2 | let leafletData, $rootScope, $compile, scope; 3 | beforeEach(() => { 4 | module('ui-leaflet'); 5 | inject(function(_$compile_, _$rootScope_, _leafletData_) { 6 | $compile = _$compile_; 7 | $rootScope = _$rootScope_; 8 | scope = $rootScope.$new(); 9 | leafletData = _leafletData_; 10 | }); 11 | }); 12 | 13 | afterEach(inject(function ($rootScope) { 14 | $rootScope.$apply(); 15 | })); 16 | 17 | it('should create google layers if correctly configured', function () { 18 | angular.extend(scope, { 19 | layers: { 20 | baselayers: { 21 | googleTerrain: { 22 | name: 'Google Terrain', 23 | layerType: 'TERRAIN', 24 | type: 'google' 25 | } 26 | }, 27 | overlays: { 28 | googleHybrid: { 29 | name: 'Google Hybrid', 30 | layerType: 'HYBRID', 31 | type: 'google', 32 | visible: true 33 | }, 34 | googleRoadmap: { 35 | name: 'Google Streets', 36 | layerType: 'ROADMAP', 37 | type: 'google', 38 | visible: true 39 | } 40 | } 41 | } 42 | }); 43 | var element = angular.element(''); 44 | element = $compile(element)(scope); 45 | var map; 46 | leafletData.getMap().then(function (leafletMap) { 47 | map = leafletMap; 48 | }); 49 | scope.$digest(); 50 | leafletData.getLayers().then(function (layers) { 51 | expect(map.hasLayer(layers.baselayers.googleTerrain)).toBe(true); 52 | expect(map.hasLayer(layers.overlays.googleHybrid)).toBe(true); 53 | expect(map.hasLayer(layers.overlays.googleRoadmap)).toBe(true); 54 | }); 55 | }); 56 | }); 57 | -------------------------------------------------------------------------------- /test/unit/layersDirective.mapbox.spec.js: -------------------------------------------------------------------------------- 1 | describe('layersDirective', () => { 2 | let leafletData, $rootScope, $compile, scope; 3 | beforeEach(() => { 4 | module('ui-leaflet'); 5 | inject(function(_$compile_, _$rootScope_, _leafletData_) { 6 | $compile = _$compile_; 7 | $rootScope = _$rootScope_; 8 | scope = $rootScope.$new(); 9 | leafletData = _leafletData_; 10 | }); 11 | }); 12 | 13 | afterEach(inject(function ($rootScope) { 14 | $rootScope.$apply(); 15 | })); 16 | 17 | it('should create mapbox layers if correctly configured', function () { 18 | angular.extend(scope, { 19 | layers: { 20 | baselayers: { 21 | mapboxBasic: { 22 | name: 'Mapbox Basic', 23 | type: 'mapbox', 24 | key: 'citng102800332hphzmbjudn7', 25 | user: 'elesdoar', 26 | apiKey: 'pk.eyJ1IjoiZWxlc2RvYXIiLCJhIjoiY2l0bmcwaDNpMDQzMTJvbDRpaTltN2dlbiJ9.KDnhRVh9St6vpQovMI7iLg' 27 | } 28 | }, 29 | overlays: { 30 | mapboxOutdoors: { 31 | name: 'Mapbox Outdoors', 32 | type: 'mapbox', 33 | key: 'citng3g0g003s2it88y9lg769', 34 | user: 'elesdoar', 35 | apiKey: 'pk.eyJ1IjoiZWxlc2RvYXIiLCJhIjoiY2l0bmcwaDNpMDQzMTJvbDRpaTltN2dlbiJ9.KDnhRVh9St6vpQovMI7iLg', 36 | visible: true 37 | } 38 | } 39 | } 40 | }); 41 | var element = angular.element(''); 42 | element = $compile(element)(scope); 43 | var map; 44 | leafletData.getMap().then(function (leafletMap) { 45 | map = leafletMap; 46 | }); 47 | scope.$digest(); 48 | leafletData.getLayers().then(function (layers) { 49 | expect(map.hasLayer(layers.baselayers.mapboxBasic)).toBe(true); 50 | expect(map.hasLayer(layers.overlays.mapboxOutdoors)).toBe(true); 51 | }); 52 | }); 53 | }); 54 | -------------------------------------------------------------------------------- /test/unit/layersDirective.yandex.spec.js: -------------------------------------------------------------------------------- 1 | describe('layersDirective', () => { 2 | let leafletData, $rootScope, $compile, scope; 3 | beforeEach(() => { 4 | module('ui-leaflet'); 5 | inject(function(_$compile_, _$rootScope_, _leafletData_) { 6 | $compile = _$compile_; 7 | $rootScope = _$rootScope_; 8 | scope = $rootScope.$new(); 9 | leafletData = _leafletData_; 10 | }); 11 | }); 12 | 13 | afterEach(inject(function ($rootScope) { 14 | $rootScope.$apply(); 15 | })); 16 | 17 | it('should create yandex layers if correctly configured', function () { 18 | angular.extend(scope, { 19 | layers: { 20 | baselayers: { 21 | yandexBasic: { 22 | name: 'Yandex Basic', 23 | type: 'yandex' 24 | } 25 | }, 26 | overlays: { 27 | yandexHybrid: { 28 | name: 'Yandex Hybrid', 29 | layerType: 'hybrid', 30 | type: 'yandex', 31 | visible: true 32 | }, 33 | yandexRoadmap: { 34 | name: 'Yandex Satellite', 35 | layerType: 'satellite', 36 | type: 'yandex', 37 | visible: true 38 | } 39 | } 40 | } 41 | }); 42 | var element = angular.element(''); 43 | element = $compile(element)(scope); 44 | var map; 45 | leafletData.getMap().then(function (leafletMap) { 46 | map = leafletMap; 47 | }); 48 | scope.$digest(); 49 | leafletData.getLayers().then(function (layers) { 50 | expect(map.hasLayer(layers.baselayers.yandexBasic)).toBe(true); 51 | expect(map.hasLayer(layers.overlays.yandexHybrid)).toBe(true); 52 | expect(map.hasLayer(layers.overlays.yandexRoadmap)).toBe(true); 53 | }); 54 | }); 55 | }); 56 | -------------------------------------------------------------------------------- /test/unit/leafletHelper.spec.js: -------------------------------------------------------------------------------- 1 | describe('leafletHelpers', () => { 2 | let leafletHelpers; 3 | beforeEach(() => { 4 | module('ui-leaflet'); 5 | inject(function(_leafletHelpers_) { 6 | leafletHelpers = _leafletHelpers_; 7 | }); 8 | }); 9 | 10 | describe('versionCompare', () => { 11 | let versionCompare; 12 | beforeEach(() => { 13 | versionCompare = leafletHelpers.versionCompare; 14 | }); 15 | 16 | describe('is greater than', () => { 17 | it('1.0.0 > 0.7.7', () => { 18 | expect(versionCompare('1.0.0', '0.7.7')).toBe(1); 19 | }); 20 | }); 21 | 22 | describe('is equal', () => { 23 | it('1.0.0 = 1.0.0', () => { 24 | expect(versionCompare('1.0.0', '1.0.0')).toBe(0); 25 | }); 26 | }); 27 | 28 | describe('is less than', () => { 29 | it('0.7.7 < 1.0.0', () => { 30 | expect(versionCompare('0.7.7', '1.0.0')).toBe(-1); 31 | }); 32 | }); 33 | }); 34 | }); 35 | --------------------------------------------------------------------------------