2 * ============LICENSE_START========================================================================
3 * ONAP : ccsdk feature sdnr wt odlux
4 * =================================================================================================
5 * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
6 * =================================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software distributed under the License
13 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14 * or implied. See the License for the specific language governing permissions and limitations under
16 * ============LICENSE_END==========================================================================
19 import * as mapboxgl from 'mapbox-gl';
20 import { Feature } from 'model/Feature';
22 const fibreLinkColor = "#1154d9";
23 const microwaveLinkColor="#039903";
25 export const addBaseSources = (map: mapboxgl.Map, selectedPoint: Feature|null, selectedLine: Feature|null) =>{
28 // make sure the sources don't already exist
29 // (if the networkmap app gets opened quickly within short time periods, the prior sources might not be fully removed)
31 if(!map.getSource("lines")){
33 map.addSource('lines', {
35 data: { type: "FeatureCollection", features: [] }
39 if(!map.getSource("selectedLine"))
41 const features = selectedLine !== null ? [selectedLine] : [];
42 map.addSource('selectedLine', {
44 data: { type: "FeatureCollection", features: features }
48 if(!map.getSource("points"))
50 map.addSource('points', {
52 data: { type: "FeatureCollection", features: [] }
56 if(!map.getSource("selectedPoints"))
58 const selectedPointFeature = selectedPoint !== null ? [selectedPoint] : [];
59 map.addSource('selectedPoints', {
61 data: { type: "FeatureCollection", features: selectedPointFeature }
66 if(!map.getSource("alarmedPoints"))
68 map.addSource("alarmedPoints", {
70 data: {type:"FeatureCollection", features:[]}
75 export const addBaseLayers = (map: mapboxgl.Map, selectedPoint: Feature|null, selectedLine: Feature|null) => {
84 'circle-color': '#11b4da',
86 'circle-stroke-width': 1,
87 'circle-stroke-color': '#fff'
93 source: 'selectedPoints',
96 'circle-color': '#116bda',
98 'circle-stroke-width': 1,
99 'circle-stroke-color': '#fff'
105 source: 'alarmedPoints',
108 'circle-color': '#CC0000',
110 'circle-stroke-width': 1,
111 'circle-stroke-color': '#fff'
116 export const addIconLayers = (map: mapboxgl.Map, selectedSiteId?: string) =>{
118 addCommonLayers(map);
119 createIconLayers(map, selectedSiteId);
122 const createIconLayers =(map: mapboxgl.Map, selectedSiteId?: string) =>{
128 'icon-allow-overlap': true,
129 'icon-image': 'lamp',
133 'filter': createFilter("street lamp", selectedSiteId),
137 'id': 'point-building',
140 'filter': createFilter("high rise building", selectedSiteId),
142 'icon-allow-overlap': true,
143 'icon-image': 'house',
149 'id': 'point-data-center',
152 'filter': createFilter("data center", selectedSiteId),
154 'icon-allow-overlap': true,
155 'icon-image': 'data-center',
160 'id': 'point-factory',
163 'filter': createFilter("factory", selectedSiteId),
165 'icon-allow-overlap': true,
166 'icon-image': 'factory',
174 'id': 'point-lamps-alarm',
176 'source': 'alarmedPoints',
178 'icon-allow-overlap': true,
179 'icon-image': 'lamp-red',
183 'filter': createFilter("street lamp"),
187 'id': 'point-building-alarm',
189 'source': 'alarmedPoints',
190 'filter': createFilter("high rise building"),
192 'icon-allow-overlap': true,
193 'icon-image': 'house-red',
199 'id': 'point-data-center-alarm',
201 'source': 'alarmedPoints',
202 'filter': createFilter("data center"),
204 'icon-allow-overlap': true,
205 'icon-image': 'data-center_red',
210 'id': 'point-factory-alarm',
212 'source': 'alarmedPoints',
213 'filter': createFilter("factory"),
215 'icon-allow-overlap': true,
216 'icon-image': 'factory-red',
224 id: 'point-remaining',
227 'filter': ['none', ['==', 'type', "high rise building"], ['==', 'type', "data center"], ['==', 'type', "factory"], ['==', 'type', "street lamp"] ],
229 'circle-color': '#11b4da',
231 'circle-stroke-width': 1,
232 'circle-stroke-color': '#fff'
237 'id': 'select-point-lamps',
239 'source': 'selectedPoints',
241 'icon-allow-overlap': true,
242 'icon-image': 'lamp',
246 'filter': ['==', 'type', 'street lamp'],
250 'id': 'select-point-buildings',
252 'source': 'selectedPoints',
253 'filter': ['==', 'type', 'high rise building'],
255 'icon-allow-overlap': true,
256 'icon-image': 'house',
262 'id': 'select-point-data-center',
264 'source': 'selectedPoints',
265 'filter': ['==', 'type', 'data center'],
267 'icon-allow-overlap': true,
268 'icon-image': 'data-center',
275 'id': 'select-point-factory',
277 'source': 'selectedPoints',
278 'filter': ['==', 'type', 'factory'],
280 'icon-allow-overlap': true,
281 'icon-image': 'factory',
287 const addCommonLayers = (map: mapboxgl.Map) =>{
290 'id': 'microwave-lines',
294 'line-join': 'round',
298 'line-color': microwaveLinkColor,
301 'filter': ['==', 'type', 'microwave']
309 'line-join': 'round',
313 'line-color': fibreLinkColor,
316 'filter': ['==', 'type', 'fibre']
320 'id': 'selectedLineMicrowave',
322 'source': 'selectedLine',
324 'line-join': 'round',
328 'line-color': microwaveLinkColor,
331 'filter': ['==', 'type', 'microwave']
335 'id': 'selectedLineFibre',
337 'source': 'selectedLine',
339 'line-join': 'round',
343 'line-color': fibreLinkColor,
346 'filter': ['==', 'type', 'fibre']
350 export const removeBaseLayers = (map: mapboxgl.Map) => {
352 map.removeLayer("points");
353 map.removeLayer("lines");
354 map.removeLayer('selectedPoints');
355 map.removeLayer('selectedLine');
358 const removeIconLayers = (map: mapboxgl.Map) =>{
360 map.removeLayer('point-building');
361 map.removeLayer('point-lamps');
362 map.removeLayer('point-data-center');
363 map.removeLayer('point-factory');
364 map.removeLayer('point-remaining');
365 map.removeLayer('select-point-data-center');
366 map.removeLayer('select-point-buildings');
367 map.removeLayer('select-point-lamps');
368 map.removeLayer('select-point-factory');
369 map.removeLayer('point-building-alarm');
370 map.removeLayer('point-lamps-alarm');
371 map.removeLayer('point-data-center-alarm');
372 map.removeLayer('point-factory-alarm');
375 let checkedLayers = false;
377 const createFilter = (type:'street lamp'|'high rise building'|'data center'|'factory', selectedSiteId?:string) =>{
379 return selectedSiteId === undefined ? ['==', 'type', type] : ["all", ['==', 'type', type], ['!=', 'id', selectedSiteId]]
382 export const showIconLayers = (map: mapboxgl.Map, show: boolean, selectedSiteId?: string) => {
384 const zoom = map.getZoom();
390 const bounds = map.getBounds();
392 if(map.getLayer('points')!== undefined && map.getLayer('point-lamps')===undefined && !checkedLayers){
394 // if sites don't have a type don't change layers to icons
395 const elements = map.queryRenderedFeatures( undefined,{
396 layers: ['points'], filter:['has', 'type']
400 if(elements.length>0 && elements.length<1000){
402 if (map.getLayer('point-lamps') === undefined) {
403 map.removeLayer('points');
404 map.setLayoutProperty('alarmedPoints', 'visibility', 'none');
405 map.setLayoutProperty('selectedPoints', 'visibility', 'none');
406 createIconLayers(map,selectedSiteId);
407 //map.moveLayer('point-remaining','selectedPoints');
421 export const swapLayersBack = (map: mapboxgl.Map) =>{
424 if(map.getLayer('selectedPoints') === undefined){
426 id: 'selectedPoints',
427 source: 'selectedPoints',
430 'circle-color': '#116bda',
432 'circle-stroke-width': 1,
433 'circle-stroke-color': '#fff'
438 if(map.getLayer('alarmedPoints') === undefined){
441 source: 'alarmedPoints',
444 'circle-color': '#CC0000',
446 'circle-stroke-width': 1,
447 'circle-stroke-color': '#fff'
453 if (map.getLayer('points') === undefined) {
455 map.setLayoutProperty('selectedPoints', 'visibility', 'visible');
456 map.setLayoutProperty('alarmedPoints', 'visibility', 'visible');
457 removeIconLayers(map);
464 'circle-color': '#11b4da',
466 'circle-stroke-width': 1,
467 'circle-stroke-color': '#fff'
471 map.moveLayer('points', map.getLayer('selectedPoints').id);
475 const addClusterLayers = (map: mapboxgl.Map, data: any) => {
476 map.addSource('clusters', {
481 map.addSource('selectedLine', {
483 data: { type: "FeatureCollection", features: [] }
486 map.addSource('selectedPoints', {
488 data: { type: "FeatureCollection", features: [] }
496 filter: ['has', 'count'],
524 filter: ['has', 'count'],
526 'text-field': '{count}',
527 'text-font': ['Roboto Bold'],
533 'id': 'selectedLine',
535 'source': 'selectedLine',
537 'line-join': 'round',
541 'line-color': '#888',
547 id: 'unclustered-points',
549 filter: ['!', ['has', 'count'],],
552 'circle-color': '#11b4da',
554 'circle-stroke-width': 1,
555 'circle-stroke-color': '#fff'
560 id: 'selectedPoints',
561 source: 'selectedPoints',
564 'circle-color': '#116bda',
566 'circle-stroke-width': 1,
567 'circle-stroke-color': '#fff'