From d78b47870002600d169627c21d694ae449a7d25b Mon Sep 17 00:00:00 2001 From: Michael Mattig Date: Wed, 24 Mar 2021 19:03:25 +0100 Subject: [PATCH 01/17] add upload component and functionality --- .../geoengine-app/src/app/app.component.ts | 13 +- .../src/lib/backend/backend.model.ts | 12 ++ .../src/lib/backend/backend.service.ts | 19 +- .../datasets/add-data/add-data.component.ts | 16 +- .../src/lib/datasets/dataset.service.ts | 10 + .../lib/datasets/upload/upload.component.html | 58 ++++++ .../lib/datasets/upload/upload.component.scss | 7 + .../lib/datasets/upload/upload.component.ts | 188 ++++++++++++++++++ .../wave-core-new/src/lib/wave-core.module.ts | 2 + projects/wave-core-new/src/public-api.ts | 1 + 10 files changed, 313 insertions(+), 13 deletions(-) create mode 100644 projects/wave-core-new/src/lib/datasets/upload/upload.component.html create mode 100644 projects/wave-core-new/src/lib/datasets/upload/upload.component.scss create mode 100644 projects/wave-core-new/src/lib/datasets/upload/upload.component.ts diff --git a/projects/geoengine-app/src/app/app.component.ts b/projects/geoengine-app/src/app/app.component.ts index d0300914..258b817d 100644 --- a/projects/geoengine-app/src/app/app.component.ts +++ b/projects/geoengine-app/src/app/app.component.ts @@ -18,7 +18,7 @@ import {MatSidenav} from '@angular/material/sidenav'; import {MatTabGroup} from '@angular/material/tabs'; import { AddDataComponent, - AddDataListButton, + AddDataButton, Layer, SidenavContainerComponent, LayoutService, @@ -42,7 +42,6 @@ import { import {DomSanitizer} from '@angular/platform-browser'; import {ActivatedRoute} from '@angular/router'; import {AppConfig} from './app-config.service'; -import {MockLayersComponent} from './mock-layers/mock-layers.component'; @Component({ selector: 'wave-app-root', @@ -196,15 +195,11 @@ export class AppComponent implements OnInit, AfterViewInit { return {component: AddDataComponent, config: {buttons: AppComponent.createAddDataListButtons()}}; } - private static createAddDataListButtons(): Array { + private static createAddDataListButtons(): Array { return [ AddDataComponent.createDataSetListButton(), - { - name: 'Mock data', - description: 'Mock data sets', - iconSrc: AddDataComponent.createIconDataUrl('mock'), - sidenavConfig: {component: MockLayersComponent, keepParent: true}, - }, + AddDataComponent.createUploadButton(), + // SourceOperatorListComponent.createDrawFeaturesButton(), // ...SourceOperatorListComponent.createCustomFeaturesButtons(), // { diff --git a/projects/wave-core-new/src/lib/backend/backend.model.ts b/projects/wave-core-new/src/lib/backend/backend.model.ts index 1b0bc0d4..4203492d 100644 --- a/projects/wave-core-new/src/lib/backend/backend.model.ts +++ b/projects/wave-core-new/src/lib/backend/backend.model.ts @@ -180,6 +180,10 @@ export interface DataSetDict { source_operator: string; } +export interface DataSetIdDict { + Internal?: InternalDataSetIdDict; +} + export interface InternalDataSetIdDict { Internal: UUID; } @@ -229,3 +233,11 @@ export interface MeasurementDict { }; }; } + +export interface UploadResponseDict { + id: UUID; +} + +export interface CreateDataSetDict { + upload: UUID; +} diff --git a/projects/wave-core-new/src/lib/backend/backend.service.ts b/projects/wave-core-new/src/lib/backend/backend.service.ts index aa6b5b59..076b0dc8 100644 --- a/projects/wave-core-new/src/lib/backend/backend.service.ts +++ b/projects/wave-core-new/src/lib/backend/backend.service.ts @@ -1,5 +1,5 @@ import {Injectable} from '@angular/core'; -import {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http'; +import {HttpClient, HttpEvent, HttpHeaders, HttpParams} from '@angular/common/http'; import {Observable, Subject} from 'rxjs'; import {Config} from '../config.service'; import {bboxDictToExtent, unixTimestampToIsoString} from '../util/conversions'; @@ -27,6 +27,9 @@ import { RasterResultDescriptorDict, PlotResultDescriptorDict, VectorResultDescriptorDict, + UploadResponseDict, + DataSetIdDict, + CreateDataSetDict, } from './backend.model'; @Injectable({ @@ -241,6 +244,20 @@ export class BackendService { }); } + upload(sessionId: UUID, form: FormData): Observable> { + return this.http.post(this.config.API_URL + '/upload', form, { + headers: BackendService.authorizationHeader(sessionId), + reportProgress: true, + observe: 'events', + }); + } + + createDataSet(sessionId: UUID, createDataSet: CreateDataSetDict): Observable { + return this.http.post(this.config.API_URL + '/dataset', createDataSet, { + headers: BackendService.authorizationHeader(sessionId), + }); + } + private static authorizationHeader(sessionId: UUID): HttpHeaders { return new HttpHeaders().set('Authorization', `Bearer ${sessionId}`); } diff --git a/projects/wave-core-new/src/lib/datasets/add-data/add-data.component.ts b/projects/wave-core-new/src/lib/datasets/add-data/add-data.component.ts index 5104d48e..61f49e2f 100644 --- a/projects/wave-core-new/src/lib/datasets/add-data/add-data.component.ts +++ b/projects/wave-core-new/src/lib/datasets/add-data/add-data.component.ts @@ -1,8 +1,9 @@ import {Component, OnInit, ChangeDetectionStrategy, Input} from '@angular/core'; import {LayoutService, SidenavConfig} from '../../layout.service'; import {DatasetListComponent} from '../dataset-list/dataset-list.component'; +import {UploadComponent} from '../upload/upload.component'; -export interface AddDataListButton { +export interface AddDataButton { name: string; description: string; icon?: string; @@ -21,7 +22,7 @@ export class AddDataComponent implements OnInit { /** * A list of data source dialogs to display */ - @Input() buttons!: Array; + @Input() buttons!: Array; constructor(private layoutService: LayoutService) {} @@ -38,7 +39,7 @@ export class AddDataComponent implements OnInit { this.layoutService.setSidenavContentComponent(sidenavConfig); } - static createDataSetListButton(): AddDataListButton { + static createDataSetListButton(): AddDataButton { return { name: 'Data Sets', description: 'Available Data Sets', @@ -47,6 +48,15 @@ export class AddDataComponent implements OnInit { }; } + static createUploadButton(): AddDataButton { + return { + name: 'Upload', + description: 'Upload data from you local computer', + iconSrc: this.createIconDataUrl('Upload'), + sidenavConfig: {component: UploadComponent, keepParent: true}, + }; + } + /** * Each operator type must have a method that returns * an icon as a data uri image. This provides a default diff --git a/projects/wave-core-new/src/lib/datasets/dataset.service.ts b/projects/wave-core-new/src/lib/datasets/dataset.service.ts index f57396aa..ee20e148 100644 --- a/projects/wave-core-new/src/lib/datasets/dataset.service.ts +++ b/projects/wave-core-new/src/lib/datasets/dataset.service.ts @@ -4,6 +4,8 @@ import {Observable} from 'rxjs'; import {DataSet} from './dataset.model'; import {UserService} from '../users/user.service'; import {map, mergeMap} from 'rxjs/operators'; +import {HttpEvent} from '@angular/common/http'; +import {CreateDataSetDict, UploadResponseDict} from '../backend/backend.model'; @Injectable({ providedIn: 'root', @@ -17,4 +19,12 @@ export class DataSetService { map((dataSetDicts) => dataSetDicts.map((dict) => DataSet.fromDict(dict))), ); } + + upload(form: FormData): Observable> { + return this.userService.getSessionStream().pipe(mergeMap((session) => this.backend.upload(session.sessionToken, form))); + } + + createDataSet(create: CreateDataSetDict) { + return this.userService.getSessionStream().pipe(mergeMap((session) => this.backend.createDataSet(session.sessionToken, create))); + } } diff --git a/projects/wave-core-new/src/lib/datasets/upload/upload.component.html b/projects/wave-core-new/src/lib/datasets/upload/upload.component.html new file mode 100644 index 00000000..3c7138b2 --- /dev/null +++ b/projects/wave-core-new/src/lib/datasets/upload/upload.component.html @@ -0,0 +1,58 @@ +Add Data + + + + Select files for upload + + + + +
+ +
+ +
+
+ + + + Specify loading information + + + +

Upload ID: {{ uploadId }}

+ +
Specify the loading info as Json
+ +
+ + Choose an example + + + {{ option.name }} + + + +
+
+ +
+
+ +
+
+
+ + + + Upload succesful! + + + Dataset ID: {{ dataSetId.id.Internal }} + diff --git a/projects/wave-core-new/src/lib/datasets/upload/upload.component.scss b/projects/wave-core-new/src/lib/datasets/upload/upload.component.scss new file mode 100644 index 00000000..68c3b650 --- /dev/null +++ b/projects/wave-core-new/src/lib/datasets/upload/upload.component.scss @@ -0,0 +1,7 @@ +.actions { + padding: 1rem; +} + +mat-card { + margin-bottom: 1rem; +} diff --git a/projects/wave-core-new/src/lib/datasets/upload/upload.component.ts b/projects/wave-core-new/src/lib/datasets/upload/upload.component.ts new file mode 100644 index 00000000..3f847c2d --- /dev/null +++ b/projects/wave-core-new/src/lib/datasets/upload/upload.component.ts @@ -0,0 +1,188 @@ +import {HttpEventType} from '@angular/common/http'; +import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; +import {BehaviorSubject, Subject} from 'rxjs'; +import {DataSetIdDict, UploadResponseDict, UUID} from '../../backend/backend.model'; +import {NotificationService} from '../../notification.service'; +import {DataSetService} from '../dataset.service'; + +interface ExampleLoadingInfo { + name: string; + json: string; +} + +@Component({ + selector: 'wave-upload', + templateUrl: './upload.component.html', + styleUrls: ['./upload.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class UploadComponent implements OnInit { + selectedFiles: FileList; + progress$ = new Subject(); + submittedUpload = false; + submittedCreate = false; + + uploadId$: Subject = new Subject(); + + dataSetId$: Subject = new Subject(); + + exampleLoadingInfos: Array = [ + { + name: 'NDVI', + json: `{ + "properties": { + "id": null, + "name": "Uploaded NDVI", + "description": "NDVI data from MODIS", + "source_operator": "GdalSource" + }, + "meta_data": { + "GdalMetaDataRegular": { + "result_descriptor": { + "data_type": "U8", + "spatial_reference": "EPSG:4326", + "measurement": "unitless" + }, + "params": { + "file_path": "operators/test-data/raster/modis_ndvi/MOD13A2_M_NDVI_%%%_START_TIME_%%%.TIFF", + "rasterband_channel": 1, + "geo_transform": { + "origin_coordinate": { + "x": -180.0, + "y": 90.0 + }, + "x_pixel_size": 0.1, + "y_pixel_size": -0.1 + }, + "bbox": { + "lower_left_coordinate": { + "x": -180.0, + "y": -90.0 + }, + "upper_right_coordinate": { + "x": 180.0, + "y": 90.0 + } + }, + "file_not_found_handling": "NoData" + }, + "placeholder": "%%%_START_TIME_%%%", + "time_format": "%Y-%m-%d", + "start": 1388534400000, + "step": { + "granularity": "Months", + "step": 1 + } + } + } + }`, + }, + { + name: 'Ports', + json: `{ + "properties": { + "id": null, + "name": "Uploaded Natural Earth 10m Ports", + "description": "Ports from Natural Earth", + "source_operator": "OgrSource" + }, + "meta_data": { + "OgrMetaData": { + "loading_info": { + "file_name": "operators/test-data/vector/data/ne_10m_ports/ne_10m_ports.shp", + "layer_name": "ne_10m_ports", + "data_type": "MultiPoint", + "time": "none", + "columns": { + "x": "", + "y": null, + "numeric": [ + "natlscale" + ], + "decimal": [ + "scalerank" + ], + "textual": [ + "featurecla", + "name", + "website" + ] + }, + "default_geometry": null, + "force_ogr_time_filter": false, + "on_error": "skip", + "provenance": null + }, + "result_descriptor": { + "data_type": "MultiPoint", + "spatial_reference": "EPSG:4326", + "columns": { + "website": "Text", + "name": "Text", + "natlscale": "Number", + "scalerank": "Decimal", + "featurecla": "Text" + } + } + } + } + }`, + }, + ]; + + loadingInfo = ''; + + constructor(private dataSetService: DataSetService, private notificationService: NotificationService) {} + + ngOnInit(): void {} + + selectFiles(event): void { + this.selectedFiles = event.target.files; + console.log(this.selectedFiles); + } + + upload(): void { + const form = new FormData(); + + for (const file of Array.from(this.selectedFiles)) { + form.append('files[]', file, file.name); + } + + this.submittedUpload = true; + + this.dataSetService.upload(form).subscribe( + (event) => { + if (event.type === HttpEventType.UploadProgress) { + this.progress$.next(Math.round((100 * event.loaded) / event.total)); + } else if (event.type === HttpEventType.Response) { + this.uploadId$.next(event.body.id); + } + console.log(event); + }, + (err) => { + this.notificationService.error('File upload failed: ' + err); + }, + ); + } + + selectLoadingInfo(info: ExampleLoadingInfo) { + this.loadingInfo = info.json; + } + + submitLoadingInfo(uploadId: UUID) { + this.submittedCreate = true; + const create = { + upload: uploadId, + definition: JSON.parse(this.loadingInfo), + }; + + this.dataSetService.createDataSet(create).subscribe( + (id) => { + this.dataSetId$.next(id); + }, + (err) => { + this.notificationService.error('Create dataset failed: ' + err); + }, + ); + } +} diff --git a/projects/wave-core-new/src/lib/wave-core.module.ts b/projects/wave-core-new/src/lib/wave-core.module.ts index 20372d57..60c9c681 100644 --- a/projects/wave-core-new/src/lib/wave-core.module.ts +++ b/projects/wave-core-new/src/lib/wave-core.module.ts @@ -101,6 +101,7 @@ import {LineageGraphComponent} from './provenance/lineage-graph/lineage-graph.co import {MeanRasterPixelValuesOverTimeDialogComponent} from './operators/dialogs/mean-raster-pixel-values-over-time-dialog/mean-raster-pixel-values-over-time-dialog.component'; import {RasterVectorJoinComponent} from './operators/dialogs/raster-vector-join/raster-vector-join.component'; import {PointInPolygonFilterOperatorComponent} from './operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component'; +import {UploadComponent} from './datasets/upload/upload.component'; const MATERIAL_MODULES = [ MatAutocompleteModule, @@ -202,6 +203,7 @@ const WAVE_COMPONENTS = [ SymbologyVectorComponent, TimeConfigComponent, TimeInputComponent, + UploadComponent, VatLogoComponent, VectorLegendComponent, VegaViewerComponent, diff --git a/projects/wave-core-new/src/public-api.ts b/projects/wave-core-new/src/public-api.ts index cabe76f4..82576ae5 100644 --- a/projects/wave-core-new/src/public-api.ts +++ b/projects/wave-core-new/src/public-api.ts @@ -23,6 +23,7 @@ export * from './lib/colors/colormap-colorizer/colormap-colorizer.component'; export * from './lib/datasets/add-data/add-data.component'; export * from './lib/datasets/dataset-list/dataset-list.component'; export * from './lib/datasets/dataset/dataset.component'; +export * from './lib/datasets/upload/upload.component'; export * from './lib/dialogs/dialog-header/dialog-header.component'; export * from './lib/dialogs/dialog-help/dialog-help.component'; export * from './lib/dialogs/dialog-section-heading/dialog-section-heading.component'; From e2d60fdc3db3d344c62337866ce70869512bc127 Mon Sep 17 00:00:00 2001 From: Michael Mattig Date: Wed, 24 Mar 2021 19:24:51 +0100 Subject: [PATCH 02/17] prettier --- .../wave-core-new/src/lib/datasets/dataset.service.ts | 2 +- .../src/lib/datasets/upload/upload.component.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/projects/wave-core-new/src/lib/datasets/dataset.service.ts b/projects/wave-core-new/src/lib/datasets/dataset.service.ts index ee20e148..a282e4d9 100644 --- a/projects/wave-core-new/src/lib/datasets/dataset.service.ts +++ b/projects/wave-core-new/src/lib/datasets/dataset.service.ts @@ -24,7 +24,7 @@ export class DataSetService { return this.userService.getSessionStream().pipe(mergeMap((session) => this.backend.upload(session.sessionToken, form))); } - createDataSet(create: CreateDataSetDict) { + createDataSet(create: CreateDataSetDict): Observable { return this.userService.getSessionStream().pipe(mergeMap((session) => this.backend.createDataSet(session.sessionToken, create))); } } diff --git a/projects/wave-core-new/src/lib/datasets/upload/upload.component.ts b/projects/wave-core-new/src/lib/datasets/upload/upload.component.ts index 3f847c2d..cebd43ad 100644 --- a/projects/wave-core-new/src/lib/datasets/upload/upload.component.ts +++ b/projects/wave-core-new/src/lib/datasets/upload/upload.component.ts @@ -1,7 +1,7 @@ import {HttpEventType} from '@angular/common/http'; import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; -import {BehaviorSubject, Subject} from 'rxjs'; -import {DataSetIdDict, UploadResponseDict, UUID} from '../../backend/backend.model'; +import {Subject} from 'rxjs'; +import {DataSetIdDict, UUID} from '../../backend/backend.model'; import {NotificationService} from '../../notification.service'; import {DataSetService} from '../dataset.service'; @@ -165,11 +165,11 @@ export class UploadComponent implements OnInit { ); } - selectLoadingInfo(info: ExampleLoadingInfo) { + selectLoadingInfo(info: ExampleLoadingInfo): void { this.loadingInfo = info.json; } - submitLoadingInfo(uploadId: UUID) { + submitLoadingInfo(uploadId: UUID): void { this.submittedCreate = true; const create = { upload: uploadId, From c4343fc66306430154e75232fe8bae110eb76a4d Mon Sep 17 00:00:00 2001 From: Michael Mattig Date: Thu, 25 Mar 2021 16:24:37 +0100 Subject: [PATCH 03/17] use util function --- .../datasets/add-data/add-data.component.ts | 40 ++----------------- .../src/lib/datasets/dataset.service.ts | 2 +- 2 files changed, 4 insertions(+), 38 deletions(-) diff --git a/projects/wave-core-new/src/lib/datasets/add-data/add-data.component.ts b/projects/wave-core-new/src/lib/datasets/add-data/add-data.component.ts index a2c57478..d47d3f77 100644 --- a/projects/wave-core-new/src/lib/datasets/add-data/add-data.component.ts +++ b/projects/wave-core-new/src/lib/datasets/add-data/add-data.component.ts @@ -1,5 +1,6 @@ import {Component, OnInit, ChangeDetectionStrategy, Input} from '@angular/core'; import {LayoutService, SidenavConfig} from '../../layout.service'; +import {createIconDataUrl} from '../../util/icons'; import {DatasetListComponent} from '../dataset-list/dataset-list.component'; import {UploadComponent} from '../upload/upload.component'; @@ -43,7 +44,7 @@ export class AddDataComponent implements OnInit { return { name: 'Data Sets', description: 'Available Data Sets', - iconSrc: this.createIconDataUrl('DataSets'), + iconSrc: createIconDataUrl('DataSets'), sidenavConfig: {component: DatasetListComponent, keepParent: true}, }; } @@ -52,43 +53,8 @@ export class AddDataComponent implements OnInit { return { name: 'Upload', description: 'Upload data from you local computer', - iconSrc: this.createIconDataUrl('Upload'), + iconSrc: createIconDataUrl('Upload'), sidenavConfig: {component: UploadComponent, keepParent: true}, }; } - - /** - * Each operator type must have a method that returns - * an icon as a data uri image. This provides a default - * out of the operator name. - */ - static createIconDataUrl(iconName: string): string { - // TODO: replace with proper icons - // from `http://stackoverflow.com/questions/3426404/ - // create-a-hexadecimal-colour-based-on-a-string-with-javascript` - const hashCode = (str: string): number => { - // java String#hashCode - let hash = 0; - for (let i = 0; i < str.length; i++) { - hash = str.charCodeAt(i) + ((hash << 5) - hash); // eslint-disable-line no-bitwise - } - return hash; - }; - const intToRGB = (i: number): string => { - const c = (i & 0x00ffffff).toString(16).toUpperCase(); // eslint-disable-line no-bitwise - - return '00000'.substring(0, 6 - c.length) + c; - }; - - const color = '#' + intToRGB(hashCode(iconName)); - const size = 64; - - const canvas = document.createElement('canvas'); - canvas.width = size; - canvas.height = size; - const context = canvas.getContext('2d'); - context.fillStyle = color; - context.fillRect(0, 0, 64, 64); - return canvas.toDataURL('image/png'); - } } diff --git a/projects/wave-core-new/src/lib/datasets/dataset.service.ts b/projects/wave-core-new/src/lib/datasets/dataset.service.ts index a282e4d9..cec6f3fe 100644 --- a/projects/wave-core-new/src/lib/datasets/dataset.service.ts +++ b/projects/wave-core-new/src/lib/datasets/dataset.service.ts @@ -5,7 +5,7 @@ import {DataSet} from './dataset.model'; import {UserService} from '../users/user.service'; import {map, mergeMap} from 'rxjs/operators'; import {HttpEvent} from '@angular/common/http'; -import {CreateDataSetDict, UploadResponseDict} from '../backend/backend.model'; +import {CreateDataSetDict, DataSetIdDict, UploadResponseDict} from '../backend/backend.model'; @Injectable({ providedIn: 'root', From d8c6ed229655aa08bd88a0cb90acbe9d60086637 Mon Sep 17 00:00:00 2001 From: Michael Mattig Date: Thu, 25 Mar 2021 16:31:31 +0100 Subject: [PATCH 04/17] get session only once --- projects/wave-core-new/src/lib/datasets/dataset.service.ts | 4 ++-- proxy-data-atlas.conf.json | 2 +- proxy-geoengine.conf.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/projects/wave-core-new/src/lib/datasets/dataset.service.ts b/projects/wave-core-new/src/lib/datasets/dataset.service.ts index cec6f3fe..d177ea44 100644 --- a/projects/wave-core-new/src/lib/datasets/dataset.service.ts +++ b/projects/wave-core-new/src/lib/datasets/dataset.service.ts @@ -21,10 +21,10 @@ export class DataSetService { } upload(form: FormData): Observable> { - return this.userService.getSessionStream().pipe(mergeMap((session) => this.backend.upload(session.sessionToken, form))); + return this.userService.getSessionTokenForRequest().pipe(mergeMap((token) => this.backend.upload(token, form))); } createDataSet(create: CreateDataSetDict): Observable { - return this.userService.getSessionStream().pipe(mergeMap((session) => this.backend.createDataSet(session.sessionToken, create))); + return this.userService.getSessionTokenForRequest().pipe(mergeMap((token) => this.backend.createDataSet(token, create))); } } diff --git a/proxy-data-atlas.conf.json b/proxy-data-atlas.conf.json index fdb6aec6..9f5b82fd 100644 --- a/proxy-data-atlas.conf.json +++ b/proxy-data-atlas.conf.json @@ -1,6 +1,6 @@ { "/api/*": { - "target": "http://pc12736.mathematik.uni-marburg.de:7777/api", + "target": "http://localhost:3030/", "changeOrigin": true, "pathRewrite": { "^/api": "" diff --git a/proxy-geoengine.conf.json b/proxy-geoengine.conf.json index 8a553f33..9f5b82fd 100644 --- a/proxy-geoengine.conf.json +++ b/proxy-geoengine.conf.json @@ -1,6 +1,6 @@ { "/api/*": { - "target": "http://pc12608.mathematik.uni-marburg.de:3030/", + "target": "http://localhost:3030/", "changeOrigin": true, "pathRewrite": { "^/api": "" From 7b114b945855735e9b45be3e93d131ce8ee7199c Mon Sep 17 00:00:00 2001 From: Michael Mattig Date: Thu, 25 Mar 2021 16:53:30 +0100 Subject: [PATCH 05/17] clean up --- .../src/lib/datasets/upload/upload.component.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/projects/wave-core-new/src/lib/datasets/upload/upload.component.ts b/projects/wave-core-new/src/lib/datasets/upload/upload.component.ts index cebd43ad..a8c9a9ee 100644 --- a/projects/wave-core-new/src/lib/datasets/upload/upload.component.ts +++ b/projects/wave-core-new/src/lib/datasets/upload/upload.component.ts @@ -18,7 +18,7 @@ interface ExampleLoadingInfo { }) export class UploadComponent implements OnInit { selectedFiles: FileList; - progress$ = new Subject(); + progress$ = new Subject(); submittedUpload = false; submittedCreate = false; @@ -132,13 +132,12 @@ export class UploadComponent implements OnInit { loadingInfo = ''; - constructor(private dataSetService: DataSetService, private notificationService: NotificationService) {} + constructor(protected dataSetService: DataSetService, protected notificationService: NotificationService) {} ngOnInit(): void {} selectFiles(event): void { this.selectedFiles = event.target.files; - console.log(this.selectedFiles); } upload(): void { @@ -157,7 +156,6 @@ export class UploadComponent implements OnInit { } else if (event.type === HttpEventType.Response) { this.uploadId$.next(event.body.id); } - console.log(event); }, (err) => { this.notificationService.error('File upload failed: ' + err); From a8cbb474f3f1221fa3337b4ac699d2d31feaccbd Mon Sep 17 00:00:00 2001 From: Michael Mattig Date: Thu, 25 Mar 2021 17:01:06 +0100 Subject: [PATCH 06/17] add core-new to build command --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7d9be299..a293141e 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "ng": "ng", "prettier": "prettier", "start": "ng serve", - "build": "npm run build-prod:core && npm run build-prod:wave && npm run build-prod:gfbio && npm run build-prod:nature40", + "build": "npm run build-prod:core && npm run build-prod:wave && npm run build-prod:gfbio && npm run build-prod:nature40 && npm run build-prod:core-new", "check": "prettier --check . && ng lint wave-core-new && ng lint geoengine-app && ng lint data-atlas-app", "ci-core": "ng build --prod wave-core-new", "serve:wave": "ng serve wave-app --proxy-config proxy.conf.json", From 248d3f5eece38fe89b4109750e3adc753bb01392 Mon Sep 17 00:00:00 2001 From: Christian Beilschmidt Date: Thu, 25 Mar 2021 17:06:55 +0100 Subject: [PATCH 07/17] delete unnecessary folders --- angular.json | 429 +- custom_typings/darge-d3.d.ts | 38 - custom_typings/proj4.d.ts | 25 - projects/gfbio-app/.eslintrc.json | 22 - projects/gfbio-app/browserslist | 12 - projects/gfbio-app/e2e/protractor.conf.js | 30 - projects/gfbio-app/e2e/src/app.e2e-spec.ts | 25 - projects/gfbio-app/e2e/src/app.po.ts | 11 - projects/gfbio-app/e2e/tsconfig.json | 9 - projects/gfbio-app/karma.conf.js | 32 - projects/gfbio-app/src/app-theme.scss | 82 - .../gfbio-app/src/app/app-config.service.ts | 42 - projects/gfbio-app/src/app/app.component.html | 87 - projects/gfbio-app/src/app/app.component.scss | 135 - projects/gfbio-app/src/app/app.component.ts | 488 -- projects/gfbio-app/src/app/app.module.ts | 98 - .../splash-dialog.component.html | 25 - .../splash-dialog.component.scss | 12 - .../splash-dialog/splash-dialog.component.ts | 20 - .../src/app/help/help.component.html | 33 - .../src/app/help/help.component.scss | 14 - .../gfbio-app/src/app/help/help.component.ts | 13 - .../src/app/login/login.component.html | 30 - .../src/app/login/login.component.scss | 29 - .../src/app/login/login.component.ts | 72 - .../abcd-repository.component.html | 23 - .../abcd-repository.component.scss | 36 - .../abcd-repository.component.ts | 135 - .../dialogs/abcd-repository/abcd.model.ts | 6 - .../operators/dialogs/baskets/csv.model.ts | 46 - .../baskets/gfbio-basket-result.component.ts | 62 - .../dialogs/baskets/gfbio-basket.model.ts | 71 - .../dialogs/baskets/gfbio-basket.pipe.ts | 54 - .../baskets/gfbio-baskets.component.html | 55 - .../baskets/gfbio-baskets.component.scss | 30 - .../baskets/gfbio-baskets.component.ts | 111 - .../grouped-abcd-basket-result.component.html | 64 - .../grouped-abcd-basket-result.component.scss | 33 - .../grouped-abcd-basket-result.component.ts | 135 - .../pangaea-basket-result.component.html | 40 - .../pangaea-basket-result.component.scss | 33 - .../pangaea-basket-result.component.ts | 98 - .../dialogs/baskets/pangaea.model.ts | 5 - .../terminology-lookup.component.html | 72 - .../terminology-lookup.component.scss | 24 - .../terminology-lookup.component.ts | 316 - .../operators/types/abcd-source-type.model.ts | 107 - .../types/pangaea-source-type.model.ts | 92 - .../types/terminology-lookup-type.ts | 150 - .../src/app/queries/mapping-query.service.ts | 137 - .../gfbio-app/src/app/users/user.service.ts | 129 - projects/gfbio-app/src/assets/.gitignore | 1 - projects/gfbio-app/src/assets/.gitkeep | 0 .../src/assets/abcd-mandatory-fields.json | 290 - projects/gfbio-app/src/assets/logo_gfbio.png | Bin 8669 -> 0 bytes projects/gfbio-app/src/assets/widget.xml | 54 - .../src/environments/environment.prod.ts | 3 - .../gfbio-app/src/environments/environment.ts | 16 - projects/gfbio-app/src/favicon.ico | Bin 16958 -> 0 bytes projects/gfbio-app/src/index.html | 84 - projects/gfbio-app/src/main.ts | 13 - projects/gfbio-app/src/polyfills.ts | 62 - projects/gfbio-app/src/styles.scss | 22 - projects/gfbio-app/src/test.ts | 23 - projects/gfbio-app/tsconfig.app.json | 12 - projects/gfbio-app/tsconfig.spec.json | 9 - projects/nature40-app/.eslintrc.json | 22 - projects/nature40-app/browserslist | 12 - projects/nature40-app/e2e/protractor.conf.js | 30 - projects/nature40-app/e2e/src/app.e2e-spec.ts | 25 - projects/nature40-app/e2e/src/app.po.ts | 11 - projects/nature40-app/e2e/tsconfig.json | 9 - projects/nature40-app/karma.conf.js | 32 - projects/nature40-app/src/app-theme.scss | 181 - .../src/app/app-config.service.ts | 32 - .../nature40-app/src/app/app.component.html | 81 - .../nature40-app/src/app/app.component.scss | 119 - .../nature40-app/src/app/app.component.ts | 364 - projects/nature40-app/src/app/app.module.ts | 58 - .../nature40-catalog.component.html | 39 - .../nature40-catalog.component.scss | 16 - .../nature40-catalog.component.ts | 205 - .../src/app/users/login/login.component.html | 30 - .../src/app/users/login/login.component.scss | 24 - .../src/app/users/login/login.component.ts | 82 - .../src/app/users/nature40-user.service.ts | 104 - projects/nature40-app/src/assets/.gitignore | 1 - projects/nature40-app/src/assets/.gitkeep | 0 .../src/assets/icons/natur_40_logo.svg | 81 - .../src/environments/environment.prod.ts | 3 - .../src/environments/environment.ts | 16 - projects/nature40-app/src/favicon.ico | Bin 16958 -> 0 bytes projects/nature40-app/src/index.html | 84 - projects/nature40-app/src/main.ts | 13 - projects/nature40-app/src/polyfills.ts | 62 - projects/nature40-app/src/styles.scss | 22 - projects/nature40-app/src/test.ts | 23 - projects/nature40-app/tsconfig.app.json | 12 - projects/nature40-app/tsconfig.spec.json | 9 - projects/wave-app/.eslintrc.json | 22 - projects/wave-app/browserslist | 12 - projects/wave-app/e2e/protractor.conf.js | 30 - projects/wave-app/e2e/src/app.e2e-spec.ts | 25 - projects/wave-app/e2e/src/app.po.ts | 11 - projects/wave-app/e2e/tsconfig.json | 9 - projects/wave-app/karma.conf.js | 32 - projects/wave-app/src/app-theme.scss | 82 - .../wave-app/src/app/app-config.service.ts | 34 - projects/wave-app/src/app/app.component.html | 82 - projects/wave-app/src/app/app.component.scss | 115 - projects/wave-app/src/app/app.component.ts | 275 - projects/wave-app/src/app/app.module.ts | 54 - projects/wave-app/src/assets/.gitignore | 1 - projects/wave-app/src/assets/.gitkeep | 0 .../src/environments/environment.prod.ts | 3 - .../wave-app/src/environments/environment.ts | 16 - projects/wave-app/src/favicon.ico | Bin 16958 -> 0 bytes projects/wave-app/src/index.html | 84 - projects/wave-app/src/main.ts | 13 - projects/wave-app/src/polyfills.ts | 62 - projects/wave-app/src/styles.scss | 22 - projects/wave-app/src/test.ts | 23 - projects/wave-app/tsconfig.app.json | 12 - projects/wave-app/tsconfig.spec.json | 9 - projects/wave-core/.eslintrc.json | 18 - projects/wave-core/README.md | 25 - projects/wave-core/assets/.gitignore | 1 - projects/wave-core/assets/.gitkeep | 0 .../wave-core/assets/config.json.blueprint | 1 - projects/wave-core/assets/countries.geojson | 183 - .../wave-core/assets/csv-data-sources.json | 69 - .../MaterialIcons-Regular.eot | Bin 143258 -> 0 bytes .../MaterialIcons-Regular.ijmap | 1 - .../MaterialIcons-Regular.svg | 2373 ------ .../MaterialIcons-Regular.ttf | Bin 128180 -> 0 bytes .../MaterialIcons-Regular.woff | Bin 57620 -> 0 bytes .../MaterialIcons-Regular.woff2 | Bin 44300 -> 0 bytes .../fonts/material-design-icons/README.md | 8 - .../fonts/material-design-icons/codepoints | 932 --- .../material-design-icons/material-icons.css | 33 - .../pacifico/FwZY7-Qmy14u9lezJ-6D6MmTpA.woff2 | Bin 22420 -> 0 bytes .../pacifico/FwZY7-Qmy14u9lezJ-6H6Mk.woff2 | Bin 30928 -> 0 bytes .../pacifico/FwZY7-Qmy14u9lezJ-6I6MmTpA.woff2 | Bin 10312 -> 0 bytes .../pacifico/FwZY7-Qmy14u9lezJ-6J6MmTpA.woff2 | Bin 29412 -> 0 bytes .../pacifico/FwZY7-Qmy14u9lezJ-6K6MmTpA.woff2 | Bin 28896 -> 0 bytes .../assets/fonts/pacifico/pacifico.css | 41 - ...Y08sg57CNWQfKNvesZW2xOQ-xsNqO47m55DA.woff2 | Bin 1432 -> 0 bytes ...6m6pUHB-5mXQQnRJtnKITppOI_IvcXXDNrsc.woff2 | Bin 1388 -> 0 bytes ...6luXEYWpBSJvXCBJtnKITppOI_IvcXXDNrsc.woff2 | Bin 15504 -> 0 bytes .../fonts/roboto/CWB0XYA8bzo0kSThX0UTuA.woff2 | Bin 14584 -> 0 bytes ...8OzT71A3E1XOAjvesZW2xOQ-xsNqO47m55DA.woff2 | Bin 12008 -> 0 bytes ...OxyyTHEGMXX8kcRJtnKITppOI_IvcXXDNrsc.woff2 | Bin 9780 -> 0 bytes ...tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2 | Bin 14524 -> 0 bytes ...Sg9YCurV6PUkTORJtnKITppOI_IvcXXDNrsc.woff2 | Bin 7260 -> 0 bytes ...4gIq26G5XYbHsFBJtnKITppOI_IvcXXDNrsc.woff2 | Bin 4836 -> 0 bytes ...OpLzo-noMoG0miPesZW2xOQ-xsNqO47m55DA.woff2 | Bin 4896 -> 0 bytes ...ShpZSmG3z6VYwnRJtnKITppOI_IvcXXDNrsc.woff2 | Bin 11852 -> 0 bytes ...GeXAPcSbHtCeQI_esZW2xOQ-xsNqO47m55DA.woff2 | Bin 15832 -> 0 bytes ...g_cXG3rLvUsKT_fesZW2xOQ-xsNqO47m55DA.woff2 | Bin 9996 -> 0 bytes .../wave-core/assets/fonts/roboto/roboto.css | 114 - ...82MNkS5K0Q4rhqvesZW2xOQ-xsNqO47m55DA.woff2 | Bin 7208 -> 0 bytes .../wave-core/assets/gbif-default-fields.json | 14 - projects/wave-core/assets/geobon-logo.svg | 111 - projects/wave-core/assets/icons/cogs.svg | 67 - projects/wave-core/assets/icons/grid4_24.svg | 18 - projects/wave-core/assets/icons/grid5_24.svg | 27 - projects/wave-core/assets/icons/line_24.svg | 3 - projects/wave-core/assets/icons/point_24.svg | 3 - .../wave-core/assets/icons/polygon_24.svg | 3 - projects/wave-core/assets/images/lineage.png | Bin 66283 -> 0 bytes .../assets/images/logo-senckenberg.png | Bin 55773 -> 0 bytes .../wave-core/assets/images/logo_agdbs.png | Bin 42843 -> 0 bytes projects/wave-core/assets/images/logo_umr.png | Bin 19199 -> 0 bytes projects/wave-core/assets/images/overview.png | Bin 570821 -> 0 bytes .../assets/mapping-data-sources.json | 913 -- .../assets/operator-type-icons/expression.png | Bin 3247 -> 0 bytes projects/wave-core/assets/vat_logo.svg | 1 - projects/wave-core/karma.conf.js | 32 - projects/wave-core/ng-package.json | 44 - projects/wave-core/package.json | 29 - .../color-breakpoint.component.html | 38 - .../color-breakpoint.component.scss | 8 - .../color-breakpoint.component.ts | 114 - .../src/lib/colors/color-breakpoint.model.ts | 108 - projects/wave-core/src/lib/colors/color.ts | 223 - .../src/lib/colors/colorizer-data.model.ts | 307 - .../colorizer-editor.component.html | 36 - .../colorizer-editor.component.scss | 7 - .../colorizer-editor.component.ts | 170 - .../colormap-colorizer.component.html | 93 - .../colormap-colorizer.component.scss | 42 - .../colormap-colorizer.component.ts | 248 - .../colormap-name-to-colorizer-data.pipe.ts | 19 - .../lib/colors/colormaps/colormap.model.ts | 262 - .../lib/colors/colormaps/generic-colormaps.ts | 31 - .../colors/colormaps/moreland-colormaps.ts | 55 - .../src/lib/colors/colormaps/mpl-colormaps.ts | 1052 --- .../scientific-colormap.license | 21 - .../scientific-colormaps.ts | 7328 ----------------- projects/wave-core/src/lib/config.service.ts | 211 - .../audio/mediaview.audio.component.html | 17 - .../audio/mediaview.audio.component.scss | 34 - .../audio/mediaview.audio.component.ts | 48 - .../lib/datatable/mediaview/filename.pipe.ts | 22 - .../mediaview.image-dialog.component.html | 38 - .../mediaview.image-dialog.component.scss | 92 - .../mediaview.image-dialog.component.ts | 76 - .../image/mediaview.image.component.html | 35 - .../image/mediaview.image.component.scss | 66 - .../image/mediaview.image.component.ts | 79 - .../mediaview/mediaview.component.html | 29 - .../mediaview/mediaview.component.scss | 5 - .../mediaview/mediaview.component.ts | 177 - .../mediaview.playlist.component.html | 18 - .../mediaview.playlist.component.scss | 7 - .../playlist/mediaview.playlist.component.ts | 44 - .../video/mediaview.video.component.html | 17 - .../video/mediaview.video.component.scss | 34 - .../video/mediaview.video.component.ts | 48 - .../lib/datatable/table/table.component.html | 80 - .../lib/datatable/table/table.component.scss | 121 - .../lib/datatable/table/table.component.ts | 606 -- .../dialog-header.component.html | 8 - .../dialog-header.component.scss | 11 - .../dialog-header/dialog-header.component.ts | 12 - .../dialog-help/dialog-help.component.html | 11 - .../dialog-help/dialog-help.component.scss | 22 - .../dialog-help/dialog-help.component.ts | 13 - .../dialog-section-heading.component.html | 4 - .../dialog-section-heading.component.scss | 12 - .../dialog-section-heading.component.ts | 12 - .../lib/help/about/help-about.component.css | 0 .../lib/help/about/help-about.component.html | 18 - .../lib/help/about/help-about.component.ts | 13 - .../help/account/help-account.component.css | 0 .../help/account/help-account.component.html | 9 - .../help/account/help-account.component.ts | 13 - .../src/lib/help/data/help-data.component.css | 0 .../lib/help/data/help-data.component.html | 13 - .../src/lib/help/data/help-data.component.ts | 13 - .../lib/help/export/help-export.component.css | 0 .../help/export/help-export.component.html | 7 - .../lib/help/export/help-export.component.ts | 13 - .../feedback/help-feedback.component.html | 28 - .../feedback/help-feedback.component.scss | 8 - .../help/feedback/help-feedback.component.ts | 41 - .../help-general-information.component.css | 0 .../help-general-information.component.html | 13 - .../help-general-information.component.ts | 13 - .../src/lib/help/help.component.scss | 14 - .../wave-core/src/lib/help/help.component.ts | 11 - projects/wave-core/src/lib/help/help.html | 14 - .../help/lineage/help-lineage.component.css | 3 - .../help/lineage/help-lineage.component.html | 9 - .../help/lineage/help-lineage.component.ts | 13 - .../operators/help-operators.component.css | 0 .../operators/help-operators.component.html | 59 - .../operators/help-operators.component.ts | 13 - .../help/overview/help-overview.component.css | 3 - .../overview/help-overview.component.html | 68 - .../help/overview/help-overview.component.ts | 13 - .../quick-demo/help-quick-demo.component.css | 4 - .../quick-demo/help-quick-demo.component.html | 4 - .../quick-demo/help-quick-demo.component.ts | 13 - .../layer-export/layer-export.component.html | 36 - .../layer-export/layer-export.component.scss | 11 - .../layer-export/layer-export.component.ts | 113 - .../layer-share/layer-share.component.html | 10 - .../layer-share/layer-share.component.scss | 7 - .../layer-share/layer-share.component.ts | 43 - .../layers/dialogs/rename-layer.component.ts | 66 - .../line-icon/line-icon.component.scss | 0 .../line-icon/line-icon.component.svg | 10 - .../line-icon/line-icon.component.ts | 50 - .../point-icon/point-icon.component.scss | 0 .../point-icon/point-icon.component.svg | 12 - .../point-icon/point-icon.component.ts | 53 - .../polygon-icon/polygon-icon.component.scss | 0 .../polygon-icon/polygon-icon.component.svg | 10 - .../polygon-icon/polygon-icon.component.ts | 53 - .../raster-icon/raster-icon.component.scss | 6 - .../raster-icon/raster-icon.component.svg | 12 - .../raster-icon/raster-icon.component.ts | 90 - .../layer-list/layer-list.component.html | 253 - .../layer-list/layer-list.component.scss | 176 - .../layers/layer-list/layer-list.component.ts | 141 - .../wave-core/src/lib/layers/layer.model.ts | 341 - .../wave-core/src/lib/layers/layer.service.ts | 150 - .../mapping-raster-legend.component.html | 37 - .../mapping-raster-legend.component.scss | 35 - .../mapping-raster-legend.component.ts | 56 - .../legend-raster/raster-legend.component.ts | 13 - .../vector-legend-component.html | 40 - .../vector-legend.component.scss | 23 - .../legend-vector/vector-legend.component.ts | 83 - .../lib/layers/legend/legend.component.html | 1 - .../lib/layers/legend/legend.component.scss | 0 .../src/lib/layers/legend/legend.component.ts | 14 - .../stroke-dash-select.component.html | 9 - .../stroke-dash-select.component.scss | 0 .../stroke-dash-select.component.ts | 108 - .../symbology-editor.component.html | 87 - .../symbology-editor.component.scss | 12 - .../symbology-editor.component.ts | 70 - ...gy-raster-mapping-colorizer.component.html | 101 - ...gy-raster-mapping-colorizer.component.scss | 46 - ...logy-raster-mapping-colorizer.component.ts | 256 - .../symbology-raster.component.html | 18 - .../symbology-raster.component.scss | 23 - .../symbology-raster.component.ts | 27 - .../symbology-vector.component.html | 241 - .../symbology-vector.component.scss | 28 - .../symbology-vector.component.ts | 352 - .../lib/layers/symbology/symbology.model.ts | 710 -- projects/wave-core/src/lib/layout.service.ts | 367 - projects/wave-core/src/lib/logo.component.ts | 30 - .../map-container.component.html | 9 - .../map-container.component.scss | 9 - .../map-container/map-container.component.ts | 654 -- .../src/lib/map/map-layer.component.ts | 330 - projects/wave-core/src/lib/map/map.service.ts | 153 - .../wave-core/src/lib/map/style-creator.ts | 232 - .../zoom-handles/zoom-handles.component.html | 8 - .../zoom-handles/zoom-handles.component.scss | 3 - .../zoom-handles/zoom-handles.component.ts | 17 - .../wave-core/src/lib/notification.service.ts | 44 - .../src/lib/operators/datatype.model.ts | 217 - .../baskets/gfbio-basket-result.component.ts | 0 .../box-plot-operator.component.html | 91 - .../box-plot-operator.component.scss | 13 - .../box-plot-operator.component.ts | 125 - .../country-polygon-selection.component.html | 31 - .../country-polygon-selection.component.scss | 25 - .../country-polygon-selection.component.ts | 228 - .../csv-properties-template.component.html | 360 - .../csv-properties.component.scss | 35 - .../csv-properties.component.ts | 629 -- .../csv-table-template.component.html | 125 - .../csv-table/csv-table.component.scss | 212 - .../csv-table/csv-table.component.ts | 374 - .../csv/csv-dialog/csv-dialog.component.html | 46 - .../csv/csv-dialog/csv-dialog.component.scss | 14 - .../csv/csv-dialog/csv-dialog.component.ts | 258 - .../csv/csv-dialog/csv.properties.service.ts | 67 - .../csv-upload/csv-upload-style.component.css | 17 - .../csv-upload-template.component.html | 19 - .../csv/csv-upload/csv-upload.component.ts | 116 - .../operators/dialogs/csv/interval.enum.ts | 9 - .../data-repository.component.html | 46 - .../data-repository.component.scss | 34 - .../data-repository.component.ts | 25 - .../data-repository/mapping-source.model.ts | 191 - .../raster/source-dataset.component.html | 64 - .../raster/source-dataset.component.scss | 51 - .../raster/source-dataset.component.ts | 300 - .../vector-source-dataset.component.html | 53 - .../vector-source-dataset.component.scss | 48 - .../vector/vector-source-dataset.component.ts | 200 - .../ol-draw-features.component.html | 29 - .../ol-draw-features.component.scss | 8 - .../ol-draw-features.component.ts | 170 - .../expression-operator.component.html | 84 - .../expression-operator.component.scss | 30 - .../expression-operator.component.ts | 241 - .../featuredb-source-list.component.html | 19 - .../featuredb-source-list.component.scss | 15 - .../featuredb-source-list.component.ts | 87 - .../gbif-operator.component.html | 56 - .../gbif-operator.component.scss | 14 - .../gbif-operator/gbif-operator.component.ts | 322 - .../dialogs/heatmap/heatmap.component.html | 22 - .../dialogs/heatmap/heatmap.component.scss | 23 - .../dialogs/heatmap/heatmap.component.ts | 127 - .../layer-selection.component.html | 9 - .../layer-selection.component.scss | 4 - .../layer-selection.component.ts | 144 - .../multi-layer-selection.component.html | 40 - .../multi-layer-selection.component.scss | 13 - .../multi-layer-selection.component.ts | 252 - .../operator-output-name.component.html | 6 - .../operator-output-name.component.scss | 3 - .../operator-output-name.component.ts | 81 - .../reprojection-selection.component.html | 6 - .../reprojection-selection.component.scss | 3 - .../reprojection-selection.component.ts | 115 - .../histogram-operator.component.html | 60 - .../histogram-operator.component.scss | 30 - .../histogram-operator.component.ts | 156 - .../numeric-attribute-filter.component.html | 73 - .../numeric-attribute-filter.component.scss | 40 - .../numeric-attribute-filter.component.ts | 233 - .../operator-list.component.html | 14 - .../operator-list.component.scss | 7 - .../operator-list/operator-list.component.ts | 231 - .../pie-chart-operator.component.html | 32 - .../pie-chart-operator.component.scss | 20 - .../pie-chart-operator.component.ts | 68 - .../point-in-polygon-filter.component.html | 15 - .../point-in-polygon-filter.component.scss | 19 - .../point-in-polygon-filter.component.ts | 81 - .../r/r-operator/r-operator.component.html | 165 - .../r/r-operator/r-operator.component.scss | 51 - .../r/r-operator/r-operator.component.ts | 263 - .../r-script-load.component.html | 10 - .../r-script-load.component.scss | 15 - .../r-script-load/r-script-load.component.ts | 57 - .../r-script-save.component.html | 11 - .../r-script-save.component.scss | 19 - .../r-script-save/r-script-save.component.ts | 56 - .../raster-mask/raster-mask.component.html | 26 - .../raster-mask/raster-mask.component.scss | 16 - .../raster-mask/raster-mask.component.ts | 72 - .../raster-polygon-clip.component.html | 15 - .../raster-polygon-clip.component.scss | 19 - .../raster-polygon-clip.component.ts | 84 - .../raster-value-extraction.component.html | 34 - .../raster-value-extraction.component.scss | 24 - .../raster-value-extraction.component.ts | 242 - .../rgb-composite.component.html | 82 - .../rgb-composite.component.scss | 28 - .../rgb-composite/rgb-composite.component.ts | 250 - .../scatter-plot-operator.component.html | 55 - .../scatter-plot-operator.component.scss | 17 - .../scatter-plot-operator.component.ts | 68 - .../scatter-plot-operator.pipe.ts | 12 - .../source-operator-list.component.html | 30 - .../source-operator-list.component.scss | 32 - .../source-operator-list.component.ts | 149 - .../statistics-plot.component.html | 22 - .../statistics-plot.component.scss | 4 - .../statistics-plot.component.ts | 64 - .../textual-attribute-filter.component.html | 40 - .../textual-attribute-filter.component.scss | 24 - .../textual-attribute-filter.component.ts | 125 - .../time-plot-operator.component.html | 44 - .../time-plot-operator.component.scss | 20 - .../time-plot-operator.component.ts | 79 - .../operator-type-parameter-options.model.ts | 475 -- .../src/lib/operators/operator-type.model.ts | 129 - .../src/lib/operators/operator.model.ts | 455 - .../gdal-source-parameter-options.model.ts | 59 - ...t-workflow-parameter-slider.component.html | 16 - ...t-workflow-parameter-slider.component.scss | 9 - ...ist-workflow-parameter-slider.component.ts | 128 - .../type-parameter-options-factory.service.ts | 20 - .../src/lib/operators/projection.model.ts | 271 - .../src/lib/operators/result-type.model.ts | 108 - .../src/lib/operators/timeformat.model.ts | 18 - .../lib/operators/types/boxplot-type.model.ts | 152 - .../types/chronicle-db-source-type.model.ts | 155 - .../types/classification-type.model.ts | 95 - .../operators/types/csv-source-type.model.ts | 210 - .../operators/types/expression-type.model.ts | 107 - ...feature-collection-db-source-type.model.ts | 89 - .../operators/types/gdal-source-type.model.ts | 304 - .../types/gfbio-source-type.model.ts | 117 - .../lib/operators/types/heatmap-type.model.ts | 91 - .../operators/types/histogram-type.model.ts | 117 - .../lib/operators/types/msg-types.model.ts | 480 -- .../numeric-attribute-filter-type.model.ts | 104 - .../types/ogr-raw-source-type.model.ts | 155 - .../operators/types/ogr-source-type.model.ts | 102 - .../operators/types/piechart-type.model.ts | 117 - .../point-in-polygon-filter-type.model.ts | 64 - .../operators/types/projection-type.model.ts | 91 - .../operators/types/r-script-type.model.ts | 91 - .../types/raster-source-type.model.ts | 94 - .../raster-value-extraction-type.model.ts | 94 - .../types/rasterize-polygon-type.model.ts | 64 - .../types/rgba-composite-type.model.ts | 159 - .../operators/types/scatterplot-type.model.ts | 138 - .../operators/types/statistics-type.model.ts | 102 - .../types/temporal-aggregation-type.ts | 91 - .../textual-attribute-filter-type.model.ts | 119 - .../operators/types/timeplot-type.model.ts | 146 - .../operators/types/type-factory.service.ts | 119 - .../operators/types/wkt-source-type.model.ts | 91 - .../wave-core/src/lib/operators/unit.model.ts | 283 - .../plots/histogram/histogram.component.html | 3 - .../plots/histogram/histogram.component.scss | 76 - .../plots/histogram/histogram.component.ts | 553 -- ...-statistics-numeric-details.component.html | 26 - ...-statistics-numeric-details.component.scss | 4 - ...er-statistics-numeric-details.component.ts | 25 - ...-statistics-textual-details.component.html | 23 - ...-statistics-textual-details.component.scss | 4 - ...er-statistics-textual-details.component.ts | 22 - .../layer-statistics-view.component.html | 58 - .../layer-statistics-view.component.scss | 0 .../layer-statistics-view.component.ts | 29 - .../plot-detail-view.component.html | 29 - .../plot-detail-view.component.scss | 8 - .../plot-detail-view.component.ts | 73 - .../plots/plot-list/plot-list.component.html | 75 - .../plots/plot-list/plot-list.component.scss | 39 - .../plots/plot-list/plot-list.component.ts | 112 - .../wave-core/src/lib/plots/plot.model.ts | 80 - .../change-projection.component.html | 10 - .../change-projection.component.scss | 13 - .../change-projection.component.ts | 22 - .../load-project/load-project.component.html | 10 - .../load-project/load-project.component.scss | 27 - .../load-project/load-project.component.ts | 78 - .../src/lib/project/loading-state.model.ts | 9 - .../new-project/new-project.component.html | 28 - .../new-project/new-project.component.scss | 26 - .../new-project/new-project.component.ts | 74 - .../src/lib/project/project.model.ts | 189 - .../src/lib/project/project.service.spec.ts | 320 - .../src/lib/project/project.service.ts | 1157 --- .../save-project-as.component.html | 28 - .../save-project-as.component.scss | 22 - .../save-project-as.component.ts | 60 - ...low-parameter-choice-dialog.component.html | 26 - ...low-parameter-choice-dialog.component.scss | 11 - ...kflow-parameter-choice-dialog.component.ts | 42 - .../workspace-settings.component.html | 54 - .../workspace-settings.component.scss | 30 - .../workspace-settings.component.ts | 23 - .../lineage-graph.component.html | 30 - .../lineage-graph.component.scss | 126 - .../lineage-graph/lineage-graph.component.ts | 335 - .../provenance-list.component.html | 22 - .../provenance-list.component.scss | 51 - .../provenance-list.component.ts | 46 - .../src/lib/provenance/provenance.model.ts | 6 - .../src/lib/queries/feature-db.model.ts | 101 - .../src/lib/queries/geojson.model.ts | 18 - .../src/lib/queries/mapping-query.service.ts | 495 -- .../src/lib/queries/output-format.model.ts | 19 - .../output-formats/wcs-output-format.model.ts | 47 - .../output-formats/wfs-output-format.model.ts | 61 - .../lib/queries/request-parameters.model.ts | 91 - .../navigation/navigation.component.html | 12 - .../navigation/navigation.component.scss | 44 - .../navigation/navigation.component.ts | 130 - .../sidenav-container.component.html | 26 - .../sidenav-container.component.scss | 30 - .../sidenav-container.component.ts | 148 - .../sidenav-header.component.html | 1 - .../sidenav-header.component.scss | 3 - .../sidenav-header.component.ts | 20 - .../src/lib/sidenav/sidenav-ref.service.ts | 121 - .../sidenav-search.component.html | 1 - .../sidenav-search.component.scss | 3 - .../sidenav-search.component.ts | 36 - .../lib/spec/component-fixture-spec.helper.ts | 185 - .../src/lib/spec/select-spec.helper.ts | 54 - .../src/lib/spec/service-spec.helper.ts | 90 - .../lib/spec/test-id-component.directive.ts | 8 - .../lib/spec/wave-testing.configuration.ts | 83 - .../browser-storage-provider.model.ts | 109 - .../mapping-storage-provider.model.ts | 413 - .../src/lib/storage/storage-provider.model.ts | 97 - .../src/lib/storage/storage.service.ts | 213 - .../small-time-interaction.component.html | 17 - .../small-time-interaction.component.scss | 8 - .../small-time-interaction.component.ts | 71 - .../ticker-interaction.component.html | 20 - .../ticker-interaction.component.scss | 3 - .../ticker-interaction.component.ts | 68 - .../time-config/time-config.component.html | 49 - .../time-config/time-config.component.scss | 24 - .../time/time-config/time-config.component.ts | 119 - .../time/time-input/time-input.component.html | 70 - .../time/time-input/time-input.component.scss | 3 - .../time/time-input/time-input.component.ts | 91 - projects/wave-core/src/lib/time/time.model.ts | 214 - .../src/lib/users/login/login.component.html | 39 - .../src/lib/users/login/login.component.scss | 52 - .../src/lib/users/login/login.component.ts | 115 - .../wave-core/src/lib/users/user.model.ts | 45 - .../src/lib/users/user.service.spec.ts | 182 - .../wave-core/src/lib/users/user.service.ts | 569 -- .../util/components/code-editor.component.ts | 156 - .../lib/util/directives/if-guest.directive.ts | 23 - .../util/directives/if-logged-in.directive.ts | 23 - projects/wave-core/src/lib/util/errors.ts | 8 - .../wave-core/src/lib/util/form.validators.ts | 210 - .../pipes/breakpoint-to-css-string.pipe.ts | 10 - .../lib/util/pipes/css-string-to-rgba.pipe.ts | 37 - .../src/lib/util/pipes/highlight.pipe.ts | 20 - .../mapping-colorizer-to-gradient.pipe.ts | 46 - .../util/pipes/mapping-data-sources.pipe.ts | 30 - .../lib/util/pipes/rgba-to-css-string.pipe.ts | 8 - .../src/lib/util/pipes/safe-html.pipe.ts | 15 - .../src/lib/util/pipes/safe-style.pipe.ts | 15 - .../wave-core/src/lib/util/pipes/trim.pipe.ts | 14 - .../lib/util/services/random-color.service.ts | 35 - .../wave-core/src/lib/wave-core.module.ts | 391 - projects/wave-core/src/public-api.ts | 123 - projects/wave-core/src/test.ts | 24 - projects/wave-core/tsconfig.lib.json | 17 - projects/wave-core/tsconfig.lib.prod.json | 4 - projects/wave-core/tsconfig.spec.json | 9 - 595 files changed, 1 insertion(+), 55790 deletions(-) delete mode 100644 custom_typings/darge-d3.d.ts delete mode 100644 custom_typings/proj4.d.ts delete mode 100644 projects/gfbio-app/.eslintrc.json delete mode 100644 projects/gfbio-app/browserslist delete mode 100644 projects/gfbio-app/e2e/protractor.conf.js delete mode 100644 projects/gfbio-app/e2e/src/app.e2e-spec.ts delete mode 100644 projects/gfbio-app/e2e/src/app.po.ts delete mode 100644 projects/gfbio-app/e2e/tsconfig.json delete mode 100644 projects/gfbio-app/karma.conf.js delete mode 100644 projects/gfbio-app/src/app-theme.scss delete mode 100644 projects/gfbio-app/src/app/app-config.service.ts delete mode 100644 projects/gfbio-app/src/app/app.component.html delete mode 100644 projects/gfbio-app/src/app/app.component.scss delete mode 100644 projects/gfbio-app/src/app/app.component.ts delete mode 100644 projects/gfbio-app/src/app/app.module.ts delete mode 100644 projects/gfbio-app/src/app/dialogs/splash-dialog/splash-dialog.component.html delete mode 100644 projects/gfbio-app/src/app/dialogs/splash-dialog/splash-dialog.component.scss delete mode 100644 projects/gfbio-app/src/app/dialogs/splash-dialog/splash-dialog.component.ts delete mode 100644 projects/gfbio-app/src/app/help/help.component.html delete mode 100644 projects/gfbio-app/src/app/help/help.component.scss delete mode 100644 projects/gfbio-app/src/app/help/help.component.ts delete mode 100644 projects/gfbio-app/src/app/login/login.component.html delete mode 100644 projects/gfbio-app/src/app/login/login.component.scss delete mode 100644 projects/gfbio-app/src/app/login/login.component.ts delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd-repository.component.html delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd-repository.component.scss delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd-repository.component.ts delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd.model.ts delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/csv.model.ts delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-basket-result.component.ts delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-basket.model.ts delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-basket.pipe.ts delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-baskets.component.html delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-baskets.component.scss delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-baskets.component.ts delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component.html delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component.scss delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component.ts delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component.html delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component.scss delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component.ts delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea.model.ts delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/terminology-lookup/terminology-lookup.component.html delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/terminology-lookup/terminology-lookup.component.scss delete mode 100644 projects/gfbio-app/src/app/operators/dialogs/terminology-lookup/terminology-lookup.component.ts delete mode 100644 projects/gfbio-app/src/app/operators/types/abcd-source-type.model.ts delete mode 100644 projects/gfbio-app/src/app/operators/types/pangaea-source-type.model.ts delete mode 100644 projects/gfbio-app/src/app/operators/types/terminology-lookup-type.ts delete mode 100644 projects/gfbio-app/src/app/queries/mapping-query.service.ts delete mode 100644 projects/gfbio-app/src/app/users/user.service.ts delete mode 100644 projects/gfbio-app/src/assets/.gitignore delete mode 100644 projects/gfbio-app/src/assets/.gitkeep delete mode 100644 projects/gfbio-app/src/assets/abcd-mandatory-fields.json delete mode 100644 projects/gfbio-app/src/assets/logo_gfbio.png delete mode 100644 projects/gfbio-app/src/assets/widget.xml delete mode 100644 projects/gfbio-app/src/environments/environment.prod.ts delete mode 100644 projects/gfbio-app/src/environments/environment.ts delete mode 100644 projects/gfbio-app/src/favicon.ico delete mode 100644 projects/gfbio-app/src/index.html delete mode 100644 projects/gfbio-app/src/main.ts delete mode 100644 projects/gfbio-app/src/polyfills.ts delete mode 100644 projects/gfbio-app/src/styles.scss delete mode 100644 projects/gfbio-app/src/test.ts delete mode 100644 projects/gfbio-app/tsconfig.app.json delete mode 100644 projects/gfbio-app/tsconfig.spec.json delete mode 100644 projects/nature40-app/.eslintrc.json delete mode 100644 projects/nature40-app/browserslist delete mode 100644 projects/nature40-app/e2e/protractor.conf.js delete mode 100644 projects/nature40-app/e2e/src/app.e2e-spec.ts delete mode 100644 projects/nature40-app/e2e/src/app.po.ts delete mode 100644 projects/nature40-app/e2e/tsconfig.json delete mode 100644 projects/nature40-app/karma.conf.js delete mode 100644 projects/nature40-app/src/app-theme.scss delete mode 100644 projects/nature40-app/src/app/app-config.service.ts delete mode 100644 projects/nature40-app/src/app/app.component.html delete mode 100644 projects/nature40-app/src/app/app.component.scss delete mode 100644 projects/nature40-app/src/app/app.component.ts delete mode 100644 projects/nature40-app/src/app/app.module.ts delete mode 100644 projects/nature40-app/src/app/operators/dialogs/nature40-catalog/nature40-catalog.component.html delete mode 100644 projects/nature40-app/src/app/operators/dialogs/nature40-catalog/nature40-catalog.component.scss delete mode 100644 projects/nature40-app/src/app/operators/dialogs/nature40-catalog/nature40-catalog.component.ts delete mode 100644 projects/nature40-app/src/app/users/login/login.component.html delete mode 100644 projects/nature40-app/src/app/users/login/login.component.scss delete mode 100644 projects/nature40-app/src/app/users/login/login.component.ts delete mode 100644 projects/nature40-app/src/app/users/nature40-user.service.ts delete mode 100644 projects/nature40-app/src/assets/.gitignore delete mode 100644 projects/nature40-app/src/assets/.gitkeep delete mode 100644 projects/nature40-app/src/assets/icons/natur_40_logo.svg delete mode 100644 projects/nature40-app/src/environments/environment.prod.ts delete mode 100644 projects/nature40-app/src/environments/environment.ts delete mode 100644 projects/nature40-app/src/favicon.ico delete mode 100644 projects/nature40-app/src/index.html delete mode 100644 projects/nature40-app/src/main.ts delete mode 100644 projects/nature40-app/src/polyfills.ts delete mode 100644 projects/nature40-app/src/styles.scss delete mode 100644 projects/nature40-app/src/test.ts delete mode 100644 projects/nature40-app/tsconfig.app.json delete mode 100644 projects/nature40-app/tsconfig.spec.json delete mode 100644 projects/wave-app/.eslintrc.json delete mode 100644 projects/wave-app/browserslist delete mode 100644 projects/wave-app/e2e/protractor.conf.js delete mode 100644 projects/wave-app/e2e/src/app.e2e-spec.ts delete mode 100644 projects/wave-app/e2e/src/app.po.ts delete mode 100644 projects/wave-app/e2e/tsconfig.json delete mode 100644 projects/wave-app/karma.conf.js delete mode 100644 projects/wave-app/src/app-theme.scss delete mode 100644 projects/wave-app/src/app/app-config.service.ts delete mode 100644 projects/wave-app/src/app/app.component.html delete mode 100644 projects/wave-app/src/app/app.component.scss delete mode 100644 projects/wave-app/src/app/app.component.ts delete mode 100644 projects/wave-app/src/app/app.module.ts delete mode 100644 projects/wave-app/src/assets/.gitignore delete mode 100644 projects/wave-app/src/assets/.gitkeep delete mode 100644 projects/wave-app/src/environments/environment.prod.ts delete mode 100644 projects/wave-app/src/environments/environment.ts delete mode 100644 projects/wave-app/src/favicon.ico delete mode 100644 projects/wave-app/src/index.html delete mode 100644 projects/wave-app/src/main.ts delete mode 100644 projects/wave-app/src/polyfills.ts delete mode 100644 projects/wave-app/src/styles.scss delete mode 100644 projects/wave-app/src/test.ts delete mode 100644 projects/wave-app/tsconfig.app.json delete mode 100644 projects/wave-app/tsconfig.spec.json delete mode 100644 projects/wave-core/.eslintrc.json delete mode 100644 projects/wave-core/README.md delete mode 100644 projects/wave-core/assets/.gitignore delete mode 100644 projects/wave-core/assets/.gitkeep delete mode 100644 projects/wave-core/assets/config.json.blueprint delete mode 100644 projects/wave-core/assets/countries.geojson delete mode 100644 projects/wave-core/assets/csv-data-sources.json delete mode 100644 projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.eot delete mode 100644 projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.ijmap delete mode 100644 projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.svg delete mode 100644 projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.ttf delete mode 100644 projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.woff delete mode 100644 projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.woff2 delete mode 100644 projects/wave-core/assets/fonts/material-design-icons/README.md delete mode 100644 projects/wave-core/assets/fonts/material-design-icons/codepoints delete mode 100644 projects/wave-core/assets/fonts/material-design-icons/material-icons.css delete mode 100644 projects/wave-core/assets/fonts/pacifico/FwZY7-Qmy14u9lezJ-6D6MmTpA.woff2 delete mode 100644 projects/wave-core/assets/fonts/pacifico/FwZY7-Qmy14u9lezJ-6H6Mk.woff2 delete mode 100644 projects/wave-core/assets/fonts/pacifico/FwZY7-Qmy14u9lezJ-6I6MmTpA.woff2 delete mode 100644 projects/wave-core/assets/fonts/pacifico/FwZY7-Qmy14u9lezJ-6J6MmTpA.woff2 delete mode 100644 projects/wave-core/assets/fonts/pacifico/FwZY7-Qmy14u9lezJ-6K6MmTpA.woff2 delete mode 100644 projects/wave-core/assets/fonts/pacifico/pacifico.css delete mode 100644 projects/wave-core/assets/fonts/roboto/-2n2p-_Y08sg57CNWQfKNvesZW2xOQ-xsNqO47m55DA.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/-L14Jk06m6pUHB-5mXQQnRJtnKITppOI_IvcXXDNrsc.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/0eC6fl06luXEYWpBSJvXCBJtnKITppOI_IvcXXDNrsc.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/CWB0XYA8bzo0kSThX0UTuA.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/Fcx7Wwv8OzT71A3E1XOAjvesZW2xOQ-xsNqO47m55DA.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/Fl4y0QdOxyyTHEGMXX8kcRJtnKITppOI_IvcXXDNrsc.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/Hgo13k-tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/I3S1wsgSg9YCurV6PUkTORJtnKITppOI_IvcXXDNrsc.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/NYDWBdD4gIq26G5XYbHsFBJtnKITppOI_IvcXXDNrsc.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/NdF9MtnOpLzo-noMoG0miPesZW2xOQ-xsNqO47m55DA.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/Pru33qjShpZSmG3z6VYwnRJtnKITppOI_IvcXXDNrsc.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/ek4gzZ-GeXAPcSbHtCeQI_esZW2xOQ-xsNqO47m55DA.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/mErvLBYg_cXG3rLvUsKT_fesZW2xOQ-xsNqO47m55DA.woff2 delete mode 100644 projects/wave-core/assets/fonts/roboto/roboto.css delete mode 100644 projects/wave-core/assets/fonts/roboto/u0TOpm082MNkS5K0Q4rhqvesZW2xOQ-xsNqO47m55DA.woff2 delete mode 100644 projects/wave-core/assets/gbif-default-fields.json delete mode 100644 projects/wave-core/assets/geobon-logo.svg delete mode 100644 projects/wave-core/assets/icons/cogs.svg delete mode 100644 projects/wave-core/assets/icons/grid4_24.svg delete mode 100644 projects/wave-core/assets/icons/grid5_24.svg delete mode 100644 projects/wave-core/assets/icons/line_24.svg delete mode 100644 projects/wave-core/assets/icons/point_24.svg delete mode 100644 projects/wave-core/assets/icons/polygon_24.svg delete mode 100644 projects/wave-core/assets/images/lineage.png delete mode 100644 projects/wave-core/assets/images/logo-senckenberg.png delete mode 100644 projects/wave-core/assets/images/logo_agdbs.png delete mode 100644 projects/wave-core/assets/images/logo_umr.png delete mode 100644 projects/wave-core/assets/images/overview.png delete mode 100644 projects/wave-core/assets/mapping-data-sources.json delete mode 100644 projects/wave-core/assets/operator-type-icons/expression.png delete mode 100644 projects/wave-core/assets/vat_logo.svg delete mode 100644 projects/wave-core/karma.conf.js delete mode 100644 projects/wave-core/ng-package.json delete mode 100644 projects/wave-core/package.json delete mode 100644 projects/wave-core/src/lib/colors/color-breakpoint-component/color-breakpoint.component.html delete mode 100644 projects/wave-core/src/lib/colors/color-breakpoint-component/color-breakpoint.component.scss delete mode 100644 projects/wave-core/src/lib/colors/color-breakpoint-component/color-breakpoint.component.ts delete mode 100644 projects/wave-core/src/lib/colors/color-breakpoint.model.ts delete mode 100644 projects/wave-core/src/lib/colors/color.ts delete mode 100644 projects/wave-core/src/lib/colors/colorizer-data.model.ts delete mode 100644 projects/wave-core/src/lib/colors/colorizer-editor/colorizer-editor.component.html delete mode 100644 projects/wave-core/src/lib/colors/colorizer-editor/colorizer-editor.component.scss delete mode 100644 projects/wave-core/src/lib/colors/colorizer-editor/colorizer-editor.component.ts delete mode 100644 projects/wave-core/src/lib/colors/colormap-colorizer/colormap-colorizer.component.html delete mode 100644 projects/wave-core/src/lib/colors/colormap-colorizer/colormap-colorizer.component.scss delete mode 100644 projects/wave-core/src/lib/colors/colormap-colorizer/colormap-colorizer.component.ts delete mode 100644 projects/wave-core/src/lib/colors/colormap-colorizer/colormap-name-to-colorizer-data.pipe.ts delete mode 100644 projects/wave-core/src/lib/colors/colormaps/colormap.model.ts delete mode 100644 projects/wave-core/src/lib/colors/colormaps/generic-colormaps.ts delete mode 100644 projects/wave-core/src/lib/colors/colormaps/moreland-colormaps.ts delete mode 100644 projects/wave-core/src/lib/colors/colormaps/mpl-colormaps.ts delete mode 100644 projects/wave-core/src/lib/colors/colormaps/scientific-colormaps/scientific-colormap.license delete mode 100644 projects/wave-core/src/lib/colors/colormaps/scientific-colormaps/scientific-colormaps.ts delete mode 100644 projects/wave-core/src/lib/config.service.ts delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/audio/mediaview.audio.component.html delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/audio/mediaview.audio.component.scss delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/audio/mediaview.audio.component.ts delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/filename.pipe.ts delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/image-dialog/mediaview.image-dialog.component.html delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/image-dialog/mediaview.image-dialog.component.scss delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/image-dialog/mediaview.image-dialog.component.ts delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/image/mediaview.image.component.html delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/image/mediaview.image.component.scss delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/image/mediaview.image.component.ts delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/mediaview.component.html delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/mediaview.component.scss delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/mediaview.component.ts delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/playlist/mediaview.playlist.component.html delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/playlist/mediaview.playlist.component.scss delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/playlist/mediaview.playlist.component.ts delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/video/mediaview.video.component.html delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/video/mediaview.video.component.scss delete mode 100644 projects/wave-core/src/lib/datatable/mediaview/video/mediaview.video.component.ts delete mode 100644 projects/wave-core/src/lib/datatable/table/table.component.html delete mode 100644 projects/wave-core/src/lib/datatable/table/table.component.scss delete mode 100644 projects/wave-core/src/lib/datatable/table/table.component.ts delete mode 100644 projects/wave-core/src/lib/dialogs/dialog-header/dialog-header.component.html delete mode 100644 projects/wave-core/src/lib/dialogs/dialog-header/dialog-header.component.scss delete mode 100644 projects/wave-core/src/lib/dialogs/dialog-header/dialog-header.component.ts delete mode 100644 projects/wave-core/src/lib/dialogs/dialog-help/dialog-help.component.html delete mode 100644 projects/wave-core/src/lib/dialogs/dialog-help/dialog-help.component.scss delete mode 100644 projects/wave-core/src/lib/dialogs/dialog-help/dialog-help.component.ts delete mode 100644 projects/wave-core/src/lib/dialogs/dialog-section-heading/dialog-section-heading.component.html delete mode 100644 projects/wave-core/src/lib/dialogs/dialog-section-heading/dialog-section-heading.component.scss delete mode 100644 projects/wave-core/src/lib/dialogs/dialog-section-heading/dialog-section-heading.component.ts delete mode 100644 projects/wave-core/src/lib/help/about/help-about.component.css delete mode 100644 projects/wave-core/src/lib/help/about/help-about.component.html delete mode 100644 projects/wave-core/src/lib/help/about/help-about.component.ts delete mode 100644 projects/wave-core/src/lib/help/account/help-account.component.css delete mode 100644 projects/wave-core/src/lib/help/account/help-account.component.html delete mode 100644 projects/wave-core/src/lib/help/account/help-account.component.ts delete mode 100644 projects/wave-core/src/lib/help/data/help-data.component.css delete mode 100644 projects/wave-core/src/lib/help/data/help-data.component.html delete mode 100644 projects/wave-core/src/lib/help/data/help-data.component.ts delete mode 100644 projects/wave-core/src/lib/help/export/help-export.component.css delete mode 100644 projects/wave-core/src/lib/help/export/help-export.component.html delete mode 100644 projects/wave-core/src/lib/help/export/help-export.component.ts delete mode 100644 projects/wave-core/src/lib/help/feedback/help-feedback.component.html delete mode 100644 projects/wave-core/src/lib/help/feedback/help-feedback.component.scss delete mode 100644 projects/wave-core/src/lib/help/feedback/help-feedback.component.ts delete mode 100644 projects/wave-core/src/lib/help/general-information/help-general-information.component.css delete mode 100644 projects/wave-core/src/lib/help/general-information/help-general-information.component.html delete mode 100644 projects/wave-core/src/lib/help/general-information/help-general-information.component.ts delete mode 100644 projects/wave-core/src/lib/help/help.component.scss delete mode 100644 projects/wave-core/src/lib/help/help.component.ts delete mode 100644 projects/wave-core/src/lib/help/help.html delete mode 100644 projects/wave-core/src/lib/help/lineage/help-lineage.component.css delete mode 100644 projects/wave-core/src/lib/help/lineage/help-lineage.component.html delete mode 100644 projects/wave-core/src/lib/help/lineage/help-lineage.component.ts delete mode 100644 projects/wave-core/src/lib/help/operators/help-operators.component.css delete mode 100644 projects/wave-core/src/lib/help/operators/help-operators.component.html delete mode 100644 projects/wave-core/src/lib/help/operators/help-operators.component.ts delete mode 100644 projects/wave-core/src/lib/help/overview/help-overview.component.css delete mode 100644 projects/wave-core/src/lib/help/overview/help-overview.component.html delete mode 100644 projects/wave-core/src/lib/help/overview/help-overview.component.ts delete mode 100644 projects/wave-core/src/lib/help/quick-demo/help-quick-demo.component.css delete mode 100644 projects/wave-core/src/lib/help/quick-demo/help-quick-demo.component.html delete mode 100644 projects/wave-core/src/lib/help/quick-demo/help-quick-demo.component.ts delete mode 100644 projects/wave-core/src/lib/layers/dialogs/layer-export/layer-export.component.html delete mode 100644 projects/wave-core/src/lib/layers/dialogs/layer-export/layer-export.component.scss delete mode 100644 projects/wave-core/src/lib/layers/dialogs/layer-export/layer-export.component.ts delete mode 100644 projects/wave-core/src/lib/layers/dialogs/layer-share/layer-share.component.html delete mode 100644 projects/wave-core/src/lib/layers/dialogs/layer-share/layer-share.component.scss delete mode 100644 projects/wave-core/src/lib/layers/dialogs/layer-share/layer-share.component.ts delete mode 100644 projects/wave-core/src/lib/layers/dialogs/rename-layer.component.ts delete mode 100644 projects/wave-core/src/lib/layers/layer-icons/line-icon/line-icon.component.scss delete mode 100644 projects/wave-core/src/lib/layers/layer-icons/line-icon/line-icon.component.svg delete mode 100644 projects/wave-core/src/lib/layers/layer-icons/line-icon/line-icon.component.ts delete mode 100644 projects/wave-core/src/lib/layers/layer-icons/point-icon/point-icon.component.scss delete mode 100644 projects/wave-core/src/lib/layers/layer-icons/point-icon/point-icon.component.svg delete mode 100644 projects/wave-core/src/lib/layers/layer-icons/point-icon/point-icon.component.ts delete mode 100644 projects/wave-core/src/lib/layers/layer-icons/polygon-icon/polygon-icon.component.scss delete mode 100644 projects/wave-core/src/lib/layers/layer-icons/polygon-icon/polygon-icon.component.svg delete mode 100644 projects/wave-core/src/lib/layers/layer-icons/polygon-icon/polygon-icon.component.ts delete mode 100644 projects/wave-core/src/lib/layers/layer-icons/raster-icon/raster-icon.component.scss delete mode 100644 projects/wave-core/src/lib/layers/layer-icons/raster-icon/raster-icon.component.svg delete mode 100644 projects/wave-core/src/lib/layers/layer-icons/raster-icon/raster-icon.component.ts delete mode 100644 projects/wave-core/src/lib/layers/layer-list/layer-list.component.html delete mode 100644 projects/wave-core/src/lib/layers/layer-list/layer-list.component.scss delete mode 100644 projects/wave-core/src/lib/layers/layer-list/layer-list.component.ts delete mode 100644 projects/wave-core/src/lib/layers/layer.model.ts delete mode 100644 projects/wave-core/src/lib/layers/layer.service.ts delete mode 100644 projects/wave-core/src/lib/layers/legend/legend-raster/mapping-raster-legend.component.html delete mode 100644 projects/wave-core/src/lib/layers/legend/legend-raster/mapping-raster-legend.component.scss delete mode 100644 projects/wave-core/src/lib/layers/legend/legend-raster/mapping-raster-legend.component.ts delete mode 100644 projects/wave-core/src/lib/layers/legend/legend-raster/raster-legend.component.ts delete mode 100644 projects/wave-core/src/lib/layers/legend/legend-vector/vector-legend-component.html delete mode 100644 projects/wave-core/src/lib/layers/legend/legend-vector/vector-legend.component.scss delete mode 100644 projects/wave-core/src/lib/layers/legend/legend-vector/vector-legend.component.ts delete mode 100644 projects/wave-core/src/lib/layers/legend/legend.component.html delete mode 100644 projects/wave-core/src/lib/layers/legend/legend.component.scss delete mode 100644 projects/wave-core/src/lib/layers/legend/legend.component.ts delete mode 100644 projects/wave-core/src/lib/layers/symbology/stroke-dash-select/stroke-dash-select.component.html delete mode 100644 projects/wave-core/src/lib/layers/symbology/stroke-dash-select/stroke-dash-select.component.scss delete mode 100644 projects/wave-core/src/lib/layers/symbology/stroke-dash-select/stroke-dash-select.component.ts delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology-editor/symbology-editor.component.html delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology-editor/symbology-editor.component.scss delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology-editor/symbology-editor.component.ts delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster-mapping-colorizer.component.html delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster-mapping-colorizer.component.scss delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster-mapping-colorizer.component.ts delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster.component.html delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster.component.scss delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster.component.ts delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology-vectors/symbology-vector.component.html delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology-vectors/symbology-vector.component.scss delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology-vectors/symbology-vector.component.ts delete mode 100644 projects/wave-core/src/lib/layers/symbology/symbology.model.ts delete mode 100644 projects/wave-core/src/lib/layout.service.ts delete mode 100644 projects/wave-core/src/lib/logo.component.ts delete mode 100644 projects/wave-core/src/lib/map/map-container/map-container.component.html delete mode 100644 projects/wave-core/src/lib/map/map-container/map-container.component.scss delete mode 100644 projects/wave-core/src/lib/map/map-container/map-container.component.ts delete mode 100644 projects/wave-core/src/lib/map/map-layer.component.ts delete mode 100644 projects/wave-core/src/lib/map/map.service.ts delete mode 100644 projects/wave-core/src/lib/map/style-creator.ts delete mode 100644 projects/wave-core/src/lib/map/zoom-handles/zoom-handles.component.html delete mode 100644 projects/wave-core/src/lib/map/zoom-handles/zoom-handles.component.scss delete mode 100644 projects/wave-core/src/lib/map/zoom-handles/zoom-handles.component.ts delete mode 100644 projects/wave-core/src/lib/notification.service.ts delete mode 100644 projects/wave-core/src/lib/operators/datatype.model.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/baskets/gfbio-basket-result.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/box-plot-operator/box-plot-operator.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/box-plot-operator/box-plot-operator.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/box-plot-operator/box-plot-operator.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/country-polygon-selection/country-polygon-selection.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/country-polygon-selection/country-polygon-selection.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/country-polygon-selection/country-polygon-selection.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-properties/csv-properties-template.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-properties/csv-properties.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-properties/csv-properties.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-table/csv-table-template.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-table/csv-table.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-table/csv-table.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv-dialog.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv-dialog.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv-dialog.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv.properties.service.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-upload/csv-upload-style.component.css delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-upload/csv-upload-template.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/csv-upload/csv-upload.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/csv/interval.enum.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/data-repository/data-repository.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/data-repository/data-repository.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/data-repository/data-repository.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/data-repository/mapping-source.model.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/data-repository/raster/source-dataset.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/data-repository/raster/source-dataset.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/data-repository/raster/source-dataset.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/data-repository/vector/vector-source-dataset.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/data-repository/vector/vector-source-dataset.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/data-repository/vector/vector-source-dataset.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/draw-features/ol-draw-features.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/draw-features/ol-draw-features.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/draw-features/ol-draw-features.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/expression-operator/expression-operator.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/expression-operator/expression-operator.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/expression-operator/expression-operator.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/featuredb-source-list/featuredb-source-list.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/featuredb-source-list/featuredb-source-list.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/featuredb-source-list/featuredb-source-list.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/gbif-operator/gbif-operator.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/gbif-operator/gbif-operator.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/gbif-operator/gbif-operator.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/heatmap/heatmap.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/heatmap/heatmap.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/heatmap/heatmap.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/helpers/layer-selection/layer-selection.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/helpers/layer-selection/layer-selection.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/helpers/layer-selection/layer-selection.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/helpers/multi-layer-selection/multi-layer-selection.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/helpers/multi-layer-selection/multi-layer-selection.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/helpers/multi-layer-selection/multi-layer-selection.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/helpers/operator-output-name/operator-output-name.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/helpers/operator-output-name/operator-output-name.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/helpers/operator-output-name/operator-output-name.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/helpers/reprojection-selection/reprojection-selection.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/helpers/reprojection-selection/reprojection-selection.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/helpers/reprojection-selection/reprojection-selection.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/histogram-operator/histogram-operator.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/histogram-operator/histogram-operator.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/histogram-operator/histogram-operator.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/numeric-attribute-filter/numeric-attribute-filter.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/numeric-attribute-filter/numeric-attribute-filter.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/numeric-attribute-filter/numeric-attribute-filter.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/operator-list/operator-list.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/operator-list/operator-list.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/operator-list/operator-list.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/pie-chart-operator/pie-chart-operator.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/pie-chart-operator/pie-chart-operator.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/pie-chart-operator/pie-chart-operator.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/r/r-operator/r-operator.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/r/r-operator/r-operator.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/r/r-operator/r-operator.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/r/r-script-load/r-script-load.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/r/r-script-load/r-script-load.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/r/r-script-load/r-script-load.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/r/r-script-save/r-script-save.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/r/r-script-save/r-script-save.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/r/r-script-save/r-script-save.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/raster-mask/raster-mask.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/raster-mask/raster-mask.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/raster-mask/raster-mask.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/raster-polygon-clip/raster-polygon-clip.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/raster-polygon-clip/raster-polygon-clip.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/raster-polygon-clip/raster-polygon-clip.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/raster-value-extraction/raster-value-extraction.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/raster-value-extraction/raster-value-extraction.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/raster-value-extraction/raster-value-extraction.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/rgb-composite/rgb-composite.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/rgb-composite/rgb-composite.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/rgb-composite/rgb-composite.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.pipe.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/source-operator-list/source-operator-list.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/source-operator-list/source-operator-list.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/source-operator-list/source-operator-list.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/statistics-plot/statistics-plot.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/statistics-plot/statistics-plot.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/statistics-plot/statistics-plot.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/textual-attribute-filter/textual-attribute-filter.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/textual-attribute-filter/textual-attribute-filter.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/textual-attribute-filter/textual-attribute-filter.component.ts delete mode 100644 projects/wave-core/src/lib/operators/dialogs/time-plot-operator/time-plot-operator.component.html delete mode 100644 projects/wave-core/src/lib/operators/dialogs/time-plot-operator/time-plot-operator.component.scss delete mode 100644 projects/wave-core/src/lib/operators/dialogs/time-plot-operator/time-plot-operator.component.ts delete mode 100644 projects/wave-core/src/lib/operators/operator-type-parameter-options.model.ts delete mode 100644 projects/wave-core/src/lib/operators/operator-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/operator.model.ts delete mode 100644 projects/wave-core/src/lib/operators/parameter-options/gdal-source-parameter-options.model.ts delete mode 100644 projects/wave-core/src/lib/operators/parameter-options/layer-list-workflow-parameter-slider/layer-list-workflow-parameter-slider.component.html delete mode 100644 projects/wave-core/src/lib/operators/parameter-options/layer-list-workflow-parameter-slider/layer-list-workflow-parameter-slider.component.scss delete mode 100644 projects/wave-core/src/lib/operators/parameter-options/layer-list-workflow-parameter-slider/layer-list-workflow-parameter-slider.component.ts delete mode 100644 projects/wave-core/src/lib/operators/parameter-options/type-parameter-options-factory.service.ts delete mode 100644 projects/wave-core/src/lib/operators/projection.model.ts delete mode 100644 projects/wave-core/src/lib/operators/result-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/timeformat.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/boxplot-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/chronicle-db-source-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/classification-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/csv-source-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/expression-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/feature-collection-db-source-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/gdal-source-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/gfbio-source-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/heatmap-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/histogram-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/msg-types.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/numeric-attribute-filter-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/ogr-raw-source-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/ogr-source-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/piechart-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/point-in-polygon-filter-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/projection-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/r-script-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/raster-source-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/raster-value-extraction-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/rasterize-polygon-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/rgba-composite-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/scatterplot-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/statistics-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/temporal-aggregation-type.ts delete mode 100644 projects/wave-core/src/lib/operators/types/textual-attribute-filter-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/timeplot-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/types/type-factory.service.ts delete mode 100644 projects/wave-core/src/lib/operators/types/wkt-source-type.model.ts delete mode 100644 projects/wave-core/src/lib/operators/unit.model.ts delete mode 100644 projects/wave-core/src/lib/plots/histogram/histogram.component.html delete mode 100644 projects/wave-core/src/lib/plots/histogram/histogram.component.scss delete mode 100644 projects/wave-core/src/lib/plots/histogram/histogram.component.ts delete mode 100644 projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-numeric-details/layer-statistics-numeric-details.component.html delete mode 100644 projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-numeric-details/layer-statistics-numeric-details.component.scss delete mode 100644 projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-numeric-details/layer-statistics-numeric-details.component.ts delete mode 100644 projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-textual-details/layer-statistics-textual-details.component.html delete mode 100644 projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-textual-details/layer-statistics-textual-details.component.scss delete mode 100644 projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-textual-details/layer-statistics-textual-details.component.ts delete mode 100644 projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-view.component.html delete mode 100644 projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-view.component.scss delete mode 100644 projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-view.component.ts delete mode 100644 projects/wave-core/src/lib/plots/plot-detail-view/plot-detail-view.component.html delete mode 100644 projects/wave-core/src/lib/plots/plot-detail-view/plot-detail-view.component.scss delete mode 100644 projects/wave-core/src/lib/plots/plot-detail-view/plot-detail-view.component.ts delete mode 100644 projects/wave-core/src/lib/plots/plot-list/plot-list.component.html delete mode 100644 projects/wave-core/src/lib/plots/plot-list/plot-list.component.scss delete mode 100644 projects/wave-core/src/lib/plots/plot-list/plot-list.component.ts delete mode 100644 projects/wave-core/src/lib/plots/plot.model.ts delete mode 100644 projects/wave-core/src/lib/project/change-projection/change-projection.component.html delete mode 100644 projects/wave-core/src/lib/project/change-projection/change-projection.component.scss delete mode 100644 projects/wave-core/src/lib/project/change-projection/change-projection.component.ts delete mode 100644 projects/wave-core/src/lib/project/load-project/load-project.component.html delete mode 100644 projects/wave-core/src/lib/project/load-project/load-project.component.scss delete mode 100644 projects/wave-core/src/lib/project/load-project/load-project.component.ts delete mode 100644 projects/wave-core/src/lib/project/loading-state.model.ts delete mode 100644 projects/wave-core/src/lib/project/new-project/new-project.component.html delete mode 100644 projects/wave-core/src/lib/project/new-project/new-project.component.scss delete mode 100644 projects/wave-core/src/lib/project/new-project/new-project.component.ts delete mode 100644 projects/wave-core/src/lib/project/project.model.ts delete mode 100644 projects/wave-core/src/lib/project/project.service.spec.ts delete mode 100644 projects/wave-core/src/lib/project/project.service.ts delete mode 100644 projects/wave-core/src/lib/project/save-project-as/save-project-as.component.html delete mode 100644 projects/wave-core/src/lib/project/save-project-as/save-project-as.component.scss delete mode 100644 projects/wave-core/src/lib/project/save-project-as/save-project-as.component.ts delete mode 100644 projects/wave-core/src/lib/project/workflow-parameter-choice-dialog/workflow-parameter-choice-dialog.component.html delete mode 100644 projects/wave-core/src/lib/project/workflow-parameter-choice-dialog/workflow-parameter-choice-dialog.component.scss delete mode 100644 projects/wave-core/src/lib/project/workflow-parameter-choice-dialog/workflow-parameter-choice-dialog.component.ts delete mode 100644 projects/wave-core/src/lib/project/workspace-settings/workspace-settings.component.html delete mode 100644 projects/wave-core/src/lib/project/workspace-settings/workspace-settings.component.scss delete mode 100644 projects/wave-core/src/lib/project/workspace-settings/workspace-settings.component.ts delete mode 100644 projects/wave-core/src/lib/provenance/lineage-graph/lineage-graph.component.html delete mode 100644 projects/wave-core/src/lib/provenance/lineage-graph/lineage-graph.component.scss delete mode 100644 projects/wave-core/src/lib/provenance/lineage-graph/lineage-graph.component.ts delete mode 100644 projects/wave-core/src/lib/provenance/provenance-list/provenance-list.component.html delete mode 100644 projects/wave-core/src/lib/provenance/provenance-list/provenance-list.component.scss delete mode 100644 projects/wave-core/src/lib/provenance/provenance-list/provenance-list.component.ts delete mode 100644 projects/wave-core/src/lib/provenance/provenance.model.ts delete mode 100644 projects/wave-core/src/lib/queries/feature-db.model.ts delete mode 100644 projects/wave-core/src/lib/queries/geojson.model.ts delete mode 100644 projects/wave-core/src/lib/queries/mapping-query.service.ts delete mode 100644 projects/wave-core/src/lib/queries/output-format.model.ts delete mode 100644 projects/wave-core/src/lib/queries/output-formats/wcs-output-format.model.ts delete mode 100644 projects/wave-core/src/lib/queries/output-formats/wfs-output-format.model.ts delete mode 100644 projects/wave-core/src/lib/queries/request-parameters.model.ts delete mode 100644 projects/wave-core/src/lib/sidenav/navigation/navigation.component.html delete mode 100644 projects/wave-core/src/lib/sidenav/navigation/navigation.component.scss delete mode 100644 projects/wave-core/src/lib/sidenav/navigation/navigation.component.ts delete mode 100644 projects/wave-core/src/lib/sidenav/sidenav-container/sidenav-container.component.html delete mode 100644 projects/wave-core/src/lib/sidenav/sidenav-container/sidenav-container.component.scss delete mode 100644 projects/wave-core/src/lib/sidenav/sidenav-container/sidenav-container.component.ts delete mode 100644 projects/wave-core/src/lib/sidenav/sidenav-header/sidenav-header.component.html delete mode 100644 projects/wave-core/src/lib/sidenav/sidenav-header/sidenav-header.component.scss delete mode 100644 projects/wave-core/src/lib/sidenav/sidenav-header/sidenav-header.component.ts delete mode 100644 projects/wave-core/src/lib/sidenav/sidenav-ref.service.ts delete mode 100644 projects/wave-core/src/lib/sidenav/sidenav-search/sidenav-search.component.html delete mode 100644 projects/wave-core/src/lib/sidenav/sidenav-search/sidenav-search.component.scss delete mode 100644 projects/wave-core/src/lib/sidenav/sidenav-search/sidenav-search.component.ts delete mode 100644 projects/wave-core/src/lib/spec/component-fixture-spec.helper.ts delete mode 100644 projects/wave-core/src/lib/spec/select-spec.helper.ts delete mode 100644 projects/wave-core/src/lib/spec/service-spec.helper.ts delete mode 100644 projects/wave-core/src/lib/spec/test-id-component.directive.ts delete mode 100644 projects/wave-core/src/lib/spec/wave-testing.configuration.ts delete mode 100644 projects/wave-core/src/lib/storage/providers/browser-storage-provider.model.ts delete mode 100644 projects/wave-core/src/lib/storage/providers/mapping-storage-provider.model.ts delete mode 100644 projects/wave-core/src/lib/storage/storage-provider.model.ts delete mode 100644 projects/wave-core/src/lib/storage/storage.service.ts delete mode 100644 projects/wave-core/src/lib/time/small-time-interaction/small-time-interaction.component.html delete mode 100644 projects/wave-core/src/lib/time/small-time-interaction/small-time-interaction.component.scss delete mode 100644 projects/wave-core/src/lib/time/small-time-interaction/small-time-interaction.component.ts delete mode 100644 projects/wave-core/src/lib/time/ticker-interaction/ticker-interaction.component.html delete mode 100644 projects/wave-core/src/lib/time/ticker-interaction/ticker-interaction.component.scss delete mode 100644 projects/wave-core/src/lib/time/ticker-interaction/ticker-interaction.component.ts delete mode 100644 projects/wave-core/src/lib/time/time-config/time-config.component.html delete mode 100644 projects/wave-core/src/lib/time/time-config/time-config.component.scss delete mode 100644 projects/wave-core/src/lib/time/time-config/time-config.component.ts delete mode 100644 projects/wave-core/src/lib/time/time-input/time-input.component.html delete mode 100644 projects/wave-core/src/lib/time/time-input/time-input.component.scss delete mode 100644 projects/wave-core/src/lib/time/time-input/time-input.component.ts delete mode 100644 projects/wave-core/src/lib/time/time.model.ts delete mode 100644 projects/wave-core/src/lib/users/login/login.component.html delete mode 100644 projects/wave-core/src/lib/users/login/login.component.scss delete mode 100644 projects/wave-core/src/lib/users/login/login.component.ts delete mode 100644 projects/wave-core/src/lib/users/user.model.ts delete mode 100644 projects/wave-core/src/lib/users/user.service.spec.ts delete mode 100644 projects/wave-core/src/lib/users/user.service.ts delete mode 100644 projects/wave-core/src/lib/util/components/code-editor.component.ts delete mode 100644 projects/wave-core/src/lib/util/directives/if-guest.directive.ts delete mode 100644 projects/wave-core/src/lib/util/directives/if-logged-in.directive.ts delete mode 100644 projects/wave-core/src/lib/util/errors.ts delete mode 100644 projects/wave-core/src/lib/util/form.validators.ts delete mode 100644 projects/wave-core/src/lib/util/pipes/breakpoint-to-css-string.pipe.ts delete mode 100644 projects/wave-core/src/lib/util/pipes/css-string-to-rgba.pipe.ts delete mode 100644 projects/wave-core/src/lib/util/pipes/highlight.pipe.ts delete mode 100644 projects/wave-core/src/lib/util/pipes/mapping-colorizer-to-gradient.pipe.ts delete mode 100644 projects/wave-core/src/lib/util/pipes/mapping-data-sources.pipe.ts delete mode 100644 projects/wave-core/src/lib/util/pipes/rgba-to-css-string.pipe.ts delete mode 100644 projects/wave-core/src/lib/util/pipes/safe-html.pipe.ts delete mode 100644 projects/wave-core/src/lib/util/pipes/safe-style.pipe.ts delete mode 100644 projects/wave-core/src/lib/util/pipes/trim.pipe.ts delete mode 100644 projects/wave-core/src/lib/util/services/random-color.service.ts delete mode 100644 projects/wave-core/src/lib/wave-core.module.ts delete mode 100644 projects/wave-core/src/public-api.ts delete mode 100644 projects/wave-core/src/test.ts delete mode 100644 projects/wave-core/tsconfig.lib.json delete mode 100644 projects/wave-core/tsconfig.lib.prod.json delete mode 100644 projects/wave-core/tsconfig.spec.json diff --git a/angular.json b/angular.json index 753ba39d..672ff828 100644 --- a/angular.json +++ b/angular.json @@ -3,52 +3,6 @@ "version": 1, "newProjectRoot": "projects", "projects": { - "wave-core": { - "projectType": "library", - "schematics": { - "@schematics/angular:component": { - "changeDetection": "OnPush", - "inlineStyle": false, - "inlineTemplate": false, - "prefix": "wave", - "style": "scss" - }, - "@schematics/angular:directive": { - "prefix": "wave" - } - }, - "root": "projects/wave-core", - "sourceRoot": "projects/wave-core/src", - "prefix": "wave", - "architect": { - "build": { - "builder": "@angular-devkit/build-ng-packagr:build", - "options": { - "tsConfig": "projects/wave-core/tsconfig.lib.json", - "project": "projects/wave-core/ng-package.json" - }, - "configurations": { - "production": { - "tsConfig": "projects/wave-core/tsconfig.lib.prod.json" - } - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "projects/wave-core/src/test.ts", - "tsConfig": "projects/wave-core/tsconfig.spec.json", - "karmaConfig": "projects/wave-core/karma.conf.js" - } - }, - "lint": { - "builder": "@angular-eslint/builder:lint", - "options": { - "lintFilePatterns": ["projects/wave-core/**/*.ts", "projects/wave-core/**/*.html"] - } - } - } - }, "wave-core-new": { "projectType": "library", "schematics": { @@ -95,133 +49,6 @@ } } }, - "wave-app": { - "projectType": "application", - "schematics": { - "@schematics/angular:component": { - "changeDetection": "OnPush", - "inlineStyle": false, - "inlineTemplate": false, - "prefix": "wave-app", - "style": "scss" - }, - "@schematics/angular:directive": { - "prefix": "wave-app" - } - }, - "root": "projects/wave-app", - "sourceRoot": "projects/wave-app/src", - "prefix": "wave-app", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "allowedCommonJsDependencies": ["dagre-d3", "pbf"], - "outputPath": "dist/wave-app", - "index": "projects/wave-app/src/index.html", - "main": "projects/wave-app/src/main.ts", - "polyfills": "projects/wave-app/src/polyfills.ts", - "tsConfig": "projects/wave-app/tsconfig.app.json", - "aot": true, - "assets": [ - "projects/wave-app/src/favicon.ico", - "projects/wave-app/src/assets", - { - "glob": "**/*", - "input": "dist/wave-core/assets", - "output": "assets" - } - ], - "styles": [ - "projects/wave-app/src/styles.scss", - "dist/wave-core/assets/fonts/roboto/roboto.css", - "dist/wave-core/assets/fonts/pacifico/pacifico.css", - "dist/wave-core/assets/fonts/material-design-icons/material-icons.css", - "node_modules/codemirror/lib/codemirror.css", - "node_modules/ol/ol.css" - ], - "scripts": [] - }, - "configurations": { - "production": { - "fileReplacements": [ - { - "replace": "projects/wave-app/src/environments/environment.ts", - "with": "projects/wave-app/src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "extractCss": true, - "namedChunks": false, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "budgets": [ - { - "type": "initial", - "maximumWarning": "5mb", - "maximumError": "10mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "6kb", - "maximumError": "10kb" - } - ] - } - } - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "wave-app:build" - }, - "configurations": { - "production": { - "browserTarget": "wave-app:build:production" - } - } - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "wave-app:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "projects/wave-app/src/test.ts", - "polyfills": "projects/wave-app/src/polyfills.ts", - "tsConfig": "projects/wave-app/tsconfig.spec.json", - "karmaConfig": "projects/wave-app/karma.conf.js", - "assets": ["projects/wave-app/src/favicon.ico", "projects/wave-app/src/assets"], - "styles": ["projects/wave-app/src/styles.scss"], - "scripts": [] - } - }, - "lint": { - "builder": "@angular-eslint/builder:lint", - "options": { - "lintFilePatterns": ["projects/wave-app/**/*.ts", "projects/wave-app/**/*.html"] - } - }, - "e2e": { - "builder": "@angular-devkit/build-angular:protractor", - "options": { - "protractorConfig": "projects/wave-app/e2e/protractor.conf.js", - "devServerTarget": "wave-app:serve" - }, - "configurations": { - "production": { - "devServerTarget": "wave-app:serve:production" - } - } - } - } - }, "geoengine-app": { "projectType": "application", "schematics": { @@ -475,261 +302,7 @@ } } } - }, - "gfbio-app": { - "projectType": "application", - "schematics": { - "@schematics/angular:component": { - "changeDetection": "OnPush", - "inlineStyle": false, - "inlineTemplate": false, - "prefix": "wave-gfbio", - "style": "scss" - }, - "@schematics/angular:directive": { - "prefix": "wave-gfbio" - } - }, - "root": "projects/gfbio-app", - "sourceRoot": "projects/gfbio-app/src", - "prefix": "wave-gfbio", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "allowedCommonJsDependencies": ["dagre-d3", "pbf"], - "outputPath": "dist/gfbio-app", - "index": "projects/gfbio-app/src/index.html", - "main": "projects/gfbio-app/src/main.ts", - "polyfills": "projects/gfbio-app/src/polyfills.ts", - "tsConfig": "projects/gfbio-app/tsconfig.app.json", - "aot": true, - "assets": [ - "projects/gfbio-app/src/favicon.ico", - "projects/gfbio-app/src/assets", - { - "glob": "**/*", - "input": "dist/wave-core/assets", - "output": "assets" - } - ], - "styles": [ - "projects/gfbio-app/src/styles.scss", - "dist/wave-core/assets/fonts/roboto/roboto.css", - "dist/wave-core/assets/fonts/pacifico/pacifico.css", - "dist/wave-core/assets/fonts/material-design-icons/material-icons.css", - "node_modules/codemirror/lib/codemirror.css", - "node_modules/ol/ol.css" - ], - "scripts": [] - }, - "configurations": { - "production": { - "fileReplacements": [ - { - "replace": "projects/gfbio-app/src/environments/environment.ts", - "with": "projects/gfbio-app/src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "extractCss": true, - "namedChunks": false, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "budgets": [ - { - "type": "initial", - "maximumWarning": "5mb", - "maximumError": "10mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "6kb", - "maximumError": "10kb" - } - ] - } - } - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "gfbio-app:build" - }, - "configurations": { - "production": { - "browserTarget": "gfbio-app:build:production" - } - } - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "gfbio-app:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "projects/gfbio-app/src/test.ts", - "polyfills": "projects/gfbio-app/src/polyfills.ts", - "tsConfig": "projects/gfbio-app/tsconfig.spec.json", - "karmaConfig": "projects/gfbio-app/karma.conf.js", - "assets": ["projects/gfbio-app/src/favicon.ico", "projects/gfbio-app/src/assets"], - "styles": ["projects/gfbio-app/src/styles.scss"], - "scripts": [] - } - }, - "lint": { - "builder": "@angular-eslint/builder:lint", - "options": { - "lintFilePatterns": ["projects/gfbio-app/**/*.ts", "projects/gfbio-app/**/*.html"] - } - }, - "e2e": { - "builder": "@angular-devkit/build-angular:protractor", - "options": { - "protractorConfig": "projects/gfbio-app/e2e/protractor.conf.js", - "devServerTarget": "gfbio-app:serve" - }, - "configurations": { - "production": { - "devServerTarget": "gfbio-app:serve:production" - } - } - } - } - }, - "nature40-app": { - "projectType": "application", - "schematics": { - "@schematics/angular:component": { - "changeDetection": "OnPush", - "inlineStyle": false, - "inlineTemplate": false, - "prefix": "wave-nature40", - "style": "scss" - }, - "@schematics/angular:directive": { - "prefix": "wave-nature40" - } - }, - "root": "projects/nature40-app", - "sourceRoot": "projects/nature40-app/src", - "prefix": "wave-nature40", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "allowedCommonJsDependencies": ["dagre-d3", "pbf"], - "outputPath": "dist/nature40-app", - "index": "projects/nature40-app/src/index.html", - "main": "projects/nature40-app/src/main.ts", - "polyfills": "projects/nature40-app/src/polyfills.ts", - "tsConfig": "projects/nature40-app/tsconfig.app.json", - "aot": true, - "assets": [ - "projects/nature40-app/src/favicon.ico", - "projects/nature40-app/src/assets", - { - "glob": "**/*", - "input": "dist/wave-core/assets", - "output": "assets" - } - ], - "styles": [ - "projects/nature40-app/src/styles.scss", - "dist/wave-core/assets/fonts/roboto/roboto.css", - "dist/wave-core/assets/fonts/pacifico/pacifico.css", - "dist/wave-core/assets/fonts/material-design-icons/material-icons.css", - "node_modules/codemirror/lib/codemirror.css", - "node_modules/ol/ol.css" - ], - "scripts": [] - }, - "configurations": { - "production": { - "fileReplacements": [ - { - "replace": "projects/nature40-app/src/environments/environment.ts", - "with": "projects/nature40-app/src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "extractCss": true, - "namedChunks": false, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "budgets": [ - { - "type": "initial", - "maximumWarning": "5mb", - "maximumError": "10mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "6kb", - "maximumError": "10kb" - } - ] - } - } - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "nature40-app:build" - }, - "configurations": { - "production": { - "browserTarget": "nature40-app:build:production" - } - } - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "nature40-app:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "projects/nature40-app/src/test.ts", - "polyfills": "projects/nature40-app/src/polyfills.ts", - "tsConfig": "projects/nature40-app/tsconfig.spec.json", - "karmaConfig": "projects/nature40-app/karma.conf.js", - "assets": ["projects/nature40-app/src/favicon.ico", "projects/nature40-app/src/assets"], - "styles": ["projects/nature40-app/src/styles.scss"], - "scripts": [] - } - }, - "lint": { - "builder": "@angular-eslint/builder:lint", - "options": { - "lintFilePatterns": ["projects/nature40-app/**/*.ts", "projects/nature40-app/**/*.html"] - } - }, - "e2e": { - "builder": "@angular-devkit/build-angular:protractor", - "options": { - "protractorConfig": "projects/nature40-app/e2e/protractor.conf.js", - "devServerTarget": "nature40-app:serve" - }, - "configurations": { - "production": { - "devServerTarget": "nature40-app:serve:production" - } - } - } - } } }, - "defaultProject": "wave-core" + "defaultProject": "wave-core-new" } diff --git a/custom_typings/darge-d3.d.ts b/custom_typings/darge-d3.d.ts deleted file mode 100644 index 0a4ed26d..00000000 --- a/custom_typings/darge-d3.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -// dagre-d3.d.ts -// Copied from existing type definition @types/dagre-d3, with some modification -declare module 'dagre-d3' { - import * as d3 from 'd3'; - import * as dagre from 'dagre'; - export const render: new () => Render; - export const intersect: { - [shapeName: string]: ( - node: dagre.Node, - points: Array<{}>, - point: any - ) => void; - }; - - export interface Render { - arrows(): { - [arrowStyleName: string]: ( - parent: d3.Selection, - id: string, - edge: dagre.Edge, - type: string - ) => void; - }; - - ( - selection: d3.Selection, - g: dagre.graphlib.Graph - ): void; - - shapes(): { - [shapeStyleName: string]: ( - parent: d3.Selection, - bbox: any, - node: dagre.Node - ) => void; - }; - } -} diff --git a/custom_typings/proj4.d.ts b/custom_typings/proj4.d.ts deleted file mode 100644 index 53226c36..00000000 --- a/custom_typings/proj4.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -declare namespace Proj { - - interface Transformer { - forward: (p: Point) => Point; - inverse: (p: Point) => Point; - } - - class Point { - x: number; - y: number; - constructor(x: number, y: number); - } - - function Proj(a: any, b: any): Transformer; - - export function defs(name: string): any; - export function defs(name: string, def: string): void; - export function transform(from: any, to: any, pt: Point): Point; - export function parse(sr: string): any; - -} - -declare module "proj4" { - export = Proj; -} diff --git a/projects/gfbio-app/.eslintrc.json b/projects/gfbio-app/.eslintrc.json deleted file mode 100644 index 7ddd2178..00000000 --- a/projects/gfbio-app/.eslintrc.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "extends": "../../.eslintrc.json", - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts"], - "parserOptions": { - "project": [ - "projects/gfbio-app/tsconfig.app.json", - "projects/gfbio-app/tsconfig.spec.json", - "projects/gfbio-app/e2e/tsconfig.json" - ], - "createDefaultProgram": true - }, - "rules": {} - }, - { - "files": ["*.html"], - "rules": {} - } - ] -} diff --git a/projects/gfbio-app/browserslist b/projects/gfbio-app/browserslist deleted file mode 100644 index 80848532..00000000 --- a/projects/gfbio-app/browserslist +++ /dev/null @@ -1,12 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -> 0.5% -last 2 versions -Firefox ESR -not dead -not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/projects/gfbio-app/e2e/protractor.conf.js b/projects/gfbio-app/e2e/protractor.conf.js deleted file mode 100644 index bf4376ef..00000000 --- a/projects/gfbio-app/e2e/protractor.conf.js +++ /dev/null @@ -1,30 +0,0 @@ -// @ts-check -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const {SpecReporter} = require('jasmine-spec-reporter'); - -/** - * @type { import("protractor").Config } - */ -exports.config = { - allScriptsTimeout: 11000, - specs: ['./src/**/*.e2e-spec.ts'], - capabilities: { - browserName: 'chrome', - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function () {}, - }, - onPrepare() { - require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.json'), - }); - jasmine.getEnv().addReporter(new SpecReporter({spec: {displayStacktrace: true}})); - }, -}; diff --git a/projects/gfbio-app/e2e/src/app.e2e-spec.ts b/projects/gfbio-app/e2e/src/app.e2e-spec.ts deleted file mode 100644 index d3642324..00000000 --- a/projects/gfbio-app/e2e/src/app.e2e-spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {AppPage} from './app.po'; -import {browser, logging} from 'protractor'; - -describe('workspace-project App', () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.getTitleText()).toEqual('gfbio-app app is running!'); - }); - - afterEach(async () => { - // Assert that there are no errors emitted from the browser - const logs = await browser.manage().logs().get(logging.Type.BROWSER); - expect(logs).not.toContain( - jasmine.objectContaining({ - level: logging.Level.SEVERE, - } as logging.Entry), - ); - }); -}); diff --git a/projects/gfbio-app/e2e/src/app.po.ts b/projects/gfbio-app/e2e/src/app.po.ts deleted file mode 100644 index e11ba071..00000000 --- a/projects/gfbio-app/e2e/src/app.po.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {browser, by, element} from 'protractor'; - -export class AppPage { - navigateTo(): Promise { - return browser.get(browser.baseUrl) as Promise; - } - - getTitleText(): Promise { - return element(by.css('wave-gfbio-root .content span')).getText() as Promise; - } -} diff --git a/projects/gfbio-app/e2e/tsconfig.json b/projects/gfbio-app/e2e/tsconfig.json deleted file mode 100644 index 3d39212b..00000000 --- a/projects/gfbio-app/e2e/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "outDir": "../../../out-tsc/e2e", - "module": "commonjs", - "target": "es5", - "types": ["jasmine", "jasminewd2", "node"] - } -} diff --git a/projects/gfbio-app/karma.conf.js b/projects/gfbio-app/karma.conf.js deleted file mode 100644 index ebdcbba3..00000000 --- a/projects/gfbio-app/karma.conf.js +++ /dev/null @@ -1,32 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular-devkit/build-angular/plugins/karma'), - ], - client: { - clearContext: false, // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - dir: require('path').join(__dirname, '../../coverage/gfbio-app'), - reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true, - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true, - }); -}; diff --git a/projects/gfbio-app/src/app-theme.scss b/projects/gfbio-app/src/app-theme.scss deleted file mode 100644 index 91c8fbc7..00000000 --- a/projects/gfbio-app/src/app-theme.scss +++ /dev/null @@ -1,82 +0,0 @@ -@import '~@angular/material/theming'; - -// Material Base Styles -@include mat-core(); - -// Define Colors -$gfbio-darkblue: ( - 50: #e7ebf4, - 100: #c2cee3, - 200: #99add1, - 300: #708cbf, - 400: #5273b1, - 500: #335aa3, - 600: #2e529b, - 700: #274891, - 800: #203f88, - 900: #142e77, - A100: #adc0ff, - A200: #7a98ff, - A400: #4770ff, - A700: #2e5dff, - contrast: ( - 50: $black-87-opacity, - 100: $black-87-opacity, - 200: $black-87-opacity, - 300: $black-87-opacity, - 400: $white-87-opacity, - 500: $white-87-opacity, - 600: $white-87-opacity, - 700: $white-87-opacity, - 800: $white-87-opacity, - 900: $white-87-opacity, - A100: $black-87-opacity, - A200: $black-87-opacity, - A400: $white-87-opacity, - A700: $white-87-opacity, - ), -); - -$gfbio-green: ( - 50: #f0f6e9, - 100: #d9e8c8, - 200: #c0d9a4, - 300: #a7c97f, - 400: #94be63, - 500: #81b248, - 600: #79ab41, - 700: #6ea238, - 800: #649930, - 900: #518a21, - A100: #dfffc7, - A200: #c2ff94, - A400: #a5ff61, - A700: #97ff47, - contrast: ( - 50: $black-87-opacity, - 100: $black-87-opacity, - 200: $black-87-opacity, - 300: $black-87-opacity, - 400: $black-87-opacity, - 500: $black-87-opacity, - 600: $black-87-opacity, - 700: $black-87-opacity, - 800: $white-87-opacity, - 900: $white-87-opacity, - A100: $black-87-opacity, - A200: $black-87-opacity, - A400: $black-87-opacity, - A700: $black-87-opacity, - ), -); - -// Define App Theme -$wave-app-primary: mat-palette($gfbio-darkblue); -$wave-app-accent: mat-palette($gfbio-green, A200, A100, A400); -$wave-app-warn: mat-palette($mat-red); - -// Create the theme object (a Sass map containing all of the palettes). -$wave-app-theme: mat-light-theme($wave-app-primary, $wave-app-accent, $wave-app-warn); - -// Apply Angular Material Mixin to Color Theme -@include angular-material-theme($wave-app-theme); diff --git a/projects/gfbio-app/src/app/app-config.service.ts b/projects/gfbio-app/src/app/app-config.service.ts deleted file mode 100644 index 58654636..00000000 --- a/projects/gfbio-app/src/app/app-config.service.ts +++ /dev/null @@ -1,42 +0,0 @@ -import {Injectable} from '@angular/core'; -import {mergeDeep} from 'immutable'; -import {Config, WaveConfigStructure, WAVE_DEFAULT_CONFIG} from 'wave-core'; - -interface Gfbio { - readonly LIFERAY_PORTAL_URL: string; - readonly SSO: SSO; -} - -interface SSO { - URL: string; - CLIENT_ID: string; - SCOPE: string; -} - -interface AppConfigStructure extends WaveConfigStructure { - readonly GFBIO: Gfbio; -} - -const APP_CONFIG_DEFAULTS = mergeDeep(WAVE_DEFAULT_CONFIG, { - GFBIO: { - LIFERAY_PORTAL_URL: 'https://dev.gfbio.org/', - SSO: { - URL: 'https://sso.gfbio.org/simplesaml/module.php/oidc/authorize.php', - CLIENT_ID: '_d6a8e839d7694e173683f2377d1669f2b3dd209679', - SCOPE: 'openid email id profile', - }, - }, -}) as AppConfigStructure; - -@Injectable() -export class AppConfig extends Config { - protected config: AppConfigStructure; - - get GFBIO(): Gfbio { - return this.config.GFBIO; - } - - load(): Promise { - return super.load(APP_CONFIG_DEFAULTS); - } -} diff --git a/projects/gfbio-app/src/app/app.component.html b/projects/gfbio-app/src/app/app.component.html deleted file mode 100644 index adf2336f..00000000 --- a/projects/gfbio-app/src/app/app.component.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - -
- - - - - - - - - - - - - - - - -
-
- - - - -
Data Table
-
- - -
- - -
Citations
-
- - -
-
-
-
diff --git a/projects/gfbio-app/src/app/app.component.scss b/projects/gfbio-app/src/app/app.component.scss deleted file mode 100644 index a76ed4e8..00000000 --- a/projects/gfbio-app/src/app/app.component.scss +++ /dev/null @@ -1,135 +0,0 @@ -wave-navigation { - z-index: 10; -} - -wave-layer-list { - position: absolute; - z-index: 2; - width: 16vw; - min-width: 200px; - left: 0; - top: 0; - background-color: rgba(255, 255, 255, 0.87); - border-bottom-right-radius: 2px; -} - -.time-container { - position: absolute; - left: 16vw; - right: 16vw; - - wave-ticker-interaction, - wave-small-time-interaction, - wave-zoom-handles { - background-color: rgba(255, 255, 255, 0.87); - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; - z-index: 3; - } - - .back-button { - z-index: 3; - - border-radius: 0 0 2px 2px; - margin-left: 1rem; - - padding: 0.2rem 1rem; - - background-color: rgba(255, 255, 255, 0.87); - - span { - margin: 0 0.5rem; - } - - img { - height: 1.8rem; - vertical-align: middle; - } - } -} - -:host ::ng-deep .mat-sidenav-content { - overflow: hidden; -} - -.top-container { - z-index: 1; -} - -.mid-container { - z-index: 0; - position: relative; -} - -.bottom-container { - position: relative; - z-index: 1; - - min-height: 3rem; - @media (max-width: 600px) and (orientation: portrait) { - min-height: 2.5rem; - } - @media (max-width: 960px) and (orientation: landscape) { - min-height: 2rem; - } - - .toggle { - position: absolute; - z-index: 1; - padding: 0; - min-width: 3rem; - width: 3rem; - height: 3rem; - @media (max-width: 600px) and (orientation: portrait) { - min-width: 2.5rem; - width: 2.5rem; - height: 2.5rem; - } - @media (max-width: 960px) and (orientation: landscape) { - min-width: 2rem; - width: 2rem; - height: 2rem; - } - } - - ::ng-deep .mat-tab-label-container { - margin-left: 3rem; - @media (max-width: 600px) and (orientation: portrait) { - margin-left: 2.5rem; - } - @media (max-width: 960px) and (orientation: landscape) { - margin-left: 2rem; - } - } - - @media (max-width: 960px) and (orientation: landscape) { - ::ng-deep mat-tab-header { - height: 2rem; - } - ::ng-deep .mat-tab-label { - line-height: 2rem; - } - } - @media (max-width: 600px) and (orientation: portrait) { - ::ng-deep mat-tab-header { - height: 2.5rem; - } - ::ng-deep .mat-tab-label { - line-height: 2.5rem; - } - } -} - -.bottom-container.small { - max-height: 3rem !important; - @media (max-width: 600px) and (orientation: portrait) { - max-height: 2.5rem !important; - } - @media (max-width: 960px) and (orientation: landscape) { - max-height: 2rem !important; - } - - ::ng-deep mat-tab-header { - border: 0; - } -} diff --git a/projects/gfbio-app/src/app/app.component.ts b/projects/gfbio-app/src/app/app.component.ts deleted file mode 100644 index 841d636f..00000000 --- a/projects/gfbio-app/src/app/app.component.ts +++ /dev/null @@ -1,488 +0,0 @@ -import {Observable, BehaviorSubject, of as observableOf, from as observableFrom, combineLatest, partition} from 'rxjs'; -import {toArray, map, tap, first, mergeMap, filter} from 'rxjs/operators'; - -import { - AfterViewInit, - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - HostListener, - Inject, - OnInit, - ViewChild, - ViewContainerRef, -} from '@angular/core'; -import {DomSanitizer} from '@angular/platform-browser'; -import {ActivatedRoute, Router} from '@angular/router'; - -import {MatDialog} from '@angular/material/dialog'; -import {MatIconRegistry} from '@angular/material/icon'; -import {MatSidenav} from '@angular/material/sidenav'; -import {MatTabGroup} from '@angular/material/tabs'; - -import { - Layer, - SidenavContainerComponent, - VectorLayer, - MapContainerComponent, - AbstractSymbology, - LayerService, - LayoutService, - ProjectService, - UserService, - StorageService, - RandomColorService, - MappingQueryService, - NotificationService, - MapService, - Config, - ResultTypes, - PointSymbology, - VectorSymbology, - PlotListComponent, - UnexpectedResultType, - Operator, - AbstractVectorSymbology, - WorkflowParameterChoiceDialogComponent, - NavigationButton, - SourceOperatorListComponent, - NavigationComponent, - OperatorListComponent, - TimeConfigComponent, - WorkspaceSettingsComponent, - SourceOperatorListButton, - GFBioSourceType, - GbifOperatorComponent, - OperatorListButtonGroups, - SidenavConfig, -} from 'wave-core'; - -import {AppConfig} from './app-config.service'; -import {GFBioMappingQueryService} from './queries/mapping-query.service'; -import {GFBioUserService} from './users/user.service'; -import { - BasketAvailability, - BasketResult, - IBasketGroupedAbcdResult, - IBasketPangaeaResult, -} from './operators/dialogs/baskets/gfbio-basket.model'; -import {GroupedAbcdBasketResultComponent} from './operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component'; -import {PangaeaBasketResultComponent} from './operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component'; -import {TerminologyLookupOperatorComponent} from './operators/dialogs/terminology-lookup/terminology-lookup.component'; -import {TerminologyLookupType} from './operators/types/terminology-lookup-type'; -import {LoginComponent} from './login/login.component'; -import {AbcdRepositoryComponent} from './operators/dialogs/abcd-repository/abcd-repository.component'; -import {ABCDSourceType} from './operators/types/abcd-source-type.model'; -import {GfbioBasketsComponent} from './operators/dialogs/baskets/gfbio-baskets.component'; -import {SplashDialogComponent} from './dialogs/splash-dialog/splash-dialog.component'; -import {HelpComponent} from './help/help.component'; -import {Location} from '@angular/common'; - -@Component({ - selector: 'wave-gfbio-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppComponent implements OnInit, AfterViewInit { - @ViewChild(MapContainerComponent, {static: true}) mapComponent: MapContainerComponent; - @ViewChild(MatTabGroup, {static: true}) bottomTabs: MatTabGroup; - - @ViewChild(MatSidenav, {static: true}) rightSidenav: MatSidenav; - @ViewChild(SidenavContainerComponent, {static: true}) rightSidenavContainer: SidenavContainerComponent; - - readonly ResultTypes = ResultTypes; - readonly LayoutService = LayoutService; - - readonly layersReverse$: Observable>>; - readonly layerListVisible$: Observable; - readonly layerDetailViewVisible$: Observable; - - readonly navigationButtons = this.setupNavigation(); - readonly addAFirstLayerConfig = AppComponent.setupAddDataConfig(); - - middleContainerHeight$: Observable; - bottomContainerHeight$: Observable; - mapIsGrid$: Observable; - - private windowHeight$ = new BehaviorSubject(window.innerHeight); - - constructor( - @Inject(Config) readonly config: AppConfig, - readonly layerService: LayerService, - readonly layoutService: LayoutService, - readonly projectService: ProjectService, - readonly vcRef: ViewContainerRef, // reference used by color picker - @Inject(UserService) private readonly userService: GFBioUserService, - private readonly storageService: StorageService, - private readonly changeDetectorRef: ChangeDetectorRef, - private readonly dialog: MatDialog, - private readonly iconRegistry: MatIconRegistry, - private readonly randomColorService: RandomColorService, - @Inject(MappingQueryService) private readonly mappingQueryService: GFBioMappingQueryService, - private readonly activatedRoute: ActivatedRoute, - private readonly router: Router, - private readonly location: Location, - private readonly notificationService: NotificationService, - private readonly mapService: MapService, - private readonly sanitizer: DomSanitizer, - ) { - this.registerIcons(); - - vcRef.length; // eslint-disable-line @typescript-eslint/no-unused-expressions - - this.storageService.toString(); // just register - - this.layersReverse$ = this.projectService.getLayerStream().pipe(map((layers) => layers.slice(0).reverse())); - - this.layerListVisible$ = this.layoutService.getLayerListVisibilityStream(); - this.layerDetailViewVisible$ = this.layoutService.getLayerDetailViewVisibilityStream(); - } - - private registerIcons() { - this.iconRegistry.addSvgIconInNamespace('vat', 'logo', this.sanitizer.bypassSecurityTrustResourceUrl('assets/vat_logo.svg')); - - // used for navigation - this.iconRegistry.addSvgIcon('cogs', this.sanitizer.bypassSecurityTrustResourceUrl('assets/icons/cogs.svg')); - } - - ngOnInit() { - this.mapService.registerMapComponent(this.mapComponent); - this.mapIsGrid$ = this.mapService.isGrid$; - - this.middleContainerHeight$ = this.layoutService.getMapHeightStream(this.windowHeight$).pipe(tap(() => this.mapComponent.resize())); - this.bottomContainerHeight$ = this.layoutService.getLayerDetailViewStream(this.windowHeight$); - } - - ngAfterViewInit() { - this.layoutService.getSidenavContentComponentStream().subscribe((sidenavConfig) => { - this.rightSidenavContainer.load(sidenavConfig); - if (sidenavConfig) { - this.rightSidenav.open(); - } else { - this.rightSidenav.close(); - } - }); - this.projectService - .getNewPlotStream() - .subscribe(() => this.layoutService.setSidenavContentComponent({component: PlotListComponent})); - - // set the stored tab index - this.layoutService.getLayerDetailViewTabIndexStream().subscribe((tabIndex) => { - if (this.bottomTabs.selectedIndex !== tabIndex) { - this.bottomTabs.selectedIndex = tabIndex; - setTimeout(() => this.changeDetectorRef.markForCheck()); - } - }); - - // show splash screen - if (this.userService.shouldShowIntroductoryPopup()) { - setTimeout(() => { - this.dialog.open(SplashDialogComponent, {}); - }); - } - - // notify window parent that this component is ready - if (parent !== window) { - parent.postMessage( - { - type: 'STATUS', - status: 'READY', - }, - '*', - ); - } else { - // handle query parameters directly if it is not embedded and using an auto login - this.handleQueryParameters(); - } - } - - setTabIndex(index: number) { - this.layoutService.setLayerDetailViewTabIndex(index); - this.layoutService.setLayerDetailViewVisibility(true); - } - - private setupNavigation(): Array { - return [ - NavigationComponent.createLoginButton(this.userService, this.layoutService, this.config, {component: LoginComponent}), - { - sidenavConfig: AppComponent.setupAddDataConfig(), - icon: 'add', - tooltip: 'Add Data', - }, - { - sidenavConfig: AppComponent.setupOperatorListConfig(), - icon: '', - svgIcon: 'cogs', - tooltip: 'Operators', - }, - { - sidenavConfig: {component: PlotListComponent, config: {operatorsListConfig: AppComponent.setupOperatorListConfig()}}, - icon: 'equalizer', - tooltip: 'Plots', - }, - { - sidenavConfig: {component: TimeConfigComponent}, - icon: 'access_time', - tooltip: 'Time', - }, - { - sidenavConfig: {component: WorkspaceSettingsComponent}, - icon: 'settings', - tooltip: 'Workspace', - }, - { - sidenavConfig: {component: HelpComponent}, - icon: 'help', - tooltip: 'Help', - }, - ]; - } - - private static setupAddDataConfig(): SidenavConfig { - return {component: SourceOperatorListComponent, config: {buttons: AppComponent.createSourceOperatorListButtons()}}; - } - - private static setupOperatorListConfig(): SidenavConfig { - return {component: OperatorListComponent, config: {operators: AppComponent.createOperatorListButtons()}}; - } - - private static createSourceOperatorListButtons(): Array { - return [ - SourceOperatorListComponent.createDataRepositoryButton(), - { - name: 'ABCD Archives', - description: 'Lookup GFBio ABCD archive', - iconSrc: ABCDSourceType.ICON_URL, - sidenavConfig: {component: AbcdRepositoryComponent, keepParent: true}, - }, - { - name: 'GFBio Search Baskets', - description: 'Display your GFBio search results', - icon: 'add_shopping_cart', - sidenavConfig: {component: GfbioBasketsComponent, keepParent: true}, - onlyIfLoggedIn: true, - }, - { - name: 'GFBio Search Baskets', - description: 'Log in to display your GFBio search results', - icon: 'add_shopping_cart', - sidenavConfig: undefined, - onlyIfLoggedOut: true, - }, - SourceOperatorListComponent.createDrawFeaturesButton(), - ...SourceOperatorListComponent.createCustomFeaturesButtons(), - { - name: 'Species Occurrences', - description: 'Query data from GBIF', - iconSrc: GFBioSourceType.ICON_URL, - sidenavConfig: {component: GbifOperatorComponent, keepParent: true}, - }, - SourceOperatorListComponent.createCountryPolygonsButton(), - ]; - } - - private static createOperatorListButtons(): OperatorListButtonGroups { - return [ - {name: 'Mixed', list: OperatorListComponent.DEFAULT_MIXED_OPERATOR_DIALOGS}, - {name: 'Plots', list: OperatorListComponent.DEFAULT_PLOT_OPERATOR_DIALOGS}, - {name: 'Raster', list: OperatorListComponent.DEFAULT_RASTER_OPERATOR_DIALOGS}, - { - name: 'Vector', - list: [ - ...OperatorListComponent.DEFAULT_VECTOR_OPERATOR_DIALOGS, - { - component: TerminologyLookupOperatorComponent, - type: TerminologyLookupType, - description: 'Augment attributes via the GFBio Terminology Service', - }, - ], - }, - ]; - } - - @HostListener('window:resize') - private windowHeight() { - this.windowHeight$.next(window.innerHeight); - } - - private handleQueryParameters() { - // If the GFBio SSO sends a link with `#access_token=…` without starting query params with a `?`, - // it can be necessary to redirect the request to `/#/?access_token=…`. - // This prevents Angular routing from cropping the access token from the URL and use proper routing. - // This could be removed once the GFBio SSO sends proper redirects. - const location_path = this.location.path(true); - if (location_path.startsWith('access_token=')) { - this.location.go('/', location_path); - } - - // Since `initialNavigation=false` in the app module, we have to start it here. - this.router.initialNavigation(); - - this.activatedRoute.queryParamMap.subscribe((params) => { - if (params.has('access_token') && params.get('token_type') === 'Bearer' && params.has('expires_in')) { - this.handleOpenIdConnectAccessToken( - params.get('access_token'), - parseInt(params.get('expires_in'), 10), - params.get('state'), - ); - } else if (params.has('workflow')) { - this.handleWorkflow(params.get('workflow')); - } else if (params.has('gfbioBasketId')) { - this.handleGFBioBasketId(params.get('gfbioBasketId')); - } else if (params.keys.length) { - // FALLBACK - must be last branch - this.notificationService.error(`Unknown URL parameters »${params.keys.join(', ')}«`); - } - }); - } - - private handleOpenIdConnectAccessToken(accessToken: string, _expiresIn: number, state: string | null) { - this.userService - .oidcLogin(accessToken) - .pipe(filter((success) => success)) - .subscribe(() => { - if (state) { - state = decodeURIComponent(state); - this.router.navigateByUrl('?' + state); - } - }); - } - - private handleWorkflow(workflow: string) { - try { - const newLayer = Layer.fromDict(JSON.parse(workflow)); - this.projectService - .getProjectStream() - .pipe(first()) - .subscribe((project) => { - if (project.layers.length > 0) { - // show popup - this.dialog.open(WorkflowParameterChoiceDialogComponent, { - data: { - dialogTitle: 'Workflow URL Parameter', - sourceName: 'URL parameter', - layers: [newLayer], - nonAvailableNames: [], - numberOfLayersInProject: project.layers.length, - }, - }); - } else { - // just add the layer if the layer array is empty - this.projectService.addLayer(newLayer); - } - }); - } catch (error) { - this.notificationService.error(`Invalid Workflow: »${error}«`); - } - } - - private handleGFBioBasketId(gfbioBasketIdString: string) { - if (this.userService.isGuestUser()) { - this.userService.redirectToOidcProvider(`gfbioBasketId=${gfbioBasketIdString}`); - } - - try { - const gfbioBasketId: number = JSON.parse(gfbioBasketIdString); - this.projectService - .getProjectStream() - .pipe(first()) - .subscribe((project) => { - this.gfbioBasketIdToLayers(gfbioBasketId).subscribe( - (importResult: BasketAvailability) => { - // show popup - this.dialog.open(WorkflowParameterChoiceDialogComponent, { - data: { - dialogTitle: 'GFBio Basket Import', - sourceName: 'GFBio Basket', - layers: importResult.availableLayers, - nonAvailableNames: importResult.nonAvailableNames, - numberOfLayersInProject: project.layers.length, - }, - }); - }, - (error) => { - this.notificationService.error(`GFBio Basket Loading Error: »${error}«`); - }, - ); - }); - } catch (error) { - this.notificationService.error(`Invalid GFBio Basket Id: »${error}«`); - } - } - - private gfbioBasketIdToLayers(basketId: number): Observable { - const [availableEntries, nonAvailableEntries]: [Observable, Observable] = partition( - this.mappingQueryService.getGFBioBasket(basketId).pipe(mergeMap((basket) => observableFrom(basket.results))), - (basketResult: BasketResult) => basketResult.available, - ); - - const availableLayers: Observable>> = availableEntries.pipe( - mergeMap((basketResult) => this.gfbioBasketResultToLayer(basketResult)), - toArray(), - ); - - const nonAvailableNames: Observable> = nonAvailableEntries.pipe( - map((basketResult) => basketResult.title), - toArray(), - ); - - return combineLatest([availableLayers, nonAvailableNames]).pipe( - map(([layers, names]: [Array>, Array]) => { - return { - availableLayers: layers, - nonAvailableNames: names, - } as BasketAvailability; - }), - ); - } - - private gfbioBasketResultToLayer(result: BasketResult): Observable> { - let operator$: Observable; - if (result.type === 'abcd_grouped') { - operator$ = this.userService - .getSourceSchemaAbcd() - .pipe( - map((sourceSchema) => - GroupedAbcdBasketResultComponent.createOperatorFromGroupedABCDData( - result as IBasketGroupedAbcdResult, - sourceSchema, - true, - ), - ), - ); - } else if (result.type === 'pangaea') { - operator$ = observableOf(PangaeaBasketResultComponent.createOperatorFromPangaeaData(result as IBasketPangaeaResult)); - } - - return operator$.pipe( - map((operator) => { - let clustered = false; - let symbology; - - switch (operator.resultType) { - case ResultTypes.POINTS: - symbology = PointSymbology.createClusterSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }); - clustered = true; - break; - case ResultTypes.POLYGONS: - symbology = VectorSymbology.createSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }); - break; - default: - throw new UnexpectedResultType(); - } - - return new VectorLayer({ - name: result.title, - operator, - symbology, - clustered, - }); - }), - ); - } -} diff --git a/projects/gfbio-app/src/app/app.module.ts b/projects/gfbio-app/src/app/app.module.ts deleted file mode 100644 index ee196772..00000000 --- a/projects/gfbio-app/src/app/app.module.ts +++ /dev/null @@ -1,98 +0,0 @@ -import {APP_INITIALIZER, NgModule} from '@angular/core'; -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; -import {BrowserModule} from '@angular/platform-browser'; -import {HttpClientModule} from '@angular/common/http'; -import {RouterModule} from '@angular/router'; - -import {AppComponent} from './app.component'; -import { - Config, - LayerService, - LayoutService, - MappingQueryService, - MapService, - NotificationService, - ProjectService, - RandomColorService, - StorageService, - SidenavRef, - UserService, - WaveCoreModule, - OperatorTypeFactory, -} from 'wave-core'; -import {AppConfig} from './app-config.service'; -import {LoginComponent} from './login/login.component'; -import {GFBioUserService} from './users/user.service'; -import {TerminologyLookupType, TerminologyLookupTypeDict} from './operators/types/terminology-lookup-type'; -import {PangaeaSourceType, PangaeaSourceTypeDict} from './operators/types/pangaea-source-type.model'; -import {ABCDSourceType, ABCDSourceTypeDict} from './operators/types/abcd-source-type.model'; -import {AbcdRepositoryComponent} from './operators/dialogs/abcd-repository/abcd-repository.component'; -import {BasketResultGroupByDatasetPipe} from './operators/dialogs/baskets/gfbio-basket.pipe'; -import {GfbioBasketsComponent} from './operators/dialogs/baskets/gfbio-baskets.component'; -import {GroupedAbcdBasketResultComponent} from './operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component'; -import {PangaeaBasketResultComponent} from './operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component'; -import {TerminologyLookupOperatorComponent} from './operators/dialogs/terminology-lookup/terminology-lookup.component'; -import {GFBioMappingQueryService} from './queries/mapping-query.service'; -import {SplashDialogComponent} from './dialogs/splash-dialog/splash-dialog.component'; -import {HelpComponent} from './help/help.component'; - -@NgModule({ - declarations: [ - AppComponent, - AbcdRepositoryComponent, - BasketResultGroupByDatasetPipe, - GfbioBasketsComponent, - GroupedAbcdBasketResultComponent, - LoginComponent, - PangaeaBasketResultComponent, - SplashDialogComponent, - TerminologyLookupOperatorComponent, - HelpComponent, - ], - imports: [ - BrowserAnimationsModule, - BrowserModule, - HttpClientModule, - RouterModule.forRoot([{path: '**', component: AppComponent}], {useHash: true, initialNavigation: 'disabled'}), - WaveCoreModule, - ], - providers: [ - { - provide: APP_INITIALIZER, - useFactory: (config: AppConfig) => () => config.load(), - deps: [Config], - multi: true, - }, - { - provide: APP_INITIALIZER, - useFactory: () => () => setupOperatorTypes(), - deps: [], - multi: true, - }, - LayerService, - LayoutService, - MapService, - NotificationService, - ProjectService, - RandomColorService, - SidenavRef, - StorageService, - {provide: Config, useClass: AppConfig}, - {provide: MappingQueryService, useClass: GFBioMappingQueryService}, - {provide: UserService, useClass: GFBioUserService}, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} - -function setupOperatorTypes(): Promise { - return new Promise((resolve, _reject) => { - OperatorTypeFactory.addType(TerminologyLookupType.TYPE, (dict) => - TerminologyLookupType.fromDict(dict as TerminologyLookupTypeDict), - ); - OperatorTypeFactory.addType(PangaeaSourceType.TYPE, (dict) => PangaeaSourceType.fromDict(dict as PangaeaSourceTypeDict)); - OperatorTypeFactory.addType(ABCDSourceType.TYPE, (dict) => ABCDSourceType.fromDict(dict as ABCDSourceTypeDict)); - - resolve(); - }); -} diff --git a/projects/gfbio-app/src/app/dialogs/splash-dialog/splash-dialog.component.html b/projects/gfbio-app/src/app/dialogs/splash-dialog/splash-dialog.component.html deleted file mode 100644 index b9ba1e0a..00000000 --- a/projects/gfbio-app/src/app/dialogs/splash-dialog/splash-dialog.component.html +++ /dev/null @@ -1,25 +0,0 @@ -VAT - The Visualization, Analysis and Transformation System - -

Biodiversity Data Easily Explored Online

-

Visualize, analyze and transform your biodiversity data in a comfortable online GIS environment! Save and share your workflows!

-

- Have access to collections and biodiversity data centers, international data aggregators and environmental data, and integrate your - own data! -

-

For a detailed introduction, please have a look at our help section!

-
- GFBio -

- VAT is part of the German Federation for Biological Data (GFBio, - www.gfbio.org), a sustainable, service oriented, national data infrastructure facilitating data - sharing for biological and environmental research. -

-
- If you want to learn how to integrate data from GFBio's data search in the VAT tool, have a look at our - How-To. - -
- - Don't show this message again - diff --git a/projects/gfbio-app/src/app/dialogs/splash-dialog/splash-dialog.component.scss b/projects/gfbio-app/src/app/dialogs/splash-dialog/splash-dialog.component.scss deleted file mode 100644 index 5a96303c..00000000 --- a/projects/gfbio-app/src/app/dialogs/splash-dialog/splash-dialog.component.scss +++ /dev/null @@ -1,12 +0,0 @@ -mat-checkbox { - height: 2rem; -} - -img { - vertical-align: middle; - height: 41px; -} - -mat-card.info { - background-color: var(--wave-accent-color, grey); -} diff --git a/projects/gfbio-app/src/app/dialogs/splash-dialog/splash-dialog.component.ts b/projects/gfbio-app/src/app/dialogs/splash-dialog/splash-dialog.component.ts deleted file mode 100644 index 33fc8d98..00000000 --- a/projects/gfbio-app/src/app/dialogs/splash-dialog/splash-dialog.component.ts +++ /dev/null @@ -1,20 +0,0 @@ -import {Component, ChangeDetectionStrategy, Inject} from '@angular/core'; -import {MatCheckboxChange} from '@angular/material/checkbox'; - -import {UserService} from 'wave-core'; - -import {GFBioUserService} from '../../users/user.service'; - -@Component({ - selector: 'wave-gfbio-splash-dialog', - templateUrl: './splash-dialog.component.html', - styleUrls: ['./splash-dialog.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class SplashDialogComponent { - constructor(@Inject(UserService) private readonly userService: GFBioUserService) {} - - changeTick(event: MatCheckboxChange) { - this.userService.setIntroductoryPopup(!event.checked); - } -} diff --git a/projects/gfbio-app/src/app/help/help.component.html b/projects/gfbio-app/src/app/help/help.component.html deleted file mode 100644 index 1da32a9b..00000000 --- a/projects/gfbio-app/src/app/help/help.component.html +++ /dev/null @@ -1,33 +0,0 @@ -Help - - - - - - - - - Account / Login -

- You can obtain a Vat account by registering at the GFBio portal at - gfbio.org. -

-

Using your GFBio Portal account also allows you to access your stored search results.

-

To log in click the button in the top-right, and select the type of account

-
- - - - - - - - - GFBio Search Results -

- When logged in as a GFBio user, the Add Data function offers a GFBio baskets option. There, you have access to all - previous searches you performed on gfbio.org while being logged in. You have the option to go the data sets landing page or add - a new layer containing the data. -

-
-
diff --git a/projects/gfbio-app/src/app/help/help.component.scss b/projects/gfbio-app/src/app/help/help.component.scss deleted file mode 100644 index e9d76ff5..00000000 --- a/projects/gfbio-app/src/app/help/help.component.scss +++ /dev/null @@ -1,14 +0,0 @@ -:host ::ng-deep mat-expansion-panel { - p { - text-align: justify; - } - - .vat { - font-variant: small-caps; - } - - img.extern { - height: 40px; - padding-right: 5px; - } -} diff --git a/projects/gfbio-app/src/app/help/help.component.ts b/projects/gfbio-app/src/app/help/help.component.ts deleted file mode 100644 index 03dfd5da..00000000 --- a/projects/gfbio-app/src/app/help/help.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; - -@Component({ - selector: 'wave-gfbio-help', - templateUrl: './help.component.html', - styleUrls: ['./help.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HelpComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} diff --git a/projects/gfbio-app/src/app/login/login.component.html b/projects/gfbio-app/src/app/login/login.component.html deleted file mode 100644 index b5116eaa..00000000 --- a/projects/gfbio-app/src/app/login/login.component.html +++ /dev/null @@ -1,30 +0,0 @@ - - - Login - - - - - - - User Info -
-
-

Username

-

Real Name

-

E-Mail

-
-
-

{{ (user | async).name }}

-

{{ (user | async).realName }}

-

{{ (user | async).email }}

-
-
-
- -
-
-
diff --git a/projects/gfbio-app/src/app/login/login.component.scss b/projects/gfbio-app/src/app/login/login.component.scss deleted file mode 100644 index e063a30f..00000000 --- a/projects/gfbio-app/src/app/login/login.component.scss +++ /dev/null @@ -1,29 +0,0 @@ -:host { - display: block; - padding: 1rem; -} - -mat-spinner { - width: 25%; - height: auto; - margin: 1rem auto; -} - -button { - margin-top: 1rem; - width: 100%; - - &.sso-button { - height: 4rem; - - img { - max-height: 50%; - margin-right: 0.5rem; - } - } -} - -.label { - color: var(--wave-foreground-secondary-text-color, grey); - margin-right: 1rem; -} diff --git a/projects/gfbio-app/src/app/login/login.component.ts b/projects/gfbio-app/src/app/login/login.component.ts deleted file mode 100644 index 005f3d95..00000000 --- a/projects/gfbio-app/src/app/login/login.component.ts +++ /dev/null @@ -1,72 +0,0 @@ -import {BehaviorSubject, Observable, Subscription} from 'rxjs'; - -import {Component, OnInit, ChangeDetectionStrategy, AfterViewInit, Inject, ChangeDetectorRef, OnDestroy} from '@angular/core'; -import {Location} from '@angular/common'; - -import {Config, NotificationService, User, UserService} from 'wave-core'; - -import {GFBioUserService} from '../users/user.service'; -import {AppConfig} from '../app-config.service'; - -enum FormStatus { - LoggedOut, - LoggedIn, - Loading, -} - -@Component({ - selector: 'wave-gfbio-login', - templateUrl: './login.component.html', - styleUrls: ['./login.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LoginComponent implements OnInit, AfterViewInit, OnDestroy { - readonly FormStatus = FormStatus; - - formStatus$ = new BehaviorSubject(FormStatus.Loading); - - user: Observable; - - private formStatusSubscription: Subscription; - - constructor( - @Inject(Config) private readonly config: AppConfig, - @Inject(UserService) private readonly userService: GFBioUserService, - private readonly changeDetectorRef: ChangeDetectorRef, - private readonly location: Location, - private readonly notificationService: NotificationService, - ) {} - - ngOnInit() { - this.userService.isSessionValid(this.userService.getSession()).subscribe((valid) => { - const isNoGuest = !this.userService.isGuestUser(); - this.formStatus$.next(valid && isNoGuest ? FormStatus.LoggedIn : FormStatus.LoggedOut); - }); - - this.user = this.userService.getUserStream(); - - this.formStatusSubscription = this.formStatus$.subscribe(() => setTimeout(() => this.changeDetectorRef.markForCheck())); - } - - ngAfterViewInit() {} - - ngOnDestroy() { - if (this.formStatusSubscription) { - this.formStatusSubscription.unsubscribe(); - } - } - - login() { - this.formStatus$.next(FormStatus.Loading); - - this.userService.redirectToOidcProvider(); - } - - logout() { - this.formStatus$.next(FormStatus.Loading); - this.userService.guestLogin().subscribe( - () => this.formStatus$.next(FormStatus.LoggedOut), - (error) => this.notificationService.error(`The backend is currently unavailable (${error})`), - ); - } -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd-repository.component.html b/projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd-repository.component.html deleted file mode 100644 index f90e412e..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd-repository.component.html +++ /dev/null @@ -1,23 +0,0 @@ -ABCD Archives - - - -
- - open_in_new -
- - - - open_in_new - -

- -

-
-
- -
-
diff --git a/projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd-repository.component.scss b/projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd-repository.component.scss deleted file mode 100644 index 44b647c6..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd-repository.component.scss +++ /dev/null @@ -1,36 +0,0 @@ -.datagroup { - color: var(--wave-primary-color, black) !important; -} - -.datagroup a { - color: var(--wave-primary-color, black) !important; -} - -.searchInput { - width: 100%; -} - -mat-list-item { - cursor: pointer; -} - -.highlight, -mat-list-item ::ng-deep .highlight { - color: var(--wave-accent-color, grey); - text-decoration: underline; -} - -.secondary_action { - float: right; -} - -img { - padding: 5px 5px 5px 0; -} - -.link { - max-width: 300px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd-repository.component.ts b/projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd-repository.component.ts deleted file mode 100644 index 9cbe2ede..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd-repository.component.ts +++ /dev/null @@ -1,135 +0,0 @@ -import {first, map} from 'rxjs/operators'; -import {Observable, BehaviorSubject} from 'rxjs'; - -import {Component, ChangeDetectionStrategy, Inject} from '@angular/core'; - -import { - UserService, - RandomColorService, - ProjectService, - DataTypes, - DataType, - Unit, - ResultTypes, - Projections, - PointSymbology, - VectorLayer, - Operator, -} from 'wave-core'; - -import {AbcdArchive} from './abcd.model'; -import {ABCDSourceType, ABCDSourceTypeConfig} from '../../types/abcd-source-type.model'; -import {BasicColumns} from '../baskets/csv.model'; -import {GFBioUserService} from '../../../users/user.service'; - -type Grouped = Iterable>; - -interface Group { - group: Array; - name: string; -} - -@Component({ - selector: 'wave-gfbio-abcd-repository', - templateUrl: './abcd-repository.component.html', - styleUrls: ['./abcd-repository.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AbcdRepositoryComponent { - searchString$ = new BehaviorSubject(''); - groups: Observable>; - - constructor( - @Inject(UserService) private readonly userService: GFBioUserService, - private randomColorService: RandomColorService, - private projectService: ProjectService, - ) { - this.groups = this.userService.getAbcdArchivesStream().pipe( - map((archives) => { - const groups: {[groupname: string]: Group} = {}; - - for (const a of archives) { - if (!groups[a.provider]) { - groups[a.provider] = { - group: [], - name: a.provider, - }; - } - groups[a.provider].group.push(a); - } - - const iterableGroups: Array> = []; - const keys = Object.keys(groups).sort(); - for (const key of keys) { - const value = groups[key]; - value.group = value.group.sort((x, y) => (x.dataset < y.dataset ? 0 : 1)); - iterableGroups.push(value); - } - - return iterableGroups; - }), - ); - } - - add(archive: AbcdArchive) { - const basicColumns: BasicColumns = { - numeric: [], - textual: [], - }; - - const attributes: Array = []; - const dataTypes = new Map(); - const units = new Map(); - - this.userService - .getSourceSchemaAbcd() - .pipe(first()) - .subscribe((sourceSchema) => { - for (const attribute of sourceSchema) { - if (attribute.numeric) { - basicColumns.numeric.push(attribute.name); - attributes.push(attribute.name); - dataTypes.set(attribute.name, DataTypes.Float64); // TODO: get more accurate type - units.set(attribute.name, Unit.defaultUnit); - } else { - basicColumns.textual.push(attribute.name); - attributes.push(attribute.name); - dataTypes.set(attribute.name, DataTypes.Alphanumeric); // TODO: get more accurate type - units.set(attribute.name, Unit.defaultUnit); - } - } - - const sourceTypeConfig: ABCDSourceTypeConfig = { - provider: archive.provider, - id: archive.file, - columns: basicColumns, - }; - - const operator = new Operator({ - operatorType: new ABCDSourceType(sourceTypeConfig), - resultType: ResultTypes.POINTS, - projection: Projections.WGS_84, - attributes, - dataTypes, - units, - }); - - const clustered = true; - const layer = new VectorLayer({ - name: archive.dataset, - operator, - symbology: PointSymbology.createClusterSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }), - // data: this.mappingQueryService.getWFSDataStreamAsGeoJsonFeatureCollection({ - // operator, - // clustered, - // }), - // provenance: this.mappingQueryService.getProvenanceStream(operator), - clustered, - }); - // this.layerService.addLayer(layer); - this.projectService.addLayer(layer); - }); - } -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd.model.ts b/projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd.model.ts deleted file mode 100644 index dfa1f7c7..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/abcd-repository/abcd.model.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface AbcdArchive { - dataset: string; - file: string; - link: string; - provider: string; -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/csv.model.ts b/projects/gfbio-app/src/app/operators/dialogs/baskets/csv.model.ts deleted file mode 100644 index 3a8e3839..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/csv.model.ts +++ /dev/null @@ -1,46 +0,0 @@ -export interface BasicColumns { - numeric: Array; - textual: Array; -} - -export interface CsvColumns extends BasicColumns { - x?: string; - y?: string; - time1?: string; - time2?: string; -} - -export type CsvTimeType = 'custom' | 'seconds' | 'dmyhm' | 'iso'; - -export interface CsvTimeFormat { - format: CsvTimeType; -} - -export type CsvErrorCase = 'skip' | 'abort' | 'keep'; - -export interface CsvParameters { - separator?: string; - on_error?: CsvErrorCase; - geometry: string; - time: 'none' | 'start' | 'start+end' | 'start+duration'; - time1_format?: CsvTimeFormat; - time2_format?: CsvTimeFormat; - duration?: number; - columns: CsvColumns; -} - -export interface Csv { - name: string; - params: CsvParameters; - geometry_type?: 'points' | 'lines' | 'polygons'; -} - -export interface CsvColumn { - name: string; - numeric: boolean; - unit: string; -} - -export interface CsvFile extends Csv { - filename: string; -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-basket-result.component.ts b/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-basket-result.component.ts deleted file mode 100644 index 2d97a4c5..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-basket-result.component.ts +++ /dev/null @@ -1,62 +0,0 @@ -import {Input, Directive, Inject} from '@angular/core'; - -import { - Operator, - ResultTypes, - VectorLayer, - PointSymbology, - VectorSymbology, - MappingQueryService, - LayerService, - RandomColorService, - UserService, - ProjectService, - UnexpectedResultType, -} from 'wave-core'; - -import {GFBioMappingQueryService} from '../../../queries/mapping-query.service'; -import {IBasketResult} from './gfbio-basket.model'; -import {GFBioUserService} from '../../../users/user.service'; - -@Directive() -// eslint-disable-next-line @angular-eslint/directive-class-suffix -export abstract class BasketResultComponent { - @Input() result: T; - - protected constructor( - @Inject(MappingQueryService) protected readonly mappingQueryService: GFBioMappingQueryService, - protected readonly layerService: LayerService, - protected readonly randomColorService: RandomColorService, - @Inject(UserService) protected readonly userService: GFBioUserService, - protected readonly projectService: ProjectService, - ) {} - - protected createAndAddLayer(operator: Operator, name: string) { - let clustered = false; - let symbology; - - switch (operator.resultType) { - case ResultTypes.POINTS: - symbology = PointSymbology.createClusterSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }); - clustered = true; - break; - case ResultTypes.POLYGONS: - symbology = VectorSymbology.createSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }); - break; - default: - throw new UnexpectedResultType(); - } - - const layer = new VectorLayer({ - name, - operator, - symbology, - clustered, - }); - this.projectService.addLayer(layer); - } -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-basket.model.ts b/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-basket.model.ts deleted file mode 100644 index 375af2e7..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-basket.model.ts +++ /dev/null @@ -1,71 +0,0 @@ -import {Moment} from 'moment'; - -import {VectorLayer, AbstractVectorSymbology} from 'wave-core'; - -import {CsvColumn} from './csv.model'; - -export type BasketResult = IBasketAbcdResult | IBasketPangaeaResult; - -export type BasketType = BasketTypeAbcd | BasketTypePangaea | BasketTypeAbcdGrouped; -export type BasketTypeAbcd = 'abcd'; -export type BasketTypeAbcdGrouped = 'abcd_grouped'; -export type BasketTypePangaea = 'pangaea'; - -export interface IBasketResult { - authors: Array; - available: boolean; - dataCenter: string; - dataLink: string; - metadataLink: string; - title: string; - type: BasketType; - resultType: string; -} - -export interface IBasketAbcdResult extends IBasketResult { - unitId?: string; -} - -export interface IBasketGroupedAbcdUnits { - unitId: string; - prefix: string; - type: string; - metadataLink: string; -} - -export interface IBasketGroupedAbcdResult extends IBasketResult { - units: Array; -} - -export interface IBasketPangaeaResult extends IBasketResult { - doi: string; - format: string; - isGeoReferenced?: boolean; - isTabSeparated?: boolean; - parameters: Array; - geometrySpecification: string; - column_x?: string; - column_y?: string; -} - -export interface Basket { - query: string; - results: Array; - timestamp: Moment; -} - -export interface BasketsOverviewBasket { - basketId: number; - query: string; - timestamp: Moment; -} - -export interface BasketsOverview { - baskets: Array; - totalNumberOfBaskets: number; -} - -export interface BasketAvailability { - availableLayers: Array>; - nonAvailableNames: Array; -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-basket.pipe.ts b/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-basket.pipe.ts deleted file mode 100644 index b95f9fbc..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-basket.pipe.ts +++ /dev/null @@ -1,54 +0,0 @@ -import {Pipe, PipeTransform} from '@angular/core'; -import {IBasketResult, IBasketAbcdResult, IBasketGroupedAbcdResult} from './gfbio-basket.model'; - -@Pipe({name: 'waveBasketResultGroupByDatasetPipe'}) -export class BasketResultGroupByDatasetPipe implements PipeTransform { - static regex = /(.*),\s*a\s*(.*)?record\s*of\s*the\s*"(.*)"\s*dataset\s*\[ID:\s*(.*)\]\s*/; - - transform(results: Array): Array { - const array: Array = []; - results.forEach((result) => { - const entry = array.find((b) => b.dataLink === result.dataLink); - - if (result.type === 'abcd') { - const abcd = result as IBasketAbcdResult; - - const unit_type_title_id = BasketResultGroupByDatasetPipe.regex.exec(abcd.title); - const title = unit_type_title_id && unit_type_title_id[3] ? unit_type_title_id[3] : abcd.title; - const unit = - unit_type_title_id && unit_type_title_id[4] - ? { - unitId: unit_type_title_id[4], - prefix: unit_type_title_id[1], - type: unit_type_title_id[2], - metadataLink: abcd.metadataLink, - } - : undefined; - - if (!entry) { - const metadataLink = abcd.metadataLink; - const grouped: IBasketGroupedAbcdResult = { - title, - dataLink: abcd.dataLink, - authors: abcd.authors, - available: abcd.available, - dataCenter: abcd.dataCenter, - metadataLink, - units: unit ? [unit] : [], - type: 'abcd_grouped', - resultType: 'points', - }; - array.push(grouped); - } else { - if (unit) { - const grouped = entry as IBasketGroupedAbcdResult; - grouped.units.push(unit); - } - } - } else if (!entry) { - array.push(result); - } - }); - return array; - } -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-baskets.component.html b/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-baskets.component.html deleted file mode 100644 index 8bf9d5ab..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-baskets.component.html +++ /dev/null @@ -1,55 +0,0 @@ -GFBio Search Baskets - - - - - - Basket History - Select other search results - - -
- -
- - - - -

{{ basketOverview.query }}

-

no search term

-

{{ basketOverview.timestamp | date }}

-
-
- - -
-
- -
- -
- - - - - - - diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-baskets.component.scss b/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-baskets.component.scss deleted file mode 100644 index 62bdaeb0..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-baskets.component.scss +++ /dev/null @@ -1,30 +0,0 @@ -div.loading { - padding: 32px calc(50% - 100px / 2); -} - -mat-progress-spinner { - width: 100px; - height: 100px; -} - -.clickable { - cursor: pointer; -} - -mat-list-item.clickable:hover { - background-color: var(--wave-background-hover-color, grey); -} - -.small { - font-size: small; - color: var(--wave-foreground-secondary-text-color, grey); -} - -.no-search-term { - font-style: italic; -} - -.error-button { - position: absolute; - margin: 2rem calc(50% - (24px / 2)); -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-baskets.component.ts b/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-baskets.component.ts deleted file mode 100644 index a1add838..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/gfbio-baskets.component.ts +++ /dev/null @@ -1,111 +0,0 @@ -import {of as observableOf, combineLatest as observableCombineLatest, ReplaySubject, BehaviorSubject, Subscription} from 'rxjs'; -import {tap, mergeMap, catchError} from 'rxjs/operators'; - -import {ChangeDetectionStrategy, Component, Inject, OnDestroy} from '@angular/core'; - -import * as moment from 'moment'; - -import {MappingQueryService, NotificationService} from 'wave-core'; - -import {Basket, BasketsOverview, BasketTypeAbcdGrouped} from './gfbio-basket.model'; -import {GFBioMappingQueryService} from '../../../queries/mapping-query.service'; - -@Component({ - selector: 'wave-gfbio-baskets', - templateUrl: './gfbio-baskets.component.html', - styleUrls: ['./gfbio-baskets.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class GfbioBasketsComponent implements OnDestroy { - // for template - BasketTypeAbcdGrouped: BasketTypeAbcdGrouped = 'abcd_grouped'; - - page$ = new BehaviorSubject(0); - limit$ = new BehaviorSubject(5); - - basketsOverview$ = new ReplaySubject(1); - selectedBasketId$ = new ReplaySubject(1); - selectedBasket$ = new ReplaySubject(1); - - isOverviewLoading$ = new BehaviorSubject(true); - isDetailsLoading$ = new BehaviorSubject(true); - isError$ = new BehaviorSubject(false); - reload$: BehaviorSubject = new BehaviorSubject(undefined); - - historyExpanded$ = new BehaviorSubject(false); - - private subscriptions: Array = []; - - constructor( - @Inject(MappingQueryService) private mappingQueryService: GFBioMappingQueryService, - private notificationService: NotificationService, - ) { - let initialBasketLoaded = false; - - this.subscriptions.push( - observableCombineLatest(this.page$, this.limit$, this.reload$) - .pipe( - tap(() => this.isOverviewLoading$.next(true)), - mergeMap(([page, limit]) => - this.mappingQueryService.getGFBioBaskets({offset: page * limit, limit}).pipe( - tap(() => this.isError$.next(false)), - catchError((error) => { - this.isError$.next(true); - this.notificationService.error(error); - return observableOf({ - baskets: [], - totalNumberOfBaskets: NaN, - } as BasketsOverview); - }), - ), - ), - tap(() => this.isOverviewLoading$.next(false)), - tap((basketsOverviews) => { - if (!initialBasketLoaded && basketsOverviews.baskets.length > 0) { - this.loadBasket(basketsOverviews.baskets[0].basketId); - initialBasketLoaded = true; - } - }), - ) - .subscribe((basketsOverview) => this.basketsOverview$.next(basketsOverview)), - ); - - this.subscriptions.push( - observableCombineLatest(this.selectedBasketId$, this.reload$) - .pipe( - tap(() => this.isDetailsLoading$.next(true)), - mergeMap(([id]) => - this.mappingQueryService.getGFBioBasket(id).pipe( - tap(() => this.isError$.next(false)), - catchError((error) => { - this.isError$.next(true); - this.notificationService.error(error); - return observableOf({ - query: '', - results: [], - timestamp: moment.invalid(), - } as Basket); - }), - ), - ), - tap(() => this.isDetailsLoading$.next(false)), - ) - .subscribe((basket) => this.selectedBasket$.next(basket)), - ); - } - - ngOnDestroy() { - this.subscriptions.forEach((subscription) => { - subscription.unsubscribe(); - }); - } - - loadBasket(id: number) { - this.selectedBasketId$.next(id); - this.historyExpanded$.next(false); - } - - reload() { - this.reload$.next(undefined); - } -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component.html b/projects/gfbio-app/src/app/operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component.html deleted file mode 100644 index bc3fe72c..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component.html +++ /dev/null @@ -1,64 +0,0 @@ - - - {{ result.title | waveTrimPipe }} - - - - - - - - - - - - - - - - -
Authors - {{ author | waveTrimPipe }} -
Data center{{ result.dataCenter | waveTrimPipe }}
MetadataDataset landing page
- - -

Units from multiple search results based on this dataset:

- - - Unit - {{ unit.prefix }} - - - Type - {{ unit.type }} - - - Unit Id - - {{ unit.unitId }} - - - - - -
-
- - -
- - -
- - - This dataset is currently not available in the VAT system -
    -
  • no georeference detected
  • -
-
-
-
- - diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component.scss b/projects/gfbio-app/src/app/operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component.scss deleted file mode 100644 index c8c128a8..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component.scss +++ /dev/null @@ -1,33 +0,0 @@ -mat-card-header ::ng-deep .mat-card-header-text { - margin: 0 !important; -} - -mat-card-title { - font-size: large !important; - color: var(--wave-primary-color, black); -} - -table.main { - text-align: left; - padding: 0; - border-spacing: 0; - margin-bottom: 1rem; -} - -.main td:first-child { - color: var(--wave-foreground-secondary-text-color, black); - margin-right: 1rem; -} - -.main td:first-child:after { - content: ':'; -} - -.no-bottom-margin { - margin-bottom: 0; -} - -mat-card-actions { - margin-left: 0 !important; - margin-right: 0 !important; -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component.ts b/projects/gfbio-app/src/app/operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component.ts deleted file mode 100644 index 03b86f28..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/grouped-abcd-basket-result/grouped-abcd-basket-result.component.ts +++ /dev/null @@ -1,135 +0,0 @@ -import {Observable, Subscription, of as observableOf} from 'rxjs'; - -import {ChangeDetectionStrategy, Component, Inject, OnDestroy, OnInit} from '@angular/core'; -import {DataSource} from '@angular/cdk/collections'; - -import { - RandomColorService, - UserService, - Projections, - MappingQueryService, - LayerService, - ProjectService, - DataType, - DataTypes, - Unit, - ResultTypes, - Operator, -} from 'wave-core'; - -import {BasicColumns, CsvColumn} from '../csv.model'; -import {IBasketGroupedAbcdResult, IBasketGroupedAbcdUnits} from '../gfbio-basket.model'; -import {BasketResultComponent} from '../gfbio-basket-result.component'; -import {ABCDSourceType, ABCDSourceTypeConfig} from '../../../types/abcd-source-type.model'; -import {GFBioMappingQueryService} from '../../../../queries/mapping-query.service'; -import {GFBioUserService} from '../../../../users/user.service'; - -class UnitDataSource extends DataSource { - private units: Array; - - constructor(units: Array) { - super(); - this.units = units; - } - - connect(): Observable> { - return observableOf(this.units); - } - - disconnect() {} -} - -@Component({ - selector: 'wave-gfbio-grouped-abcd-basket-result', - templateUrl: './grouped-abcd-basket-result.component.html', - styleUrls: ['./grouped-abcd-basket-result.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class GroupedAbcdBasketResultComponent extends BasketResultComponent implements OnInit, OnDestroy { - hasUnits = false; - sourceSchema: Array = []; - - unitDataSource: UnitDataSource; - displayedUnitColumns = ['prefix', 'type', 'unitId']; - - private abcdSchemaSubscription: Subscription; - - static createOperatorFromGroupedABCDData( - result: IBasketGroupedAbcdResult, - sourceSchema: Array, - filterUnits: boolean, - ): Operator { - const basicColumns: BasicColumns = { - numeric: [], - textual: [], - }; - - const attributes: Array = []; - const dataTypes = new Map(); - const units = new Map(); - - for (const attribute of sourceSchema) { - if (attribute.numeric) { - basicColumns.numeric.push(attribute.name); - attributes.push(attribute.name); - dataTypes.set(attribute.name, DataTypes.Float64); // TODO: get more accurate type - units.set(attribute.name, Unit.defaultUnit); - } else { - basicColumns.textual.push(attribute.name); - attributes.push(attribute.name); - dataTypes.set(attribute.name, DataTypes.Alphanumeric); // TODO: get more accurate type - units.set(attribute.name, Unit.defaultUnit); - } - } - - const sourceTypeConfig: ABCDSourceTypeConfig = { - provider: result.dataCenter, - id: result.dataLink, - columns: basicColumns, - }; - - if (filterUnits) { - sourceTypeConfig.units = result.units.map((u) => u.unitId); - } - - return new Operator({ - operatorType: new ABCDSourceType(sourceTypeConfig), - resultType: ResultTypes.POINTS, - projection: Projections.WGS_84, - attributes, - dataTypes, - units, - }); - } - - constructor( - @Inject(MappingQueryService) protected readonly mappingQueryService: GFBioMappingQueryService, - protected readonly layerService: LayerService, - protected readonly randomColorService: RandomColorService, - @Inject(UserService) protected readonly userService: GFBioUserService, - protected readonly projectService: ProjectService, - ) { - super(mappingQueryService, layerService, randomColorService, userService, projectService); - } - - ngOnInit() { - this.hasUnits = this.result.units.length > 0; - this.abcdSchemaSubscription = this.userService.getSourceSchemaAbcd().subscribe((schema) => { - // TODO: subscribe when something might change... - this.sourceSchema = schema; - }); - - this.unitDataSource = new UnitDataSource(this.result.units); - } - - ngOnDestroy() { - this.abcdSchemaSubscription.unsubscribe(); - } - - add(filterUnits: boolean) { - this.createAndAddLayer( - GroupedAbcdBasketResultComponent.createOperatorFromGroupedABCDData(this.result, this.sourceSchema, filterUnits), - this.result.title, - ); - } -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component.html b/projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component.html deleted file mode 100644 index 434add23..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component.html +++ /dev/null @@ -1,40 +0,0 @@ - - - {{ result.title | waveTrimPipe }} - - - - - - - - - - - - - - - - -
Authors - {{ author | waveTrimPipe }} -
Data center{{ result.dataCenter | waveTrimPipe }}
MetadataDataset landing page
-
- - -
- -
- - - This dataset is currently not available in the VAT system -
    -
  • the data is not tab-separated
  • -
  • no georeference detected
  • -
-
-
-
- - diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component.scss b/projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component.scss deleted file mode 100644 index c8c128a8..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component.scss +++ /dev/null @@ -1,33 +0,0 @@ -mat-card-header ::ng-deep .mat-card-header-text { - margin: 0 !important; -} - -mat-card-title { - font-size: large !important; - color: var(--wave-primary-color, black); -} - -table.main { - text-align: left; - padding: 0; - border-spacing: 0; - margin-bottom: 1rem; -} - -.main td:first-child { - color: var(--wave-foreground-secondary-text-color, black); - margin-right: 1rem; -} - -.main td:first-child:after { - content: ':'; -} - -.no-bottom-margin { - margin-bottom: 0; -} - -mat-card-actions { - margin-left: 0 !important; - margin-right: 0 !important; -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component.ts b/projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component.ts deleted file mode 100644 index 5427fb92..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea-basket-result/pangaea-basket-result.component.ts +++ /dev/null @@ -1,98 +0,0 @@ -import {ChangeDetectionStrategy, Component, Inject} from '@angular/core'; - -import { - RandomColorService, - UserService, - Projections, - MappingQueryService, - LayerService, - ProjectService, - DataType, - DataTypes, - Unit, - ResultTypes, - Operator, -} from 'wave-core'; - -import {CsvColumns, CsvParameters} from '../csv.model'; -import {IBasketPangaeaResult} from '../gfbio-basket.model'; -import {BasketResultComponent} from '../gfbio-basket-result.component'; -import {PangaeaSourceType} from '../../../types/pangaea-source-type.model'; -import {GFBioMappingQueryService} from '../../../../queries/mapping-query.service'; -import {GFBioUserService} from '../../../../users/user.service'; - -@Component({ - selector: 'wave-gfbio-pangaea-basket-result', - templateUrl: './pangaea-basket-result.component.html', - styleUrls: ['./pangaea-basket-result.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PangaeaBasketResultComponent extends BasketResultComponent { - static createOperatorFromPangaeaData(result: IBasketPangaeaResult): Operator { - const csvColumns: CsvColumns = { - numeric: [], - textual: [], - x: '', - y: '', - }; - - const attributes: Array = []; - const dataTypes = new Map(); - const units = new Map(); - - for (const attribute of result.parameters) { - if (attribute.numeric) { - csvColumns.numeric.push(attribute.name); - attributes.push(attribute.name); - dataTypes.set(attribute.name, DataTypes.Float64); // TODO: get more accurate type - units.set(attribute.name, Unit.defaultUnit); - } else { - csvColumns.textual.push(attribute.name); - attributes.push(attribute.name); - dataTypes.set(attribute.name, DataTypes.Alphanumeric); // TODO: get more accurate type - units.set(attribute.name, Unit.defaultUnit); - } - } - - csvColumns.x = result.column_x; - csvColumns.y = result.column_y; - - const csvParameters: CsvParameters = { - geometry: result.geometrySpecification, - separator: '\t', - time: 'none', - columns: csvColumns, - on_error: 'keep', // TODO: let the user decide on this - }; - - return new Operator({ - operatorType: new PangaeaSourceType({ - doi: result.doi, - csvParameters, - }), - resultType: ResultTypes.fromCode(result.resultType), - projection: Projections.WGS_84, - attributes, - dataTypes, - units, - }); - } - - constructor( - @Inject(MappingQueryService) protected readonly mappingQueryService: GFBioMappingQueryService, - protected readonly layerService: LayerService, - protected readonly randomColorService: RandomColorService, - @Inject(UserService) protected readonly userService: GFBioUserService, - protected readonly projectService: ProjectService, - ) { - super(mappingQueryService, layerService, randomColorService, userService, projectService); - } - - createResultOperator(): Operator { - return PangaeaBasketResultComponent.createOperatorFromPangaeaData(this.result); - } - - addDataset() { - this.createAndAddLayer(this.createResultOperator(), this.result.title); - } -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea.model.ts b/projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea.model.ts deleted file mode 100644 index 07c468d7..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/baskets/pangaea.model.ts +++ /dev/null @@ -1,5 +0,0 @@ -import {Csv} from './csv.model'; - -export interface PangaeaDataset extends Csv { - datalink: string; -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/terminology-lookup/terminology-lookup.component.html b/projects/gfbio-app/src/app/operators/dialogs/terminology-lookup/terminology-lookup.component.html deleted file mode 100644 index 19358c89..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/terminology-lookup/terminology-lookup.component.html +++ /dev/null @@ -1,72 +0,0 @@ -GFBio Terminology Lookup -
-
- - - - - {{ attribute }} - - - - - - [{{ terminology.acronym }}] {{ terminology.name }} - - - - - - - - The terminology_key must be non-empty. - - - - - - - The resolved attribute name must be non-empty. - - - - - - {{ TerminologyLookupOnNotResolvable.KEEP }} - {{ TerminologyLookupOnNotResolvable.EMPTY }} - - - - - - {{ TerminologyLookupMatchType.EXACT }} - {{ TerminologyLookupMatchType.INCLUDED }} - {{ TerminologyLookupMatchType.REGEX }} - - - - Use first hit - - - - The name must be non-empty. - - -
-
- -
-
diff --git a/projects/gfbio-app/src/app/operators/dialogs/terminology-lookup/terminology-lookup.component.scss b/projects/gfbio-app/src/app/operators/dialogs/terminology-lookup/terminology-lookup.component.scss deleted file mode 100644 index f907881f..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/terminology-lookup/terminology-lookup.component.scss +++ /dev/null @@ -1,24 +0,0 @@ -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.container { - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -.actions { - text-align: right; - padding: 1rem; -} - -mat-form-field { - width: 100% !important; - margin: 0 0 1rem 0; -} - -.error { - color: var(--wave-warn-color, red); -} diff --git a/projects/gfbio-app/src/app/operators/dialogs/terminology-lookup/terminology-lookup.component.ts b/projects/gfbio-app/src/app/operators/dialogs/terminology-lookup/terminology-lookup.component.ts deleted file mode 100644 index fa0fd16d..00000000 --- a/projects/gfbio-app/src/app/operators/dialogs/terminology-lookup/terminology-lookup.component.ts +++ /dev/null @@ -1,316 +0,0 @@ -import {Observable} from 'rxjs'; -import {map, tap} from 'rxjs/operators'; - -import {AfterViewInit, ChangeDetectionStrategy, Component} from '@angular/core'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; - -import { - VectorLayer, - AbstractVectorSymbology, - Operator, - ProjectService, - WaveValidators, - RandomColorService, - DataTypes, - ResultTypes, -} from 'wave-core'; -import {TerminologyLookupType, TerminologyLookupOnNotResolvable, TerminologyLookupMatchType} from '../../types/terminology-lookup-type'; - -// TODO: replace with actual lookup -const TERMINOLOGIES: Array<{name: string; acronym: string; description: string; uri: string}> = [ - { - name: 'Biological Collections Ontology', - acronym: 'BCO', - description: - "The biological collection ontology includes consideration of the distinctions between individuals, organisms, voucher specimens, lots, and samples the relations between these entities, and processes governing the creation and use of 'samples'. Within scope as well are properties including collector, location, time, storage environment, containers, institution, and collection identifiers. ", - uri: 'http://purl.obolibrary.org/obo/bco.owl', - }, - { - name: 'Flora Phenotype Ontology', - acronym: 'FLOPO', - description: - 'The Flora Phenotype Ontology is an ontology of phenotypes reported in Floras. The original version was developed at the pro-iBiosphere Hackathon in Leiden. This is the pre-classified version of the ontology; the original OWL file is at https://github.com/flora-phenotype-ontology/flopoontology/blob/master/ontology/flopo.owl The Flora Phenotype Ontology is generated from the Flora Malesiana, Flora Gabon, Flora of Central Africa, and a collection of Kews African Floras. Every class in the ontology has at least one taxon annotation. The (draft) taxon annotation are available at http://jagannath.pdn.cam.ac.uk/plant/flora/clean-rerun/', - uri: 'http://purl.obolibrary.org/obo/flopo.owl', - }, - { - name: 'Phenotypic Quality Ontology', - acronym: 'PATO', - description: - 'Phenotypic qualities (properties). This ontology can be used in conjunction with other ontologies such as GO or anatomical ontologies to refer to phenotypes. Examples of qualities are red, ectopic, high temperature, fused, small, edematous and arrested.', - uri: 'http://purl.obolibrary.org/obo/pato.owl', - }, - { - name: 'Chemical Entities of Biological Interest Ontology', - acronym: 'CHEBI', - description: 'A structured classification of chemical compounds of biological relevance.', - uri: 'http://purl.obolibrary.org/obo/chebi/160/chebi.owl', - }, - { - name: 'RecordBasis', - acronym: 'RECORDBASIS', - description: - "A controlled vocabulary (Terminology) 'BasisOfRecords' or 'RecordBasis' (DwC: “The specific nature of the data record.”). Based on GBIF/ DwC and BiNHum/ABCD.", - uri: 'http://terminologies.gfbio.org/terms/RECORDBASIS', - }, - { - name: 'Bohlmann Ontology', - acronym: 'BOHLMANN', - description: 'An ontology listing the natural substances that occurr in the plant family of Compositae (Asteraceae).', - uri: 'http://terminologies.gfbio.org/terms/BOHLMANN', - }, - { - name: 'Trichoptera Ontology', - acronym: 'TRICHOPTERA', - description: 'Working list: taxon names of the order Trichoptera (caddisflies; Insecta).', - uri: 'http://terminologies.gfbio.org/terms/TRICHOPTERA/', - }, - { - name: 'Environment Ontology', - acronym: 'ENVO', - description: - 'Official PURL: http://purl.obolibrary.org/obo/envo.owl The most up-to-date information about ENVO is available here: http://www.obofoundry.org/ontology/envo.html EnvO is an OBO Foundry and Library ontology for the concise, controlled description of environmental entities such as ecosystems, environmental processes, and environmental qualities. It closely interoperates with a broad collection of other OBO ontologies and is used in a diverse range of projects.', - uri: 'http://purl.obolibrary.org/obo/envo.owl', - }, - { - name: 'Thysanoptera Ontology', - acronym: 'THYSANOPTERA', - description: 'Working list: taxon names of the order Thysanoptera (Insecta).', - uri: 'http://terminologies.gfbio.org/terms/THYSANOPTERA/', - }, - { - name: 'The Extensible Observation Ontology', - acronym: 'OBOE', - description: - 'The Extensible Observation Ontology (OBOE) is a formal ontology for capturing the semantics of scientific observation and measurement. The ontology supports researchers to add detailed semantic annotations to scientific data, thereby clarifying the inherent meaning of scientific observations.', - uri: 'http://ecoinformatics.org/oboe/oboe.1.2/oboe.owl', - }, - { - name: 'Kingdom', - acronym: 'KINGDOM', - description: - "A controlled vocabulary (Terminology) for biological taxa 'Higher Classification - Kingdom (=Regnum)'. Based on GBIF and CoL.", - uri: 'http://terminologies.gfbio.org/terms/KINGDOM', - }, - { - name: 'Plant Trait Ontology', - acronym: 'PTO', - description: - 'A controlled vocabulary to describe phenotypic traits in plants. Each trait is a distinguishable feature, characteristic, quality or phenotypic feature of a developing or mature plant, or a plant part.', - uri: 'http://purl.obolibrary.org/obo/to.owl', - }, - { - name: 'Oribatida Ontology', - acronym: 'ORIBATIDA', - description: 'Working list: taxon names of the order Oribatida (moss- or beetle-mites).', - uri: 'http://terminologies.gfbio.org/terms/ORIBATIDA/', - }, - { - name: 'Quantity, Unit, Dimension and Type', - acronym: 'QUDT', - description: - 'The QUDT collection of ontologies define the base classes properties, and restrictions used for modeling physical quantities, units of measure, and their dimensions in various measurement systems. The goal of the QUDT ontology is to provide a unified model of, measurable quantities, units for measuring different kinds of quantities, the numerical values of quantities in different units of measure and the data structures and data types used to store and manipulate these objects in software. This OWL schema is a foundation for a basic treatment of units.', - uri: 'http://data.qudt.org/qudt/owl/1.0.0/qudt-all.owl', - }, - { - name: 'Semantic Web for Earth and Environment Technology Ontology', - acronym: 'SWEET', - description: - 'The Semantic Web for Earth and Environmental Terminology is a mature foundational ontology that contains over 6000 concepts organized in 200 ontologies represented in OWL. Top level concepts include Representation (math, space, science, time, data), Realm (Ocean, Land Surface, Terrestrial Hydroshere, Atmosphere, etc.), Phenomena (macro-scale ecological and physical), Processes (micro-scale physical, biological, chemical, and mathematical), Human Activities (Decision, Commerce, Jurisdiction, Environmental, Research). Originally developed by NASA Jet Propulsion Labs under Rob Raskin, SWEET is now officially under the governance of the ESIP foundation.', - uri: 'http://sweetontology.net/sweetAll', - }, - { - name: 'ISO 3166 Countries and Subdivisions', - acronym: 'ISOCOUNTRIES', - description: 'ISO 3166 Countries and Subdivisions', - uri: 'http://terminologies.gfbio.org/terms/ISOCOUNTRIES', - }, - { - name: 'The lithologs rock names ontology for igneous rocks', - acronym: 'LIT_I', - description: - 'The lithologs ontology for igneous rocks provides SKOSified information on the classification of igneous rocks extracted from the IUGS recommendations published by Le Maitre (ed.)(2002): Igneous rocks: a classification and glossary of terms', - uri: 'http://terminologies.gfbio.org/terms/LIT_I', - }, - { - name: 'National Center for Biotechnology Information (NCBI) Organismal Classification', - acronym: 'NCBITAXON', - description: - 'The NCBI Taxonomy Database is a curated classification and nomenclature for all of the organisms in the public sequence databases.', - uri: 'http://purl.obolibrary.org/obo/ncbitaxon.owl', - }, - { - name: 'Regionalised and Domain-specific Taxon Lists', - acronym: 'DTNtaxonlists_SNSB', - description: - 'The DWB REST Webservice for Taxon Lists is part of a Diversity Workbench (DWB) services network. It is delivering basic information on taxon names in use, synonyms, classification and German vernacular names of a number of groups of animals, fungi and plants. The current focus is on domain-specific lists (checklists, taxon reference lists, red lists) from Germany under active curation by experts on taxonomy or floristics and faunistics. Each regionalised and domain-specific taxon list has its own history and objectives, is managed completely separately and has its own hierarchical classification. The DiversityTaxonNames (DTN) data resources accessed by the REST API may include additional taxon-related data useful, e. g., for regional nature conservation agencies and environmental projects. This information might be mobilised in a next step. For more information please check the Overview on Published Lists ( http://services.snsb.info/DTNtaxonlists/rest/v0.1/) and the REST-API documentation ( http://services.snsb.info/DTNtaxonlists/rest/v0.1/static/api-doc.html).', - uri: 'http://www.eu-nomen.eu/portal/taxon.php?GUID=', - }, - { - name: 'Catalogue Of Life', - acronym: 'COL', - description: - 'The Catalogue of Life is the most comprehensive and authoritative global index of species currently available. It consists of a single integrated species checklist and taxonomic hierarchy. The Catalogue holds essential information on the names, relationships and distributions of over 1.7 million species. This figure continues to rise as information is compiled from diverse sources around the world. . Accessed via: https://cybertaxonomy.eu/cdmlib/rest-api-name-catalogue.html.', - uri: 'http://api.cybertaxonomy.org/col/name_catalogue/', - }, - { - name: 'Prokaryotic Nomenclature up-to-date', - acronym: 'PNU', - description: - "PNU is a compilation of all names of Bacteria and Archaea which have been validly published according to the Bacteriological Code since 1. Jan. 1980, and nomenclatural changes which have been validly published since. It will be updated with the publication of each new issue of the Int. J. Syst. Evol. Microbiol. (IJSEM). 'Prokaryotic Nomenclature up-to-date' is published by the Leibniz-Institut DSMZ - Deutsche Sammlung von Mikroorganismen und Zellkulturen GmbH.", - uri: 'http://bacdive.dsmz.de/api/pnu/', - }, - { - name: 'Integrated Taxonomic Information System', - acronym: 'ITIS', - description: - 'The White House Subcommittee on Biodiversity and Ecosystem Dynamics has identified systematics as a research priority that is fundamental to ecosystem management and biodiversity conservation. This primary need identified by the Subcommittee requires improvements in the organization of, and access to, standardized nomenclature. ITIS (originally referred to as the Interagency Taxonomic Information System) was designed to fulfill these requirements. In the future, the ITIS will provide taxonomic data and a directory of taxonomic expertise that will support the system. The ITIS is the result of a partnership of federal agencies formed to satisfy their mutual needs for scientifically credible taxonomic information. Since its inception, ITIS has gained valuable new partners and undergone a name change; ITIS now stands for the Integrated Taxonomic Information System. ', - uri: 'http://www.itis.gov/', - }, - { - name: 'The GeoNames geographical database', - acronym: 'GEONAMES', - description: - 'The GeoNames geographical database is available for download free of charge under a creative commons attribution license. It contains over 10 million geographical names and consists of over 9 million unique features whereof 2.8 million populated places and 5.5 million alternate names. All features are categorized into one out of nine feature classes and further subcategorized into one out of 645 feature codes.', - uri: 'http://sws.geonames.org/', - }, - { - name: 'Pan-European Species directories Infrastructure', - acronym: 'PESI', - description: - 'PESI provides standardised and authoritative taxonomic information by integrating and securing Europes taxonomically authoritative species name registers and nomenclators (name databases) and associated exper(tise) networks that underpin the management of biodiversity in Europe.', - uri: 'http://www.eu-nomen.eu/portal/taxon.php?GUID=', - }, - { - name: 'World Register of Marine Species', - acronym: 'WORMS', - description: - 'The aim of a World Register of Marine Species (WoRMS) is to provide an authoritative and comprehensive list of names of marine organisms, including information on synonymy. While highest priority goes to valid names, other names in use are included so that this register can serve as a guide to interpret taxonomic literature.', - uri: 'http://www.marinespecies.org/aphia.php?p=soap', - }, -]; - -/** - * This component allows creating the terminology lookup operator. - */ -@Component({ - selector: 'wave-gfbio-terminology-lookup', - templateUrl: './terminology-lookup.component.html', - styleUrls: ['./terminology-lookup.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class TerminologyLookupOperatorComponent implements AfterViewInit { - // for the template - readonly ResultTypes = ResultTypes; - TerminologyLookupOnNotResolvable = TerminologyLookupOnNotResolvable; - TerminologyLookupMatchType = TerminologyLookupMatchType; - TERMINOLOGIES = TERMINOLOGIES; - - form: FormGroup; - attributes$: Observable>; - - constructor(private projectService: ProjectService, private formBuilder: FormBuilder, private randomColorService: RandomColorService) { - this.form = formBuilder.group({ - name: [undefined, [Validators.required, WaveValidators.notOnlyWhitespace]], - vectorLayer: [undefined, Validators.required], - attribute: [undefined, Validators.required], - terminology: ['ISOCOUNTRIES', Validators.required], - terminology_key: ['label', [Validators.required, WaveValidators.notOnlyWhitespace]], - resolved_attribute_name: [undefined, [Validators.required, WaveValidators.notOnlyWhitespace]], - matchType: [TerminologyLookupMatchType.INCLUDED, []], - on_not_resolvable: [TerminologyLookupOnNotResolvable.EMPTY, Validators.required], - first_hit: [true, []], - }); - - this.attributes$ = this.form.controls['vectorLayer'].valueChanges.pipe( - tap((layer) => { - // side effects!!! - this.form.controls['attribute'].setValue(undefined); - if (layer) { - this.form.controls['attribute'].enable({onlySelf: true}); - } else { - this.form.controls['attribute'].disable({onlySelf: true}); - } - }), - map((layer) => { - if (layer) { - return layer.operator.attributes.toArray().sort(); - } else { - return []; - } - }), - ); - } - - ngAfterViewInit() { - // initially get attributes - setTimeout(() => this.form.controls['vectorLayer'].enable({emitEvent: true})); - } - - add() { - const vectorLayer: VectorLayer = this.form.controls['vectorLayer'].value; - const sourceOperator: Operator = vectorLayer.operator; - - const attributeName: string = this.form.controls['attribute'].value; - const terminologyName: string = this.form.controls['terminology'].value; - const terminologyKeyName: string = this.form.controls['terminology_key'].value; - - const on_not_resolvable: TerminologyLookupOnNotResolvable = this.form.controls['on_not_resolvable'].value; - const match_type: TerminologyLookupMatchType = this.form.controls['matchType'].value; - const first_hit: boolean = this.form.controls['first_hit'].value; - const resolved_attribute_name = this.form.controls['resolved_attribute_name'].value; - - const name: string = this.form.controls['name'].value; - - // TODO: handle new terminology name and add it to the attribute list! - const operatorAttributes = sourceOperator.attributes.toArray(); - operatorAttributes.push(resolved_attribute_name); - const operatorDataTypes = sourceOperator.dataTypes.set('resolved_attribute_name', DataTypes.Alphanumeric); - - const dict = { - operatorType: new TerminologyLookupType({ - attribute_name: attributeName, - terminology: terminologyName, - key: terminologyKeyName, - on_not_resolvable, - resolved_attribute: resolved_attribute_name, - match_type, - first_hit, - }), - resultType: sourceOperator.resultType, - projection: sourceOperator.projection, - attributes: operatorAttributes, - dataTypes: operatorDataTypes, - units: sourceOperator.units, - pointSources: [], - lineSources: [], - polygonSources: [], - }; - - switch (sourceOperator.resultType) { - case ResultTypes.POINTS: - dict.pointSources.push(sourceOperator); - break; - case ResultTypes.LINES: - dict.lineSources.push(sourceOperator); - break; - case ResultTypes.POLYGONS: - dict.polygonSources.push(sourceOperator); - break; - default: - throw Error('Incompatible Input Type'); - } - - const operator = new Operator(dict); - - const symbology = (vectorLayer.symbology.clone() as any) as AbstractVectorSymbology; - symbology.fillRGBA = this.randomColorService.getRandomColorRgba(); - const layer = new VectorLayer({ - name, - operator, - symbology, - clustered: vectorLayer.clustered, - }); - - this.projectService.addLayer(layer); - } -} diff --git a/projects/gfbio-app/src/app/operators/types/abcd-source-type.model.ts b/projects/gfbio-app/src/app/operators/types/abcd-source-type.model.ts deleted file mode 100644 index f3f82e44..00000000 --- a/projects/gfbio-app/src/app/operators/types/abcd-source-type.model.ts +++ /dev/null @@ -1,107 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from 'wave-core'; -import {BasicColumns} from '../dialogs/baskets/csv.model'; - -export interface ABCDSourceTypeConfig { - provider: string; - id: string; - units?: Array; - columns?: BasicColumns; -} - -interface ABCDSourceTypeMappingDict extends OperatorTypeMappingDict { - path: string; - units: Array; - columns: BasicColumns; -} - -export interface ABCDSourceTypeDict extends OperatorTypeDict { - provider: string; - id: string; - units: Array; - columns?: BasicColumns; -} - -/** - * The ABCD source type. - */ -export class ABCDSourceType extends OperatorType { - private static _TYPE = 'abcd_source'; - private static _ICON_URL = OperatorType.createIconDataUrl(ABCDSourceType._TYPE); - private static _NAME = 'ABCD Source'; - - static get TYPE(): string { - return ABCDSourceType._TYPE; - } - - static get ICON_URL(): string { - return ABCDSourceType._ICON_URL; - } - - static get NAME(): string { - return ABCDSourceType._NAME; - } - - private provider: string; - private id: string; - private units: Array; - private columns: BasicColumns; - - constructor(config: ABCDSourceTypeConfig) { - super(); - this.provider = config.provider; - this.id = config.id; - this.units = config.units ? config.units : []; - this.columns = config.columns; - } - - static fromDict(dict: ABCDSourceTypeDict): ABCDSourceType { - return new ABCDSourceType({ - provider: dict.provider, - id: dict.id, - units: dict.units, - columns: dict.columns ? dict.columns : {textual: [], numeric: []}, - }); - } - - getMappingName(): string { - return ABCDSourceType.TYPE; - } - - getIconUrl(): string { - return ABCDSourceType.ICON_URL; - } - - toString(): string { - return ABCDSourceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['archive', this.provider], - ['id', this.id], - ['units', this.units.join(', ')], - ]; - } - - toMappingDict(): ABCDSourceTypeMappingDict { - return { - path: this.id, - units: this.units, - columns: this.columns, - }; - } - - toDict(): ABCDSourceTypeDict { - return { - operatorType: ABCDSourceType.TYPE, - provider: this.provider, - id: this.id, - units: this.units, - columns: this.columns, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return ABCDSourceType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/gfbio-app/src/app/operators/types/pangaea-source-type.model.ts b/projects/gfbio-app/src/app/operators/types/pangaea-source-type.model.ts deleted file mode 100644 index a4d4a1be..00000000 --- a/projects/gfbio-app/src/app/operators/types/pangaea-source-type.model.ts +++ /dev/null @@ -1,92 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from 'wave-core'; -import {CsvParameters} from '../dialogs/baskets/csv.model'; - -interface PangaeaSourceTypeConfig { - doi: string; - csvParameters: CsvParameters; -} - -interface PangaeaSourceTypeMappingDict extends OperatorTypeMappingDict, CsvParameters { - doi: string; -} - -export interface PangaeaSourceTypeDict extends OperatorTypeDict { - doi: string; - csvParameters: CsvParameters; -} - -/** - * The Pangaea source type. - */ -export class PangaeaSourceType extends OperatorType { - private static _TYPE = 'pangaea_source'; - private static _ICON_URL = OperatorType.createIconDataUrl(PangaeaSourceType._TYPE); - private static _NAME = 'Pangaea Source'; - - static get TYPE(): string { - return PangaeaSourceType._TYPE; - } - - static get ICON_URL(): string { - return PangaeaSourceType._ICON_URL; - } - - static get NAME(): string { - return PangaeaSourceType._NAME; - } - - private doi: string; - private csvParameters: CsvParameters; - - constructor(config: PangaeaSourceTypeConfig) { - super(); - this.doi = config.doi; - this.csvParameters = config.csvParameters; - } - - static fromDict(dict: PangaeaSourceTypeDict): PangaeaSourceType { - return new PangaeaSourceType({ - doi: dict.doi, - csvParameters: dict.csvParameters, - }); - } - - getMappingName(): string { - return PangaeaSourceType.TYPE; - } - - getIconUrl(): string { - return PangaeaSourceType.ICON_URL; - } - - toString(): string { - return PangaeaSourceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['doi', this.doi], - ['geometry', this.csvParameters.geometry], - ['separator', this.csvParameters.separator ? this.csvParameters.separator : ''], - ['time', this.csvParameters.time ? this.csvParameters.time : ''], - ]; - } - - toMappingDict(): PangaeaSourceTypeMappingDict { - let dict = this.csvParameters as PangaeaSourceTypeMappingDict; - dict.doi = this.doi; - return dict; - } - - toDict(): PangaeaSourceTypeDict { - return { - operatorType: PangaeaSourceType.TYPE, - doi: this.doi, - csvParameters: this.csvParameters, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return PangaeaSourceType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/gfbio-app/src/app/operators/types/terminology-lookup-type.ts b/projects/gfbio-app/src/app/operators/types/terminology-lookup-type.ts deleted file mode 100644 index 308140e9..00000000 --- a/projects/gfbio-app/src/app/operators/types/terminology-lookup-type.ts +++ /dev/null @@ -1,150 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from 'wave-core'; - -export enum TerminologyLookupOnNotResolvable { - EMPTY = 'EMPTY', - KEEP = 'KEEP', -} - -export enum TerminologyLookupMatchType { - EXACT = 'exact', - INCLUDED = 'included', - REGEX = 'regex', -} - -interface TerminologyLookupTypeMappingDict extends OperatorTypeMappingDict { - attribute_name: string; - resolved_attribute: string; - terminology: string; - key?: string; - match_type?: 'exact' | 'included' | 'regex'; - first_hit?: boolean; - on_not_resolvable: 'EMPTY' | 'KEEP'; -} - -export interface TerminologyLookupTypeDict extends OperatorTypeDict { - attribute_name: string; - resolved_attribute: string; - terminology: string; - key: string; - match_type: TerminologyLookupMatchType; - first_hit: boolean; - on_not_resolvable: TerminologyLookupOnNotResolvable; -} - -interface TerminologyLookupTypeConfig { - attribute_name: string; - resolved_attribute: string; - terminology: string; - key?: string; - match_type?: TerminologyLookupMatchType; - first_hit?: boolean; - on_not_resolvable: TerminologyLookupOnNotResolvable; -} - -/** - * The Terminology Resolver type. - */ -export class TerminologyLookupType extends OperatorType { - private static _TYPE = 'terminology_resolver'; - private static _ICON_URL = OperatorType.createIconDataUrl(TerminologyLookupType._TYPE); - private static _NAME = 'Terminology Resolver'; - - static get TYPE(): string { - return TerminologyLookupType._TYPE; - } - - static get ICON_URL(): string { - return TerminologyLookupType._ICON_URL; - } - - static get NAME(): string { - return TerminologyLookupType._NAME; - } - - attribute_name: string; - resolved_attribute_name: string; - terminology: string; - key: string; - match_type: TerminologyLookupMatchType; - first_hit: boolean; - on_not_resolvable: TerminologyLookupOnNotResolvable; - new_column_appendix: string; - define_new_column_appendix: boolean; - - static fromDict(dict: TerminologyLookupTypeDict): TerminologyLookupType { - return new TerminologyLookupType(dict); - } - - constructor(config: TerminologyLookupTypeConfig) { - super(); - this.attribute_name = config.attribute_name; - this.resolved_attribute_name = config.resolved_attribute; - this.terminology = config.terminology; - this.key = config.key; - this.match_type = config.match_type ? config.match_type : TerminologyLookupMatchType.EXACT; - this.first_hit = !!config.first_hit; - this.on_not_resolvable = config.on_not_resolvable ? config.on_not_resolvable : TerminologyLookupOnNotResolvable.EMPTY; - } - - getMappingName(): string { - return TerminologyLookupType.TYPE; - } - - getIconUrl(): string { - return TerminologyLookupType.ICON_URL; - } - - toString(): string { - return TerminologyLookupType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['attribute_name', this.attribute_name.toString()], - ['resolved_attribute_name', this.resolved_attribute_name.toString()], - ['terminology', this.terminology.toString()], - ['key', this.key.toString()], - ['match_type', this.match_type.toString()], - ['first_hit', this.first_hit.toString()], - ['on_not_resolvable', this.on_not_resolvable.toString()], - ]; - } - - toMappingDict(): TerminologyLookupTypeMappingDict { - const dict = { - attribute_name: this.attribute_name, - resolved_attribute: this.resolved_attribute_name, - terminology: this.terminology, - on_not_resolvable: this.on_not_resolvable.toString(), - first_hit: this.first_hit, - }; - - if (this.key) { - dict['key'] = this.key; - } - if (this.match_type) { - dict['match_type'] = this.match_type; // TODO: remove cast? - } - return dict as TerminologyLookupTypeMappingDict; - } - - toDict(): TerminologyLookupTypeDict { - return { - operatorType: TerminologyLookupType.TYPE, - attribute_name: this.attribute_name, - resolved_attribute: this.resolved_attribute_name, - terminology: this.terminology, - on_not_resolvable: this.on_not_resolvable, - first_hit: this.first_hit, - key: this.key, - match_type: this.match_type, - - // define_new_column_appendix: this.define_new_column_appendix, - // new_column_appendix: this.new_column_appendix - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return TerminologyLookupType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/gfbio-app/src/app/queries/mapping-query.service.ts b/projects/gfbio-app/src/app/queries/mapping-query.service.ts deleted file mode 100644 index a9260ddc..00000000 --- a/projects/gfbio-app/src/app/queries/mapping-query.service.ts +++ /dev/null @@ -1,137 +0,0 @@ -import {Inject, Injectable} from '@angular/core'; -import {HttpClient} from '@angular/common/http'; - -import {Observable} from 'rxjs'; -import {map} from 'rxjs/operators'; - -import * as moment from 'moment'; - -import {MappingRequestParameters, MappingQueryService, UserService, Config} from 'wave-core'; - -import { - Basket, - BasketResult, - BasketsOverview, - IBasketAbcdResult, - IBasketGroupedAbcdResult, -} from '../operators/dialogs/baskets/gfbio-basket.model'; -import {GFBioUserService} from '../users/user.service'; -import {AppConfig} from '../app-config.service'; - -@Injectable() -export class GFBioMappingQueryService extends MappingQueryService { - constructor( - @Inject(Config) protected readonly config: AppConfig, - protected readonly http: HttpClient, - @Inject(UserService) protected readonly userService: GFBioUserService, - ) { - super(config, http, userService); - } - - getGFBioBaskets(config: {offset: number; limit: number}): Observable { - const parameters = new MappingRequestParameters({ - service: 'gfbio', - request: 'baskets', - sessionToken: this.userService.getSession().sessionToken, - parameters: { - offset: config.offset, - limit: config.limit, - }, - }); - - const queryUrl = this.config.MAPPING_URL + '?' + parameters.toMessageBody(); - - interface BasketsOverviewRaw { - baskets: Array<{ - basketId: number; - query: string; - timestamp: string; - }>; - totalNumberOfBaskets: number; - } - - return this.http.get(queryUrl).pipe( - map((basketsOverview: BasketsOverviewRaw) => { - return { - baskets: basketsOverview.baskets.map((basket) => { - return { - basketId: basket.basketId, - query: basket.query, - timestamp: moment(basket.timestamp, 'YYYY-MM-DD HH:mm:ss.S'), - }; - }), - totalNumberOfBaskets: basketsOverview.totalNumberOfBaskets, - }; - }), - ); - } - - getGFBioBasket(id: number): Observable { - const parameters = new MappingRequestParameters({ - service: 'gfbio', - request: 'basket', - sessionToken: this.userService.getSession().sessionToken, - parameters: { - id, - }, - }); - - const queryUrl = this.config.MAPPING_URL + '?' + parameters.toMessageBody(); - - return this.http.get(queryUrl).pipe( - map((basket: Basket) => { - const regex = /(.*),\s*a\s*(.*)?record\s*of\s*the\s*"(.*)"\s*dataset\s*\[ID:\s*(.*)]\s*/; - - const basketResults: Array = []; - basket.results.forEach((result) => { - const entry = basketResults.find((b) => b.dataLink === result.dataLink); - - if (result.type === 'abcd') { - const abcd = result as IBasketAbcdResult; - - const unit_type_title_id = regex.exec(abcd.title); - const title = unit_type_title_id && unit_type_title_id[3] ? unit_type_title_id[3] : abcd.title; - const unit = - unit_type_title_id && unit_type_title_id[4] - ? { - unitId: unit_type_title_id[4], - prefix: unit_type_title_id[1], - type: unit_type_title_id[2], - metadataLink: abcd.metadataLink, - } - : undefined; - - if (!entry) { - const metadataLink = abcd.metadataLink; - const grouped: IBasketGroupedAbcdResult = { - title, - dataLink: abcd.dataLink, - authors: abcd.authors, - available: abcd.available, - dataCenter: abcd.dataCenter, - metadataLink, - units: unit ? [unit] : [], - type: 'abcd_grouped', - resultType: 'points', - }; - basketResults.push(grouped); - } else { - if (unit) { - const grouped = entry as IBasketGroupedAbcdResult; - grouped.units.push(unit); - } - } - } else if (!entry) { - basketResults.push(result); - } - }); - - return { - query: basket.query, - results: basketResults, - timestamp: moment(basket.timestamp, 'MM-DD-YYYY HH:mm:ss.SSS'), - }; - }), - ); - } -} diff --git a/projects/gfbio-app/src/app/users/user.service.ts b/projects/gfbio-app/src/app/users/user.service.ts deleted file mode 100644 index efc86922..00000000 --- a/projects/gfbio-app/src/app/users/user.service.ts +++ /dev/null @@ -1,129 +0,0 @@ -import {Inject, Injectable} from '@angular/core'; -import {HttpClient} from '@angular/common/http'; - -import {Observable} from 'rxjs'; -import {map, switchMap} from 'rxjs/operators'; - -import {Config, MappingRequestParameters, NotificationService, ParametersType, UserService} from 'wave-core'; - -import {AppConfig} from '../app-config.service'; -import {AbcdArchive} from '../operators/dialogs/abcd-repository/abcd.model'; -import {Basket} from '../operators/dialogs/baskets/gfbio-basket.model'; -import {CsvColumn} from '../operators/dialogs/baskets/csv.model'; - -@Injectable() -export class GFBioUserService extends UserService { - constructor( - @Inject(Config) protected readonly config: AppConfig, - protected readonly http: HttpClient, - protected readonly notificationService: NotificationService, - ) { - super(config, http, notificationService); - } - - /** - * Get the schema of a source operator. TODO: this should be replaced by a generic service call, which resolves the shema of a source. - */ - getSourceSchemaAbcd(): Observable> { - const jsonUrl = './assets/abcd-mandatory-fields.json'; - - return this.http.get>(jsonUrl); - } - - /** - * Get as stream of Abcd sources depending on the logged in user. - */ - getAbcdArchivesStream(): Observable> { - interface AbcdResponse { - archives: Array; - result: boolean; - } - - return super.getSessionStream().pipe( - switchMap((session) => { - const parameters = new GfbioServiceRequestParameters({ - request: 'abcd', - sessionToken: session.sessionToken, - }); - return super.request(parameters).pipe(map((abcdResponse) => abcdResponse.archives)); - }), - ); - } - - /** - * Get as stream of GFBio baskets sources depending on the logged in user. - */ - getGfbioBasketStream(): Observable> { - interface GfbioBasketResponse { - baskets: Array; - result: boolean; - } - - return super.getSessionStream().pipe( - switchMap((session) => { - const parameters = new GfbioServiceRequestParameters({ - request: 'baskets', - sessionToken: session.sessionToken, - }); - return super.request(parameters).pipe(map((gfbioBasketResponse) => gfbioBasketResponse.baskets)); - }), - ); - } - - /** - * Login using an OpenId Connect access token - * - * @returns `true` if the login was succesful, `false` otherwise. - */ - oidcLogin(accessToken: string): Observable { - const parameters = new OidcServiceRequestParameters({ - sessionToken: undefined, - request: 'login', - parameters: {access_token: accessToken}, - }); - - return super.loginRequestToUserDetails(parameters); - } - - /** - * Redirect current app to SSO page - */ - redirectToOidcProvider(payload?: string) { - const url = this.config.GFBIO.SSO.URL; - const client_id = this.config.GFBIO.SSO.CLIENT_ID; - const scope = this.config.GFBIO.SSO.SCOPE; - const state = payload ? `&state=${encodeURIComponent(payload)}` : ''; - window.location.href = `${url}?client_id=${client_id}&response_type=token&scope=${scope}${state}`; - } - - setIntroductoryPopup(show: boolean) { - localStorage.setItem('showIntroductoryPopup', JSON.stringify(show)); - } - - shouldShowIntroductoryPopup(): boolean { - const show = localStorage.getItem('showIntroductoryPopup'); - return show === null || JSON.parse(show); - } -} - -class GfbioServiceRequestParameters extends MappingRequestParameters { - constructor(config: {request: string; sessionToken: string; parameters?: ParametersType}) { - super({ - service: 'gfbio', - request: config.request, - sessionToken: config.sessionToken, - parameters: config.parameters, - }); - } -} - -class OidcServiceRequestParameters extends MappingRequestParameters { - constructor(config: {request: string; sessionToken: string; parameters?: ParametersType}) { - super({ - service: 'oidc', - request: config.request, - sessionToken: config.sessionToken, - parameters: config.parameters, - }); - } -} diff --git a/projects/gfbio-app/src/assets/.gitignore b/projects/gfbio-app/src/assets/.gitignore deleted file mode 100644 index d344ba6b..00000000 --- a/projects/gfbio-app/src/assets/.gitignore +++ /dev/null @@ -1 +0,0 @@ -config.json diff --git a/projects/gfbio-app/src/assets/.gitkeep b/projects/gfbio-app/src/assets/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/gfbio-app/src/assets/abcd-mandatory-fields.json b/projects/gfbio-app/src/assets/abcd-mandatory-fields.json deleted file mode 100644 index 4b44ac32..00000000 --- a/projects/gfbio-app/src/assets/abcd-mandatory-fields.json +++ /dev/null @@ -1,290 +0,0 @@ -[ - { - "name": "/DataSets/DataSet/DatasetGUID", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/TechnicalContacts/TechnicalContact/Name", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/TechnicalContacts/TechnicalContact/Email", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/ContentContacts/ContentContact/Name", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/ContentContacts/ContentContact/Email", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Metadata/Description/Representation/Title", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Metadata/Description/Representation/Details", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Metadata/Description/Representation/URI", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Metadata/RevisionData/DateModified", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Metadata/IPRStatements/Licenses/License/Text", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Metadata/IPRStatements/Citations/Citation/Text", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Metadata/IPRStatements/Licenses/License/Details", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Metadata/IPRStatements/Licenses/License/URI", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": true, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/SourceInstitutionID", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/SourceID", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/UnitID", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/DateLastEdited", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/Identifications/Identification/Result/TaxonIdentified/HigherTaxa/HigherTaxon/HigherTaxonName", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/Identifications/Identification/Result/TaxonIdentified/HigherTaxa/HigherTaxon/HigherTaxonRank", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/Identifications/Identification/Result/TaxonIdentified/ScientificName/FullScientificNameString", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/RecordBasis", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/MultiMediaObjects/MultiMediaObject/FileURI", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/MultiMediaObjects/MultiMediaObject/Format", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/MultiMediaObjects/MultiMediaObject/IPR/Licenses/License/Text", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/MultiMediaObjects/MultiMediaObject/IPR/Licenses/License/Details", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/MultiMediaObjects/MultiMediaObject/IPR/Licenses/License/URI", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/MultiMediaObjects/MultiMediaObject/Creator", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/Gathering/DateTime/ISODateTimeBegin", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/Gathering/Agents/GatheringAgent/AgentText", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/Gathering/LocalityText", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/Gathering/Country/Name", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/Gathering/Country/ISO3166Code", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": false, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/Gathering/SiteCoordinateSets/SiteCoordinates/CoordinatesLatLong/LongitudeDecimal", - "numeric": true, - "vatMandatory": true, - "gfbioMandatory": true, - "globalField": false, - "unit": "°" - }, - { - "name": "/DataSets/DataSet/Units/Unit/Gathering/SiteCoordinateSets/SiteCoordinates/CoordinatesLatLong/LatitudeDecimal", - "numeric": true, - "vatMandatory": true, - "gfbioMandatory": true, - "globalField": false, - "unit": "°" - }, - { - "name": "/DataSets/DataSet/Units/Unit/Gathering/SiteCoordinateSets/SiteCoordinates/CoordinatesLatLong/SpatialDatum", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": false, - "unit": "" - }, - { - "name": "/DataSets/DataSet/Units/Unit/RecordURI", - "numeric": false, - "vatMandatory": false, - "gfbioMandatory": true, - "globalField": false, - "unit": "" - } -] diff --git a/projects/gfbio-app/src/assets/logo_gfbio.png b/projects/gfbio-app/src/assets/logo_gfbio.png deleted file mode 100644 index 6f68f04b08a687632f694a3cdeea4ff62337b1bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8669 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 - - - - - - - - - // get preferences - var prefs = new gadgets.Prefs(); - - // size application - var totalHeight = isNaN(parent.window.innerHeight) ? parent.window.clientHeight : parent.window.innerHeight; - var headerHeight = prefs.getInt("HEADER_HEIGHT"); - gadgets.window.adjustHeight(totalHeight - headerHeight); - - // get url params - var urlParams = parent.window.location.search - - // create iframe - var iframe = document.createElement('iframe'); - iframe.id = 'searchVisualizationFrame'; - iframe.style.border = 'none'; - iframe.style.margin = 0; - iframe.style.padding = 0; - iframe.style.height = '100%'; - iframe.style.width = '100%'; - iframe.src = prefs.getString('VAT_URL') + '#/' + urlParams; - - // listen on load event and then send the token - function forwardToken(event) { - var message = event.data; - if (message.type === 'STATUS' && message.status === 'READY') { - parent.Liferay.Service( - '/GFBioProject-portlet.basket/get-token', - function (token) { - iframe.contentWindow.postMessage({type: 'TOKEN_LOGIN', token: token}, '*'); - } - ); - } - } - - window.addEventListener('message', forwardToken); - - // append iframe to document body - document.getElementsByTagName('body')[0].appendChild(iframe); - - ]]> - - diff --git a/projects/gfbio-app/src/environments/environment.prod.ts b/projects/gfbio-app/src/environments/environment.prod.ts deleted file mode 100644 index da7c84f6..00000000 --- a/projects/gfbio-app/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true, -}; diff --git a/projects/gfbio-app/src/environments/environment.ts b/projects/gfbio-app/src/environments/environment.ts deleted file mode 100644 index c9cad009..00000000 --- a/projects/gfbio-app/src/environments/environment.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - -export const environment = { - production: false, -}; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/projects/gfbio-app/src/favicon.ico b/projects/gfbio-app/src/favicon.ico deleted file mode 100644 index e2cef5c75a846e530b9628c9d30aef20d72c39db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 diff --git a/projects/gfbio-app/src/index.html b/projects/gfbio-app/src/index.html deleted file mode 100644 index d7a9715d..00000000 --- a/projects/gfbio-app/src/index.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - VAT: Visualization, Analysis and Transformation System - - - - - - - -

VAT

-
- · - · - · -
-
- - diff --git a/projects/gfbio-app/src/main.ts b/projects/gfbio-app/src/main.ts deleted file mode 100644 index 469eddb3..00000000 --- a/projects/gfbio-app/src/main.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {enableProdMode} from '@angular/core'; -import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; - -import {AppModule} from './app/app.module'; -import {environment} from './environments/environment'; - -if (environment.production) { - enableProdMode(); -} - -platformBrowserDynamic() - .bootstrapModule(AppModule) - .catch((err) => console.error(err)); diff --git a/projects/gfbio-app/src/polyfills.ts b/projects/gfbio-app/src/polyfills.ts deleted file mode 100644 index e49856ec..00000000 --- a/projects/gfbio-app/src/polyfills.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/projects/gfbio-app/src/styles.scss b/projects/gfbio-app/src/styles.scss deleted file mode 100644 index cf2f195d..00000000 --- a/projects/gfbio-app/src/styles.scss +++ /dev/null @@ -1,22 +0,0 @@ -@import 'app-theme'; - -:root { - --wave-primary-color: #{mat-color($wave-app-primary)}; - --wave-accent-color: #{mat-color($wave-app-accent)}; - --wave-warn-color: #{mat-color($wave-app-warn)}; - - --wave-faded-accent-color: #{mat-color($wave-app-accent, 0.32)}; - - --wave-foreground-text-color: #{mat-color(map-get($wave-app-theme, foreground), text)}; - --wave-foreground-secondary-text-color: #{mat-color(map-get($wave-app-theme, foreground), secondary-text)}; - - --wave-background-color: #{map-get(map-get($wave-app-theme, background), background)}; - --wave-background-hover-color: #{mat-color(map-get($wave-app-theme, background), hover)}; - - font-family: Roboto, 'Helvetica Neue', sans-serif; - font-size: 16px; -} - -a { - color: mat-color(map-get($wave-app-theme, foreground), secondary-text); -} diff --git a/projects/gfbio-app/src/test.ts b/projects/gfbio-app/src/test.ts deleted file mode 100644 index 7a816b2b..00000000 --- a/projects/gfbio-app/src/test.ts +++ /dev/null @@ -1,23 +0,0 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files - -import 'zone.js/dist/zone-testing'; -import {getTestBed} from '@angular/core/testing'; -import {BrowserDynamicTestingModule, platformBrowserDynamicTesting} from '@angular/platform-browser-dynamic/testing'; - -declare const require: { - context( - path: string, - deep?: boolean, - filter?: RegExp, - ): { - keys(): string[]; - (id: string): T; - }; -}; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); diff --git a/projects/gfbio-app/tsconfig.app.json b/projects/gfbio-app/tsconfig.app.json deleted file mode 100644 index 8212f985..00000000 --- a/projects/gfbio-app/tsconfig.app.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "../../out-tsc/app", - "types": [] - }, - "files": ["src/main.ts", "src/polyfills.ts"], - "include": [], - "paths": { - "wave-core": ["dist/wave-core"] - } -} diff --git a/projects/gfbio-app/tsconfig.spec.json b/projects/gfbio-app/tsconfig.spec.json deleted file mode 100644 index b6b4f089..00000000 --- a/projects/gfbio-app/tsconfig.spec.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "../../out-tsc/spec", - "types": ["jasmine", "node"] - }, - "files": ["src/test.ts", "src/polyfills.ts"], - "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] -} diff --git a/projects/nature40-app/.eslintrc.json b/projects/nature40-app/.eslintrc.json deleted file mode 100644 index ff3b48ea..00000000 --- a/projects/nature40-app/.eslintrc.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "extends": "../../.eslintrc.json", - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts"], - "parserOptions": { - "project": [ - "projects/nature40-app/tsconfig.app.json", - "projects/nature40-app/tsconfig.spec.json", - "projects/nature40-app/e2e/tsconfig.json" - ], - "createDefaultProgram": true - }, - "rules": {} - }, - { - "files": ["*.html"], - "rules": {} - } - ] -} diff --git a/projects/nature40-app/browserslist b/projects/nature40-app/browserslist deleted file mode 100644 index 80848532..00000000 --- a/projects/nature40-app/browserslist +++ /dev/null @@ -1,12 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -> 0.5% -last 2 versions -Firefox ESR -not dead -not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/projects/nature40-app/e2e/protractor.conf.js b/projects/nature40-app/e2e/protractor.conf.js deleted file mode 100644 index bf4376ef..00000000 --- a/projects/nature40-app/e2e/protractor.conf.js +++ /dev/null @@ -1,30 +0,0 @@ -// @ts-check -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const {SpecReporter} = require('jasmine-spec-reporter'); - -/** - * @type { import("protractor").Config } - */ -exports.config = { - allScriptsTimeout: 11000, - specs: ['./src/**/*.e2e-spec.ts'], - capabilities: { - browserName: 'chrome', - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function () {}, - }, - onPrepare() { - require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.json'), - }); - jasmine.getEnv().addReporter(new SpecReporter({spec: {displayStacktrace: true}})); - }, -}; diff --git a/projects/nature40-app/e2e/src/app.e2e-spec.ts b/projects/nature40-app/e2e/src/app.e2e-spec.ts deleted file mode 100644 index 53905473..00000000 --- a/projects/nature40-app/e2e/src/app.e2e-spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {AppPage} from './app.po'; -import {browser, logging} from 'protractor'; - -describe('workspace-project App', () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.getTitleText()).toEqual('nature40-app app is running!'); - }); - - afterEach(async () => { - // Assert that there are no errors emitted from the browser - const logs = await browser.manage().logs().get(logging.Type.BROWSER); - expect(logs).not.toContain( - jasmine.objectContaining({ - level: logging.Level.SEVERE, - } as logging.Entry), - ); - }); -}); diff --git a/projects/nature40-app/e2e/src/app.po.ts b/projects/nature40-app/e2e/src/app.po.ts deleted file mode 100644 index 02d41cfc..00000000 --- a/projects/nature40-app/e2e/src/app.po.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {browser, by, element} from 'protractor'; - -export class AppPage { - navigateTo(): Promise { - return browser.get(browser.baseUrl) as Promise; - } - - getTitleText(): Promise { - return element(by.css('wave-nature40-root .content span')).getText() as Promise; - } -} diff --git a/projects/nature40-app/e2e/tsconfig.json b/projects/nature40-app/e2e/tsconfig.json deleted file mode 100644 index 3d39212b..00000000 --- a/projects/nature40-app/e2e/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "outDir": "../../../out-tsc/e2e", - "module": "commonjs", - "target": "es5", - "types": ["jasmine", "jasminewd2", "node"] - } -} diff --git a/projects/nature40-app/karma.conf.js b/projects/nature40-app/karma.conf.js deleted file mode 100644 index 293c8f8c..00000000 --- a/projects/nature40-app/karma.conf.js +++ /dev/null @@ -1,32 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular-devkit/build-angular/plugins/karma'), - ], - client: { - clearContext: false, // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - dir: require('path').join(__dirname, '../../coverage/nature40-app'), - reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true, - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true, - }); -}; diff --git a/projects/nature40-app/src/app-theme.scss b/projects/nature40-app/src/app-theme.scss deleted file mode 100644 index 3a2a934c..00000000 --- a/projects/nature40-app/src/app-theme.scss +++ /dev/null @@ -1,181 +0,0 @@ -@import '~@angular/material/theming'; - -// Material Base Styles -@include mat-core(); - -// Define Colors -$nature40-green: ( - 50: #e1ede8, - 100: #b4d2c5, - 200: #82b59e, - 300: #4f9777, - 400: #2a8059, - 500: #046a3c, - 600: #036236, - 700: #03572e, - 800: #024d27, - 900: #013c1a, - A100: #72ff9f, - A200: #3fff7c, - A400: #0cff59, - A700: #00f14d, - contrast: ( - 50: #000000, - 100: #000000, - 200: #000000, - 300: #ffffff, - 400: #ffffff, - 500: #ffffff, - 600: #ffffff, - 700: #ffffff, - 800: #ffffff, - 900: #ffffff, - A100: #000000, - A200: #000000, - A400: #000000, - A700: #000000, - ), -); - -$nature40-orange: ( - 50: #fef3e1, - 100: #fce2b4, - 200: #facf82, - 300: #f7bb4f, - 400: #f6ad2a, - 500: #f49e04, - 600: #f39603, - 700: #f18c03, - 800: #ef8202, - 900: #ec7001, - A100: #ffffff, - A200: #ffede0, - A400: #ffcfad, - A700: #ffc093, - contrast: ( - 50: #000000, - 100: #000000, - 200: #000000, - 300: #000000, - 400: #000000, - 500: #000000, - 600: #000000, - 700: #000000, - 800: #000000, - 900: #000000, - A100: #000000, - A200: #000000, - A400: #000000, - A700: #000000, - ), -); - -$nature40-blue: ( - 50: #e1e2f1, - 100: #b4b7dd, - 200: #8287c6, - 300: #4f56af, - 400: #2a329d, - 500: #040e8c, - 600: #030c84, - 700: #030a79, - 800: #02086f, - 900: #01045c, - A100: #8d8dff, - A200: #5a5aff, - A400: #2727ff, - A700: #0e0eff, - contrast: ( - 50: #000000, - 100: #000000, - 200: #000000, - 300: #ffffff, - 400: #ffffff, - 500: #ffffff, - 600: #ffffff, - 700: #ffffff, - 800: #ffffff, - 900: #ffffff, - A100: #000000, - A200: #ffffff, - A400: #ffffff, - A700: #ffffff, - ), -); - -$nature40-lightgreen: ( - 50: #f4f9f1, - 100: #e4f0dd, - 200: #d2e7c6, - 300: #bfddaf, - 400: #b2d59d, - 500: #a4ce8c, - 600: #9cc984, - 700: #92c279, - 800: #89bc6f, - 900: #78b05c, - A100: #ffffff, - A200: #efffe7, - A400: #ccffb4, - A700: #bbff9b, - contrast: ( - 50: #000000, - 100: #000000, - 200: #000000, - 300: #000000, - 400: #000000, - 500: #000000, - 600: #000000, - 700: #000000, - 800: #000000, - 900: #000000, - A100: #000000, - A200: #000000, - A400: #000000, - A700: #000000, - ), -); - -$nature40-gray: ( - 50: #efefef, - 100: #d8d8d8, - 200: #bebebe, - 300: #a3a3a3, - 400: #909090, - 500: #7c7c7c, - 600: #747474, - 700: #696969, - 800: #5f5f5f, - 900: #4c4c4c, - A100: #bababa, - A200: #8c8c8c, - A400: #4d4d4d, - A700: #333333, - contrast: ( - 50: #000000, - 100: #000000, - 200: #000000, - 300: #000000, - 400: #000000, - 500: #ffffff, - 600: #ffffff, - 700: #ffffff, - 800: #ffffff, - 900: #ffffff, - A100: #000000, - A200: #000000, - A400: #000000, - A700: #ffffff, - ), -); - -// Define App Theme -$wave-app-primary: mat-palette($nature40-green); -$wave-app-accent: mat-palette($nature40-orange, A200, A100, A400); -$wave-app-warn: mat-palette($mat-red); - -// Create the theme object (a Sass map containing all of the palettes). -$wave-app-theme: mat-light-theme($wave-app-primary, $wave-app-accent, $wave-app-warn); - -// Apply Angular Material Mixin to Color Theme -@include angular-material-theme($wave-app-theme); diff --git a/projects/nature40-app/src/app/app-config.service.ts b/projects/nature40-app/src/app/app-config.service.ts deleted file mode 100644 index e3f72a6c..00000000 --- a/projects/nature40-app/src/app/app-config.service.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {Injectable} from '@angular/core'; -import {mergeDeep} from 'immutable'; -import {Config, WaveConfigStructure, WAVE_DEFAULT_CONFIG} from 'wave-core'; - -interface Nature40 { - SSO_JWT_PROVIDER_URL: string; - DEFAULT_VIEW_BBOX: [number, number, number, number]; -} - -interface AppConfigStructure extends WaveConfigStructure { - readonly NATURE40: Nature40; -} - -const APP_CONFIG_DEFAULTS = mergeDeep(WAVE_DEFAULT_CONFIG, { - NATURE40: { - SSO_JWT_PROVIDER_URL: 'http://vhrz669.hrz.uni-marburg.de/nature40/sso?jws=', - DEFAULT_VIEW_BBOX: [8.66, 50.82, 8.69, 50.84], // default to Uniwald - }, -}) as AppConfigStructure; - -@Injectable() -export class AppConfig extends Config { - protected config: AppConfigStructure; - - get NATURE40(): Nature40 { - return this.config.NATURE40; - } - - load(): Promise { - return super.load(APP_CONFIG_DEFAULTS); - } -} diff --git a/projects/nature40-app/src/app/app.component.html b/projects/nature40-app/src/app/app.component.html deleted file mode 100644 index 8ea86bf8..00000000 --- a/projects/nature40-app/src/app/app.component.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - -
- - -
- -
- - - - - -
- - - - - - - - - - - - - - - - -
-
- - - - -
Data Table
-
- - -
- - -
Citations
-
- - -
-
-
-
diff --git a/projects/nature40-app/src/app/app.component.scss b/projects/nature40-app/src/app/app.component.scss deleted file mode 100644 index 6c793ea9..00000000 --- a/projects/nature40-app/src/app/app.component.scss +++ /dev/null @@ -1,119 +0,0 @@ -wave-navigation { - z-index: 10; -} - -wave-layer-list { - position: absolute; - z-index: 2; - width: 16vw; - min-width: 200px; - left: 0; - top: 0; - background-color: rgba(255, 255, 255, 0.87); - border-bottom-right-radius: 2px; - - .logo { - filter: hue-rotate(270deg); - } -} - -.time-container { - position: absolute; - left: 16vw; - right: 16vw; - - wave-ticker-interaction, - wave-small-time-interaction, - wave-zoom-handles { - background-color: rgba(255, 255, 255, 0.87); - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; - z-index: 3; - } -} - -:host ::ng-deep .mat-sidenav-content { - overflow: hidden; -} - -.top-container { - z-index: 1; -} - -.mid-container { - z-index: 0; - position: relative; -} - -.bottom-container { - position: relative; - z-index: 1; - - min-height: 3rem; - @media (max-width: 600px) and (orientation: portrait) { - min-height: 2.5rem; - } - @media (max-width: 960px) and (orientation: landscape) { - min-height: 2rem; - } - - .toggle { - position: absolute; - z-index: 1; - padding: 0; - min-width: 3rem; - width: 3rem; - height: 3rem; - @media (max-width: 600px) and (orientation: portrait) { - min-width: 2.5rem; - width: 2.5rem; - height: 2.5rem; - } - @media (max-width: 960px) and (orientation: landscape) { - min-width: 2rem; - width: 2rem; - height: 2rem; - } - } - - ::ng-deep .mat-tab-label-container { - margin-left: 3rem; - @media (max-width: 600px) and (orientation: portrait) { - margin-left: 2.5rem; - } - @media (max-width: 960px) and (orientation: landscape) { - margin-left: 2rem; - } - } - - @media (max-width: 960px) and (orientation: landscape) { - ::ng-deep mat-tab-header { - height: 2rem; - } - ::ng-deep .mat-tab-label { - line-height: 2rem; - } - } - @media (max-width: 600px) and (orientation: portrait) { - ::ng-deep mat-tab-header { - height: 2.5rem; - } - ::ng-deep .mat-tab-label { - line-height: 2.5rem; - } - } -} - -.bottom-container.small { - max-height: 3rem !important; - @media (max-width: 600px) and (orientation: portrait) { - max-height: 2.5rem !important; - } - @media (max-width: 960px) and (orientation: landscape) { - max-height: 2rem !important; - } - - ::ng-deep mat-tab-header { - border: 0; - } -} diff --git a/projects/nature40-app/src/app/app.component.ts b/projects/nature40-app/src/app/app.component.ts deleted file mode 100644 index a5f40853..00000000 --- a/projects/nature40-app/src/app/app.component.ts +++ /dev/null @@ -1,364 +0,0 @@ -import {Observable, BehaviorSubject, fromEvent} from 'rxjs'; -import {map, tap, first} from 'rxjs/operators'; - -import {transformExtent} from 'ol/proj'; - -import { - AfterViewInit, - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - HostListener, - Inject, - OnInit, - ViewChild, - ViewContainerRef, -} from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; -import {MatIconRegistry} from '@angular/material/icon'; -import {MatSidenav} from '@angular/material/sidenav'; -import {MatTabGroup} from '@angular/material/tabs'; -import { - Layer, - SidenavContainerComponent, - MapContainerComponent, - AbstractSymbology, - LayerService, - LayoutService, - ProjectService, - UserService, - StorageService, - RandomColorService, - MappingQueryService, - NotificationService, - MapService, - Config, - ResultTypes, - PlotListComponent, - WorkflowParameterChoiceDialogComponent, - NavigationButton, - SourceOperatorListComponent, - NavigationComponent, - OperatorListComponent, - TimeConfigComponent, - WorkspaceSettingsComponent, - HelpComponent, - SourceOperatorListButton, - GFBioSourceType, - GbifOperatorComponent, - OperatorListButtonGroups, - SidenavConfig, - Projections, -} from 'wave-core'; -import {DomSanitizer} from '@angular/platform-browser'; -import {ActivatedRoute} from '@angular/router'; -import {AppConfig} from './app-config.service'; -import {Nature40UserService} from './users/nature40-user.service'; -import {LoginComponent} from './users/login/login.component'; -import {Nature40CatalogComponent} from './operators/dialogs/nature40-catalog/nature40-catalog.component'; - -@Component({ - selector: 'wave-nature40-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppComponent implements OnInit, AfterViewInit { - @ViewChild(MapContainerComponent, {static: true}) mapComponent: MapContainerComponent; - @ViewChild(MatTabGroup, {static: true}) bottomTabs: MatTabGroup; - - @ViewChild(MatSidenav, {static: true}) rightSidenav: MatSidenav; - @ViewChild(SidenavContainerComponent, {static: true}) rightSidenavContainer: SidenavContainerComponent; - - readonly ResultTypes = ResultTypes; - readonly LayoutService = LayoutService; - - readonly layersReverse$: Observable>>; - readonly layerListVisible$: Observable; - readonly layerDetailViewVisible$: Observable; - - readonly navigationButtons = this.setupNavigation(); - readonly addAFirstLayerConfig = AppComponent.setupAddDataConfig(); - - middleContainerHeight$: Observable; - bottomContainerHeight$: Observable; - mapIsGrid$: Observable; - - private windowHeight$ = new BehaviorSubject(window.innerHeight); - - constructor( - @Inject(Config) readonly config: AppConfig, - readonly layerService: LayerService, - readonly layoutService: LayoutService, - readonly projectService: ProjectService, - readonly vcRef: ViewContainerRef, // reference used by color picker - @Inject(UserService) private readonly userService: Nature40UserService, - private storageService: StorageService, - private changeDetectorRef: ChangeDetectorRef, - private dialog: MatDialog, - private iconRegistry: MatIconRegistry, - private randomColorService: RandomColorService, - private mappingQueryService: MappingQueryService, - private activatedRoute: ActivatedRoute, - private notificationService: NotificationService, - private mapService: MapService, - private sanitizer: DomSanitizer, - ) { - this.registerIcons(); - - vcRef.length; // eslint-disable-line @typescript-eslint/no-unused-expressions - - this.storageService.toString(); // just register - - this.layersReverse$ = this.projectService.getLayerStream().pipe(map((layers) => layers.slice(0).reverse())); - - this.layerListVisible$ = this.layoutService.getLayerListVisibilityStream(); - this.layerDetailViewVisible$ = this.layoutService.getLayerDetailViewVisibilityStream(); - - this.setupInitialZoom(); - } - - private registerIcons() { - this.iconRegistry.addSvgIconInNamespace('vat', 'logo', this.sanitizer.bypassSecurityTrustResourceUrl('assets/vat_logo.svg')); - - // used for navigation - this.iconRegistry.addSvgIcon('cogs', this.sanitizer.bypassSecurityTrustResourceUrl('assets/icons/cogs.svg')); - - this.iconRegistry.addSvgIconInNamespace( - 'nature40', - 'icon', - this.sanitizer.bypassSecurityTrustResourceUrl('assets/icons/natur_40_logo.svg'), - ); - } - - ngOnInit() { - this.mapService.registerMapComponent(this.mapComponent); - this.mapIsGrid$ = this.mapService.isGrid$; - - this.middleContainerHeight$ = this.layoutService.getMapHeightStream(this.windowHeight$).pipe(tap(() => this.mapComponent.resize())); - this.bottomContainerHeight$ = this.layoutService.getLayerDetailViewStream(this.windowHeight$); - } - - ngAfterViewInit() { - this.layoutService.getSidenavContentComponentStream().subscribe((sidenavConfig) => { - this.rightSidenavContainer.load(sidenavConfig); - if (sidenavConfig) { - this.rightSidenav.open(); - } else { - this.rightSidenav.close(); - } - }); - this.projectService - .getNewPlotStream() - .subscribe(() => this.layoutService.setSidenavContentComponent({component: PlotListComponent})); - - // set the stored tab index - this.layoutService.getLayerDetailViewTabIndexStream().subscribe((tabIndex) => { - if (this.bottomTabs.selectedIndex !== tabIndex) { - this.bottomTabs.selectedIndex = tabIndex; - setTimeout(() => this.changeDetectorRef.markForCheck()); - } - }); - - this.handleQueryParameters(); - } - - setTabIndex(index: number) { - this.layoutService.setLayerDetailViewTabIndex(index); - this.layoutService.setLayerDetailViewVisibility(true); - } - - private setupNavigation(): Array { - return [ - NavigationComponent.createLoginButton(this.userService, this.layoutService, this.config, {component: LoginComponent}), - { - sidenavConfig: AppComponent.setupAddDataConfig(), - icon: 'add', - tooltip: 'Add Data', - }, - { - sidenavConfig: AppComponent.setupOperatorListConfig(), - icon: '', - svgIcon: 'cogs', - tooltip: 'Operators', - }, - { - sidenavConfig: {component: PlotListComponent, config: {operatorsListConfig: AppComponent.setupOperatorListConfig()}}, - icon: 'equalizer', - tooltip: 'Plots', - }, - { - sidenavConfig: {component: TimeConfigComponent}, - icon: 'access_time', - tooltip: 'Time', - }, - { - sidenavConfig: {component: WorkspaceSettingsComponent}, - icon: 'settings', - tooltip: 'Workspace', - }, - { - sidenavConfig: {component: HelpComponent}, - icon: 'help', - tooltip: 'Help', - }, - ]; - } - - private static setupAddDataConfig(): SidenavConfig { - return {component: SourceOperatorListComponent, config: {buttons: AppComponent.createSourceOperatorListButtons()}}; - } - - private static setupOperatorListConfig(): SidenavConfig { - return {component: OperatorListComponent, config: {operators: AppComponent.createOperatorListButtons()}}; - } - - private static createSourceOperatorListButtons(): Array { - return [ - SourceOperatorListComponent.createDataRepositoryButton(), - { - name: 'Nature 4.0 Catalog', - description: 'Browse all the Nature 4.0 data', - icon: 'nature_people', - sidenavConfig: {component: Nature40CatalogComponent, keepParent: true}, - onlyIfLoggedIn: true, - }, - { - name: 'Nature 4.0 Catalog', - description: 'Log in to browse all the Nature 4.0 data', - icon: 'nature_people', - sidenavConfig: undefined, - onlyIfLoggedOut: true, - }, - SourceOperatorListComponent.createDrawFeaturesButton(), - ...SourceOperatorListComponent.createCustomFeaturesButtons(), - { - name: 'Species Occurrences', - description: 'Query data from GBIF', - iconSrc: GFBioSourceType.ICON_URL, - sidenavConfig: {component: GbifOperatorComponent, keepParent: true}, - }, - SourceOperatorListComponent.createCountryPolygonsButton(), - ]; - } - - private static createOperatorListButtons(): OperatorListButtonGroups { - return [ - {name: 'Mixed', list: OperatorListComponent.DEFAULT_MIXED_OPERATOR_DIALOGS}, - {name: 'Plots', list: OperatorListComponent.DEFAULT_PLOT_OPERATOR_DIALOGS}, - {name: 'Raster', list: OperatorListComponent.DEFAULT_RASTER_OPERATOR_DIALOGS}, - {name: 'Vector', list: OperatorListComponent.DEFAULT_VECTOR_OPERATOR_DIALOGS}, - ]; - } - - @HostListener('window:resize') - private windowHeight() { - this.windowHeight$.next(window.innerHeight); - } - - private handleQueryParameters() { - this.activatedRoute.queryParams.subscribe((p) => { - for (const parameter of Object.keys(p)) { - const value = p[parameter]; - switch (parameter) { - case 'workflow': - try { - const newLayer = Layer.fromDict(JSON.parse(value)); - this.projectService - .getProjectStream() - .pipe(first()) - .subscribe((project) => { - if (project.layers.length > 0) { - // show popup - this.dialog.open(WorkflowParameterChoiceDialogComponent, { - data: { - dialogTitle: 'Workflow URL Parameter', - sourceName: 'URL parameter', - layers: [newLayer], - nonAvailableNames: [], - numberOfLayersInProject: project.layers.length, - }, - }); - } else { - // just add the layer if the layer array is empty - this.projectService.addLayer(newLayer); - } - }); - } catch (error) { - this.notificationService.error(`Invalid Workflow: »${error}«`); - } - break; - case 'jws': - case 'jwt': - this.nature40JwtLogin(parameter, value); - break; - default: - this.notificationService.error(`Unknown URL Parameter »${parameter}«`); - } - } - }); - } - - private nature40JwtLogin(parameter: string, token: string) { - this.userService - .nature40JwtTokenLogin(token) - .pipe(first()) - .subscribe( - (success) => { - if (success) { - this.notificationService.info(`Logged in using ${parameter.toUpperCase()}`); - } else { - this.notificationService.error(`Login with ${parameter.toUpperCase()} unsuccessful`); - // log out, because mapping session exists, but JWT token has become invalid - this.userService.guestLogin().pipe(first()).subscribe(); - } - }, - (error) => { - this.notificationService.error(`Cant handle provided ${parameter.toUpperCase()} parameters: »${error}«`); - }, - ); - } - - /** - * This handler stores the user viewport extent on leaving the app and retrieves it the next time. - * The data is stored in local storage, s.th. it is not reflected using multiple browsers. - * If there is no extent stored it uses the *Uniwald* extent as a starting point. - */ - private setupInitialZoom() { - const PATH_PREFIX = window.location.pathname.replace(/\//g, '_').replace(/-/g, '_'); - const storage_key = `${PATH_PREFIX}_zoom_extent`; - - let stored_extent: [number, number, number, number] = JSON.parse(localStorage.getItem(storage_key)); - - if (!stored_extent) { - stored_extent = this.config.NATURE40.DEFAULT_VIEW_BBOX; - } - - this.projectService - .getProjectionStream() - .pipe(first()) - .subscribe((projection) => { - const projectedExtent = transformExtent( - stored_extent, - Projections.WGS_84.getOpenlayersProjection(), - projection.getOpenlayersProjection(), - ); - this.mapService.zoomTo(projectedExtent); - }); - - fromEvent(window, 'beforeunload').subscribe(() => { - // store extent when leaving the site - this.projectService - .getProjectionStream() - .pipe(first()) - .subscribe((projection) => { - const wgs84_extent: [number, number, number, number] = transformExtent( - this.mapService.getViewportSize().extent, - projection.getOpenlayersProjection(), - Projections.WGS_84.getOpenlayersProjection(), - ); - localStorage.setItem(storage_key, JSON.stringify(wgs84_extent)); - }); - }); - } -} diff --git a/projects/nature40-app/src/app/app.module.ts b/projects/nature40-app/src/app/app.module.ts deleted file mode 100644 index 4a5685b6..00000000 --- a/projects/nature40-app/src/app/app.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import {APP_INITIALIZER, NgModule} from '@angular/core'; -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; -import {BrowserModule} from '@angular/platform-browser'; -import {HttpClientModule} from '@angular/common/http'; -import {RouterModule} from '@angular/router'; - -import {AppComponent} from './app.component'; -import { - Config, - LayerService, - LayoutService, - MappingQueryService, - MapService, - NotificationService, - ProjectService, - RandomColorService, - StorageService, - SidenavRef, - UserService, - WaveCoreModule, -} from 'wave-core'; - -import {AppConfig} from './app-config.service'; -import {Nature40CatalogComponent} from './operators/dialogs/nature40-catalog/nature40-catalog.component'; -import {Nature40UserService} from './users/nature40-user.service'; -import {LoginComponent} from './users/login/login.component'; - -@NgModule({ - declarations: [AppComponent, LoginComponent, Nature40CatalogComponent], - imports: [ - BrowserAnimationsModule, - BrowserModule, - HttpClientModule, - RouterModule.forRoot([{path: '**', component: AppComponent}], {useHash: true}), - WaveCoreModule, - ], - providers: [ - { - provide: APP_INITIALIZER, - useFactory: (config: AppConfig) => () => config.load(), - deps: [Config], - multi: true, - }, - {provide: Config, useClass: AppConfig}, - {provide: UserService, useClass: Nature40UserService}, - LayerService, - LayoutService, - MappingQueryService, - MapService, - NotificationService, - ProjectService, - RandomColorService, - SidenavRef, - StorageService, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/projects/nature40-app/src/app/operators/dialogs/nature40-catalog/nature40-catalog.component.html b/projects/nature40-app/src/app/operators/dialogs/nature40-catalog/nature40-catalog.component.html deleted file mode 100644 index 555ccf08..00000000 --- a/projects/nature40-app/src/app/operators/dialogs/nature40-catalog/nature40-catalog.component.html +++ /dev/null @@ -1,39 +0,0 @@ -Nature 4.0 Catalog - -
- -
-

The catalog is currently empty.

- - -
- - - Raster - Vector - data_usage - - -
- -
-
-
-

- {{ entry.title }} - - open_in_new - -

-

{{ entry.description }}

-
-
- - - - diff --git a/projects/nature40-app/src/app/operators/dialogs/nature40-catalog/nature40-catalog.component.scss b/projects/nature40-app/src/app/operators/dialogs/nature40-catalog/nature40-catalog.component.scss deleted file mode 100644 index 0d01060d..00000000 --- a/projects/nature40-app/src/app/operators/dialogs/nature40-catalog/nature40-catalog.component.scss +++ /dev/null @@ -1,16 +0,0 @@ -.info { - text-align: center; - - mat-spinner, - p { - margin: 2rem auto 0 auto; - } -} - -mat-list-item { - cursor: pointer; - - &:hover { - background-color: rgba(black, 0.12); - } -} diff --git a/projects/nature40-app/src/app/operators/dialogs/nature40-catalog/nature40-catalog.component.ts b/projects/nature40-app/src/app/operators/dialogs/nature40-catalog/nature40-catalog.component.ts deleted file mode 100644 index 50d53c22..00000000 --- a/projects/nature40-app/src/app/operators/dialogs/nature40-catalog/nature40-catalog.component.ts +++ /dev/null @@ -1,205 +0,0 @@ -import {ChangeDetectionStrategy, Component, Inject, OnDestroy, OnInit} from '@angular/core'; -import {HttpClient} from '@angular/common/http'; - -import {BehaviorSubject, Observable, of, throwError} from 'rxjs'; -import {first, flatMap, map} from 'rxjs/operators'; - -import {Map as ImmutableMap} from 'immutable'; - -import { - RasterSourceType, - OgrSourceType, - MappingRequestParameters, - Config, - Unit, - UnitMappingDict, - Operator, - ProjectService, - NotificationService, - RasterLayer, - MappingRasterSymbology, - DataType, - DataTypes, - ResultTypes, - Projections, - GdalSourceType, - Provenance, - UserService, -} from 'wave-core'; - -import {Nature40CatalogEntry, Nature40UserService} from '../../../users/nature40-user.service'; -import {AppConfig} from '../../../app-config.service'; - -@Component({ - selector: 'wave-nature40-catalog', - templateUrl: './nature40-catalog.component.html', - styleUrls: ['./nature40-catalog.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class Nature40CatalogComponent implements OnInit, OnDestroy { - readonly RASTER_ICON_URL: string = RasterSourceType.ICON_URL; - readonly VECTOR_ICON_URL: string = OgrSourceType.ICON_URL; - - readonly catalog$: Observable>>; - isResolving = new Map>(); - - constructor( - @Inject(Config) private readonly config: AppConfig, - @Inject(UserService) private readonly userService: Nature40UserService, - private readonly projectService: ProjectService, - private readonly notificationService: NotificationService, - private readonly http: HttpClient, - ) { - this.catalog$ = this.userService.getNature40Catalog(); - } - - ngOnInit() {} - - ngOnDestroy() { - this.isResolving.forEach((subject, _entry) => subject.complete()); - } - - isNotResolving$(entry: Nature40CatalogEntry): Observable { - if (!this.isResolving.has(entry)) { - this.isResolving.set(entry, new BehaviorSubject(false)); - } - - return this.isResolving.get(entry).pipe(map((value) => !value)); - } - - add(entry: Nature40CatalogEntry) { - if (this.isResolving.has(entry)) { - this.isResolving.get(entry).next(true); - } else { - this.isResolving.set(entry, new BehaviorSubject(true)); - } - - this.queryMetadata(entry) - .pipe( - first(), - flatMap((metadata) => { - if (!metadata) { - return throwError(`Datatype of »${entry.title}« is not yet supported`); - } - - switch (metadata.type) { - case 'gdal_source': - return of(Nature40CatalogComponent.createGdalSourceLayer(entry, metadata as GdalSourceMetadata)); - default: - return throwError(`Layer type »${metadata.type}« is not yet supported`); - } - }), - ) - .subscribe( - (layer) => { - this.isResolving.get(entry).next(false); - this.projectService.addLayer(layer); - }, - (error) => { - this.isResolving.get(entry).next(false); - this.notificationService.error(error); - }, - ); - } - - private static createGdalSourceLayer(entry: Nature40CatalogEntry, metadata: GdalSourceMetadata): RasterLayer { - for (const channel of metadata.channels) { - // TODO: smart layer for other channels - const datatype = DataTypes.fromCode(Nature40CatalogComponent.rsdbToMappingDataType(channel.datatype)); - const unit = Unit.fromMappingDict(channel.unit); - - const operator = new Operator({ - attributes: [Operator.RASTER_ATTRIBTE_NAME], - dataTypes: ImmutableMap().set(Operator.RASTER_ATTRIBTE_NAME, datatype), - operatorType: new GdalSourceType({ - channelConfig: { - displayValue: channel.name, - channelNumber: 0, - }, - sourcename: channel.file_name, - transform: false, - gdal_params: { - channels: [ - { - channel: channel.channel, - datatype: datatype.getCode(), - file_name: channel.file_name, - unit, - }, - ], - coords: { - crs: channel.crs, - }, - provenance: Nature40CatalogComponent.provenanceOfEntry(entry), - }, - }), - operatorTypeParameterOptions: undefined, - projection: Projections.fromCode(channel.crs), - resultType: ResultTypes.RASTER, - units: ImmutableMap().set(Operator.RASTER_ATTRIBTE_NAME, unit), - }); - - return new RasterLayer({ - name: entry.title, - operator, - symbology: MappingRasterSymbology.createSymbology({unit}), - }); - } - } - - private static provenanceOfEntry(entry: Nature40CatalogEntry): Provenance { - return { - citation: `${entry.title}${entry.description ? ' - ' : ''}${entry.description}`, - license: '', - uri: entry.user_url, - local_identifier: undefined, - }; - } - - private static rsdbToMappingDataType(datatype: string): string { - // TODO: migrate function to backend - return datatype.charAt(0).toUpperCase() + datatype.slice(1); - } - - private queryMetadata(entry: Nature40CatalogEntry): Observable { - const parameters = new MappingRequestParameters({ - service: 'nature40', - sessionToken: this.userService.getSession().sessionToken, - request: 'resolveCatalogEntry', - parameters: {entry: JSON.stringify(entry)}, - }); - - return this.http - .post<{result: boolean | string; metadata?: Nature40CatalogEntryMetadata}>( - this.config.MAPPING_URL, - parameters.toMessageBody(true), - {headers: parameters.getHeaders()}, - ) - .pipe( - flatMap((response) => { - if (typeof response.result === 'string') { - // error string is in the field - return throwError(response.result); - } - - return of(response.metadata); - }), - ); - } -} - -interface Nature40CatalogEntryMetadata { - type: string; -} - -interface GdalSourceMetadata extends Nature40CatalogEntryMetadata { - type: 'gdal_source'; - channels: Array<{ - crs: string; - channel: number; - datatype: string; - file_name: string; - name: string; - unit: UnitMappingDict; - }>; -} diff --git a/projects/nature40-app/src/app/users/login/login.component.html b/projects/nature40-app/src/app/users/login/login.component.html deleted file mode 100644 index a73ab511..00000000 --- a/projects/nature40-app/src/app/users/login/login.component.html +++ /dev/null @@ -1,30 +0,0 @@ - - - Login - - - - - - - User Info -
-
-

Username

-

Real Name

-

E-Mail

-
-
-

{{ (user | async).name }}

-

{{ (user | async).realName }}

-

{{ (user | async).email }}

-
-
-
- -
-
-
diff --git a/projects/nature40-app/src/app/users/login/login.component.scss b/projects/nature40-app/src/app/users/login/login.component.scss deleted file mode 100644 index 4e4c2b24..00000000 --- a/projects/nature40-app/src/app/users/login/login.component.scss +++ /dev/null @@ -1,24 +0,0 @@ -:host { - display: block; - padding: 1rem; -} - -mat-spinner { - width: 25%; - height: auto; - margin: 1rem auto; -} - -button { - margin-top: 1rem; - width: 100%; - - &.sso-button { - height: 4rem; - } -} - -.label { - color: var(--wave-foreground-secondary-text-color, grey); - margin-right: 1rem; -} diff --git a/projects/nature40-app/src/app/users/login/login.component.ts b/projects/nature40-app/src/app/users/login/login.component.ts deleted file mode 100644 index 14d1b797..00000000 --- a/projects/nature40-app/src/app/users/login/login.component.ts +++ /dev/null @@ -1,82 +0,0 @@ -import {BehaviorSubject, Observable, Subscription} from 'rxjs'; -import {first} from 'rxjs/operators'; - -import {Component, OnInit, ChangeDetectionStrategy, AfterViewInit, Inject, ChangeDetectorRef, OnDestroy} from '@angular/core'; - -import {Config, NotificationService, User, UserService} from 'wave-core'; - -import {AppConfig} from '../../app-config.service'; -import {Nature40UserService} from '../nature40-user.service'; - -enum FormStatus { - LoggedOut, - LoggedIn, - Loading, -} - -@Component({ - selector: 'wave-nature40-login', - templateUrl: './login.component.html', - styleUrls: ['./login.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LoginComponent implements OnInit, AfterViewInit, OnDestroy { - readonly FormStatus = FormStatus; - - formStatus$ = new BehaviorSubject(FormStatus.Loading); - user: Observable; - - private formStatusSubscription: Subscription; - - constructor( - @Inject(Config) private readonly config: AppConfig, - @Inject(UserService) private readonly userService: Nature40UserService, - private readonly changeDetectorRef: ChangeDetectorRef, - private readonly notificationService: NotificationService, - ) {} - - ngOnInit() { - this.userService.isSessionValid(this.userService.getSession()).subscribe((valid) => { - const isNoGuest = !this.userService.isGuestUser(); - this.formStatus$.next(valid && isNoGuest ? FormStatus.LoggedIn : FormStatus.LoggedOut); - }); - - this.user = this.userService.getUserStream(); - - this.formStatusSubscription = this.formStatus$.subscribe(() => setTimeout(() => this.changeDetectorRef.markForCheck())); - } - - ngAfterViewInit() {} - - ngOnDestroy() { - if (this.formStatusSubscription) { - this.formStatusSubscription.unsubscribe(); - } - } - - login() { - this.formStatus$.next(FormStatus.Loading); - this.userService - .getNature40JwtClientToken() - .pipe(first()) - .subscribe( - ({clientToken}: {clientToken}) => { - // no need to set form status since we redirect the page - window.location.href = this.config.NATURE40.SSO_JWT_PROVIDER_URL + clientToken; - }, - (error) => { - const errorString = error.toString() === {}.toString() ? '' : ` (${error})`; - this.notificationService.error('The backend is currently unavailable' + errorString); - this.formStatus$.next(FormStatus.LoggedOut); - }, - ); - } - - logout() { - this.formStatus$.next(FormStatus.Loading); - this.userService.guestLogin().subscribe( - () => this.formStatus$.next(FormStatus.LoggedOut), - (error) => this.notificationService.error(`The backend is currently unavailable (${error})`), - ); - } -} diff --git a/projects/nature40-app/src/app/users/nature40-user.service.ts b/projects/nature40-app/src/app/users/nature40-user.service.ts deleted file mode 100644 index 3e041c30..00000000 --- a/projects/nature40-app/src/app/users/nature40-user.service.ts +++ /dev/null @@ -1,104 +0,0 @@ -import {Inject, Injectable} from '@angular/core'; -import {HttpClient} from '@angular/common/http'; - -import {Observable, ReplaySubject} from 'rxjs'; - -import {Config, MappingRequestParameters, UserService, NotificationService} from 'wave-core'; - -import {AppConfig} from '../app-config.service'; - -@Injectable() -export class Nature40UserService extends UserService { - constructor( - @Inject(Config) protected readonly config: AppConfig, - protected readonly http: HttpClient, - protected readonly notificationService: NotificationService, - ) { - super(config, http, notificationService); - } - - /** - * Login using a JSON Web Token (JWT). - * If it was successful, set a new user. - * @param token The user's token. - * @returns `true` if the login was succesful, `false` otherwise. - */ - nature40JwtTokenLogin(token: string): Observable { - const parameters = new MappingRequestParameters({ - service: 'nature40', - sessionToken: undefined, - request: 'login', - parameters: {token}, - }); - - return this.loginRequestToUserDetails(parameters); - } - - /** - * Retrieve the signed JWT client token. - */ - getNature40JwtClientToken(): Observable<{clientToken: string}> { - const parameters = new MappingRequestParameters({ - service: 'nature40', - sessionToken: undefined, - request: 'clientToken', - parameters: {}, - }); - - return this.request<{result: string | boolean; clientToken: string}>(parameters); - } - - getNature40Catalog(): Observable>> { - const parameters = new MappingRequestParameters({ - service: 'nature40', - sessionToken: this.getSession().sessionToken, - request: 'sourcelist', - parameters: {}, - }); - - const subject = new ReplaySubject>>(1); - - this.request<{result: boolean | string; sourcelist?: Array}>(parameters).subscribe( - ({result, sourcelist}) => { - if (typeof result === 'string') { - // unsuccessful - subject.error(new Error(result)); - return; - } - - const groupedValues = new Map>(); - for (const entry of sourcelist) { - const group = entry.provider.type; - if (groupedValues.has(group)) { - groupedValues.get(group).push(entry); - } else { - groupedValues.set(group, [entry]); - } - } - - subject.next(groupedValues); - }, - () => subject.error(new Error('Unable to retrieve Nature 4.0 catalog data')), - () => subject.complete(), - ); - - return subject; - } -} - -export interface Nature40CatalogEntry { - global_id: string; - title: string; - description: string; - user_url: string; - provider: { - type: string; - id: string; - url: string; - }; - dataset: { - type: string; - id: string; - url: string; - }; -} diff --git a/projects/nature40-app/src/assets/.gitignore b/projects/nature40-app/src/assets/.gitignore deleted file mode 100644 index d344ba6b..00000000 --- a/projects/nature40-app/src/assets/.gitignore +++ /dev/null @@ -1 +0,0 @@ -config.json diff --git a/projects/nature40-app/src/assets/.gitkeep b/projects/nature40-app/src/assets/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/nature40-app/src/assets/icons/natur_40_logo.svg b/projects/nature40-app/src/assets/icons/natur_40_logo.svg deleted file mode 100644 index 0d142289..00000000 --- a/projects/nature40-app/src/assets/icons/natur_40_logo.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/projects/nature40-app/src/environments/environment.prod.ts b/projects/nature40-app/src/environments/environment.prod.ts deleted file mode 100644 index da7c84f6..00000000 --- a/projects/nature40-app/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true, -}; diff --git a/projects/nature40-app/src/environments/environment.ts b/projects/nature40-app/src/environments/environment.ts deleted file mode 100644 index c9cad009..00000000 --- a/projects/nature40-app/src/environments/environment.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - -export const environment = { - production: false, -}; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/projects/nature40-app/src/favicon.ico b/projects/nature40-app/src/favicon.ico deleted file mode 100644 index e2cef5c75a846e530b9628c9d30aef20d72c39db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 diff --git a/projects/nature40-app/src/index.html b/projects/nature40-app/src/index.html deleted file mode 100644 index 5174a1f9..00000000 --- a/projects/nature40-app/src/index.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - VAT: Visualization, Analysis and Transformation System - - - - - - - -

VAT

-
- · - · - · -
-
- - diff --git a/projects/nature40-app/src/main.ts b/projects/nature40-app/src/main.ts deleted file mode 100644 index 469eddb3..00000000 --- a/projects/nature40-app/src/main.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {enableProdMode} from '@angular/core'; -import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; - -import {AppModule} from './app/app.module'; -import {environment} from './environments/environment'; - -if (environment.production) { - enableProdMode(); -} - -platformBrowserDynamic() - .bootstrapModule(AppModule) - .catch((err) => console.error(err)); diff --git a/projects/nature40-app/src/polyfills.ts b/projects/nature40-app/src/polyfills.ts deleted file mode 100644 index e49856ec..00000000 --- a/projects/nature40-app/src/polyfills.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/projects/nature40-app/src/styles.scss b/projects/nature40-app/src/styles.scss deleted file mode 100644 index cf2f195d..00000000 --- a/projects/nature40-app/src/styles.scss +++ /dev/null @@ -1,22 +0,0 @@ -@import 'app-theme'; - -:root { - --wave-primary-color: #{mat-color($wave-app-primary)}; - --wave-accent-color: #{mat-color($wave-app-accent)}; - --wave-warn-color: #{mat-color($wave-app-warn)}; - - --wave-faded-accent-color: #{mat-color($wave-app-accent, 0.32)}; - - --wave-foreground-text-color: #{mat-color(map-get($wave-app-theme, foreground), text)}; - --wave-foreground-secondary-text-color: #{mat-color(map-get($wave-app-theme, foreground), secondary-text)}; - - --wave-background-color: #{map-get(map-get($wave-app-theme, background), background)}; - --wave-background-hover-color: #{mat-color(map-get($wave-app-theme, background), hover)}; - - font-family: Roboto, 'Helvetica Neue', sans-serif; - font-size: 16px; -} - -a { - color: mat-color(map-get($wave-app-theme, foreground), secondary-text); -} diff --git a/projects/nature40-app/src/test.ts b/projects/nature40-app/src/test.ts deleted file mode 100644 index 7a816b2b..00000000 --- a/projects/nature40-app/src/test.ts +++ /dev/null @@ -1,23 +0,0 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files - -import 'zone.js/dist/zone-testing'; -import {getTestBed} from '@angular/core/testing'; -import {BrowserDynamicTestingModule, platformBrowserDynamicTesting} from '@angular/platform-browser-dynamic/testing'; - -declare const require: { - context( - path: string, - deep?: boolean, - filter?: RegExp, - ): { - keys(): string[]; - (id: string): T; - }; -}; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); diff --git a/projects/nature40-app/tsconfig.app.json b/projects/nature40-app/tsconfig.app.json deleted file mode 100644 index 8212f985..00000000 --- a/projects/nature40-app/tsconfig.app.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "../../out-tsc/app", - "types": [] - }, - "files": ["src/main.ts", "src/polyfills.ts"], - "include": [], - "paths": { - "wave-core": ["dist/wave-core"] - } -} diff --git a/projects/nature40-app/tsconfig.spec.json b/projects/nature40-app/tsconfig.spec.json deleted file mode 100644 index b6b4f089..00000000 --- a/projects/nature40-app/tsconfig.spec.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "../../out-tsc/spec", - "types": ["jasmine", "node"] - }, - "files": ["src/test.ts", "src/polyfills.ts"], - "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] -} diff --git a/projects/wave-app/.eslintrc.json b/projects/wave-app/.eslintrc.json deleted file mode 100644 index d8afd07f..00000000 --- a/projects/wave-app/.eslintrc.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "extends": "../../.eslintrc.json", - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts"], - "parserOptions": { - "project": [ - "projects/wave-app/tsconfig.app.json", - "projects/wave-app/tsconfig.spec.json", - "projects/wave-app/e2e/tsconfig.json" - ], - "createDefaultProgram": true - }, - "rules": {} - }, - { - "files": ["*.html"], - "rules": {} - } - ] -} diff --git a/projects/wave-app/browserslist b/projects/wave-app/browserslist deleted file mode 100644 index 80848532..00000000 --- a/projects/wave-app/browserslist +++ /dev/null @@ -1,12 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -> 0.5% -last 2 versions -Firefox ESR -not dead -not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/projects/wave-app/e2e/protractor.conf.js b/projects/wave-app/e2e/protractor.conf.js deleted file mode 100644 index bf4376ef..00000000 --- a/projects/wave-app/e2e/protractor.conf.js +++ /dev/null @@ -1,30 +0,0 @@ -// @ts-check -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const {SpecReporter} = require('jasmine-spec-reporter'); - -/** - * @type { import("protractor").Config } - */ -exports.config = { - allScriptsTimeout: 11000, - specs: ['./src/**/*.e2e-spec.ts'], - capabilities: { - browserName: 'chrome', - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function () {}, - }, - onPrepare() { - require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.json'), - }); - jasmine.getEnv().addReporter(new SpecReporter({spec: {displayStacktrace: true}})); - }, -}; diff --git a/projects/wave-app/e2e/src/app.e2e-spec.ts b/projects/wave-app/e2e/src/app.e2e-spec.ts deleted file mode 100644 index 18d8a12b..00000000 --- a/projects/wave-app/e2e/src/app.e2e-spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {AppPage} from './app.po'; -import {browser, logging} from 'protractor'; - -describe('workspace-project App', () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.getTitleText()).toEqual('wave-app app is running!'); - }); - - afterEach(async () => { - // Assert that there are no errors emitted from the browser - const logs = await browser.manage().logs().get(logging.Type.BROWSER); - expect(logs).not.toContain( - jasmine.objectContaining({ - level: logging.Level.SEVERE, - } as logging.Entry), - ); - }); -}); diff --git a/projects/wave-app/e2e/src/app.po.ts b/projects/wave-app/e2e/src/app.po.ts deleted file mode 100644 index c0cc0f9b..00000000 --- a/projects/wave-app/e2e/src/app.po.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {browser, by, element} from 'protractor'; - -export class AppPage { - navigateTo(): Promise { - return browser.get(browser.baseUrl) as Promise; - } - - getTitleText(): Promise { - return element(by.css('waveApp-root .content span')).getText() as Promise; - } -} diff --git a/projects/wave-app/e2e/tsconfig.json b/projects/wave-app/e2e/tsconfig.json deleted file mode 100644 index 3d39212b..00000000 --- a/projects/wave-app/e2e/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "outDir": "../../../out-tsc/e2e", - "module": "commonjs", - "target": "es5", - "types": ["jasmine", "jasminewd2", "node"] - } -} diff --git a/projects/wave-app/karma.conf.js b/projects/wave-app/karma.conf.js deleted file mode 100644 index 5c2c7c29..00000000 --- a/projects/wave-app/karma.conf.js +++ /dev/null @@ -1,32 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular-devkit/build-angular/plugins/karma'), - ], - client: { - clearContext: false, // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - dir: require('path').join(__dirname, '../../coverage/wave-app'), - reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true, - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true, - }); -}; diff --git a/projects/wave-app/src/app-theme.scss b/projects/wave-app/src/app-theme.scss deleted file mode 100644 index 91c8fbc7..00000000 --- a/projects/wave-app/src/app-theme.scss +++ /dev/null @@ -1,82 +0,0 @@ -@import '~@angular/material/theming'; - -// Material Base Styles -@include mat-core(); - -// Define Colors -$gfbio-darkblue: ( - 50: #e7ebf4, - 100: #c2cee3, - 200: #99add1, - 300: #708cbf, - 400: #5273b1, - 500: #335aa3, - 600: #2e529b, - 700: #274891, - 800: #203f88, - 900: #142e77, - A100: #adc0ff, - A200: #7a98ff, - A400: #4770ff, - A700: #2e5dff, - contrast: ( - 50: $black-87-opacity, - 100: $black-87-opacity, - 200: $black-87-opacity, - 300: $black-87-opacity, - 400: $white-87-opacity, - 500: $white-87-opacity, - 600: $white-87-opacity, - 700: $white-87-opacity, - 800: $white-87-opacity, - 900: $white-87-opacity, - A100: $black-87-opacity, - A200: $black-87-opacity, - A400: $white-87-opacity, - A700: $white-87-opacity, - ), -); - -$gfbio-green: ( - 50: #f0f6e9, - 100: #d9e8c8, - 200: #c0d9a4, - 300: #a7c97f, - 400: #94be63, - 500: #81b248, - 600: #79ab41, - 700: #6ea238, - 800: #649930, - 900: #518a21, - A100: #dfffc7, - A200: #c2ff94, - A400: #a5ff61, - A700: #97ff47, - contrast: ( - 50: $black-87-opacity, - 100: $black-87-opacity, - 200: $black-87-opacity, - 300: $black-87-opacity, - 400: $black-87-opacity, - 500: $black-87-opacity, - 600: $black-87-opacity, - 700: $black-87-opacity, - 800: $white-87-opacity, - 900: $white-87-opacity, - A100: $black-87-opacity, - A200: $black-87-opacity, - A400: $black-87-opacity, - A700: $black-87-opacity, - ), -); - -// Define App Theme -$wave-app-primary: mat-palette($gfbio-darkblue); -$wave-app-accent: mat-palette($gfbio-green, A200, A100, A400); -$wave-app-warn: mat-palette($mat-red); - -// Create the theme object (a Sass map containing all of the palettes). -$wave-app-theme: mat-light-theme($wave-app-primary, $wave-app-accent, $wave-app-warn); - -// Apply Angular Material Mixin to Color Theme -@include angular-material-theme($wave-app-theme); diff --git a/projects/wave-app/src/app/app-config.service.ts b/projects/wave-app/src/app/app-config.service.ts deleted file mode 100644 index 8b4a97db..00000000 --- a/projects/wave-app/src/app/app-config.service.ts +++ /dev/null @@ -1,34 +0,0 @@ -import {Injectable} from '@angular/core'; -import {mergeDeep} from 'immutable'; -import {Config, WaveConfigStructure, WAVE_DEFAULT_CONFIG} from 'wave-core'; - -interface Components { - readonly PLAYBACK: { - readonly AVAILABLE: boolean; - }; -} - -interface AppConfigStructure extends WaveConfigStructure { - readonly COMPONENTS: Components; -} - -const APP_CONFIG_DEFAULTS = mergeDeep(WAVE_DEFAULT_CONFIG, { - COMPONENTS: { - PLAYBACK: { - AVAILABLE: false, - }, - }, -}) as AppConfigStructure; - -@Injectable() -export class AppConfig extends Config { - protected config: AppConfigStructure; - - get COMPONENTS(): Components { - return this.config.COMPONENTS; - } - - load(): Promise { - return super.load(APP_CONFIG_DEFAULTS); - } -} diff --git a/projects/wave-app/src/app/app.component.html b/projects/wave-app/src/app/app.component.html deleted file mode 100644 index c40008c9..00000000 --- a/projects/wave-app/src/app/app.component.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - -
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - -
-
- - - - -
Data Table
-
- - -
- - -
Citations
-
- - -
-
-
-
diff --git a/projects/wave-app/src/app/app.component.scss b/projects/wave-app/src/app/app.component.scss deleted file mode 100644 index 6fd8fae1..00000000 --- a/projects/wave-app/src/app/app.component.scss +++ /dev/null @@ -1,115 +0,0 @@ -wave-navigation { - z-index: 10; -} - -wave-layer-list { - position: absolute; - z-index: 2; - width: 16vw; - min-width: 200px; - left: 0; - top: 0; - background-color: rgba(255, 255, 255, 0.87); - border-bottom-right-radius: 2px; -} - -.time-container { - position: absolute; - left: 16vw; - right: 16vw; - - wave-ticker-interaction, - wave-small-time-interaction, - wave-zoom-handles { - background-color: rgba(255, 255, 255, 0.87); - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; - z-index: 3; - } -} - -:host ::ng-deep .mat-sidenav-content { - overflow: hidden; -} - -.top-container { - z-index: 1; -} - -.mid-container { - z-index: 0; - position: relative; -} - -.bottom-container { - position: relative; - z-index: 1; - - min-height: 3rem; - @media (max-width: 600px) and (orientation: portrait) { - min-height: 2.5rem; - } - @media (max-width: 960px) and (orientation: landscape) { - min-height: 2rem; - } - - .toggle { - position: absolute; - z-index: 1; - padding: 0; - min-width: 3rem; - width: 3rem; - height: 3rem; - @media (max-width: 600px) and (orientation: portrait) { - min-width: 2.5rem; - width: 2.5rem; - height: 2.5rem; - } - @media (max-width: 960px) and (orientation: landscape) { - min-width: 2rem; - width: 2rem; - height: 2rem; - } - } - - ::ng-deep .mat-tab-label-container { - margin-left: 3rem; - @media (max-width: 600px) and (orientation: portrait) { - margin-left: 2.5rem; - } - @media (max-width: 960px) and (orientation: landscape) { - margin-left: 2rem; - } - } - - @media (max-width: 960px) and (orientation: landscape) { - ::ng-deep mat-tab-header { - height: 2rem; - } - ::ng-deep .mat-tab-label { - line-height: 2rem; - } - } - @media (max-width: 600px) and (orientation: portrait) { - ::ng-deep mat-tab-header { - height: 2.5rem; - } - ::ng-deep .mat-tab-label { - line-height: 2.5rem; - } - } -} - -.bottom-container.small { - max-height: 3rem !important; - @media (max-width: 600px) and (orientation: portrait) { - max-height: 2.5rem !important; - } - @media (max-width: 960px) and (orientation: landscape) { - max-height: 2rem !important; - } - - ::ng-deep mat-tab-header { - border: 0; - } -} diff --git a/projects/wave-app/src/app/app.component.ts b/projects/wave-app/src/app/app.component.ts deleted file mode 100644 index 168bc9dc..00000000 --- a/projects/wave-app/src/app/app.component.ts +++ /dev/null @@ -1,275 +0,0 @@ -import {Observable, BehaviorSubject} from 'rxjs'; -import {map, tap, first} from 'rxjs/operators'; - -import { - AfterViewInit, - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - HostListener, - Inject, - OnInit, - ViewChild, - ViewContainerRef, -} from '@angular/core'; -import {MatDialog} from '@angular/material/dialog'; -import {MatIconRegistry} from '@angular/material/icon'; -import {MatSidenav} from '@angular/material/sidenav'; -import {MatTabGroup} from '@angular/material/tabs'; -import { - Layer, - SidenavContainerComponent, - MapContainerComponent, - AbstractSymbology, - LayerService, - LayoutService, - ProjectService, - UserService, - StorageService, - RandomColorService, - MappingQueryService, - NotificationService, - MapService, - Config, - ResultTypes, - PointSymbology, - VectorSymbology, - LineSymbology, - PlotListComponent, - WorkflowParameterChoiceDialogComponent, - NavigationButton, - SourceOperatorListComponent, - NavigationComponent, - OperatorListComponent, - TimeConfigComponent, - WorkspaceSettingsComponent, - HelpComponent, - SourceOperatorListButton, - GFBioSourceType, - GbifOperatorComponent, - OperatorListButtonGroups, - SidenavConfig, -} from 'wave-core'; -import {DomSanitizer} from '@angular/platform-browser'; -import {ActivatedRoute} from '@angular/router'; -import {AppConfig} from './app-config.service'; - -@Component({ - selector: 'wave-app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AppComponent implements OnInit, AfterViewInit { - @ViewChild(MapContainerComponent, {static: true}) mapComponent: MapContainerComponent; - @ViewChild(MatTabGroup, {static: true}) bottomTabs: MatTabGroup; - - @ViewChild(MatSidenav, {static: true}) rightSidenav: MatSidenav; - @ViewChild(SidenavContainerComponent, {static: true}) rightSidenavContainer: SidenavContainerComponent; - - readonly ResultTypes = ResultTypes; - readonly LayoutService = LayoutService; - - readonly layersReverse$: Observable>>; - readonly layerListVisible$: Observable; - readonly layerDetailViewVisible$: Observable; - - readonly navigationButtons = this.setupNavigation(); - readonly addAFirstLayerConfig = AppComponent.setupAddDataConfig(); - - middleContainerHeight$: Observable; - bottomContainerHeight$: Observable; - mapIsGrid$: Observable; - - private windowHeight$ = new BehaviorSubject(window.innerHeight); - - constructor( - @Inject(Config) readonly config: AppConfig, - readonly layerService: LayerService, - readonly layoutService: LayoutService, - readonly projectService: ProjectService, - readonly vcRef: ViewContainerRef, // reference used by color picker - private userService: UserService, - private storageService: StorageService, - private changeDetectorRef: ChangeDetectorRef, - private dialog: MatDialog, - private iconRegistry: MatIconRegistry, - private randomColorService: RandomColorService, - private mappingQueryService: MappingQueryService, - private activatedRoute: ActivatedRoute, - private notificationService: NotificationService, - private mapService: MapService, - private sanitizer: DomSanitizer, - ) { - this.registerIcons(); - - vcRef.length; // eslint-disable-line @typescript-eslint/no-unused-expressions - - this.storageService.toString(); // just register - - this.layersReverse$ = this.projectService.getLayerStream().pipe(map((layers) => layers.slice(0).reverse())); - - this.layerListVisible$ = this.layoutService.getLayerListVisibilityStream(); - this.layerDetailViewVisible$ = this.layoutService.getLayerDetailViewVisibilityStream(); - } - - private registerIcons() { - this.iconRegistry.addSvgIconInNamespace('vat', 'logo', this.sanitizer.bypassSecurityTrustResourceUrl('assets/vat_logo.svg')); - - // used for navigation - this.iconRegistry.addSvgIcon('cogs', this.sanitizer.bypassSecurityTrustResourceUrl('assets/icons/cogs.svg')); - - // TODO: migrate to geo bon app - // this.iconRegistry.addSvgIconInNamespace( - // 'geobon', - // 'logo', - // this.sanitizer.bypassSecurityTrustResourceUrl('assets/geobon-logo.svg'), - // ); - } - - ngOnInit() { - this.mapService.registerMapComponent(this.mapComponent); - this.mapIsGrid$ = this.mapService.isGrid$; - - this.middleContainerHeight$ = this.layoutService.getMapHeightStream(this.windowHeight$).pipe(tap(() => this.mapComponent.resize())); - this.bottomContainerHeight$ = this.layoutService.getLayerDetailViewStream(this.windowHeight$); - } - - ngAfterViewInit() { - this.layoutService.getSidenavContentComponentStream().subscribe((sidenavConfig) => { - this.rightSidenavContainer.load(sidenavConfig); - if (sidenavConfig) { - this.rightSidenav.open(); - } else { - this.rightSidenav.close(); - } - }); - this.projectService - .getNewPlotStream() - .subscribe(() => this.layoutService.setSidenavContentComponent({component: PlotListComponent})); - - // set the stored tab index - this.layoutService.getLayerDetailViewTabIndexStream().subscribe((tabIndex) => { - if (this.bottomTabs.selectedIndex !== tabIndex) { - this.bottomTabs.selectedIndex = tabIndex; - setTimeout(() => this.changeDetectorRef.markForCheck()); - } - }); - - this.handleQueryParameters(); - } - - setTabIndex(index: number) { - this.layoutService.setLayerDetailViewTabIndex(index); - this.layoutService.setLayerDetailViewVisibility(true); - } - - private setupNavigation(): Array { - return [ - NavigationComponent.createLoginButton(this.userService, this.layoutService, this.config), - { - sidenavConfig: AppComponent.setupAddDataConfig(), - icon: 'add', - tooltip: 'Add Data', - }, - { - sidenavConfig: {component: OperatorListComponent, config: {operators: AppComponent.createOperatorListButtons()}}, - icon: '', - svgIcon: 'cogs', - tooltip: 'Operators', - }, - { - sidenavConfig: {component: PlotListComponent}, - icon: 'equalizer', - tooltip: 'Plots', - }, - { - sidenavConfig: {component: TimeConfigComponent}, - icon: 'access_time', - tooltip: 'Time', - }, - { - sidenavConfig: {component: WorkspaceSettingsComponent}, - icon: 'settings', - tooltip: 'Workspace', - }, - { - sidenavConfig: {component: HelpComponent}, - icon: 'help', - tooltip: 'Help', - }, - ]; - } - - private static setupAddDataConfig(): SidenavConfig { - return {component: SourceOperatorListComponent, config: {buttons: AppComponent.createSourceOperatorListButtons()}}; - } - - private static createSourceOperatorListButtons(): Array { - return [ - SourceOperatorListComponent.createDataRepositoryButton(), - SourceOperatorListComponent.createDrawFeaturesButton(), - ...SourceOperatorListComponent.createCustomFeaturesButtons(), - { - name: 'Species Occurrences', - description: 'Query data from GBIF', - iconSrc: GFBioSourceType.ICON_URL, - sidenavConfig: {component: GbifOperatorComponent, keepParent: true}, - }, - SourceOperatorListComponent.createCountryPolygonsButton(), - ]; - } - - private static createOperatorListButtons(): OperatorListButtonGroups { - return [ - {name: 'Mixed', list: OperatorListComponent.DEFAULT_MIXED_OPERATOR_DIALOGS}, - {name: 'Plots', list: OperatorListComponent.DEFAULT_PLOT_OPERATOR_DIALOGS}, - {name: 'Raster', list: OperatorListComponent.DEFAULT_RASTER_OPERATOR_DIALOGS}, - {name: 'Vector', list: OperatorListComponent.DEFAULT_VECTOR_OPERATOR_DIALOGS}, - ]; - } - - @HostListener('window:resize') - private windowHeight() { - this.windowHeight$.next(window.innerHeight); - } - - private handleQueryParameters() { - this.activatedRoute.queryParams.subscribe((p) => { - for (const parameter of Object.keys(p)) { - const value = p[parameter]; - switch (parameter) { - case 'workflow': - try { - const newLayer = Layer.fromDict(JSON.parse(value)); - this.projectService - .getProjectStream() - .pipe(first()) - .subscribe((project) => { - if (project.layers.length > 0) { - // show popup - this.dialog.open(WorkflowParameterChoiceDialogComponent, { - data: { - dialogTitle: 'Workflow URL Parameter', - sourceName: 'URL parameter', - layers: [newLayer], - nonAvailableNames: [], - numberOfLayersInProject: project.layers.length, - }, - }); - } else { - // just add the layer if the layer array is empty - this.projectService.addLayer(newLayer); - } - }); - } catch (error) { - this.notificationService.error(`Invalid Workflow: »${error}«`); - } - break; - default: - this.notificationService.error(`Unknown URL Parameter »${parameter}«`); - } - } - }); - } -} diff --git a/projects/wave-app/src/app/app.module.ts b/projects/wave-app/src/app/app.module.ts deleted file mode 100644 index 7448c83e..00000000 --- a/projects/wave-app/src/app/app.module.ts +++ /dev/null @@ -1,54 +0,0 @@ -import {APP_INITIALIZER, NgModule} from '@angular/core'; -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; -import {BrowserModule} from '@angular/platform-browser'; -import {HttpClientModule} from '@angular/common/http'; -import {RouterModule} from '@angular/router'; - -import {AppComponent} from './app.component'; -import { - Config, - LayerService, - LayoutService, - MappingQueryService, - MapService, - NotificationService, - ProjectService, - RandomColorService, - StorageService, - SidenavRef, - UserService, - WaveCoreModule, -} from 'wave-core'; -import {AppConfig} from './app-config.service'; - -@NgModule({ - declarations: [AppComponent], - imports: [ - BrowserAnimationsModule, - BrowserModule, - HttpClientModule, - RouterModule.forRoot([{path: '**', component: AppComponent}], {useHash: true}), - WaveCoreModule, - ], - providers: [ - {provide: Config, useClass: AppConfig}, - { - provide: APP_INITIALIZER, - useFactory: (config: AppConfig) => () => config.load(), - deps: [Config], - multi: true, - }, - LayerService, - LayoutService, - MappingQueryService, - MapService, - NotificationService, - ProjectService, - RandomColorService, - SidenavRef, - StorageService, - UserService, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/projects/wave-app/src/assets/.gitignore b/projects/wave-app/src/assets/.gitignore deleted file mode 100644 index d344ba6b..00000000 --- a/projects/wave-app/src/assets/.gitignore +++ /dev/null @@ -1 +0,0 @@ -config.json diff --git a/projects/wave-app/src/assets/.gitkeep b/projects/wave-app/src/assets/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-app/src/environments/environment.prod.ts b/projects/wave-app/src/environments/environment.prod.ts deleted file mode 100644 index da7c84f6..00000000 --- a/projects/wave-app/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true, -}; diff --git a/projects/wave-app/src/environments/environment.ts b/projects/wave-app/src/environments/environment.ts deleted file mode 100644 index c9cad009..00000000 --- a/projects/wave-app/src/environments/environment.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - -export const environment = { - production: false, -}; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/projects/wave-app/src/favicon.ico b/projects/wave-app/src/favicon.ico deleted file mode 100644 index e2cef5c75a846e530b9628c9d30aef20d72c39db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 diff --git a/projects/wave-app/src/index.html b/projects/wave-app/src/index.html deleted file mode 100644 index 238e3d14..00000000 --- a/projects/wave-app/src/index.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - VAT: Visualization, Analysis and Transformation System - - - - - - - -

VAT

-
- · - · - · -
-
- - diff --git a/projects/wave-app/src/main.ts b/projects/wave-app/src/main.ts deleted file mode 100644 index 469eddb3..00000000 --- a/projects/wave-app/src/main.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {enableProdMode} from '@angular/core'; -import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; - -import {AppModule} from './app/app.module'; -import {environment} from './environments/environment'; - -if (environment.production) { - enableProdMode(); -} - -platformBrowserDynamic() - .bootstrapModule(AppModule) - .catch((err) => console.error(err)); diff --git a/projects/wave-app/src/polyfills.ts b/projects/wave-app/src/polyfills.ts deleted file mode 100644 index e49856ec..00000000 --- a/projects/wave-app/src/polyfills.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/projects/wave-app/src/styles.scss b/projects/wave-app/src/styles.scss deleted file mode 100644 index cf2f195d..00000000 --- a/projects/wave-app/src/styles.scss +++ /dev/null @@ -1,22 +0,0 @@ -@import 'app-theme'; - -:root { - --wave-primary-color: #{mat-color($wave-app-primary)}; - --wave-accent-color: #{mat-color($wave-app-accent)}; - --wave-warn-color: #{mat-color($wave-app-warn)}; - - --wave-faded-accent-color: #{mat-color($wave-app-accent, 0.32)}; - - --wave-foreground-text-color: #{mat-color(map-get($wave-app-theme, foreground), text)}; - --wave-foreground-secondary-text-color: #{mat-color(map-get($wave-app-theme, foreground), secondary-text)}; - - --wave-background-color: #{map-get(map-get($wave-app-theme, background), background)}; - --wave-background-hover-color: #{mat-color(map-get($wave-app-theme, background), hover)}; - - font-family: Roboto, 'Helvetica Neue', sans-serif; - font-size: 16px; -} - -a { - color: mat-color(map-get($wave-app-theme, foreground), secondary-text); -} diff --git a/projects/wave-app/src/test.ts b/projects/wave-app/src/test.ts deleted file mode 100644 index 7a816b2b..00000000 --- a/projects/wave-app/src/test.ts +++ /dev/null @@ -1,23 +0,0 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files - -import 'zone.js/dist/zone-testing'; -import {getTestBed} from '@angular/core/testing'; -import {BrowserDynamicTestingModule, platformBrowserDynamicTesting} from '@angular/platform-browser-dynamic/testing'; - -declare const require: { - context( - path: string, - deep?: boolean, - filter?: RegExp, - ): { - keys(): string[]; - (id: string): T; - }; -}; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); diff --git a/projects/wave-app/tsconfig.app.json b/projects/wave-app/tsconfig.app.json deleted file mode 100644 index 8212f985..00000000 --- a/projects/wave-app/tsconfig.app.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "../../out-tsc/app", - "types": [] - }, - "files": ["src/main.ts", "src/polyfills.ts"], - "include": [], - "paths": { - "wave-core": ["dist/wave-core"] - } -} diff --git a/projects/wave-app/tsconfig.spec.json b/projects/wave-app/tsconfig.spec.json deleted file mode 100644 index b6b4f089..00000000 --- a/projects/wave-app/tsconfig.spec.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "../../out-tsc/spec", - "types": ["jasmine", "node"] - }, - "files": ["src/test.ts", "src/polyfills.ts"], - "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] -} diff --git a/projects/wave-core/.eslintrc.json b/projects/wave-core/.eslintrc.json deleted file mode 100644 index eff7f7bd..00000000 --- a/projects/wave-core/.eslintrc.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "../../.eslintrc.json", - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts"], - "parserOptions": { - "project": ["projects/wave-core/tsconfig.lib.json", "projects/wave-core/tsconfig.spec.json"], - "createDefaultProgram": true - }, - "rules": {} - }, - { - "files": ["*.html"], - "rules": {} - } - ] -} diff --git a/projects/wave-core/README.md b/projects/wave-core/README.md deleted file mode 100644 index 9d36cb4e..00000000 --- a/projects/wave-core/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# WaveCore - -This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.0.6. - -## Code scaffolding - -Run `ng generate component component-name --project wave-core` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project wave-core`. - -> Note: Don't forget to add `--project wave-core` or else it will be added to the default project in your `angular.json` file. - -## Build - -Run `ng build wave-core` to build the project. The build artifacts will be stored in the `dist/` directory. - -## Publishing - -After building your library with `ng build wave-core`, go to the dist folder `cd dist/wave-core` and run `npm publish`. - -## Running unit tests - -Run `ng test wave-core` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/projects/wave-core/assets/.gitignore b/projects/wave-core/assets/.gitignore deleted file mode 100644 index d344ba6b..00000000 --- a/projects/wave-core/assets/.gitignore +++ /dev/null @@ -1 +0,0 @@ -config.json diff --git a/projects/wave-core/assets/.gitkeep b/projects/wave-core/assets/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/assets/config.json.blueprint b/projects/wave-core/assets/config.json.blueprint deleted file mode 100644 index 0967ef42..00000000 --- a/projects/wave-core/assets/config.json.blueprint +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/projects/wave-core/assets/countries.geojson b/projects/wave-core/assets/countries.geojson deleted file mode 100644 index aee18b93..00000000 --- a/projects/wave-core/assets/countries.geojson +++ /dev/null @@ -1,183 +0,0 @@ -{"type":"FeatureCollection","crs":{"type":"name","properties":{"name":"EPSG:4326"}},"features":[ -{"type":"Feature","id":"BACKGROUND","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-180.0,-90.0],[180.0,-90.0],[180.0,90.0],[-180.0,90.0],[-180.0,-90.0]]]}}, -{"type":"Feature","id":"AFG","properties":{"name":"Afghanistan"},"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[62.230651,35.270664],[62.984662,35.404041],[63.193538,35.857166],[63.982896,36.007957],[64.546479,36.312073],[64.746105,37.111818],[65.588948,37.305217],[65.745631,37.661164],[66.217385,37.39379],[66.518607,37.362784],[67.075782,37.356144],[67.83,37.144994],[68.135562,37.023115],[68.859446,37.344336],[69.196273,37.151144],[69.518785,37.608997],[70.116578,37.588223],[70.270574,37.735165],[70.376304,38.138396],[70.806821,38.486282],[71.348131,38.258905],[71.239404,37.953265],[71.541918,37.905774],[71.448693,37.065645],[71.844638,36.738171],[72.193041,36.948288],[72.63689,37.047558],[73.260056,37.495257],[73.948696,37.421566],[74.980002,37.41999],[75.158028,37.133031],[74.575893,37.020841],[74.067552,36.836176],[72.920025,36.720007],[71.846292,36.509942],[71.262348,36.074388],[71.498768,35.650563],[71.613076,35.153203],[71.115019,34.733126],[71.156773,34.348911],[70.881803,33.988856],[69.930543,34.02012],[70.323594,33.358533],[69.687147,33.105499],[69.262522,32.501944],[69.317764,31.901412],[68.926677,31.620189],[68.556932,31.71331],[67.792689,31.58293],[67.683394,31.303154],[66.938891,31.304911],[66.381458,30.738899],[66.346473,29.887943],[65.046862,29.472181],[64.350419,29.560031],[64.148002,29.340819],[63.550261,29.468331],[62.549857,29.318572],[60.874248,29.829239],[61.781222,30.73585],[61.699314,31.379506],[60.941945,31.548075],[60.863655,32.18292],[60.536078,32.981269],[60.9637,33.528832],[60.52843,33.676446],[60.803193,34.404102],[61.210817,35.650072]]]}}, -{"type":"Feature","id":"AGO","properties":{"name":"Angola"},"geometry":{"type":"MultiPolygon","coordinates":[[[[16.326528,-5.87747],[16.57318,-6.622645],[16.860191,-7.222298],[17.089996,-7.545689],[17.47297,-8.068551],[18.134222,-7.987678],[18.464176,-7.847014],[19.016752,-7.988246],[19.166613,-7.738184],[19.417502,-7.155429],[20.037723,-7.116361],[20.091622,-6.94309],[20.601823,-6.939318],[20.514748,-7.299606],[21.728111,-7.290872],[21.746456,-7.920085],[21.949131,-8.305901],[21.801801,-8.908707],[21.875182,-9.523708],[22.208753,-9.894796],[22.155268,-11.084801],[22.402798,-10.993075],[22.837345,-11.017622],[23.456791,-10.867863],[23.912215,-10.926826],[24.017894,-11.237298],[23.904154,-11.722282],[24.079905,-12.191297],[23.930922,-12.565848],[24.016137,-12.911046],[21.933886,-12.898437],[21.887843,-16.08031],[22.562478,-16.898451],[23.215048,-17.523116],[21.377176,-17.930636],[18.956187,-17.789095],[18.263309,-17.309951],[14.209707,-17.353101],[14.058501,-17.423381],[13.462362,-16.971212],[12.814081,-16.941343],[12.215461,-17.111668],[11.734199,-17.301889],[11.640096,-16.673142],[11.778537,-15.793816],[12.123581,-14.878316],[12.175619,-14.449144],[12.500095,-13.5477],[12.738479,-13.137906],[13.312914,-12.48363],[13.633721,-12.038645],[13.738728,-11.297863],[13.686379,-10.731076],[13.387328,-10.373578],[13.120988,-9.766897],[12.87537,-9.166934],[12.929061,-8.959091],[13.236433,-8.562629],[12.93304,-7.596539],[12.728298,-6.927122],[12.227347,-6.294448],[12.322432,-6.100092],[12.735171,-5.965682],[13.024869,-5.984389],[13.375597,-5.864241],[16.326528,-5.87747]]],[[[12.436688,-5.684304],[12.182337,-5.789931],[11.914963,-5.037987],[12.318608,-4.60623],[12.62076,-4.438023],[12.995517,-4.781103],[12.631612,-4.991271],[12.468004,-5.248362],[12.436688,-5.684304]]]]}}, -{"type":"Feature","id":"ALB","properties":{"name":"Albania"},"geometry":{"type":"Polygon","coordinates":[[[20.590247,41.855404],[20.463175,41.515089],[20.605182,41.086226],[21.02004,40.842727],[20.99999,40.580004],[20.674997,40.435],[20.615,40.110007],[20.150016,39.624998],[19.98,39.694993],[19.960002,39.915006],[19.406082,40.250773],[19.319059,40.72723],[19.40355,41.409566],[19.540027,41.719986],[19.371769,41.877548],[19.304486,42.195745],[19.738051,42.688247],[19.801613,42.500093],[20.0707,42.58863],[20.283755,42.32026],[20.52295,42.21787],[20.590247,41.855404]]]}}, -{"type":"Feature","id":"ARE","properties":{"name":"United Arab Emirates"},"geometry":{"type":"Polygon","coordinates":[[[51.579519,24.245497],[51.757441,24.294073],[51.794389,24.019826],[52.577081,24.177439],[53.404007,24.151317],[54.008001,24.121758],[54.693024,24.797892],[55.439025,25.439145],[56.070821,26.055464],[56.261042,25.714606],[56.396847,24.924732],[55.886233,24.920831],[55.804119,24.269604],[55.981214,24.130543],[55.528632,23.933604],[55.525841,23.524869],[55.234489,23.110993],[55.208341,22.70833],[55.006803,22.496948],[52.000733,23.001154],[51.617708,24.014219],[51.579519,24.245497]]]}}, -{"type":"Feature","id":"ARG","properties":{"name":"Argentina"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-65.5,-55.2],[-66.45,-55.25],[-66.95992,-54.89681],[-67.56244,-54.87001],[-68.63335,-54.8695],[-68.63401,-52.63637],[-68.25,-53.1],[-67.75,-53.85],[-66.45,-54.45],[-65.05,-54.7],[-65.5,-55.2]]],[[[-64.964892,-22.075862],[-64.377021,-22.798091],[-63.986838,-21.993644],[-62.846468,-22.034985],[-62.685057,-22.249029],[-60.846565,-23.880713],[-60.028966,-24.032796],[-58.807128,-24.771459],[-57.777217,-25.16234],[-57.63366,-25.603657],[-58.618174,-27.123719],[-57.60976,-27.395899],[-56.486702,-27.548499],[-55.695846,-27.387837],[-54.788795,-26.621786],[-54.625291,-25.739255],[-54.13005,-25.547639],[-53.628349,-26.124865],[-53.648735,-26.923473],[-54.490725,-27.474757],[-55.162286,-27.881915],[-56.2909,-28.852761],[-57.625133,-30.216295],[-57.874937,-31.016556],[-58.14244,-32.044504],[-58.132648,-33.040567],[-58.349611,-33.263189],[-58.427074,-33.909454],[-58.495442,-34.43149],[-57.22583,-35.288027],[-57.362359,-35.97739],[-56.737487,-36.413126],[-56.788285,-36.901572],[-57.749157,-38.183871],[-59.231857,-38.72022],[-61.237445,-38.928425],[-62.335957,-38.827707],[-62.125763,-39.424105],[-62.330531,-40.172586],[-62.145994,-40.676897],[-62.745803,-41.028761],[-63.770495,-41.166789],[-64.73209,-40.802677],[-65.118035,-41.064315],[-64.978561,-42.058001],[-64.303408,-42.359016],[-63.755948,-42.043687],[-63.458059,-42.563138],[-64.378804,-42.873558],[-65.181804,-43.495381],[-65.328823,-44.501366],[-65.565269,-45.036786],[-66.509966,-45.039628],[-67.293794,-45.551896],[-67.580546,-46.301773],[-66.597066,-47.033925],[-65.641027,-47.236135],[-65.985088,-48.133289],[-67.166179,-48.697337],[-67.816088,-49.869669],[-68.728745,-50.264218],[-69.138539,-50.73251],[-68.815561,-51.771104],[-68.149995,-52.349983],[-68.571545,-52.299444],[-69.498362,-52.142761],[-71.914804,-52.009022],[-72.329404,-51.425956],[-72.309974,-50.67701],[-72.975747,-50.74145],[-73.328051,-50.378785],[-73.415436,-49.318436],[-72.648247,-48.878618],[-72.331161,-48.244238],[-72.447355,-47.738533],[-71.917258,-46.884838],[-71.552009,-45.560733],[-71.659316,-44.973689],[-71.222779,-44.784243],[-71.329801,-44.407522],[-71.793623,-44.207172],[-71.464056,-43.787611],[-71.915424,-43.408565],[-72.148898,-42.254888],[-71.746804,-42.051386],[-71.915734,-40.832339],[-71.680761,-39.808164],[-71.413517,-38.916022],[-70.814664,-38.552995],[-71.118625,-37.576827],[-71.121881,-36.658124],[-70.364769,-36.005089],[-70.388049,-35.169688],[-69.817309,-34.193571],[-69.814777,-33.273886],[-70.074399,-33.09121],[-70.535069,-31.36501],[-69.919008,-30.336339],[-70.01355,-29.367923],[-69.65613,-28.459141],[-69.001235,-27.521214],[-68.295542,-26.89934],[-68.5948,-26.506909],[-68.386001,-26.185016],[-68.417653,-24.518555],[-67.328443,-24.025303],[-66.985234,-22.986349],[-67.106674,-22.735925],[-66.273339,-21.83231],[-64.964892,-22.075862]]]]}}, -{"type":"Feature","id":"ARM","properties":{"name":"Armenia"},"geometry":{"type":"Polygon","coordinates":[[[43.582746,41.092143],[44.97248,41.248129],[45.179496,40.985354],[45.560351,40.81229],[45.359175,40.561504],[45.891907,40.218476],[45.610012,39.899994],[46.034534,39.628021],[46.483499,39.464155],[46.50572,38.770605],[46.143623,38.741201],[45.735379,39.319719],[45.739978,39.473999],[45.298145,39.471751],[45.001987,39.740004],[44.79399,39.713003],[44.400009,40.005],[43.656436,40.253564],[43.752658,40.740201],[43.582746,41.092143]]]}}, -{"type":"Feature","id":"ATA","properties":{"name":"Antarctica"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-59.572095,-80.040179],[-59.865849,-80.549657],[-60.159656,-81.000327],[-62.255393,-80.863178],[-64.488125,-80.921934],[-65.741666,-80.588827],[-65.741666,-80.549657],[-66.290031,-80.255773],[-64.037688,-80.294944],[-61.883246,-80.39287],[-61.138976,-79.981371],[-60.610119,-79.628679],[-59.572095,-80.040179]]],[[[-159.208184,-79.497059],[-161.127601,-79.634209],[-162.439847,-79.281465],[-163.027408,-78.928774],[-163.066604,-78.869966],[-163.712896,-78.595667],[-163.105801,-78.223338],[-161.245113,-78.380176],[-160.246208,-78.693645],[-159.482405,-79.046338],[-159.208184,-79.497059]]],[[[-45.154758,-78.04707],[-43.920828,-78.478103],[-43.48995,-79.08556],[-43.372438,-79.516645],[-43.333267,-80.026123],[-44.880537,-80.339644],[-46.506174,-80.594357],[-48.386421,-80.829485],[-50.482107,-81.025442],[-52.851988,-80.966685],[-54.164259,-80.633528],[-53.987991,-80.222028],[-51.853134,-79.94773],[-50.991326,-79.614623],[-50.364595,-79.183487],[-49.914131,-78.811209],[-49.306959,-78.458569],[-48.660616,-78.047018],[-48.660616,-78.047019],[-48.151396,-78.04707],[-46.662857,-77.831476],[-45.154758,-78.04707]]],[[[-121.211511,-73.50099],[-119.918851,-73.657725],[-118.724143,-73.481353],[-119.292119,-73.834097],[-120.232217,-74.08881],[-121.62283,-74.010468],[-122.621735,-73.657778],[-122.621735,-73.657777],[-122.406245,-73.324619],[-121.211511,-73.50099]]],[[[-125.559566,-73.481353],[-124.031882,-73.873268],[-124.619469,-73.834097],[-125.912181,-73.736118],[-127.28313,-73.461769],[-127.28313,-73.461768],[-126.558472,-73.246226],[-125.559566,-73.481353]]],[[[-98.98155,-71.933334],[-97.884743,-72.070535],[-96.787937,-71.952971],[-96.20035,-72.521205],[-96.983765,-72.442864],[-98.198083,-72.482035],[-99.432013,-72.442864],[-100.783455,-72.50162],[-101.801868,-72.305663],[-102.330725,-71.894164],[-101.703967,-71.717792],[-100.430919,-71.854993],[-98.98155,-71.933334]]],[[[-68.451346,-70.955823],[-68.333834,-71.406493],[-68.510128,-71.798407],[-68.784297,-72.170736],[-69.959471,-72.307885],[-71.075889,-72.503842],[-72.388134,-72.484257],[-71.8985,-72.092343],[-73.073622,-72.229492],[-74.19004,-72.366693],[-74.953895,-72.072757],[-75.012625,-71.661258],[-73.915819,-71.269345],[-73.915819,-71.269344],[-73.230331,-71.15178],[-72.074717,-71.190951],[-71.780962,-70.681473],[-71.72218,-70.309196],[-71.741791,-69.505782],[-71.173815,-69.035475],[-70.253252,-68.87874],[-69.724447,-69.251017],[-69.489422,-69.623346],[-69.058518,-70.074016],[-68.725541,-70.505153],[-68.451346,-70.955823]]],[[[-58.614143,-64.152467],[-59.045073,-64.36801],[-59.789342,-64.211223],[-60.611928,-64.309202],[-61.297416,-64.54433],[-62.0221,-64.799094],[-62.51176,-65.09303],[-62.648858,-65.484942],[-62.590128,-65.857219],[-62.120079,-66.190326],[-62.805567,-66.425505],[-63.74569,-66.503847],[-64.294106,-66.837004],[-64.881693,-67.150474],[-65.508425,-67.58161],[-65.665082,-67.953887],[-65.312545,-68.365335],[-64.783715,-68.678908],[-63.961103,-68.913984],[-63.1973,-69.227556],[-62.785955,-69.619419],[-62.570516,-69.991747],[-62.276736,-70.383661],[-61.806661,-70.716768],[-61.512906,-71.089045],[-61.375809,-72.010074],[-61.081977,-72.382351],[-61.003661,-72.774265],[-60.690269,-73.166179],[-60.827367,-73.695242],[-61.375809,-74.106742],[-61.96337,-74.439848],[-63.295201,-74.576997],[-63.74569,-74.92974],[-64.352836,-75.262847],[-65.860987,-75.635124],[-67.192818,-75.79191],[-68.446282,-76.007452],[-69.797724,-76.222995],[-70.600724,-76.634494],[-72.206776,-76.673665],[-73.969536,-76.634494],[-75.555977,-76.712887],[-77.24037,-76.712887],[-76.926979,-77.104802],[-75.399294,-77.28107],[-74.282876,-77.55542],[-73.656119,-77.908112],[-74.772536,-78.221633],[-76.4961,-78.123654],[-77.925858,-78.378419],[-77.984666,-78.789918],[-78.023785,-79.181833],[-76.848637,-79.514939],[-76.633224,-79.887216],[-75.360097,-80.259545],[-73.244852,-80.416331],[-71.442946,-80.69063],[-70.013163,-81.004151],[-68.191646,-81.317672],[-65.704279,-81.474458],[-63.25603,-81.748757],[-61.552026,-82.042692],[-59.691416,-82.37585],[-58.712121,-82.846106],[-58.222487,-83.218434],[-57.008117,-82.865691],[-55.362894,-82.571755],[-53.619771,-82.258235],[-51.543644,-82.003521],[-49.76135,-81.729171],[-47.273931,-81.709586],[-44.825708,-81.846735],[-42.808363,-82.081915],[-42.16202,-81.65083],[-40.771433,-81.356894],[-38.244818,-81.337309],[-36.26667,-81.121715],[-34.386397,-80.906172],[-32.310296,-80.769023],[-30.097098,-80.592651],[-28.549802,-80.337938],[-29.254901,-79.985195],[-29.685805,-79.632503],[-29.685805,-79.260226],[-31.624808,-79.299397],[-33.681324,-79.456132],[-35.639912,-79.456132],[-35.914107,-79.083855],[-35.77701,-78.339248],[-35.326546,-78.123654],[-33.896763,-77.888526],[-32.212369,-77.65345],[-30.998051,-77.359515],[-29.783732,-77.065579],[-28.882779,-76.673665],[-27.511752,-76.497345],[-26.160336,-76.360144],[-25.474822,-76.281803],[-23.927552,-76.24258],[-22.458598,-76.105431],[-21.224694,-75.909474],[-20.010375,-75.674346],[-18.913543,-75.439218],[-17.522982,-75.125698],[-16.641589,-74.79254],[-15.701491,-74.498604],[-15.40771,-74.106742],[-16.46532,-73.871614],[-16.112784,-73.460114],[-15.446855,-73.146542],[-14.408805,-72.950585],[-13.311973,-72.715457],[-12.293508,-72.401936],[-11.510067,-72.010074],[-11.020433,-71.539767],[-10.295774,-71.265416],[-9.101015,-71.324224],[-8.611381,-71.65733],[-7.416622,-71.696501],[-7.377451,-71.324224],[-6.868232,-70.93231],[-5.790985,-71.030289],[-5.536375,-71.402617],[-4.341667,-71.461373],[-3.048981,-71.285053],[-1.795492,-71.167438],[-0.659489,-71.226246],[-0.228637,-71.637745],[0.868195,-71.304639],[1.886686,-71.128267],[3.022638,-70.991118],[4.139055,-70.853917],[5.157546,-70.618789],[6.273912,-70.462055],[7.13572,-70.246512],[7.742866,-69.893769],[8.48711,-70.148534],[9.525135,-70.011333],[10.249845,-70.48164],[10.817821,-70.834332],[11.953824,-70.638375],[12.404287,-70.246512],[13.422778,-69.972162],[14.734998,-70.030918],[15.126757,-70.403247],[15.949342,-70.030918],[17.026589,-69.913354],[18.201711,-69.874183],[19.259373,-69.893769],[20.375739,-70.011333],[21.452985,-70.07014],[21.923034,-70.403247],[22.569403,-70.697182],[23.666184,-70.520811],[24.841357,-70.48164],[25.977309,-70.48164],[27.093726,-70.462055],[28.09258,-70.324854],[29.150242,-70.20729],[30.031583,-69.93294],[30.971733,-69.75662],[31.990172,-69.658641],[32.754053,-69.384291],[33.302443,-68.835642],[33.870419,-68.502588],[34.908495,-68.659271],[35.300202,-69.012014],[36.16201,-69.247142],[37.200035,-69.168748],[37.905108,-69.52144],[38.649404,-69.776205],[39.667894,-69.541077],[40.020431,-69.109941],[40.921358,-68.933621],[41.959434,-68.600514],[42.938702,-68.463313],[44.113876,-68.267408],[44.897291,-68.051866],[45.719928,-67.816738],[46.503343,-67.601196],[47.44344,-67.718759],[48.344419,-67.366068],[48.990736,-67.091718],[49.930885,-67.111303],[50.753471,-66.876175],[50.949325,-66.523484],[51.791547,-66.249133],[52.614133,-66.053176],[53.613038,-65.89639],[54.53355,-65.818049],[55.414943,-65.876805],[56.355041,-65.974783],[57.158093,-66.249133],[57.255968,-66.680218],[58.137361,-67.013324],[58.744508,-67.287675],[59.939318,-67.405239],[60.605221,-67.679589],[61.427806,-67.953887],[62.387489,-68.012695],[63.19049,-67.816738],[64.052349,-67.405239],[64.992447,-67.620729],[65.971715,-67.738345],[66.911864,-67.855909],[67.891133,-67.934302],[68.890038,-67.934302],[69.712624,-68.972791],[69.673453,-69.227556],[69.555941,-69.678226],[68.596258,-69.93294],[67.81274,-70.305268],[67.949889,-70.697182],[69.066307,-70.677545],[68.929157,-71.069459],[68.419989,-71.441788],[67.949889,-71.853287],[68.71377,-72.166808],[69.869307,-72.264787],[71.024895,-72.088415],[71.573285,-71.696501],[71.906288,-71.324224],[72.454627,-71.010703],[73.08141,-70.716768],[73.33602,-70.364024],[73.864877,-69.874183],[74.491557,-69.776205],[75.62756,-69.737034],[76.626465,-69.619419],[77.644904,-69.462684],[78.134539,-69.07077],[78.428371,-68.698441],[79.113859,-68.326216],[80.093127,-68.071503],[80.93535,-67.875546],[81.483792,-67.542388],[82.051767,-67.366068],[82.776426,-67.209282],[83.775331,-67.30726],[84.676206,-67.209282],[85.655527,-67.091718],[86.752359,-67.150474],[87.477017,-66.876175],[87.986289,-66.209911],[88.358411,-66.484261],[88.828408,-66.954568],[89.67063,-67.150474],[90.630365,-67.228867],[91.5901,-67.111303],[92.608539,-67.189696],[93.548637,-67.209282],[94.17542,-67.111303],[95.017591,-67.170111],[95.781472,-67.385653],[96.682399,-67.248504],[97.759646,-67.248504],[98.68021,-67.111303],[99.718182,-67.248504],[100.384188,-66.915346],[100.893356,-66.58224],[101.578896,-66.30789],[102.832411,-65.563284],[103.478676,-65.700485],[104.242557,-65.974783],[104.90846,-66.327527],[106.181561,-66.934931],[107.160881,-66.954568],[108.081393,-66.954568],[109.15864,-66.837004],[110.235835,-66.699804],[111.058472,-66.425505],[111.74396,-66.13157],[112.860378,-66.092347],[113.604673,-65.876805],[114.388088,-66.072762],[114.897308,-66.386283],[115.602381,-66.699804],[116.699161,-66.660633],[117.384701,-66.915346],[118.57946,-67.170111],[119.832924,-67.268089],[120.871,-67.189696],[121.654415,-66.876175],[122.320369,-66.562654],[123.221296,-66.484261],[124.122274,-66.621462],[125.160247,-66.719389],[126.100396,-66.562654],[127.001427,-66.562654],[127.882768,-66.660633],[128.80328,-66.758611],[129.704259,-66.58224],[130.781454,-66.425505],[131.799945,-66.386283],[132.935896,-66.386283],[133.85646,-66.288304],[134.757387,-66.209963],[135.031582,-65.72007],[135.070753,-65.308571],[135.697485,-65.582869],[135.873805,-66.033591],[136.206705,-66.44509],[136.618049,-66.778197],[137.460271,-66.954568],[138.596223,-66.895761],[139.908442,-66.876175],[140.809421,-66.817367],[142.121692,-66.817367],[143.061842,-66.797782],[144.374061,-66.837004],[145.490427,-66.915346],[146.195552,-67.228867],[145.999699,-67.601196],[146.646067,-67.895131],[147.723263,-68.130259],[148.839629,-68.385024],[150.132314,-68.561292],[151.483705,-68.71813],[152.502247,-68.874813],[153.638199,-68.894502],[154.284567,-68.561292],[155.165857,-68.835642],[155.92979,-69.149215],[156.811132,-69.384291],[158.025528,-69.482269],[159.181013,-69.599833],[159.670699,-69.991747],[160.80665,-70.226875],[161.570479,-70.579618],[162.686897,-70.736353],[163.842434,-70.716768],[164.919681,-70.775524],[166.11444,-70.755938],[167.309095,-70.834332],[168.425616,-70.971481],[169.463589,-71.20666],[170.501665,-71.402617],[171.20679,-71.696501],[171.089227,-72.088415],[170.560422,-72.441159],[170.109958,-72.891829],[169.75737,-73.24452],[169.287321,-73.65602],[167.975101,-73.812806],[167.387489,-74.165498],[166.094803,-74.38104],[165.644391,-74.772954],[164.958851,-75.145283],[164.234193,-75.458804],[163.822797,-75.870303],[163.568239,-76.24258],[163.47026,-76.693302],[163.489897,-77.065579],[164.057873,-77.457442],[164.273363,-77.82977],[164.743464,-78.182514],[166.604126,-78.319611],[166.995781,-78.750748],[165.193876,-78.907483],[163.666217,-79.123025],[161.766385,-79.162248],[160.924162,-79.730482],[160.747894,-80.200737],[160.316964,-80.573066],[159.788211,-80.945395],[161.120016,-81.278501],[161.629287,-81.690001],[162.490992,-82.062278],[163.705336,-82.395435],[165.095949,-82.708956],[166.604126,-83.022477],[168.895665,-83.335998],[169.404782,-83.825891],[172.283934,-84.041433],[172.477049,-84.117914],[173.224083,-84.41371],[175.985672,-84.158997],[178.277212,-84.472518],[180,-84.71338],[-179.942499,-84.721443],[-179.058677,-84.139412],[-177.256772,-84.452933],[-177.140807,-84.417941],[-176.084673,-84.099259],[-175.947235,-84.110449],[-175.829882,-84.117914],[-174.382503,-84.534323],[-173.116559,-84.117914],[-172.889106,-84.061019],[-169.951223,-83.884647],[-168.999989,-84.117914],[-168.530199,-84.23739],[-167.022099,-84.570497],[-164.182144,-84.82521],[-161.929775,-85.138731],[-158.07138,-85.37391],[-155.192253,-85.09956],[-150.942099,-85.295517],[-148.533073,-85.609038],[-145.888918,-85.315102],[-143.107718,-85.040752],[-142.892279,-84.570497],[-146.829068,-84.531274],[-150.060732,-84.296146],[-150.902928,-83.904232],[-153.586201,-83.68869],[-153.409907,-83.23802],[-153.037759,-82.82652],[-152.665637,-82.454192],[-152.861517,-82.042692],[-154.526299,-81.768394],[-155.29018,-81.41565],[-156.83745,-81.102129],[-154.408787,-81.160937],[-152.097662,-81.004151],[-150.648293,-81.337309],[-148.865998,-81.043373],[-147.22075,-80.671045],[-146.417749,-80.337938],[-146.770286,-79.926439],[-148.062947,-79.652089],[-149.531901,-79.358205],[-151.588416,-79.299397],[-153.390322,-79.162248],[-155.329376,-79.064269],[-155.975668,-78.69194],[-157.268302,-78.378419],[-158.051768,-78.025676],[-158.365134,-76.889207],[-157.875474,-76.987238],[-156.974573,-77.300759],[-155.329376,-77.202728],[-153.742832,-77.065579],[-152.920247,-77.496664],[-151.33378,-77.398737],[-150.00195,-77.183143],[-148.748486,-76.908845],[-147.612483,-76.575738],[-146.104409,-76.47776],[-146.143528,-76.105431],[-146.496091,-75.733154],[-146.20231,-75.380411],[-144.909624,-75.204039],[-144.322037,-75.537197],[-142.794353,-75.34124],[-141.638764,-75.086475],[-140.209007,-75.06689],[-138.85759,-74.968911],[-137.5062,-74.733783],[-136.428901,-74.518241],[-135.214583,-74.302699],[-134.431194,-74.361455],[-133.745654,-74.439848],[-132.257168,-74.302699],[-130.925311,-74.479019],[-129.554284,-74.459433],[-128.242038,-74.322284],[-126.890622,-74.420263],[-125.402082,-74.518241],[-124.011496,-74.479019],[-122.562152,-74.498604],[-121.073613,-74.518241],[-119.70256,-74.479019],[-118.684145,-74.185083],[-117.469801,-74.028348],[-116.216312,-74.243891],[-115.021552,-74.067519],[-113.944331,-73.714828],[-113.297988,-74.028348],[-112.945452,-74.38104],[-112.299083,-74.714198],[-111.261059,-74.420263],[-110.066325,-74.79254],[-108.714909,-74.910103],[-107.559346,-75.184454],[-106.149148,-75.125698],[-104.876074,-74.949326],[-103.367949,-74.988497],[-102.016507,-75.125698],[-100.645531,-75.302018],[-100.1167,-74.870933],[-100.763043,-74.537826],[-101.252703,-74.185083],[-102.545337,-74.106742],[-103.113313,-73.734413],[-103.328752,-73.362084],[-103.681289,-72.61753],[-102.917485,-72.754679],[-101.60524,-72.813436],[-100.312528,-72.754679],[-99.13738,-72.911414],[-98.118889,-73.20535],[-97.688037,-73.558041],[-96.336595,-73.616849],[-95.043961,-73.4797],[-93.672907,-73.283743],[-92.439003,-73.166179],[-91.420564,-73.401307],[-90.088733,-73.322914],[-89.226951,-72.558722],[-88.423951,-73.009393],[-87.268337,-73.185764],[-86.014822,-73.087786],[-85.192236,-73.4797],[-83.879991,-73.518871],[-82.665646,-73.636434],[-81.470913,-73.851977],[-80.687447,-73.4797],[-80.295791,-73.126956],[-79.296886,-73.518871],[-77.925858,-73.420892],[-76.907367,-73.636434],[-76.221879,-73.969541],[-74.890049,-73.871614],[-73.852024,-73.65602],[-72.833533,-73.401307],[-71.619215,-73.264157],[-70.209042,-73.146542],[-68.935916,-73.009393],[-67.956622,-72.79385],[-67.369061,-72.480329],[-67.134036,-72.049244],[-67.251548,-71.637745],[-67.56494,-71.245831],[-67.917477,-70.853917],[-68.230843,-70.462055],[-68.485452,-70.109311],[-68.544209,-69.717397],[-68.446282,-69.325535],[-67.976233,-68.953206],[-67.5845,-68.541707],[-67.427843,-68.149844],[-67.62367,-67.718759],[-67.741183,-67.326845],[-67.251548,-66.876175],[-66.703184,-66.58224],[-66.056815,-66.209963],[-65.371327,-65.89639],[-64.568276,-65.602506],[-64.176542,-65.171423],[-63.628152,-64.897073],[-63.001394,-64.642308],[-62.041686,-64.583552],[-61.414928,-64.270031],[-60.709855,-64.074074],[-59.887269,-63.95651],[-59.162585,-63.701745],[-58.594557,-63.388224],[-57.811143,-63.27066],[-57.223582,-63.525425],[-57.59573,-63.858532],[-58.614143,-64.152467]]]]}}, -{"type":"Feature","id":"ATF","properties":{"name":"French Southern and Antarctic Lands"},"geometry":{"type":"Polygon","coordinates":[[[68.935,-48.625],[69.58,-48.94],[70.525,-49.065],[70.56,-49.255],[70.28,-49.71],[68.745,-49.775],[68.72,-49.2425],[68.8675,-48.83],[68.935,-48.625]]]}}, -{"type":"Feature","id":"AUS","properties":{"name":"Australia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[145.397978,-40.792549],[146.364121,-41.137695],[146.908584,-41.000546],[147.689259,-40.808258],[148.289068,-40.875438],[148.359865,-42.062445],[148.017301,-42.407024],[147.914052,-43.211522],[147.564564,-42.937689],[146.870343,-43.634597],[146.663327,-43.580854],[146.048378,-43.549745],[145.43193,-42.693776],[145.29509,-42.03361],[144.718071,-41.162552],[144.743755,-40.703975],[145.397978,-40.792549]]],[[[143.561811,-13.763656],[143.922099,-14.548311],[144.563714,-14.171176],[144.894908,-14.594458],[145.374724,-14.984976],[145.271991,-15.428205],[145.48526,-16.285672],[145.637033,-16.784918],[145.888904,-16.906926],[146.160309,-17.761655],[146.063674,-18.280073],[146.387478,-18.958274],[147.471082,-19.480723],[148.177602,-19.955939],[148.848414,-20.39121],[148.717465,-20.633469],[149.28942,-21.260511],[149.678337,-22.342512],[150.077382,-22.122784],[150.482939,-22.556142],[150.727265,-22.402405],[150.899554,-23.462237],[151.609175,-24.076256],[152.07354,-24.457887],[152.855197,-25.267501],[153.136162,-26.071173],[153.161949,-26.641319],[153.092909,-27.2603],[153.569469,-28.110067],[153.512108,-28.995077],[153.339095,-29.458202],[153.069241,-30.35024],[153.089602,-30.923642],[152.891578,-31.640446],[152.450002,-32.550003],[151.709117,-33.041342],[151.343972,-33.816023],[151.010555,-34.31036],[150.714139,-35.17346],[150.32822,-35.671879],[150.075212,-36.420206],[149.946124,-37.109052],[149.997284,-37.425261],[149.423882,-37.772681],[148.304622,-37.809061],[147.381733,-38.219217],[146.922123,-38.606532],[146.317922,-39.035757],[145.489652,-38.593768],[144.876976,-38.417448],[145.032212,-37.896188],[144.485682,-38.085324],[143.609974,-38.809465],[142.745427,-38.538268],[142.17833,-38.380034],[141.606582,-38.308514],[140.638579,-38.019333],[139.992158,-37.402936],[139.806588,-36.643603],[139.574148,-36.138362],[139.082808,-35.732754],[138.120748,-35.612296],[138.449462,-35.127261],[138.207564,-34.384723],[137.71917,-35.076825],[136.829406,-35.260535],[137.352371,-34.707339],[137.503886,-34.130268],[137.890116,-33.640479],[137.810328,-32.900007],[136.996837,-33.752771],[136.372069,-34.094766],[135.989043,-34.890118],[135.208213,-34.47867],[135.239218,-33.947953],[134.613417,-33.222778],[134.085904,-32.848072],[134.273903,-32.617234],[132.990777,-32.011224],[132.288081,-31.982647],[131.326331,-31.495803],[129.535794,-31.590423],[128.240938,-31.948489],[127.102867,-32.282267],[126.148714,-32.215966],[125.088623,-32.728751],[124.221648,-32.959487],[124.028947,-33.483847],[123.659667,-33.890179],[122.811036,-33.914467],[122.183064,-34.003402],[121.299191,-33.821036],[120.580268,-33.930177],[119.893695,-33.976065],[119.298899,-34.509366],[119.007341,-34.464149],[118.505718,-34.746819],[118.024972,-35.064733],[117.295507,-35.025459],[116.625109,-35.025097],[115.564347,-34.386428],[115.026809,-34.196517],[115.048616,-33.623425],[115.545123,-33.487258],[115.714674,-33.259572],[115.679379,-32.900369],[115.801645,-32.205062],[115.689611,-31.612437],[115.160909,-30.601594],[114.997043,-30.030725],[115.040038,-29.461095],[114.641974,-28.810231],[114.616498,-28.516399],[114.173579,-28.118077],[114.048884,-27.334765],[113.477498,-26.543134],[113.338953,-26.116545],[113.778358,-26.549025],[113.440962,-25.621278],[113.936901,-25.911235],[114.232852,-26.298446],[114.216161,-25.786281],[113.721255,-24.998939],[113.625344,-24.683971],[113.393523,-24.384764],[113.502044,-23.80635],[113.706993,-23.560215],[113.843418,-23.059987],[113.736552,-22.475475],[114.149756,-21.755881],[114.225307,-22.517488],[114.647762,-21.82952],[115.460167,-21.495173],[115.947373,-21.068688],[116.711615,-20.701682],[117.166316,-20.623599],[117.441545,-20.746899],[118.229559,-20.374208],[118.836085,-20.263311],[118.987807,-20.044203],[119.252494,-19.952942],[119.805225,-19.976506],[120.85622,-19.683708],[121.399856,-19.239756],[121.655138,-18.705318],[122.241665,-18.197649],[122.286624,-17.798603],[122.312772,-17.254967],[123.012574,-16.4052],[123.433789,-17.268558],[123.859345,-17.069035],[123.503242,-16.596506],[123.817073,-16.111316],[124.258287,-16.327944],[124.379726,-15.56706],[124.926153,-15.0751],[125.167275,-14.680396],[125.670087,-14.51007],[125.685796,-14.230656],[126.125149,-14.347341],[126.142823,-14.095987],[126.582589,-13.952791],[127.065867,-13.817968],[127.804633,-14.276906],[128.35969,-14.86917],[128.985543,-14.875991],[129.621473,-14.969784],[129.4096,-14.42067],[129.888641,-13.618703],[130.339466,-13.357376],[130.183506,-13.10752],[130.617795,-12.536392],[131.223495,-12.183649],[131.735091,-12.302453],[132.575298,-12.114041],[132.557212,-11.603012],[131.824698,-11.273782],[132.357224,-11.128519],[133.019561,-11.376411],[133.550846,-11.786515],[134.393068,-12.042365],[134.678632,-11.941183],[135.298491,-12.248606],[135.882693,-11.962267],[136.258381,-12.049342],[136.492475,-11.857209],[136.95162,-12.351959],[136.685125,-12.887223],[136.305407,-13.29123],[135.961758,-13.324509],[136.077617,-13.724278],[135.783836,-14.223989],[135.428664,-14.715432],[135.500184,-14.997741],[136.295175,-15.550265],[137.06536,-15.870762],[137.580471,-16.215082],[138.303217,-16.807604],[138.585164,-16.806622],[139.108543,-17.062679],[139.260575,-17.371601],[140.215245,-17.710805],[140.875463,-17.369069],[141.07111,-16.832047],[141.274095,-16.38887],[141.398222,-15.840532],[141.702183,-15.044921],[141.56338,-14.561333],[141.63552,-14.270395],[141.519869,-13.698078],[141.65092,-12.944688],[141.842691,-12.741548],[141.68699,-12.407614],[141.928629,-11.877466],[142.118488,-11.328042],[142.143706,-11.042737],[142.51526,-10.668186],[142.79731,-11.157355],[142.866763,-11.784707],[143.115947,-11.90563],[143.158632,-12.325656],[143.522124,-12.834358],[143.597158,-13.400422],[143.561811,-13.763656]]]]}}, -{"type":"Feature","id":"AUT","properties":{"name":"Austria"},"geometry":{"type":"Polygon","coordinates":[[[16.979667,48.123497],[16.903754,47.714866],[16.340584,47.712902],[16.534268,47.496171],[16.202298,46.852386],[16.011664,46.683611],[15.137092,46.658703],[14.632472,46.431817],[13.806475,46.509306],[12.376485,46.767559],[12.153088,47.115393],[11.164828,46.941579],[11.048556,46.751359],[10.442701,46.893546],[9.932448,46.920728],[9.47997,47.10281],[9.632932,47.347601],[9.594226,47.525058],[9.896068,47.580197],[10.402084,47.302488],[10.544504,47.566399],[11.426414,47.523766],[12.141357,47.703083],[12.62076,47.672388],[12.932627,47.467646],[13.025851,47.637584],[12.884103,48.289146],[13.243357,48.416115],[13.595946,48.877172],[14.338898,48.555305],[14.901447,48.964402],[15.253416,49.039074],[16.029647,48.733899],[16.499283,48.785808],[16.960288,48.596982],[16.879983,48.470013],[16.979667,48.123497]]]}}, -{"type":"Feature","id":"AZE","properties":{"name":"Azerbaijan"},"geometry":{"type":"MultiPolygon","coordinates":[[[[45.001987,39.740004],[45.298145,39.471751],[45.739978,39.473999],[45.735379,39.319719],[46.143623,38.741201],[45.457722,38.874139],[44.952688,39.335765],[44.79399,39.713003],[45.001987,39.740004]]],[[[47.373315,41.219732],[47.815666,41.151416],[47.987283,41.405819],[48.584353,41.80887],[49.110264,41.282287],[49.618915,40.572924],[50.08483,40.526157],[50.392821,40.256561],[49.569202,40.176101],[49.395259,39.399482],[49.223228,39.049219],[48.856532,38.815486],[48.883249,38.320245],[48.634375,38.270378],[48.010744,38.794015],[48.355529,39.288765],[48.060095,39.582235],[47.685079,39.508364],[46.50572,38.770605],[46.483499,39.464155],[46.034534,39.628021],[45.610012,39.899994],[45.891907,40.218476],[45.359175,40.561504],[45.560351,40.81229],[45.179496,40.985354],[44.97248,41.248129],[45.217426,41.411452],[45.962601,41.123873],[46.501637,41.064445],[46.637908,41.181673],[46.145432,41.722802],[46.404951,41.860675],[46.686071,41.827137],[47.373315,41.219732]]]]}}, -{"type":"Feature","id":"BDI","properties":{"name":"Burundi"},"geometry":{"type":"Polygon","coordinates":[[[29.339998,-4.499983],[29.276384,-3.293907],[29.024926,-2.839258],[29.632176,-2.917858],[29.938359,-2.348487],[30.469696,-2.413858],[30.527677,-2.807632],[30.743013,-3.034285],[30.752263,-3.35933],[30.50556,-3.568567],[30.116333,-4.090138],[29.753512,-4.452389],[29.339998,-4.499983]]]}}, -{"type":"Feature","id":"BEL","properties":{"name":"Belgium"},"geometry":{"type":"Polygon","coordinates":[[[3.314971,51.345781],[4.047071,51.267259],[4.973991,51.475024],[5.606976,51.037298],[6.156658,50.803721],[6.043073,50.128052],[5.782417,50.090328],[5.674052,49.529484],[4.799222,49.985373],[4.286023,49.907497],[3.588184,50.378992],[3.123252,50.780363],[2.658422,50.796848],[2.513573,51.148506],[3.314971,51.345781]]]}}, -{"type":"Feature","id":"BEN","properties":{"name":"Benin"},"geometry":{"type":"Polygon","coordinates":[[[2.691702,6.258817],[1.865241,6.142158],[1.618951,6.832038],[1.664478,9.12859],[1.463043,9.334624],[1.425061,9.825395],[1.077795,10.175607],[0.772336,10.470808],[0.899563,10.997339],[1.24347,11.110511],[1.447178,11.547719],[1.935986,11.64115],[2.154474,11.94015],[2.490164,12.233052],[2.848643,12.235636],[3.61118,11.660167],[3.572216,11.327939],[3.797112,10.734746],[3.60007,10.332186],[3.705438,10.06321],[3.220352,9.444153],[2.912308,9.137608],[2.723793,8.506845],[2.749063,7.870734],[2.691702,6.258817]]]}}, -{"type":"Feature","id":"BFA","properties":{"name":"Burkina Faso"},"geometry":{"type":"Polygon","coordinates":[[[-2.827496,9.642461],[-3.511899,9.900326],[-3.980449,9.862344],[-4.330247,9.610835],[-4.779884,9.821985],[-4.954653,10.152714],[-5.404342,10.370737],[-5.470565,10.95127],[-5.197843,11.375146],[-5.220942,11.713859],[-4.427166,12.542646],[-4.280405,13.228444],[-4.006391,13.472485],[-3.522803,13.337662],[-3.103707,13.541267],[-2.967694,13.79815],[-2.191825,14.246418],[-2.001035,14.559008],[-1.066363,14.973815],[-0.515854,15.116158],[-0.266257,14.924309],[0.374892,14.928908],[0.295646,14.444235],[0.429928,13.988733],[0.993046,13.33575],[1.024103,12.851826],[2.177108,12.625018],[2.154474,11.94015],[1.935986,11.64115],[1.447178,11.547719],[1.24347,11.110511],[0.899563,10.997339],[0.023803,11.018682],[-0.438702,11.098341],[-0.761576,10.93693],[-1.203358,11.009819],[-2.940409,10.96269],[-2.963896,10.395335],[-2.827496,9.642461]]]}}, -{"type":"Feature","id":"BGD","properties":{"name":"Bangladesh"},"geometry":{"type":"Polygon","coordinates":[[[92.672721,22.041239],[92.652257,21.324048],[92.303234,21.475485],[92.368554,20.670883],[92.082886,21.192195],[92.025215,21.70157],[91.834891,22.182936],[91.417087,22.765019],[90.496006,22.805017],[90.586957,22.392794],[90.272971,21.836368],[89.847467,22.039146],[89.70205,21.857116],[89.418863,21.966179],[89.031961,22.055708],[88.876312,22.879146],[88.52977,23.631142],[88.69994,24.233715],[88.084422,24.501657],[88.306373,24.866079],[88.931554,25.238692],[88.209789,25.768066],[88.563049,26.446526],[89.355094,26.014407],[89.832481,25.965082],[89.920693,25.26975],[90.872211,25.132601],[91.799596,25.147432],[92.376202,24.976693],[91.915093,24.130414],[91.46773,24.072639],[91.158963,23.503527],[91.706475,22.985264],[91.869928,23.624346],[92.146035,23.627499],[92.672721,22.041239]]]}}, -{"type":"Feature","id":"BGR","properties":{"name":"Bulgaria"},"geometry":{"type":"Polygon","coordinates":[[[22.65715,44.234923],[22.944832,43.823785],[23.332302,43.897011],[24.100679,43.741051],[25.569272,43.688445],[26.065159,43.943494],[27.2424,44.175986],[27.970107,43.812468],[28.558081,43.707462],[28.039095,43.293172],[27.673898,42.577892],[27.99672,42.007359],[27.135739,42.141485],[26.117042,41.826905],[26.106138,41.328899],[25.197201,41.234486],[24.492645,41.583896],[23.692074,41.309081],[22.952377,41.337994],[22.881374,41.999297],[22.380526,42.32026],[22.545012,42.461362],[22.436595,42.580321],[22.604801,42.898519],[22.986019,43.211161],[22.500157,43.642814],[22.410446,44.008063],[22.65715,44.234923]]]}}, -{"type":"Feature","id":"BHS","properties":{"name":"The Bahamas"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-77.53466,23.75975],[-77.78,23.71],[-78.03405,24.28615],[-78.40848,24.57564],[-78.19087,25.2103],[-77.89,25.17],[-77.54,24.34],[-77.53466,23.75975]]],[[[-77.82,26.58],[-78.91,26.42],[-78.98,26.79],[-78.51,26.87],[-77.85,26.84],[-77.82,26.58]]],[[[-77,26.59],[-77.17255,25.87918],[-77.35641,26.00735],[-77.34,26.53],[-77.78802,26.92516],[-77.79,27.04],[-77,26.59]]]]}}, -{"type":"Feature","id":"BIH","properties":{"name":"Bosnia and Herzegovina"},"geometry":{"type":"Polygon","coordinates":[[[19.005486,44.860234],[19.36803,44.863],[19.11761,44.42307],[19.59976,44.03847],[19.454,43.5681],[19.21852,43.52384],[19.03165,43.43253],[18.70648,43.20011],[18.56,42.65],[17.674922,43.028563],[17.297373,43.446341],[16.916156,43.667722],[16.456443,44.04124],[16.23966,44.351143],[15.750026,44.818712],[15.959367,45.233777],[16.318157,45.004127],[16.534939,45.211608],[17.002146,45.233777],[17.861783,45.06774],[18.553214,45.08159],[19.005486,44.860234]]]}}, -{"type":"Feature","id":"BLR","properties":{"name":"Belarus"},"geometry":{"type":"Polygon","coordinates":[[[23.484128,53.912498],[24.450684,53.905702],[25.536354,54.282423],[25.768433,54.846963],[26.588279,55.167176],[26.494331,55.615107],[27.10246,55.783314],[28.176709,56.16913],[29.229513,55.918344],[29.371572,55.670091],[29.896294,55.789463],[30.873909,55.550976],[30.971836,55.081548],[30.757534,54.811771],[31.384472,54.157056],[31.791424,53.974639],[31.731273,53.794029],[32.405599,53.618045],[32.693643,53.351421],[32.304519,53.132726],[31.497644,53.167427],[31.305201,53.073996],[31.540018,52.742052],[31.785998,52.101678],[30.927549,52.042353],[30.619454,51.822806],[30.555117,51.319503],[30.157364,51.416138],[29.254938,51.368234],[28.992835,51.602044],[28.617613,51.427714],[28.241615,51.572227],[27.454066,51.592303],[26.337959,51.832289],[25.327788,51.910656],[24.553106,51.888461],[24.005078,51.617444],[23.527071,51.578454],[23.508002,52.023647],[23.199494,52.486977],[23.799199,52.691099],[23.804935,53.089731],[23.527536,53.470122],[23.484128,53.912498]]]}}, -{"type":"Feature","id":"BLZ","properties":{"name":"Belize"},"geometry":{"type":"Polygon","coordinates":[[[-89.14308,17.808319],[-89.150909,17.955468],[-89.029857,18.001511],[-88.848344,17.883198],[-88.490123,18.486831],[-88.300031,18.499982],[-88.296336,18.353273],[-88.106813,18.348674],[-88.123479,18.076675],[-88.285355,17.644143],[-88.197867,17.489475],[-88.302641,17.131694],[-88.239518,17.036066],[-88.355428,16.530774],[-88.551825,16.265467],[-88.732434,16.233635],[-88.930613,15.887273],[-89.229122,15.886938],[-89.150806,17.015577],[-89.14308,17.808319]]]}}, -{"type":"Feature","id":"BMU","properties":{"name":"Bermuda"},"geometry":{"type":"Polygon","coordinates":[[[-64.7799734332998,32.3072000581802],[-64.7873319183061,32.3039237143428],[-64.7946942710173,32.3032682700388],[-64.8094297981283,32.3098175728414],[-64.8167896352437,32.3058845718466],[-64.8101968029642,32.3022833180511],[-64.7962291465484,32.2934409732427],[-64.7815086336978,32.2868973114514],[-64.7997025513437,32.2796896417328],[-64.8066707691087,32.2747767569465],[-64.8225587873683,32.2669111289395],[-64.8287548840306,32.2669075473817],[-64.8306732143498,32.2583944840235],[-64.8399924854972,32.254782282336],[-64.8566090462354,32.2547740387514],[-64.8682296789446,32.2616393614322],[-64.8628241459563,32.2724481933959],[-64.8748651338951,32.2757120264753],[-64.8717752856644,32.2819371582026],[-64.8671422127295,32.2930760547989],[-64.8559068764437,32.2960321186471],[-64.8597429072279,32.3015842021933],[-64.8439233486717,32.3140553852543],[-64.8350242329311,32.3242161760006],[-64.8338690593672,32.3294587561557],[-64.8520298651164,32.3110911879954],[-64.8635922932573,32.3048469433363],[-64.8686668994079,32.30910745083],[-64.8721354593415,32.3041908606301],[-64.8779667328485,32.3038632800462],[-64.8780046844321,32.2907757831692],[-64.8849776658292,32.2819261366004],[-64.8783230004629,32.2613001418681],[-64.863194968877,32.2465799485801],[-64.8519819555722,32.2485519134663],[-64.842311980074,32.2492123317296],[-64.8388242605209,32.2475773472534],[-64.8334002575532,32.2462714714698],[-64.8256389530584,32.2472637398594],[-64.8205697556026,32.2531698880328],[-64.8105087275579,32.2561208974156],[-64.7900177727338,32.2659446936992],[-64.7745415970416,32.2718413023427],[-64.7644742436426,32.2855931353214],[-64.7551803442276,32.2908326702531],[-64.7423982971436,32.2996734994024],[-64.7206991797682,32.3137542201258],[-64.7117851247134,32.3176823360806],[-64.6962778813133,32.3275029115532],[-64.6768921127452,32.3324095397555],[-64.6567136927777,32.3451776458469],[-64.6532168823499,32.3494356627941],[-64.6605720384429,32.3589423487763],[-64.65125819471,32.3615600906466],[-64.6462011670816,32.36975169749],[-64.6613227512832,32.3763135008721],[-64.6690666074397,32.388444543924],[-64.6834270548595,32.3854968316788],[-64.6954617672714,32.3763221285869],[-64.70438689565,32.3704254760469],[-64.7117569982798,32.368132600249],[-64.7061764744404,32.3600110593559],[-64.700531552697,32.3590601356818],[-64.6940348033967,32.3640708659835],[-64.6895164826082,32.3633598579866],[-64.6864150099255,32.3547797587266],[-64.6824635995504,32.3540628176846],[-64.6835876652835,32.3626447677968],[-64.6801998697415,32.3631199096979],[-64.6672170444687,32.3597751617473],[-64.6598811264978,32.3497625771755],[-64.6737331235384,32.3390281851635],[-64.6887090648183,32.3342439408053],[-64.706732854446,32.3429010723036],[-64.7149301576112,32.3552188753513],[-64.7185967666669,32.3552239212394],[-64.7214189847314,32.3518830231342],[-64.7270616067222,32.3466461715475],[-64.734962460882,32.3442819830499],[-64.7383521549094,32.3407216514918],[-64.7411729976333,32.3311790864627],[-64.7423019216485,32.323311561213],[-64.7462482354281,32.318538611581],[-64.7566773739613,32.3130509130175],[-64.768738200563,32.3088369816572],[-64.7799734332998,32.3072000581802]]]}}, -{"type":"Feature","id":"BOL","properties":{"name":"Bolivia"},"geometry":{"type":"Polygon","coordinates":[[[-62.846468,-22.034985],[-63.986838,-21.993644],[-64.377021,-22.798091],[-64.964892,-22.075862],[-66.273339,-21.83231],[-67.106674,-22.735925],[-67.82818,-22.872919],[-68.219913,-21.494347],[-68.757167,-20.372658],[-68.442225,-19.405068],[-68.966818,-18.981683],[-69.100247,-18.260125],[-69.590424,-17.580012],[-68.959635,-16.500698],[-69.389764,-15.660129],[-69.160347,-15.323974],[-69.339535,-14.953195],[-68.948887,-14.453639],[-68.929224,-13.602684],[-68.88008,-12.899729],[-68.66508,-12.5613],[-69.529678,-10.951734],[-68.786158,-11.03638],[-68.271254,-11.014521],[-68.048192,-10.712059],[-67.173801,-10.306812],[-66.646908,-9.931331],[-65.338435,-9.761988],[-65.444837,-10.511451],[-65.321899,-10.895872],[-65.402281,-11.56627],[-64.316353,-12.461978],[-63.196499,-12.627033],[-62.80306,-13.000653],[-62.127081,-13.198781],[-61.713204,-13.489202],[-61.084121,-13.479384],[-60.503304,-13.775955],[-60.459198,-14.354007],[-60.264326,-14.645979],[-60.251149,-15.077219],[-60.542966,-15.09391],[-60.15839,-16.258284],[-58.24122,-16.299573],[-58.388058,-16.877109],[-58.280804,-17.27171],[-57.734558,-17.552468],[-57.498371,-18.174188],[-57.676009,-18.96184],[-57.949997,-19.400004],[-57.853802,-19.969995],[-58.166392,-20.176701],[-58.183471,-19.868399],[-59.115042,-19.356906],[-60.043565,-19.342747],[-61.786326,-19.633737],[-62.265961,-20.513735],[-62.291179,-21.051635],[-62.685057,-22.249029],[-62.846468,-22.034985]]]}}, -{"type":"Feature","id":"BRA","properties":{"name":"Brazil"},"geometry":{"type":"Polygon","coordinates":[[[-57.625133,-30.216295],[-56.2909,-28.852761],[-55.162286,-27.881915],[-54.490725,-27.474757],[-53.648735,-26.923473],[-53.628349,-26.124865],[-54.13005,-25.547639],[-54.625291,-25.739255],[-54.428946,-25.162185],[-54.293476,-24.5708],[-54.29296,-24.021014],[-54.652834,-23.839578],[-55.027902,-24.001274],[-55.400747,-23.956935],[-55.517639,-23.571998],[-55.610683,-22.655619],[-55.797958,-22.35693],[-56.473317,-22.0863],[-56.88151,-22.282154],[-57.937156,-22.090176],[-57.870674,-20.732688],[-58.166392,-20.176701],[-57.853802,-19.969995],[-57.949997,-19.400004],[-57.676009,-18.96184],[-57.498371,-18.174188],[-57.734558,-17.552468],[-58.280804,-17.27171],[-58.388058,-16.877109],[-58.24122,-16.299573],[-60.15839,-16.258284],[-60.542966,-15.09391],[-60.251149,-15.077219],[-60.264326,-14.645979],[-60.459198,-14.354007],[-60.503304,-13.775955],[-61.084121,-13.479384],[-61.713204,-13.489202],[-62.127081,-13.198781],[-62.80306,-13.000653],[-63.196499,-12.627033],[-64.316353,-12.461978],[-65.402281,-11.56627],[-65.321899,-10.895872],[-65.444837,-10.511451],[-65.338435,-9.761988],[-66.646908,-9.931331],[-67.173801,-10.306812],[-68.048192,-10.712059],[-68.271254,-11.014521],[-68.786158,-11.03638],[-69.529678,-10.951734],[-70.093752,-11.123972],[-70.548686,-11.009147],[-70.481894,-9.490118],[-71.302412,-10.079436],[-72.184891,-10.053598],[-72.563033,-9.520194],[-73.226713,-9.462213],[-73.015383,-9.032833],[-73.571059,-8.424447],[-73.987235,-7.52383],[-73.723401,-7.340999],[-73.724487,-6.918595],[-73.120027,-6.629931],[-73.219711,-6.089189],[-72.964507,-5.741251],[-72.891928,-5.274561],[-71.748406,-4.593983],[-70.928843,-4.401591],[-70.794769,-4.251265],[-69.893635,-4.298187],[-69.444102,-1.556287],[-69.420486,-1.122619],[-69.577065,-0.549992],[-70.020656,-0.185156],[-70.015566,0.541414],[-69.452396,0.706159],[-69.252434,0.602651],[-69.218638,0.985677],[-69.804597,1.089081],[-69.816973,1.714805],[-67.868565,1.692455],[-67.53781,2.037163],[-67.259998,1.719999],[-67.065048,1.130112],[-66.876326,1.253361],[-66.325765,0.724452],[-65.548267,0.789254],[-65.354713,1.095282],[-64.611012,1.328731],[-64.199306,1.492855],[-64.083085,1.916369],[-63.368788,2.2009],[-63.422867,2.411068],[-64.269999,2.497006],[-64.408828,3.126786],[-64.368494,3.79721],[-64.816064,4.056445],[-64.628659,4.148481],[-63.888343,4.02053],[-63.093198,3.770571],[-62.804533,4.006965],[-62.08543,4.162124],[-60.966893,4.536468],[-60.601179,4.918098],[-60.733574,5.200277],[-60.213683,5.244486],[-59.980959,5.014061],[-60.111002,4.574967],[-59.767406,4.423503],[-59.53804,3.958803],[-59.815413,3.606499],[-59.974525,2.755233],[-59.718546,2.24963],[-59.646044,1.786894],[-59.030862,1.317698],[-58.540013,1.268088],[-58.429477,1.463942],[-58.11345,1.507195],[-57.660971,1.682585],[-57.335823,1.948538],[-56.782704,1.863711],[-56.539386,1.899523],[-55.995698,1.817667],[-55.9056,2.021996],[-56.073342,2.220795],[-55.973322,2.510364],[-55.569755,2.421506],[-55.097587,2.523748],[-54.524754,2.311849],[-54.088063,2.105557],[-53.778521,2.376703],[-53.554839,2.334897],[-53.418465,2.053389],[-52.939657,2.124858],[-52.556425,2.504705],[-52.249338,3.241094],[-51.657797,4.156232],[-51.317146,4.203491],[-51.069771,3.650398],[-50.508875,1.901564],[-49.974076,1.736483],[-49.947101,1.04619],[-50.699251,0.222984],[-50.388211,-0.078445],[-48.620567,-0.235489],[-48.584497,-1.237805],[-47.824956,-0.581618],[-46.566584,-0.941028],[-44.905703,-1.55174],[-44.417619,-2.13775],[-44.581589,-2.691308],[-43.418791,-2.38311],[-41.472657,-2.912018],[-39.978665,-2.873054],[-38.500383,-3.700652],[-37.223252,-4.820946],[-36.452937,-5.109404],[-35.597796,-5.149504],[-35.235389,-5.464937],[-34.89603,-6.738193],[-34.729993,-7.343221],[-35.128212,-8.996401],[-35.636967,-9.649282],[-37.046519,-11.040721],[-37.683612,-12.171195],[-38.423877,-13.038119],[-38.673887,-13.057652],[-38.953276,-13.79337],[-38.882298,-15.667054],[-39.161092,-17.208407],[-39.267339,-17.867746],[-39.583521,-18.262296],[-39.760823,-19.599113],[-40.774741,-20.904512],[-40.944756,-21.937317],[-41.754164,-22.370676],[-41.988284,-22.97007],[-43.074704,-22.967693],[-44.647812,-23.351959],[-45.352136,-23.796842],[-46.472093,-24.088969],[-47.648972,-24.885199],[-48.495458,-25.877025],[-48.641005,-26.623698],[-48.474736,-27.175912],[-48.66152,-28.186135],[-48.888457,-28.674115],[-49.587329,-29.224469],[-50.696874,-30.984465],[-51.576226,-31.777698],[-52.256081,-32.24537],[-52.7121,-33.196578],[-53.373662,-33.768378],[-53.650544,-33.202004],[-53.209589,-32.727666],[-53.787952,-32.047243],[-54.572452,-31.494511],[-55.60151,-30.853879],[-55.973245,-30.883076],[-56.976026,-30.109686],[-57.625133,-30.216295]]]}}, -{"type":"Feature","id":"BRN","properties":{"name":"Brunei"},"geometry":{"type":"Polygon","coordinates":[[[114.204017,4.525874],[114.599961,4.900011],[115.45071,5.44773],[115.4057,4.955228],[115.347461,4.316636],[114.869557,4.348314],[114.659596,4.007637],[114.204017,4.525874]]]}}, -{"type":"Feature","id":"BTN","properties":{"name":"Bhutan"},"geometry":{"type":"Polygon","coordinates":[[[91.696657,27.771742],[92.103712,27.452614],[92.033484,26.83831],[91.217513,26.808648],[90.373275,26.875724],[89.744528,26.719403],[88.835643,27.098966],[88.814248,27.299316],[89.47581,28.042759],[90.015829,28.296439],[90.730514,28.064954],[91.258854,28.040614],[91.696657,27.771742]]]}}, -{"type":"Feature","id":"BWA","properties":{"name":"Botswana"},"geometry":{"type":"Polygon","coordinates":[[[25.649163,-18.536026],[25.850391,-18.714413],[26.164791,-19.293086],[27.296505,-20.39152],[27.724747,-20.499059],[27.727228,-20.851802],[28.02137,-21.485975],[28.794656,-21.639454],[29.432188,-22.091313],[28.017236,-22.827754],[27.11941,-23.574323],[26.786407,-24.240691],[26.485753,-24.616327],[25.941652,-24.696373],[25.765849,-25.174845],[25.664666,-25.486816],[25.025171,-25.71967],[24.211267,-25.670216],[23.73357,-25.390129],[23.312097,-25.26869],[22.824271,-25.500459],[22.579532,-25.979448],[22.105969,-26.280256],[21.605896,-26.726534],[20.889609,-26.828543],[20.66647,-26.477453],[20.758609,-25.868136],[20.165726,-24.917962],[19.895768,-24.76779],[19.895458,-21.849157],[20.881134,-21.814327],[20.910641,-18.252219],[21.65504,-18.219146],[23.196858,-17.869038],[23.579006,-18.281261],[24.217365,-17.889347],[24.520705,-17.887125],[25.084443,-17.661816],[25.264226,-17.73654],[25.649163,-18.536026]]]}}, -{"type":"Feature","id":"CAF","properties":{"name":"Central African Republic"},"geometry":{"type":"Polygon","coordinates":[[[15.27946,7.421925],[16.106232,7.497088],[16.290562,7.754307],[16.456185,7.734774],[16.705988,7.508328],[17.96493,7.890914],[18.389555,8.281304],[18.911022,8.630895],[18.81201,8.982915],[19.094008,9.074847],[20.059685,9.012706],[21.000868,9.475985],[21.723822,10.567056],[22.231129,10.971889],[22.864165,11.142395],[22.977544,10.714463],[23.554304,10.089255],[23.55725,9.681218],[23.394779,9.265068],[23.459013,8.954286],[23.805813,8.666319],[24.567369,8.229188],[25.114932,7.825104],[25.124131,7.500085],[25.796648,6.979316],[26.213418,6.546603],[26.465909,5.946717],[27.213409,5.550953],[27.374226,5.233944],[27.044065,5.127853],[26.402761,5.150875],[25.650455,5.256088],[25.278798,5.170408],[25.128833,4.927245],[24.805029,4.897247],[24.410531,5.108784],[23.297214,4.609693],[22.84148,4.710126],[22.704124,4.633051],[22.405124,4.02916],[21.659123,4.224342],[20.927591,4.322786],[20.290679,4.691678],[19.467784,5.031528],[18.932312,4.709506],[18.542982,4.201785],[18.453065,3.504386],[17.8099,3.560196],[17.133042,3.728197],[16.537058,3.198255],[16.012852,2.26764],[15.907381,2.557389],[15.862732,3.013537],[15.405396,3.335301],[15.03622,3.851367],[14.950953,4.210389],[14.478372,4.732605],[14.558936,5.030598],[14.459407,5.451761],[14.53656,6.226959],[14.776545,6.408498],[15.27946,7.421925]]]}}, -{"type":"Feature","id":"CAN","properties":{"name":"Canada"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-63.6645,46.55001],[-62.9393,46.41587],[-62.01208,46.44314],[-62.50391,46.03339],[-62.87433,45.96818],[-64.1428,46.39265],[-64.39261,46.72747],[-64.01486,47.03601],[-63.6645,46.55001]]],[[[-61.806305,49.10506],[-62.29318,49.08717],[-63.58926,49.40069],[-64.51912,49.87304],[-64.17322,49.95718],[-62.85829,49.70641],[-61.835585,49.28855],[-61.806305,49.10506]]],[[[-123.510002,48.510011],[-124.012891,48.370846],[-125.655013,48.825005],[-125.954994,49.179996],[-126.850004,49.53],[-127.029993,49.814996],[-128.059336,49.994959],[-128.444584,50.539138],[-128.358414,50.770648],[-127.308581,50.552574],[-126.695001,50.400903],[-125.755007,50.295018],[-125.415002,49.950001],[-124.920768,49.475275],[-123.922509,49.062484],[-123.510002,48.510011]]],[[[-56.134036,50.68701],[-56.795882,49.812309],[-56.143105,50.150117],[-55.471492,49.935815],[-55.822401,49.587129],[-54.935143,49.313011],[-54.473775,49.556691],[-53.476549,49.249139],[-53.786014,48.516781],[-53.086134,48.687804],[-52.958648,48.157164],[-52.648099,47.535548],[-53.069158,46.655499],[-53.521456,46.618292],[-54.178936,46.807066],[-53.961869,47.625207],[-54.240482,47.752279],[-55.400773,46.884994],[-55.997481,46.91972],[-55.291219,47.389562],[-56.250799,47.632545],[-57.325229,47.572807],[-59.266015,47.603348],[-59.419494,47.899454],[-58.796586,48.251525],[-59.231625,48.523188],[-58.391805,49.125581],[-57.35869,50.718274],[-56.73865,51.287438],[-55.870977,51.632094],[-55.406974,51.588273],[-55.600218,51.317075],[-56.134036,50.68701]]],[[[-132.710008,54.040009],[-131.74999,54.120004],[-132.04948,52.984621],[-131.179043,52.180433],[-131.57783,52.182371],[-132.180428,52.639707],[-132.549992,53.100015],[-133.054611,53.411469],[-133.239664,53.85108],[-133.180004,54.169975],[-132.710008,54.040009]]],[[[-79.26582,62.158675],[-79.65752,61.63308],[-80.09956,61.7181],[-80.36215,62.01649],[-80.315395,62.085565],[-79.92939,62.3856],[-79.52002,62.36371],[-79.26582,62.158675]]],[[[-81.89825,62.7108],[-83.06857,62.15922],[-83.77462,62.18231],[-83.99367,62.4528],[-83.25048,62.91409],[-81.87699,62.90458],[-81.89825,62.7108]]],[[[-85.161308,65.657285],[-84.975764,65.217518],[-84.464012,65.371772],[-83.882626,65.109618],[-82.787577,64.766693],[-81.642014,64.455136],[-81.55344,63.979609],[-80.817361,64.057486],[-80.103451,63.725981],[-80.99102,63.411246],[-82.547178,63.651722],[-83.108798,64.101876],[-84.100417,63.569712],[-85.523405,63.052379],[-85.866769,63.637253],[-87.221983,63.541238],[-86.35276,64.035833],[-86.224886,64.822917],[-85.883848,65.738778],[-85.161308,65.657285]]],[[[-75.86588,67.14886],[-76.98687,67.09873],[-77.2364,67.58809],[-76.81166,68.14856],[-75.89521,68.28721],[-75.1145,68.01036],[-75.10333,67.58202],[-75.21597,67.44425],[-75.86588,67.14886]]],[[[-95.647681,69.10769],[-96.269521,68.75704],[-97.617401,69.06003],[-98.431801,68.9507],[-99.797401,69.40003],[-98.917401,69.71003],[-98.218261,70.14354],[-97.157401,69.86003],[-96.557401,69.68003],[-96.257401,69.49003],[-95.647681,69.10769]]],[[[-90.5471,69.49766],[-90.55151,68.47499],[-89.21515,69.25873],[-88.01966,68.61508],[-88.31749,67.87338],[-87.35017,67.19872],[-86.30607,67.92146],[-85.57664,68.78456],[-85.52197,69.88211],[-84.10081,69.80539],[-82.62258,69.65826],[-81.28043,69.16202],[-81.2202,68.66567],[-81.96436,68.13253],[-81.25928,67.59716],[-81.38653,67.11078],[-83.34456,66.41154],[-84.73542,66.2573],[-85.76943,66.55833],[-86.0676,66.05625],[-87.03143,65.21297],[-87.32324,64.77563],[-88.48296,64.09897],[-89.91444,64.03273],[-90.70398,63.61017],[-90.77004,62.96021],[-91.93342,62.83508],[-93.15698,62.02469],[-94.24153,60.89865],[-94.62931,60.11021],[-94.6846,58.94882],[-93.21502,58.78212],[-92.76462,57.84571],[-92.29703,57.08709],[-90.89769,57.28468],[-89.03953,56.85172],[-88.03978,56.47162],[-87.32421,55.99914],[-86.07121,55.72383],[-85.01181,55.3026],[-83.36055,55.24489],[-82.27285,55.14832],[-82.4362,54.28227],[-82.12502,53.27703],[-81.40075,52.15788],[-79.91289,51.20842],[-79.14301,51.53393],[-78.60191,52.56208],[-79.12421,54.14145],[-79.82958,54.66772],[-78.22874,55.13645],[-77.0956,55.83741],[-76.54137,56.53423],[-76.62319,57.20263],[-77.30226,58.05209],[-78.51688,58.80458],[-77.33676,59.85261],[-77.77272,60.75788],[-78.10687,62.31964],[-77.41067,62.55053],[-75.69621,62.2784],[-74.6682,62.18111],[-73.83988,62.4438],[-72.90853,62.10507],[-71.67708,61.52535],[-71.37369,61.13717],[-69.59042,61.06141],[-69.62033,60.22125],[-69.2879,58.95736],[-68.37455,58.80106],[-67.64976,58.21206],[-66.20178,58.76731],[-65.24517,59.87071],[-64.58352,60.33558],[-63.80475,59.4426],[-62.50236,58.16708],[-61.39655,56.96745],[-61.79866,56.33945],[-60.46853,55.77548],[-59.56962,55.20407],[-57.97508,54.94549],[-57.3332,54.6265],[-56.93689,53.78032],[-56.15811,53.64749],[-55.75632,53.27036],[-55.68338,52.14664],[-56.40916,51.7707],[-57.12691,51.41972],[-58.77482,51.0643],[-60.03309,50.24277],[-61.72366,50.08046],[-63.86251,50.29099],[-65.36331,50.2982],[-66.39905,50.22897],[-67.23631,49.51156],[-68.51114,49.06836],[-69.95362,47.74488],[-71.10458,46.82171],[-70.25522,46.98606],[-68.65,48.3],[-66.55243,49.1331],[-65.05626,49.23278],[-64.17099,48.74248],[-65.11545,48.07085],[-64.79854,46.99297],[-64.47219,46.23849],[-63.17329,45.73902],[-61.52072,45.88377],[-60.51815,47.00793],[-60.4486,46.28264],[-59.80287,45.9204],[-61.03988,45.26525],[-63.25471,44.67014],[-64.24656,44.26553],[-65.36406,43.54523],[-66.1234,43.61867],[-66.16173,44.46512],[-64.42549,45.29204],[-66.02605,45.25931],[-67.13741,45.13753],[-67.79134,45.70281],[-67.79046,47.06636],[-68.23444,47.35486],[-68.905,47.185],[-69.237216,47.447781],[-69.99997,46.69307],[-70.305,45.915],[-70.66,45.46],[-71.08482,45.30524],[-71.405,45.255],[-71.50506,45.0082],[-73.34783,45.00738],[-74.867,45.00048],[-75.31821,44.81645],[-76.375,44.09631],[-76.5,44.018459],[-76.820034,43.628784],[-77.737885,43.629056],[-78.72028,43.625089],[-79.171674,43.466339],[-79.01,43.27],[-78.92,42.965],[-78.939362,42.863611],[-80.247448,42.3662],[-81.277747,42.209026],[-82.439278,41.675105],[-82.690089,41.675105],[-83.02981,41.832796],[-83.142,41.975681],[-83.12,42.08],[-82.9,42.43],[-82.43,42.98],[-82.137642,43.571088],[-82.337763,44.44],[-82.550925,45.347517],[-83.592851,45.816894],[-83.469551,45.994686],[-83.616131,46.116927],[-83.890765,46.116927],[-84.091851,46.275419],[-84.14212,46.512226],[-84.3367,46.40877],[-84.6049,46.4396],[-84.543749,46.538684],[-84.779238,46.637102],[-84.87608,46.900083],[-85.652363,47.220219],[-86.461991,47.553338],[-87.439793,47.94],[-88.378114,48.302918],[-89.272917,48.019808],[-89.6,48.01],[-90.83,48.27],[-91.64,48.14],[-92.61,48.45],[-93.63087,48.60926],[-94.32914,48.67074],[-94.64,48.84],[-94.81758,49.38905],[-95.15609,49.38425],[-95.15907,49],[-97.22872,49.0007],[-100.65,49],[-104.04826,48.99986],[-107.05,49],[-110.05,49],[-113,49],[-116.04818,49],[-117.03121,49],[-120,49],[-122.84,49],[-122.97421,49.002538],[-124.91024,49.98456],[-125.62461,50.41656],[-127.43561,50.83061],[-127.99276,51.71583],[-127.85032,52.32961],[-129.12979,52.75538],[-129.30523,53.56159],[-130.51497,54.28757],[-130.53611,54.80278],[-129.98,55.285],[-130.00778,55.91583],[-131.70781,56.55212],[-132.73042,57.69289],[-133.35556,58.41028],[-134.27111,58.86111],[-134.945,59.27056],[-135.47583,59.78778],[-136.47972,59.46389],[-137.4525,58.905],[-138.34089,59.56211],[-139.039,60],[-140.013,60.27682],[-140.99778,60.30639],[-140.9925,66.00003],[-140.986,69.712],[-139.12052,69.47102],[-137.54636,68.99002],[-136.50358,68.89804],[-135.62576,69.31512],[-134.41464,69.62743],[-132.92925,69.50534],[-131.43136,69.94451],[-129.79471,70.19369],[-129.10773,69.77927],[-128.36156,70.01286],[-128.13817,70.48384],[-127.44712,70.37721],[-125.75632,69.48058],[-124.42483,70.1584],[-124.28968,69.39969],[-123.06108,69.56372],[-122.6835,69.85553],[-121.47226,69.79778],[-119.94288,69.37786],[-117.60268,69.01128],[-116.22643,68.84151],[-115.2469,68.90591],[-113.89794,68.3989],[-115.30489,67.90261],[-113.49727,67.68815],[-110.798,67.80612],[-109.94619,67.98104],[-108.8802,67.38144],[-107.79239,67.88736],[-108.81299,68.31164],[-108.16721,68.65392],[-106.95,68.7],[-106.15,68.8],[-105.34282,68.56122],[-104.33791,68.018],[-103.22115,68.09775],[-101.45433,67.64689],[-99.90195,67.80566],[-98.4432,67.78165],[-98.5586,68.40394],[-97.66948,68.57864],[-96.11991,68.23939],[-96.12588,67.29338],[-95.48943,68.0907],[-94.685,68.06383],[-94.23282,69.06903],[-95.30408,69.68571],[-96.47131,70.08976],[-96.39115,71.19482],[-95.2088,71.92053],[-93.88997,71.76015],[-92.87818,71.31869],[-91.51964,70.19129],[-92.40692,69.69997],[-90.5471,69.49766]]],[[[-114.16717,73.12145],[-114.66634,72.65277],[-112.44102,72.9554],[-111.05039,72.4504],[-109.92035,72.96113],[-109.00654,72.63335],[-108.18835,71.65089],[-107.68599,72.06548],[-108.39639,73.08953],[-107.51645,73.23598],[-106.52259,73.07601],[-105.40246,72.67259],[-104.77484,71.6984],[-104.46476,70.99297],[-102.78537,70.49776],[-100.98078,70.02432],[-101.08929,69.58447],[-102.73116,69.50402],[-102.09329,69.11962],[-102.43024,68.75282],[-104.24,68.91],[-105.96,69.18],[-107.12254,69.11922],[-109,68.78],[-111.534149,68.630059],[-113.3132,68.53554],[-113.85496,69.00744],[-115.22,69.28],[-116.10794,69.16821],[-117.34,69.96],[-116.67473,70.06655],[-115.13112,70.2373],[-113.72141,70.19237],[-112.4161,70.36638],[-114.35,70.6],[-116.48684,70.52045],[-117.9048,70.54056],[-118.43238,70.9092],[-116.11311,71.30918],[-117.65568,71.2952],[-119.40199,71.55859],[-118.56267,72.30785],[-117.86642,72.70594],[-115.18909,73.31459],[-114.16717,73.12145]]],[[[-104.5,73.42],[-105.38,72.76],[-106.94,73.46],[-106.6,73.6],[-105.26,73.64],[-104.5,73.42]]],[[[-76.34,73.102685],[-76.251404,72.826385],[-77.314438,72.855545],[-78.39167,72.876656],[-79.486252,72.742203],[-79.775833,72.802902],[-80.876099,73.333183],[-80.833885,73.693184],[-80.353058,73.75972],[-78.064438,73.651932],[-76.34,73.102685]]],[[[-86.562179,73.157447],[-85.774371,72.534126],[-84.850112,73.340278],[-82.31559,73.750951],[-80.600088,72.716544],[-80.748942,72.061907],[-78.770639,72.352173],[-77.824624,72.749617],[-75.605845,72.243678],[-74.228616,71.767144],[-74.099141,71.33084],[-72.242226,71.556925],[-71.200015,70.920013],[-68.786054,70.525024],[-67.91497,70.121948],[-66.969033,69.186087],[-68.805123,68.720198],[-66.449866,68.067163],[-64.862314,67.847539],[-63.424934,66.928473],[-61.851981,66.862121],[-62.163177,66.160251],[-63.918444,64.998669],[-65.14886,65.426033],[-66.721219,66.388041],[-68.015016,66.262726],[-68.141287,65.689789],[-67.089646,65.108455],[-65.73208,64.648406],[-65.320168,64.382737],[-64.669406,63.392927],[-65.013804,62.674185],[-66.275045,62.945099],[-68.783186,63.74567],[-67.369681,62.883966],[-66.328297,62.280075],[-66.165568,61.930897],[-68.877367,62.330149],[-71.023437,62.910708],[-72.235379,63.397836],[-71.886278,63.679989],[-73.378306,64.193963],[-74.834419,64.679076],[-74.818503,64.389093],[-77.70998,64.229542],[-78.555949,64.572906],[-77.897281,65.309192],[-76.018274,65.326969],[-73.959795,65.454765],[-74.293883,65.811771],[-73.944912,66.310578],[-72.651167,67.284576],[-72.92606,67.726926],[-73.311618,68.069437],[-74.843307,68.554627],[-76.869101,68.894736],[-76.228649,69.147769],[-77.28737,69.76954],[-78.168634,69.826488],[-78.957242,70.16688],[-79.492455,69.871808],[-81.305471,69.743185],[-84.944706,69.966634],[-87.060003,70.260001],[-88.681713,70.410741],[-89.51342,70.762038],[-88.467721,71.218186],[-89.888151,71.222552],[-90.20516,72.235074],[-89.436577,73.129464],[-88.408242,73.537889],[-85.826151,73.803816],[-86.562179,73.157447]]],[[[-100.35642,73.84389],[-99.16387,73.63339],[-97.38,73.76],[-97.12,73.47],[-98.05359,72.99052],[-96.54,72.56],[-96.72,71.66],[-98.35966,71.27285],[-99.32286,71.35639],[-100.01482,71.73827],[-102.5,72.51],[-102.48,72.83],[-100.43836,72.70588],[-101.54,73.36],[-100.35642,73.84389]]],[[[-93.196296,72.771992],[-94.269047,72.024596],[-95.409856,72.061881],[-96.033745,72.940277],[-96.018268,73.43743],[-95.495793,73.862417],[-94.503658,74.134907],[-92.420012,74.100025],[-90.509793,73.856732],[-92.003965,72.966244],[-93.196296,72.771992]]],[[[-120.46,71.383602],[-123.09219,70.90164],[-123.62,71.34],[-125.928949,71.868688],[-125.5,72.292261],[-124.80729,73.02256],[-123.94,73.68],[-124.91775,74.29275],[-121.53788,74.44893],[-120.10978,74.24135],[-117.55564,74.18577],[-116.58442,73.89607],[-115.51081,73.47519],[-116.76794,73.22292],[-119.22,72.52],[-120.46,71.82],[-120.46,71.383602]]],[[[-93.612756,74.979997],[-94.156909,74.592347],[-95.608681,74.666864],[-96.820932,74.927623],[-96.288587,75.377828],[-94.85082,75.647218],[-93.977747,75.29649],[-93.612756,74.979997]]],[[[-98.5,76.72],[-97.735585,76.25656],[-97.704415,75.74344],[-98.16,75],[-99.80874,74.89744],[-100.88366,75.05736],[-100.86292,75.64075],[-102.50209,75.5638],[-102.56552,76.3366],[-101.48973,76.30537],[-99.98349,76.64634],[-98.57699,76.58859],[-98.5,76.72]]],[[[-108.21141,76.20168],[-107.81943,75.84552],[-106.92893,76.01282],[-105.881,75.9694],[-105.70498,75.47951],[-106.31347,75.00527],[-109.7,74.85],[-112.22307,74.41696],[-113.74381,74.39427],[-113.87135,74.72029],[-111.79421,75.1625],[-116.31221,75.04343],[-117.7104,75.2222],[-116.34602,76.19903],[-115.40487,76.47887],[-112.59056,76.14134],[-110.81422,75.54919],[-109.0671,75.47321],[-110.49726,76.42982],[-109.5811,76.79417],[-108.54859,76.67832],[-108.21141,76.20168]]],[[[-94.684086,77.097878],[-93.573921,76.776296],[-91.605023,76.778518],[-90.741846,76.449597],[-90.969661,76.074013],[-89.822238,75.847774],[-89.187083,75.610166],[-87.838276,75.566189],[-86.379192,75.482421],[-84.789625,75.699204],[-82.753445,75.784315],[-81.128531,75.713983],[-80.057511,75.336849],[-79.833933,74.923127],[-80.457771,74.657304],[-81.948843,74.442459],[-83.228894,74.564028],[-86.097452,74.410032],[-88.15035,74.392307],[-89.764722,74.515555],[-92.422441,74.837758],[-92.768285,75.38682],[-92.889906,75.882655],[-93.893824,76.319244],[-95.962457,76.441381],[-97.121379,76.751078],[-96.745123,77.161389],[-94.684086,77.097878]]],[[[-116.198587,77.645287],[-116.335813,76.876962],[-117.106051,76.530032],[-118.040412,76.481172],[-119.899318,76.053213],[-121.499995,75.900019],[-122.854924,76.116543],[-122.854925,76.116543],[-121.157535,76.864508],[-119.103939,77.51222],[-117.570131,77.498319],[-116.198587,77.645287]]],[[[-93.840003,77.519997],[-94.295608,77.491343],[-96.169654,77.555111],[-96.436304,77.834629],[-94.422577,77.820005],[-93.720656,77.634331],[-93.840003,77.519997]]],[[[-110.186938,77.697015],[-112.051191,77.409229],[-113.534279,77.732207],[-112.724587,78.05105],[-111.264443,78.152956],[-109.854452,77.996325],[-110.186938,77.697015]]],[[[-109.663146,78.601973],[-110.881314,78.40692],[-112.542091,78.407902],[-112.525891,78.550555],[-111.50001,78.849994],[-110.963661,78.804441],[-109.663146,78.601973]]],[[[-95.830295,78.056941],[-97.309843,77.850597],[-98.124289,78.082857],[-98.552868,78.458105],[-98.631984,78.87193],[-97.337231,78.831984],[-96.754399,78.765813],[-95.559278,78.418315],[-95.830295,78.056941]]],[[[-100.060192,78.324754],[-99.670939,77.907545],[-101.30394,78.018985],[-102.949809,78.343229],[-105.176133,78.380332],[-104.210429,78.67742],[-105.41958,78.918336],[-105.492289,79.301594],[-103.529282,79.165349],[-100.825158,78.800462],[-100.060192,78.324754]]],[[[-87.02,79.66],[-85.81435,79.3369],[-87.18756,79.0393],[-89.03535,78.28723],[-90.80436,78.21533],[-92.87669,78.34333],[-93.95116,78.75099],[-93.93574,79.11373],[-93.14524,79.3801],[-94.974,79.37248],[-96.07614,79.70502],[-96.70972,80.15777],[-96.01644,80.60233],[-95.32345,80.90729],[-94.29843,80.97727],[-94.73542,81.20646],[-92.40984,81.25739],[-91.13289,80.72345],[-89.45,80.509322],[-87.81,80.32],[-87.02,79.66]]],[[[-68.5,83.106322],[-65.82735,83.02801],[-63.68,82.9],[-61.85,82.6286],[-61.89388,82.36165],[-64.334,81.92775],[-66.75342,81.72527],[-67.65755,81.50141],[-65.48031,81.50657],[-67.84,80.9],[-69.4697,80.61683],[-71.18,79.8],[-73.2428,79.63415],[-73.88,79.430162],[-76.90773,79.32309],[-75.52924,79.19766],[-76.22046,79.01907],[-75.39345,78.52581],[-76.34354,78.18296],[-77.88851,77.89991],[-78.36269,77.50859],[-79.75951,77.20968],[-79.61965,76.98336],[-77.91089,77.022045],[-77.88911,76.777955],[-80.56125,76.17812],[-83.17439,76.45403],[-86.11184,76.29901],[-87.6,76.42],[-89.49068,76.47239],[-89.6161,76.95213],[-87.76739,77.17833],[-88.26,77.9],[-87.65,77.970222],[-84.97634,77.53873],[-86.34,78.18],[-87.96192,78.37181],[-87.15198,78.75867],[-85.37868,78.9969],[-85.09495,79.34543],[-86.50734,79.73624],[-86.93179,80.25145],[-84.19844,80.20836],[-83.408696,80.1],[-81.84823,80.46442],[-84.1,80.58],[-87.59895,80.51627],[-89.36663,80.85569],[-90.2,81.26],[-91.36786,81.5531],[-91.58702,81.89429],[-90.1,82.085],[-88.93227,82.11751],[-86.97024,82.27961],[-85.5,82.652273],[-84.260005,82.6],[-83.18,82.32],[-82.42,82.86],[-81.1,83.02],[-79.30664,83.13056],[-76.25,83.172059],[-75.71878,83.06404],[-72.83153,83.23324],[-70.665765,83.169781],[-68.5,83.106322]]]]}}, -{"type":"Feature","id":"CHE","properties":{"name":"Switzerland"},"geometry":{"type":"Polygon","coordinates":[[[9.594226,47.525058],[9.632932,47.347601],[9.47997,47.10281],[9.932448,46.920728],[10.442701,46.893546],[10.363378,46.483571],[9.922837,46.314899],[9.182882,46.440215],[8.966306,46.036932],[8.489952,46.005151],[8.31663,46.163642],[7.755992,45.82449],[7.273851,45.776948],[6.843593,45.991147],[6.5001,46.429673],[6.022609,46.27299],[6.037389,46.725779],[6.768714,47.287708],[6.736571,47.541801],[7.192202,47.449766],[7.466759,47.620582],[8.317301,47.61358],[8.522612,47.830828],[9.594226,47.525058]]]}}, -{"type":"Feature","id":"CHL","properties":{"name":"Chile"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-68.63401,-52.63637],[-68.63335,-54.8695],[-67.56244,-54.87001],[-66.95992,-54.89681],[-67.29103,-55.30124],[-68.14863,-55.61183],[-68.639991,-55.580018],[-69.2321,-55.49906],[-69.95809,-55.19843],[-71.00568,-55.05383],[-72.2639,-54.49514],[-73.2852,-53.95752],[-74.66253,-52.83749],[-73.8381,-53.04743],[-72.43418,-53.7154],[-71.10773,-54.07433],[-70.59178,-53.61583],[-70.26748,-52.93123],[-69.34565,-52.5183],[-68.63401,-52.63637]]],[[[-68.219913,-21.494347],[-67.82818,-22.872919],[-67.106674,-22.735925],[-66.985234,-22.986349],[-67.328443,-24.025303],[-68.417653,-24.518555],[-68.386001,-26.185016],[-68.5948,-26.506909],[-68.295542,-26.89934],[-69.001235,-27.521214],[-69.65613,-28.459141],[-70.01355,-29.367923],[-69.919008,-30.336339],[-70.535069,-31.36501],[-70.074399,-33.09121],[-69.814777,-33.273886],[-69.817309,-34.193571],[-70.388049,-35.169688],[-70.364769,-36.005089],[-71.121881,-36.658124],[-71.118625,-37.576827],[-70.814664,-38.552995],[-71.413517,-38.916022],[-71.680761,-39.808164],[-71.915734,-40.832339],[-71.746804,-42.051386],[-72.148898,-42.254888],[-71.915424,-43.408565],[-71.464056,-43.787611],[-71.793623,-44.207172],[-71.329801,-44.407522],[-71.222779,-44.784243],[-71.659316,-44.973689],[-71.552009,-45.560733],[-71.917258,-46.884838],[-72.447355,-47.738533],[-72.331161,-48.244238],[-72.648247,-48.878618],[-73.415436,-49.318436],[-73.328051,-50.378785],[-72.975747,-50.74145],[-72.309974,-50.67701],[-72.329404,-51.425956],[-71.914804,-52.009022],[-69.498362,-52.142761],[-68.571545,-52.299444],[-69.461284,-52.291951],[-69.94278,-52.537931],[-70.845102,-52.899201],[-71.006332,-53.833252],[-71.429795,-53.856455],[-72.557943,-53.53141],[-73.702757,-52.835069],[-73.702757,-52.83507],[-74.946763,-52.262754],[-75.260026,-51.629355],[-74.976632,-51.043396],[-75.479754,-50.378372],[-75.608015,-48.673773],[-75.18277,-47.711919],[-74.126581,-46.939253],[-75.644395,-46.647643],[-74.692154,-45.763976],[-74.351709,-44.103044],[-73.240356,-44.454961],[-72.717804,-42.383356],[-73.3889,-42.117532],[-73.701336,-43.365776],[-74.331943,-43.224958],[-74.017957,-41.794813],[-73.677099,-39.942213],[-73.217593,-39.258689],[-73.505559,-38.282883],[-73.588061,-37.156285],[-73.166717,-37.12378],[-72.553137,-35.50884],[-71.861732,-33.909093],[-71.43845,-32.418899],[-71.668721,-30.920645],[-71.370083,-30.095682],[-71.489894,-28.861442],[-70.905124,-27.64038],[-70.724954,-25.705924],[-70.403966,-23.628997],[-70.091246,-21.393319],[-70.16442,-19.756468],[-70.372572,-18.347975],[-69.858444,-18.092694],[-69.590424,-17.580012],[-69.100247,-18.260125],[-68.966818,-18.981683],[-68.442225,-19.405068],[-68.757167,-20.372658],[-68.219913,-21.494347]]]]}}, -{"type":"Feature","id":"CHN","properties":{"name":"China"},"geometry":{"type":"MultiPolygon","coordinates":[[[[110.339188,18.678395],[109.47521,18.197701],[108.655208,18.507682],[108.626217,19.367888],[109.119056,19.821039],[110.211599,20.101254],[110.786551,20.077534],[111.010051,19.69593],[110.570647,19.255879],[110.339188,18.678395]]],[[[127.657407,49.76027],[129.397818,49.4406],[130.582293,48.729687],[130.987282,47.790132],[132.506672,47.78897],[133.373596,48.183442],[135.026311,48.47823],[134.500814,47.57844],[134.112362,47.212467],[133.769644,46.116927],[133.097127,45.144066],[131.883454,45.321162],[131.025212,44.967953],[131.288555,44.11152],[131.144688,42.92999],[130.633866,42.903015],[130.640016,42.395009],[129.994267,42.985387],[129.596669,42.424982],[128.052215,41.994285],[128.208433,41.466772],[127.343783,41.503152],[126.869083,41.816569],[126.182045,41.107336],[125.079942,40.569824],[124.265625,39.928493],[122.86757,39.637788],[122.131388,39.170452],[121.054554,38.897471],[121.585995,39.360854],[121.376757,39.750261],[122.168595,40.422443],[121.640359,40.94639],[120.768629,40.593388],[119.639602,39.898056],[119.023464,39.252333],[118.042749,39.204274],[117.532702,38.737636],[118.059699,38.061476],[118.87815,37.897325],[118.911636,37.448464],[119.702802,37.156389],[120.823457,37.870428],[121.711259,37.481123],[122.357937,37.454484],[122.519995,36.930614],[121.104164,36.651329],[120.637009,36.11144],[119.664562,35.609791],[119.151208,34.909859],[120.227525,34.360332],[120.620369,33.376723],[121.229014,32.460319],[121.908146,31.692174],[121.891919,30.949352],[121.264257,30.676267],[121.503519,30.142915],[122.092114,29.83252],[121.938428,29.018022],[121.684439,28.225513],[121.125661,28.135673],[120.395473,27.053207],[119.585497,25.740781],[118.656871,24.547391],[117.281606,23.624501],[115.890735,22.782873],[114.763827,22.668074],[114.152547,22.22376],[113.80678,22.54834],[113.241078,22.051367],[111.843592,21.550494],[110.785466,21.397144],[110.444039,20.341033],[109.889861,20.282457],[109.627655,21.008227],[109.864488,21.395051],[108.522813,21.715212],[108.05018,21.55238],[107.04342,21.811899],[106.567273,22.218205],[106.725403,22.794268],[105.811247,22.976892],[105.329209,23.352063],[104.476858,22.81915],[103.504515,22.703757],[102.706992,22.708795],[102.170436,22.464753],[101.652018,22.318199],[101.80312,21.174367],[101.270026,21.201652],[101.180005,21.436573],[101.150033,21.849984],[100.416538,21.558839],[99.983489,21.742937],[99.240899,22.118314],[99.531992,22.949039],[98.898749,23.142722],[98.660262,24.063286],[97.60472,23.897405],[97.724609,25.083637],[98.671838,25.918703],[98.712094,26.743536],[98.68269,27.508812],[98.246231,27.747221],[97.911988,28.335945],[97.327114,28.261583],[96.248833,28.411031],[96.586591,28.83098],[96.117679,29.452802],[95.404802,29.031717],[94.56599,29.277438],[93.413348,28.640629],[92.503119,27.896876],[91.696657,27.771742],[91.258854,28.040614],[90.730514,28.064954],[90.015829,28.296439],[89.47581,28.042759],[88.814248,27.299316],[88.730326,28.086865],[88.120441,27.876542],[86.954517,27.974262],[85.82332,28.203576],[85.011638,28.642774],[84.23458,28.839894],[83.898993,29.320226],[83.337115,29.463732],[82.327513,30.115268],[81.525804,30.422717],[81.111256,30.183481],[79.721367,30.882715],[78.738894,31.515906],[78.458446,32.618164],[79.176129,32.48378],[79.208892,32.994395],[78.811086,33.506198],[78.912269,34.321936],[77.837451,35.49401],[76.192848,35.898403],[75.896897,36.666806],[75.158028,37.133031],[74.980002,37.41999],[74.829986,37.990007],[74.864816,38.378846],[74.257514,38.606507],[73.928852,38.505815],[73.675379,39.431237],[73.960013,39.660008],[73.822244,39.893973],[74.776862,40.366425],[75.467828,40.562072],[76.526368,40.427946],[76.904484,41.066486],[78.187197,41.185316],[78.543661,41.582243],[80.11943,42.123941],[80.25999,42.349999],[80.18015,42.920068],[80.866206,43.180362],[79.966106,44.917517],[81.947071,45.317027],[82.458926,45.53965],[83.180484,47.330031],[85.16429,47.000956],[85.720484,47.452969],[85.768233,48.455751],[86.598776,48.549182],[87.35997,49.214981],[87.751264,49.297198],[88.013832,48.599463],[88.854298,48.069082],[90.280826,47.693549],[90.970809,46.888146],[90.585768,45.719716],[90.94554,45.286073],[92.133891,45.115076],[93.480734,44.975472],[94.688929,44.352332],[95.306875,44.241331],[95.762455,43.319449],[96.349396,42.725635],[97.451757,42.74889],[99.515817,42.524691],[100.845866,42.663804],[101.83304,42.514873],[103.312278,41.907468],[104.522282,41.908347],[104.964994,41.59741],[106.129316,42.134328],[107.744773,42.481516],[109.243596,42.519446],[110.412103,42.871234],[111.129682,43.406834],[111.829588,43.743118],[111.667737,44.073176],[111.348377,44.457442],[111.873306,45.102079],[112.436062,45.011646],[113.463907,44.808893],[114.460332,45.339817],[115.985096,45.727235],[116.717868,46.388202],[117.421701,46.672733],[118.874326,46.805412],[119.66327,46.69268],[119.772824,47.048059],[118.866574,47.74706],[118.064143,48.06673],[117.295507,47.697709],[116.308953,47.85341],[115.742837,47.726545],[115.485282,48.135383],[116.191802,49.134598],[116.678801,49.888531],[117.879244,49.510983],[119.288461,50.142883],[119.279366,50.582908],[120.18205,51.643566],[120.738191,51.964115],[120.725789,52.516226],[120.177089,52.753886],[121.003085,53.251401],[122.245748,53.431726],[123.571507,53.458804],[125.068211,53.161045],[125.946349,52.792799],[126.564399,51.784255],[126.939157,51.353894],[127.287456,50.739797],[127.657407,49.76027]]]]}}, -{"type":"Feature","id":"CIV","properties":{"name":"Ivory Coast"},"geometry":{"type":"Polygon","coordinates":[[[-2.856125,4.994476],[-3.311084,4.984296],[-4.00882,5.179813],[-4.649917,5.168264],[-5.834496,4.993701],[-6.528769,4.705088],[-7.518941,4.338288],[-7.712159,4.364566],[-7.635368,5.188159],[-7.539715,5.313345],[-7.570153,5.707352],[-7.993693,6.12619],[-8.311348,6.193033],[-8.60288,6.467564],[-8.385452,6.911801],[-8.485446,7.395208],[-8.439298,7.686043],[-8.280703,7.68718],[-8.221792,8.123329],[-8.299049,8.316444],[-8.203499,8.455453],[-7.8321,8.575704],[-8.079114,9.376224],[-8.309616,9.789532],[-8.229337,10.12902],[-8.029944,10.206535],[-7.89959,10.297382],[-7.622759,10.147236],[-6.850507,10.138994],[-6.666461,10.430811],[-6.493965,10.411303],[-6.205223,10.524061],[-6.050452,10.096361],[-5.816926,10.222555],[-5.404342,10.370737],[-4.954653,10.152714],[-4.779884,9.821985],[-4.330247,9.610835],[-3.980449,9.862344],[-3.511899,9.900326],[-2.827496,9.642461],[-2.56219,8.219628],[-2.983585,7.379705],[-3.24437,6.250472],[-2.810701,5.389051],[-2.856125,4.994476]]]}}, -{"type":"Feature","id":"CMR","properties":{"name":"Cameroon"},"geometry":{"type":"Polygon","coordinates":[[[13.075822,2.267097],[12.951334,2.321616],[12.35938,2.192812],[11.751665,2.326758],[11.276449,2.261051],[9.649158,2.283866],[9.795196,3.073404],[9.404367,3.734527],[8.948116,3.904129],[8.744924,4.352215],[8.488816,4.495617],[8.500288,4.771983],[8.757533,5.479666],[9.233163,6.444491],[9.522706,6.453482],[10.118277,7.03877],[10.497375,7.055358],[11.058788,6.644427],[11.745774,6.981383],[11.839309,7.397042],[12.063946,7.799808],[12.218872,8.305824],[12.753672,8.717763],[12.955468,9.417772],[13.1676,9.640626],[13.308676,10.160362],[13.57295,10.798566],[14.415379,11.572369],[14.468192,11.904752],[14.577178,12.085361],[14.181336,12.483657],[14.213531,12.802035],[14.495787,12.859396],[14.893386,12.219048],[14.960152,11.555574],[14.923565,10.891325],[15.467873,9.982337],[14.909354,9.992129],[14.627201,9.920919],[14.171466,10.021378],[13.954218,9.549495],[14.544467,8.965861],[14.979996,8.796104],[15.120866,8.38215],[15.436092,7.692812],[15.27946,7.421925],[14.776545,6.408498],[14.53656,6.226959],[14.459407,5.451761],[14.558936,5.030598],[14.478372,4.732605],[14.950953,4.210389],[15.03622,3.851367],[15.405396,3.335301],[15.862732,3.013537],[15.907381,2.557389],[16.012852,2.26764],[15.940919,1.727673],[15.146342,1.964015],[14.337813,2.227875],[13.075822,2.267097]]]}}, -{"type":"Feature","id":"COD","properties":{"name":"Democratic Republic of the Congo"},"geometry":{"type":"Polygon","coordinates":[[[30.83386,3.509166],[30.773347,2.339883],[31.174149,2.204465],[30.85267,1.849396],[30.468508,1.583805],[30.086154,1.062313],[29.875779,0.59738],[29.819503,-0.20531],[29.587838,-0.587406],[29.579466,-1.341313],[29.291887,-1.620056],[29.254835,-2.21511],[29.117479,-2.292211],[29.024926,-2.839258],[29.276384,-3.293907],[29.339998,-4.499983],[29.519987,-5.419979],[29.419993,-5.939999],[29.620032,-6.520015],[30.199997,-7.079981],[30.740015,-8.340007],[30.346086,-8.238257],[29.002912,-8.407032],[28.734867,-8.526559],[28.449871,-9.164918],[28.673682,-9.605925],[28.49607,-10.789884],[28.372253,-11.793647],[28.642417,-11.971569],[29.341548,-12.360744],[29.616001,-12.178895],[29.699614,-13.257227],[28.934286,-13.248958],[28.523562,-12.698604],[28.155109,-12.272481],[27.388799,-12.132747],[27.16442,-11.608748],[26.553088,-11.92444],[25.75231,-11.784965],[25.418118,-11.330936],[24.78317,-11.238694],[24.314516,-11.262826],[24.257155,-10.951993],[23.912215,-10.926826],[23.456791,-10.867863],[22.837345,-11.017622],[22.402798,-10.993075],[22.155268,-11.084801],[22.208753,-9.894796],[21.875182,-9.523708],[21.801801,-8.908707],[21.949131,-8.305901],[21.746456,-7.920085],[21.728111,-7.290872],[20.514748,-7.299606],[20.601823,-6.939318],[20.091622,-6.94309],[20.037723,-7.116361],[19.417502,-7.155429],[19.166613,-7.738184],[19.016752,-7.988246],[18.464176,-7.847014],[18.134222,-7.987678],[17.47297,-8.068551],[17.089996,-7.545689],[16.860191,-7.222298],[16.57318,-6.622645],[16.326528,-5.87747],[13.375597,-5.864241],[13.024869,-5.984389],[12.735171,-5.965682],[12.322432,-6.100092],[12.182337,-5.789931],[12.436688,-5.684304],[12.468004,-5.248362],[12.631612,-4.991271],[12.995517,-4.781103],[13.25824,-4.882957],[13.600235,-4.500138],[14.144956,-4.510009],[14.209035,-4.793092],[14.582604,-4.970239],[15.170992,-4.343507],[15.75354,-3.855165],[16.00629,-3.535133],[15.972803,-2.712392],[16.407092,-1.740927],[16.865307,-1.225816],[17.523716,-0.74383],[17.638645,-0.424832],[17.663553,-0.058084],[17.82654,0.288923],[17.774192,0.855659],[17.898835,1.741832],[18.094276,2.365722],[18.393792,2.900443],[18.453065,3.504386],[18.542982,4.201785],[18.932312,4.709506],[19.467784,5.031528],[20.290679,4.691678],[20.927591,4.322786],[21.659123,4.224342],[22.405124,4.02916],[22.704124,4.633051],[22.84148,4.710126],[23.297214,4.609693],[24.410531,5.108784],[24.805029,4.897247],[25.128833,4.927245],[25.278798,5.170408],[25.650455,5.256088],[26.402761,5.150875],[27.044065,5.127853],[27.374226,5.233944],[27.979977,4.408413],[28.428994,4.287155],[28.696678,4.455077],[29.159078,4.389267],[29.715995,4.600805],[29.9535,4.173699],[30.83386,3.509166]]]}}, -{"type":"Feature","id":"COG","properties":{"name":"Republic of the Congo"},"geometry":{"type":"Polygon","coordinates":[[[12.995517,-4.781103],[12.62076,-4.438023],[12.318608,-4.60623],[11.914963,-5.037987],[11.093773,-3.978827],[11.855122,-3.426871],[11.478039,-2.765619],[11.820964,-2.514161],[12.495703,-2.391688],[12.575284,-1.948511],[13.109619,-2.42874],[13.992407,-2.470805],[14.29921,-1.998276],[14.425456,-1.333407],[14.316418,-0.552627],[13.843321,0.038758],[14.276266,1.19693],[14.026669,1.395677],[13.282631,1.314184],[13.003114,1.830896],[13.075822,2.267097],[14.337813,2.227875],[15.146342,1.964015],[15.940919,1.727673],[16.012852,2.26764],[16.537058,3.198255],[17.133042,3.728197],[17.8099,3.560196],[18.453065,3.504386],[18.393792,2.900443],[18.094276,2.365722],[17.898835,1.741832],[17.774192,0.855659],[17.82654,0.288923],[17.663553,-0.058084],[17.638645,-0.424832],[17.523716,-0.74383],[16.865307,-1.225816],[16.407092,-1.740927],[15.972803,-2.712392],[16.00629,-3.535133],[15.75354,-3.855165],[15.170992,-4.343507],[14.582604,-4.970239],[14.209035,-4.793092],[14.144956,-4.510009],[13.600235,-4.500138],[13.25824,-4.882957],[12.995517,-4.781103]]]}}, -{"type":"Feature","id":"COL","properties":{"name":"Colombia"},"geometry":{"type":"Polygon","coordinates":[[[-75.373223,-0.152032],[-75.801466,0.084801],[-76.292314,0.416047],[-76.57638,0.256936],[-77.424984,0.395687],[-77.668613,0.825893],[-77.855061,0.809925],[-78.855259,1.380924],[-78.990935,1.69137],[-78.617831,1.766404],[-78.662118,2.267355],[-78.42761,2.629556],[-77.931543,2.696606],[-77.510431,3.325017],[-77.12769,3.849636],[-77.496272,4.087606],[-77.307601,4.667984],[-77.533221,5.582812],[-77.318815,5.845354],[-77.476661,6.691116],[-77.881571,7.223771],[-77.753414,7.70984],[-77.431108,7.638061],[-77.242566,7.935278],[-77.474723,8.524286],[-77.353361,8.670505],[-76.836674,8.638749],[-76.086384,9.336821],[-75.6746,9.443248],[-75.664704,9.774003],[-75.480426,10.61899],[-74.906895,11.083045],[-74.276753,11.102036],[-74.197223,11.310473],[-73.414764,11.227015],[-72.627835,11.731972],[-72.238195,11.95555],[-71.75409,12.437303],[-71.399822,12.376041],[-71.137461,12.112982],[-71.331584,11.776284],[-71.973922,11.608672],[-72.227575,11.108702],[-72.614658,10.821975],[-72.905286,10.450344],[-73.027604,9.73677],[-73.304952,9.152],[-72.78873,9.085027],[-72.660495,8.625288],[-72.439862,8.405275],[-72.360901,8.002638],[-72.479679,7.632506],[-72.444487,7.423785],[-72.198352,7.340431],[-71.960176,6.991615],[-70.674234,7.087785],[-70.093313,6.960376],[-69.38948,6.099861],[-68.985319,6.206805],[-68.265052,6.153268],[-67.695087,6.267318],[-67.34144,6.095468],[-67.521532,5.55687],[-67.744697,5.221129],[-67.823012,4.503937],[-67.621836,3.839482],[-67.337564,3.542342],[-67.303173,3.318454],[-67.809938,2.820655],[-67.447092,2.600281],[-67.181294,2.250638],[-66.876326,1.253361],[-67.065048,1.130112],[-67.259998,1.719999],[-67.53781,2.037163],[-67.868565,1.692455],[-69.816973,1.714805],[-69.804597,1.089081],[-69.218638,0.985677],[-69.252434,0.602651],[-69.452396,0.706159],[-70.015566,0.541414],[-70.020656,-0.185156],[-69.577065,-0.549992],[-69.420486,-1.122619],[-69.444102,-1.556287],[-69.893635,-4.298187],[-70.394044,-3.766591],[-70.692682,-3.742872],[-70.047709,-2.725156],[-70.813476,-2.256865],[-71.413646,-2.342802],[-71.774761,-2.16979],[-72.325787,-2.434218],[-73.070392,-2.308954],[-73.659504,-1.260491],[-74.122395,-1.002833],[-74.441601,-0.53082],[-75.106625,-0.057205],[-75.373223,-0.152032]]]}}, -{"type":"Feature","id":"CRI","properties":{"name":"Costa Rica"},"geometry":{"type":"Polygon","coordinates":[[[-82.965783,8.225028],[-83.508437,8.446927],[-83.711474,8.656836],[-83.596313,8.830443],[-83.632642,9.051386],[-83.909886,9.290803],[-84.303402,9.487354],[-84.647644,9.615537],[-84.713351,9.908052],[-84.97566,10.086723],[-84.911375,9.795992],[-85.110923,9.55704],[-85.339488,9.834542],[-85.660787,9.933347],[-85.797445,10.134886],[-85.791709,10.439337],[-85.659314,10.754331],[-85.941725,10.895278],[-85.71254,11.088445],[-85.561852,11.217119],[-84.903003,10.952303],[-84.673069,11.082657],[-84.355931,10.999226],[-84.190179,10.79345],[-83.895054,10.726839],[-83.655612,10.938764],[-83.40232,10.395438],[-83.015677,9.992982],[-82.546196,9.566135],[-82.932891,9.476812],[-82.927155,9.07433],[-82.719183,8.925709],[-82.868657,8.807266],[-82.829771,8.626295],[-82.913176,8.423517],[-82.965783,8.225028]]]}}, -{"type":"Feature","id":"CUB","properties":{"name":"Cuba"},"geometry":{"type":"Polygon","coordinates":[[[-82.268151,23.188611],[-81.404457,23.117271],[-80.618769,23.10598],[-79.679524,22.765303],[-79.281486,22.399202],[-78.347434,22.512166],[-77.993296,22.277194],[-77.146422,21.657851],[-76.523825,21.20682],[-76.19462,21.220565],[-75.598222,21.016624],[-75.67106,20.735091],[-74.933896,20.693905],[-74.178025,20.284628],[-74.296648,20.050379],[-74.961595,19.923435],[-75.63468,19.873774],[-76.323656,19.952891],[-77.755481,19.855481],[-77.085108,20.413354],[-77.492655,20.673105],[-78.137292,20.739949],[-78.482827,21.028613],[-78.719867,21.598114],[-79.285,21.559175],[-80.217475,21.827324],[-80.517535,22.037079],[-81.820943,22.192057],[-82.169992,22.387109],[-81.795002,22.636965],[-82.775898,22.68815],[-83.494459,22.168518],[-83.9088,22.154565],[-84.052151,21.910575],[-84.54703,21.801228],[-84.974911,21.896028],[-84.447062,22.20495],[-84.230357,22.565755],[-83.77824,22.788118],[-83.267548,22.983042],[-82.510436,23.078747],[-82.268151,23.188611]]]}}, -{"type":"Feature","id":"-99","properties":{"name":"Northern Cyprus"},"geometry":{"type":"Polygon","coordinates":[[[32.73178,35.140026],[32.802474,35.145504],[32.946961,35.386703],[33.667227,35.373216],[34.576474,35.671596],[33.900804,35.245756],[33.973617,35.058506],[33.86644,35.093595],[33.675392,35.017863],[33.525685,35.038688],[33.475817,35.000345],[33.455922,35.101424],[33.383833,35.162712],[33.190977,35.173125],[32.919572,35.087833],[32.73178,35.140026]]]}}, -{"type":"Feature","id":"CYP","properties":{"name":"Cyprus"},"geometry":{"type":"Polygon","coordinates":[[[33.973617,35.058506],[34.004881,34.978098],[32.979827,34.571869],[32.490296,34.701655],[32.256667,35.103232],[32.73178,35.140026],[32.919572,35.087833],[33.190977,35.173125],[33.383833,35.162712],[33.455922,35.101424],[33.475817,35.000345],[33.525685,35.038688],[33.675392,35.017863],[33.86644,35.093595],[33.973617,35.058506]]]}}, -{"type":"Feature","id":"CZE","properties":{"name":"Czech Republic"},"geometry":{"type":"Polygon","coordinates":[[[16.960288,48.596982],[16.499283,48.785808],[16.029647,48.733899],[15.253416,49.039074],[14.901447,48.964402],[14.338898,48.555305],[13.595946,48.877172],[13.031329,49.307068],[12.521024,49.547415],[12.415191,49.969121],[12.240111,50.266338],[12.966837,50.484076],[13.338132,50.733234],[14.056228,50.926918],[14.307013,51.117268],[14.570718,51.002339],[15.016996,51.106674],[15.490972,50.78473],[16.238627,50.697733],[16.176253,50.422607],[16.719476,50.215747],[16.868769,50.473974],[17.554567,50.362146],[17.649445,50.049038],[18.392914,49.988629],[18.853144,49.49623],[18.554971,49.495015],[18.399994,49.315001],[18.170498,49.271515],[18.104973,49.043983],[17.913512,48.996493],[17.886485,48.903475],[17.545007,48.800019],[17.101985,48.816969],[16.960288,48.596982]]]}}, -{"type":"Feature","id":"DEU","properties":{"name":"Germany"},"geometry":{"type":"Polygon","coordinates":[[[9.921906,54.983104],[9.93958,54.596642],[10.950112,54.363607],[10.939467,54.008693],[11.956252,54.196486],[12.51844,54.470371],[13.647467,54.075511],[14.119686,53.757029],[14.353315,53.248171],[14.074521,52.981263],[14.4376,52.62485],[14.685026,52.089947],[14.607098,51.745188],[15.016996,51.106674],[14.570718,51.002339],[14.307013,51.117268],[14.056228,50.926918],[13.338132,50.733234],[12.966837,50.484076],[12.240111,50.266338],[12.415191,49.969121],[12.521024,49.547415],[13.031329,49.307068],[13.595946,48.877172],[13.243357,48.416115],[12.884103,48.289146],[13.025851,47.637584],[12.932627,47.467646],[12.62076,47.672388],[12.141357,47.703083],[11.426414,47.523766],[10.544504,47.566399],[10.402084,47.302488],[9.896068,47.580197],[9.594226,47.525058],[8.522612,47.830828],[8.317301,47.61358],[7.466759,47.620582],[7.593676,48.333019],[8.099279,49.017784],[6.65823,49.201958],[6.18632,49.463803],[6.242751,49.902226],[6.043073,50.128052],[6.156658,50.803721],[5.988658,51.851616],[6.589397,51.852029],[6.84287,52.22844],[7.092053,53.144043],[6.90514,53.482162],[7.100425,53.693932],[7.936239,53.748296],[8.121706,53.527792],[8.800734,54.020786],[8.572118,54.395646],[8.526229,54.962744],[9.282049,54.830865],[9.921906,54.983104]]]}}, -{"type":"Feature","id":"DJI","properties":{"name":"Djibouti"},"geometry":{"type":"Polygon","coordinates":[[[43.081226,12.699639],[43.317852,12.390148],[43.286381,11.974928],[42.715874,11.735641],[43.145305,11.46204],[42.776852,10.926879],[42.55493,11.10511],[42.31414,11.0342],[41.75557,11.05091],[41.73959,11.35511],[41.66176,11.6312],[42,12.1],[42.35156,12.54223],[42.779642,12.455416],[43.081226,12.699639]]]}}, -{"type":"Feature","id":"DNK","properties":{"name":"Denmark"},"geometry":{"type":"MultiPolygon","coordinates":[[[[12.690006,55.609991],[12.089991,54.800015],[11.043543,55.364864],[10.903914,55.779955],[12.370904,56.111407],[12.690006,55.609991]]],[[[10.912182,56.458621],[10.667804,56.081383],[10.369993,56.190007],[9.649985,55.469999],[9.921906,54.983104],[9.282049,54.830865],[8.526229,54.962744],[8.120311,55.517723],[8.089977,56.540012],[8.256582,56.809969],[8.543438,57.110003],[9.424469,57.172066],[9.775559,57.447941],[10.580006,57.730017],[10.546106,57.215733],[10.25,56.890016],[10.369993,56.609982],[10.912182,56.458621]]]]}}, -{"type":"Feature","id":"DOM","properties":{"name":"Dominican Republic"},"geometry":{"type":"Polygon","coordinates":[[[-71.712361,19.714456],[-71.587304,19.884911],[-70.806706,19.880286],[-70.214365,19.622885],[-69.950815,19.648],[-69.76925,19.293267],[-69.222126,19.313214],[-69.254346,19.015196],[-68.809412,18.979074],[-68.317943,18.612198],[-68.689316,18.205142],[-69.164946,18.422648],[-69.623988,18.380713],[-69.952934,18.428307],[-70.133233,18.245915],[-70.517137,18.184291],[-70.669298,18.426886],[-70.99995,18.283329],[-71.40021,17.598564],[-71.657662,17.757573],[-71.708305,18.044997],[-71.687738,18.31666],[-71.945112,18.6169],[-71.701303,18.785417],[-71.624873,19.169838],[-71.712361,19.714456]]]}}, -{"type":"Feature","id":"DZA","properties":{"name":"Algeria"},"geometry":{"type":"Polygon","coordinates":[[[11.999506,23.471668],[8.572893,21.565661],[5.677566,19.601207],[4.267419,19.155265],[3.158133,19.057364],[3.146661,19.693579],[2.683588,19.85623],[2.060991,20.142233],[1.823228,20.610809],[-1.550055,22.792666],[-4.923337,24.974574],[-8.6844,27.395744],[-8.665124,27.589479],[-8.66559,27.656426],[-8.674116,28.841289],[-7.059228,29.579228],[-6.060632,29.7317],[-5.242129,30.000443],[-4.859646,30.501188],[-3.690441,30.896952],[-3.647498,31.637294],[-3.06898,31.724498],[-2.616605,32.094346],[-1.307899,32.262889],[-1.124551,32.651522],[-1.388049,32.864015],[-1.733455,33.919713],[-1.792986,34.527919],[-2.169914,35.168396],[-1.208603,35.714849],[-0.127454,35.888662],[0.503877,36.301273],[1.466919,36.605647],[3.161699,36.783905],[4.815758,36.865037],[5.32012,36.716519],[6.26182,37.110655],[7.330385,37.118381],[7.737078,36.885708],[8.420964,36.946427],[8.217824,36.433177],[8.376368,35.479876],[8.140981,34.655146],[7.524482,34.097376],[7.612642,33.344115],[8.430473,32.748337],[8.439103,32.506285],[9.055603,32.102692],[9.48214,30.307556],[9.805634,29.424638],[9.859998,28.95999],[9.683885,28.144174],[9.756128,27.688259],[9.629056,27.140953],[9.716286,26.512206],[9.319411,26.094325],[9.910693,25.365455],[9.948261,24.936954],[10.303847,24.379313],[10.771364,24.562532],[11.560669,24.097909],[11.999506,23.471668]]]}}, -{"type":"Feature","id":"ECU","properties":{"name":"Ecuador"},"geometry":{"type":"Polygon","coordinates":[[[-80.302561,-3.404856],[-79.770293,-2.657512],[-79.986559,-2.220794],[-80.368784,-2.685159],[-80.967765,-2.246943],[-80.764806,-1.965048],[-80.933659,-1.057455],[-80.58337,-0.906663],[-80.399325,-0.283703],[-80.020898,0.36034],[-80.09061,0.768429],[-79.542762,0.982938],[-78.855259,1.380924],[-77.855061,0.809925],[-77.668613,0.825893],[-77.424984,0.395687],[-76.57638,0.256936],[-76.292314,0.416047],[-75.801466,0.084801],[-75.373223,-0.152032],[-75.233723,-0.911417],[-75.544996,-1.56161],[-76.635394,-2.608678],[-77.837905,-3.003021],[-78.450684,-3.873097],[-78.639897,-4.547784],[-79.205289,-4.959129],[-79.624979,-4.454198],[-80.028908,-4.346091],[-80.442242,-4.425724],[-80.469295,-4.059287],[-80.184015,-3.821162],[-80.302561,-3.404856]]]}}, -{"type":"Feature","id":"EGY","properties":{"name":"Egypt"},"geometry":{"type":"Polygon","coordinates":[[[34.9226,29.50133],[34.64174,29.09942],[34.42655,28.34399],[34.15451,27.8233],[33.92136,27.6487],[33.58811,27.97136],[33.13676,28.41765],[32.42323,29.85108],[32.32046,29.76043],[32.73482,28.70523],[33.34876,27.69989],[34.10455,26.14227],[34.47387,25.59856],[34.79507,25.03375],[35.69241,23.92671],[35.49372,23.75237],[35.52598,23.10244],[36.69069,22.20485],[36.86623,22],[32.9,22],[29.02,22],[25,22],[25,25.6825],[25,29.238655],[24.70007,30.04419],[24.95762,30.6616],[24.80287,31.08929],[25.16482,31.56915],[26.49533,31.58568],[27.45762,31.32126],[28.45048,31.02577],[28.91353,30.87005],[29.68342,31.18686],[30.09503,31.4734],[30.97693,31.55586],[31.68796,31.4296],[31.96041,30.9336],[32.19247,31.26034],[32.99392,31.02407],[33.7734,30.96746],[34.26544,31.21936],[34.9226,29.50133]]]}}, -{"type":"Feature","id":"ERI","properties":{"name":"Eritrea"},"geometry":{"type":"Polygon","coordinates":[[[42.35156,12.54223],[42.00975,12.86582],[41.59856,13.45209],[41.155194,13.77332],[40.8966,14.11864],[40.026219,14.519579],[39.34061,14.53155],[39.0994,14.74064],[38.51295,14.50547],[37.90607,14.95943],[37.59377,14.2131],[36.42951,14.42211],[36.323189,14.822481],[36.75386,16.291874],[36.85253,16.95655],[37.16747,17.26314],[37.904,17.42754],[38.41009,17.998307],[38.990623,16.840626],[39.26611,15.922723],[39.814294,15.435647],[41.179275,14.49108],[41.734952,13.921037],[42.276831,13.343992],[42.589576,13.000421],[43.081226,12.699639],[42.779642,12.455416],[42.35156,12.54223]]]}}, -{"type":"Feature","id":"ESP","properties":{"name":"Spain"},"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.984433,42.592775],[-9.392884,43.026625],[-7.97819,43.748338],[-6.754492,43.567909],[-5.411886,43.57424],[-4.347843,43.403449],[-3.517532,43.455901],[-1.901351,43.422802],[-1.502771,43.034014],[0.338047,42.579546],[0.701591,42.795734],[1.826793,42.343385],[2.985999,42.473015],[3.039484,41.89212],[2.091842,41.226089],[0.810525,41.014732],[0.721331,40.678318],[0.106692,40.123934],[-0.278711,39.309978],[0.111291,38.738514],[-0.467124,38.292366],[-0.683389,37.642354],[-1.438382,37.443064],[-2.146453,36.674144],[-3.415781,36.6589],[-4.368901,36.677839],[-4.995219,36.324708],[-5.37716,35.94685],[-5.866432,36.029817],[-6.236694,36.367677],[-6.520191,36.942913],[-7.453726,37.097788],[-7.537105,37.428904],[-7.166508,37.803894],[-7.029281,38.075764],[-7.374092,38.373059],[-7.098037,39.030073],[-7.498632,39.629571],[-7.066592,39.711892],[-7.026413,40.184524],[-6.86402,40.330872],[-6.851127,41.111083],[-6.389088,41.381815],[-6.668606,41.883387],[-7.251309,41.918346],[-7.422513,41.792075],[-8.013175,41.790886],[-8.263857,42.280469],[-8.671946,42.134689],[-9.034818,41.880571]]]}}, -{"type":"Feature","id":"EST","properties":{"name":"Estonia"},"geometry":{"type":"Polygon","coordinates":[[[24.312863,57.793424],[24.428928,58.383413],[24.061198,58.257375],[23.42656,58.612753],[23.339795,59.18724],[24.604214,59.465854],[25.864189,59.61109],[26.949136,59.445803],[27.981114,59.475388],[28.131699,59.300825],[27.420166,58.724581],[27.716686,57.791899],[27.288185,57.474528],[26.463532,57.476389],[25.60281,57.847529],[25.164594,57.970157],[24.312863,57.793424]]]}}, -{"type":"Feature","id":"ETH","properties":{"name":"Ethiopia"},"geometry":{"type":"Polygon","coordinates":[[[37.90607,14.95943],[38.51295,14.50547],[39.0994,14.74064],[39.34061,14.53155],[40.02625,14.51959],[40.8966,14.11864],[41.1552,13.77333],[41.59856,13.45209],[42.00975,12.86582],[42.35156,12.54223],[42,12.1],[41.66176,11.6312],[41.73959,11.35511],[41.75557,11.05091],[42.31414,11.0342],[42.55493,11.10511],[42.776852,10.926879],[42.55876,10.57258],[42.92812,10.02194],[43.29699,9.54048],[43.67875,9.18358],[46.94834,7.99688],[47.78942,8.003],[44.9636,5.00162],[43.66087,4.95755],[42.76967,4.25259],[42.12861,4.23413],[41.855083,3.918912],[41.1718,3.91909],[40.76848,4.25702],[39.85494,3.83879],[39.559384,3.42206],[38.89251,3.50074],[38.67114,3.61607],[38.43697,3.58851],[38.120915,3.598605],[36.855093,4.447864],[36.159079,4.447864],[35.817448,4.776966],[35.817448,5.338232],[35.298007,5.506],[34.70702,6.59422],[34.25032,6.82607],[34.0751,7.22595],[33.56829,7.71334],[32.95418,7.78497],[33.2948,8.35458],[33.8255,8.37916],[33.97498,8.68456],[33.96162,9.58358],[34.25745,10.63009],[34.73115,10.91017],[34.83163,11.31896],[35.26049,12.08286],[35.86363,12.57828],[36.27022,13.56333],[36.42951,14.42211],[37.59377,14.2131],[37.90607,14.95943]]]}}, -{"type":"Feature","id":"FIN","properties":{"name":"Finland"},"geometry":{"type":"Polygon","coordinates":[[[28.59193,69.064777],[28.445944,68.364613],[29.977426,67.698297],[29.054589,66.944286],[30.21765,65.80598],[29.54443,64.948672],[30.444685,64.204453],[30.035872,63.552814],[31.516092,62.867687],[31.139991,62.357693],[30.211107,61.780028],[28.069998,60.503517],[26.255173,60.423961],[24.496624,60.057316],[22.869695,59.846373],[22.290764,60.391921],[21.322244,60.72017],[21.544866,61.705329],[21.059211,62.607393],[21.536029,63.189735],[22.442744,63.81781],[24.730512,64.902344],[25.398068,65.111427],[25.294043,65.534346],[23.903379,66.006927],[23.56588,66.396051],[23.539473,67.936009],[21.978535,68.616846],[20.645593,69.106247],[21.244936,69.370443],[22.356238,68.841741],[23.66205,68.891247],[24.735679,68.649557],[25.689213,69.092114],[26.179622,69.825299],[27.732292,70.164193],[29.015573,69.766491],[28.59193,69.064777]]]}}, -{"type":"Feature","id":"FJI","properties":{"name":"Fiji"},"geometry":{"type":"MultiPolygon","coordinates":[[[[178.3736,-17.33992],[178.71806,-17.62846],[178.55271,-18.15059],[177.93266,-18.28799],[177.38146,-18.16432],[177.28504,-17.72465],[177.67087,-17.38114],[178.12557,-17.50481],[178.3736,-17.33992]]],[[[179.364143,-16.801354],[178.725059,-17.012042],[178.596839,-16.63915],[179.096609,-16.433984],[179.413509,-16.379054],[180,-16.067133],[180,-16.555217],[179.364143,-16.801354]]],[[[-179.917369,-16.501783],[-180,-16.555217],[-180,-16.067133],[-179.79332,-16.020882],[-179.917369,-16.501783]]]]}}, -{"type":"Feature","id":"FLK","properties":{"name":"Falkland Islands"},"geometry":{"type":"Polygon","coordinates":[[[-61.2,-51.85],[-60,-51.25],[-59.15,-51.5],[-58.55,-51.1],[-57.75,-51.55],[-58.05,-51.9],[-59.4,-52.2],[-59.85,-51.85],[-60.7,-52.3],[-61.2,-51.85]]]}}, -{"type":"Feature","id":"FRA","properties":{"name":"France"},"geometry":{"type":"MultiPolygon","coordinates":[[[[9.560016,42.152492],[9.229752,41.380007],[8.775723,41.583612],[8.544213,42.256517],[8.746009,42.628122],[9.390001,43.009985],[9.560016,42.152492]]],[[[3.588184,50.378992],[4.286023,49.907497],[4.799222,49.985373],[5.674052,49.529484],[5.897759,49.442667],[6.18632,49.463803],[6.65823,49.201958],[8.099279,49.017784],[7.593676,48.333019],[7.466759,47.620582],[7.192202,47.449766],[6.736571,47.541801],[6.768714,47.287708],[6.037389,46.725779],[6.022609,46.27299],[6.5001,46.429673],[6.843593,45.991147],[6.802355,45.70858],[7.096652,45.333099],[6.749955,45.028518],[7.007562,44.254767],[7.549596,44.127901],[7.435185,43.693845],[6.529245,43.128892],[4.556963,43.399651],[3.100411,43.075201],[2.985999,42.473015],[1.826793,42.343385],[0.701591,42.795734],[0.338047,42.579546],[-1.502771,43.034014],[-1.901351,43.422802],[-1.384225,44.02261],[-1.193798,46.014918],[-2.225724,47.064363],[-2.963276,47.570327],[-4.491555,47.954954],[-4.59235,48.68416],[-3.295814,48.901692],[-1.616511,48.644421],[-1.933494,49.776342],[-0.989469,49.347376],[1.338761,50.127173],[1.639001,50.946606],[2.513573,51.148506],[2.658422,50.796848],[3.123252,50.780363],[3.588184,50.378992]]]]}}, -{"type":"Feature","id":"GAB","properties":{"name":"Gabon"},"geometry":{"type":"Polygon","coordinates":[[[11.093773,-3.978827],[10.066135,-2.969483],[9.405245,-2.144313],[8.797996,-1.111301],[8.830087,-0.779074],[9.04842,-0.459351],[9.291351,0.268666],[9.492889,1.01012],[9.830284,1.067894],[11.285079,1.057662],[11.276449,2.261051],[11.751665,2.326758],[12.35938,2.192812],[12.951334,2.321616],[13.075822,2.267097],[13.003114,1.830896],[13.282631,1.314184],[14.026669,1.395677],[14.276266,1.19693],[13.843321,0.038758],[14.316418,-0.552627],[14.425456,-1.333407],[14.29921,-1.998276],[13.992407,-2.470805],[13.109619,-2.42874],[12.575284,-1.948511],[12.495703,-2.391688],[11.820964,-2.514161],[11.478039,-2.765619],[11.855122,-3.426871],[11.093773,-3.978827]]]}}, -{"type":"Feature","id":"GBR","properties":{"name":"United Kingdom"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-5.661949,54.554603],[-6.197885,53.867565],[-6.95373,54.073702],[-7.572168,54.059956],[-7.366031,54.595841],[-7.572168,55.131622],[-6.733847,55.17286],[-5.661949,54.554603]]],[[[-3.005005,58.635],[-4.073828,57.553025],[-3.055002,57.690019],[-1.959281,57.6848],[-2.219988,56.870017],[-3.119003,55.973793],[-2.085009,55.909998],[-2.005676,55.804903],[-1.114991,54.624986],[-0.430485,54.464376],[0.184981,53.325014],[0.469977,52.929999],[1.681531,52.73952],[1.559988,52.099998],[1.050562,51.806761],[1.449865,51.289428],[0.550334,50.765739],[-0.787517,50.774989],[-2.489998,50.500019],[-2.956274,50.69688],[-3.617448,50.228356],[-4.542508,50.341837],[-5.245023,49.96],[-5.776567,50.159678],[-4.30999,51.210001],[-3.414851,51.426009],[-3.422719,51.426848],[-4.984367,51.593466],[-5.267296,51.9914],[-4.222347,52.301356],[-4.770013,52.840005],[-4.579999,53.495004],[-3.093831,53.404547],[-3.09208,53.404441],[-2.945009,53.985],[-3.614701,54.600937],[-3.630005,54.615013],[-4.844169,54.790971],[-5.082527,55.061601],[-4.719112,55.508473],[-5.047981,55.783986],[-5.586398,55.311146],[-5.644999,56.275015],[-6.149981,56.78501],[-5.786825,57.818848],[-5.009999,58.630013],[-4.211495,58.550845],[-3.005005,58.635]]]]}}, -{"type":"Feature","id":"GEO","properties":{"name":"Georgia"},"geometry":{"type":"Polygon","coordinates":[[[41.554084,41.535656],[41.703171,41.962943],[41.45347,42.645123],[40.875469,43.013628],[40.321394,43.128634],[39.955009,43.434998],[40.076965,43.553104],[40.922185,43.382159],[42.394395,43.220308],[43.756017,42.740828],[43.9312,42.554974],[44.537623,42.711993],[45.470279,42.502781],[45.77641,42.092444],[46.404951,41.860675],[46.145432,41.722802],[46.637908,41.181673],[46.501637,41.064445],[45.962601,41.123873],[45.217426,41.411452],[44.97248,41.248129],[43.582746,41.092143],[42.619549,41.583173],[41.554084,41.535656]]]}}, -{"type":"Feature","id":"GHA","properties":{"name":"Ghana"},"geometry":{"type":"Polygon","coordinates":[[[1.060122,5.928837],[-0.507638,5.343473],[-1.063625,5.000548],[-1.964707,4.710462],[-2.856125,4.994476],[-2.810701,5.389051],[-3.24437,6.250472],[-2.983585,7.379705],[-2.56219,8.219628],[-2.827496,9.642461],[-2.963896,10.395335],[-2.940409,10.96269],[-1.203358,11.009819],[-0.761576,10.93693],[-0.438702,11.098341],[0.023803,11.018682],[-0.049785,10.706918],[0.36758,10.191213],[0.365901,9.465004],[0.461192,8.677223],[0.712029,8.312465],[0.490957,7.411744],[0.570384,6.914359],[0.836931,6.279979],[1.060122,5.928837]]]}}, -{"type":"Feature","id":"GIN","properties":{"name":"Guinea"},"geometry":{"type":"Polygon","coordinates":[[[-8.439298,7.686043],[-8.722124,7.711674],[-8.926065,7.309037],[-9.208786,7.313921],[-9.403348,7.526905],[-9.33728,7.928534],[-9.755342,8.541055],[-10.016567,8.428504],[-10.230094,8.406206],[-10.505477,8.348896],[-10.494315,8.715541],[-10.65477,8.977178],[-10.622395,9.26791],[-10.839152,9.688246],[-11.117481,10.045873],[-11.917277,10.046984],[-12.150338,9.858572],[-12.425929,9.835834],[-12.596719,9.620188],[-12.711958,9.342712],[-13.24655,8.903049],[-13.685154,9.494744],[-14.074045,9.886167],[-14.330076,10.01572],[-14.579699,10.214467],[-14.693232,10.656301],[-14.839554,10.876572],[-15.130311,11.040412],[-14.685687,11.527824],[-14.382192,11.509272],[-14.121406,11.677117],[-13.9008,11.678719],[-13.743161,11.811269],[-13.828272,12.142644],[-13.718744,12.247186],[-13.700476,12.586183],[-13.217818,12.575874],[-12.499051,12.33209],[-12.278599,12.35444],[-12.203565,12.465648],[-11.658301,12.386583],[-11.513943,12.442988],[-11.456169,12.076834],[-11.297574,12.077971],[-11.036556,12.211245],[-10.87083,12.177887],[-10.593224,11.923975],[-10.165214,11.844084],[-9.890993,12.060479],[-9.567912,12.194243],[-9.327616,12.334286],[-9.127474,12.30806],[-8.905265,12.088358],[-8.786099,11.812561],[-8.376305,11.393646],[-8.581305,11.136246],[-8.620321,10.810891],[-8.407311,10.909257],[-8.282357,10.792597],[-8.335377,10.494812],[-8.029944,10.206535],[-8.229337,10.12902],[-8.309616,9.789532],[-8.079114,9.376224],[-7.8321,8.575704],[-8.203499,8.455453],[-8.299049,8.316444],[-8.221792,8.123329],[-8.280703,7.68718],[-8.439298,7.686043]]]}}, -{"type":"Feature","id":"GMB","properties":{"name":"Gambia"},"geometry":{"type":"Polygon","coordinates":[[[-16.841525,13.151394],[-16.713729,13.594959],[-15.624596,13.623587],[-15.39877,13.860369],[-15.081735,13.876492],[-14.687031,13.630357],[-14.376714,13.62568],[-14.046992,13.794068],[-13.844963,13.505042],[-14.277702,13.280585],[-14.712197,13.298207],[-15.141163,13.509512],[-15.511813,13.27857],[-15.691001,13.270353],[-15.931296,13.130284],[-16.841525,13.151394]]]}}, -{"type":"Feature","id":"GNB","properties":{"name":"Guinea Bissau"},"geometry":{"type":"Polygon","coordinates":[[[-15.130311,11.040412],[-15.66418,11.458474],[-16.085214,11.524594],[-16.314787,11.806515],[-16.308947,11.958702],[-16.613838,12.170911],[-16.677452,12.384852],[-16.147717,12.547762],[-15.816574,12.515567],[-15.548477,12.62817],[-13.700476,12.586183],[-13.718744,12.247186],[-13.828272,12.142644],[-13.743161,11.811269],[-13.9008,11.678719],[-14.121406,11.677117],[-14.382192,11.509272],[-14.685687,11.527824],[-15.130311,11.040412]]]}}, -{"type":"Feature","id":"GNQ","properties":{"name":"Equatorial Guinea"},"geometry":{"type":"Polygon","coordinates":[[[9.492889,1.01012],[9.305613,1.160911],[9.649158,2.283866],[11.276449,2.261051],[11.285079,1.057662],[9.830284,1.067894],[9.492889,1.01012]]]}}, -{"type":"Feature","id":"GRC","properties":{"name":"Greece"},"geometry":{"type":"MultiPolygon","coordinates":[[[[23.69998,35.705004],[24.246665,35.368022],[25.025015,35.424996],[25.769208,35.354018],[25.745023,35.179998],[26.290003,35.29999],[26.164998,35.004995],[24.724982,34.919988],[24.735007,35.084991],[23.514978,35.279992],[23.69998,35.705004]]],[[[26.604196,41.562115],[26.294602,40.936261],[26.056942,40.824123],[25.447677,40.852545],[24.925848,40.947062],[23.714811,40.687129],[24.407999,40.124993],[23.899968,39.962006],[23.342999,39.960998],[22.813988,40.476005],[22.626299,40.256561],[22.849748,39.659311],[23.350027,39.190011],[22.973099,38.970903],[23.530016,38.510001],[24.025025,38.219993],[24.040011,37.655015],[23.115003,37.920011],[23.409972,37.409991],[22.774972,37.30501],[23.154225,36.422506],[22.490028,36.41],[21.670026,36.844986],[21.295011,37.644989],[21.120034,38.310323],[20.730032,38.769985],[20.217712,39.340235],[20.150016,39.624998],[20.615,40.110007],[20.674997,40.435],[20.99999,40.580004],[21.02004,40.842727],[21.674161,40.931275],[22.055378,41.149866],[22.597308,41.130487],[22.76177,41.3048],[22.952377,41.337994],[23.692074,41.309081],[24.492645,41.583896],[25.197201,41.234486],[26.106138,41.328899],[26.117042,41.826905],[26.604196,41.562115]]]]}}, -{"type":"Feature","id":"GRL","properties":{"name":"Greenland"},"geometry":{"type":"Polygon","coordinates":[[[-46.76379,82.62796],[-43.40644,83.22516],[-39.89753,83.18018],[-38.62214,83.54905],[-35.08787,83.64513],[-27.10046,83.51966],[-20.84539,82.72669],[-22.69182,82.34165],[-26.51753,82.29765],[-31.9,82.2],[-31.39646,82.02154],[-27.85666,82.13178],[-24.84448,81.78697],[-22.90328,82.09317],[-22.07175,81.73449],[-23.16961,81.15271],[-20.62363,81.52462],[-15.76818,81.91245],[-12.77018,81.71885],[-12.20855,81.29154],[-16.28533,80.58004],[-16.85,80.35],[-20.04624,80.17708],[-17.73035,80.12912],[-18.9,79.4],[-19.70499,78.75128],[-19.67353,77.63859],[-18.47285,76.98565],[-20.03503,76.94434],[-21.67944,76.62795],[-19.83407,76.09808],[-19.59896,75.24838],[-20.66818,75.15585],[-19.37281,74.29561],[-21.59422,74.22382],[-20.43454,73.81713],[-20.76234,73.46436],[-22.17221,73.30955],[-23.56593,73.30663],[-22.31311,72.62928],[-22.29954,72.18409],[-24.27834,72.59788],[-24.79296,72.3302],[-23.44296,72.08016],[-22.13281,71.46898],[-21.75356,70.66369],[-23.53603,70.471],[-24.30702,70.85649],[-25.54341,71.43094],[-25.20135,70.75226],[-26.36276,70.22646],[-23.72742,70.18401],[-22.34902,70.12946],[-25.02927,69.2588],[-27.74737,68.47046],[-30.67371,68.12503],[-31.77665,68.12078],[-32.81105,67.73547],[-34.20196,66.67974],[-36.35284,65.9789],[-37.04378,65.93768],[-38.37505,65.69213],[-39.81222,65.45848],[-40.66899,64.83997],[-40.68281,64.13902],[-41.1887,63.48246],[-42.81938,62.68233],[-42.41666,61.90093],[-42.86619,61.07404],[-43.3784,60.09772],[-44.7875,60.03676],[-46.26364,60.85328],[-48.26294,60.85843],[-49.23308,61.40681],[-49.90039,62.38336],[-51.63325,63.62691],[-52.14014,64.27842],[-52.27659,65.1767],[-53.66166,66.09957],[-53.30161,66.8365],[-53.96911,67.18899],[-52.9804,68.35759],[-51.47536,68.72958],[-51.08041,69.14781],[-50.87122,69.9291],[-52.013585,69.574925],[-52.55792,69.42616],[-53.45629,69.283625],[-54.68336,69.61003],[-54.75001,70.28932],[-54.35884,70.821315],[-53.431315,70.835755],[-51.39014,70.56978],[-53.10937,71.20485],[-54.00422,71.54719],[-55,71.406537],[-55.83468,71.65444],[-54.71819,72.58625],[-55.32634,72.95861],[-56.12003,73.64977],[-57.32363,74.71026],[-58.59679,75.09861],[-58.58516,75.51727],[-61.26861,76.10238],[-63.39165,76.1752],[-66.06427,76.13486],[-68.50438,76.06141],[-69.66485,76.37975],[-71.40257,77.00857],[-68.77671,77.32312],[-66.76397,77.37595],[-71.04293,77.63595],[-73.297,78.04419],[-73.15938,78.43271],[-69.37345,78.91388],[-65.7107,79.39436],[-65.3239,79.75814],[-68.02298,80.11721],[-67.15129,80.51582],[-63.68925,81.21396],[-62.23444,81.3211],[-62.65116,81.77042],[-60.28249,82.03363],[-57.20744,82.19074],[-54.13442,82.19962],[-53.04328,81.88833],[-50.39061,82.43883],[-48.00386,82.06481],[-46.59984,81.985945],[-44.523,81.6607],[-46.9007,82.19979],[-46.76379,82.62796]]]}}, -{"type":"Feature","id":"GTM","properties":{"name":"Guatemala"},"geometry":{"type":"Polygon","coordinates":[[[-90.095555,13.735338],[-90.608624,13.909771],[-91.23241,13.927832],[-91.689747,14.126218],[-92.22775,14.538829],[-92.20323,14.830103],[-92.087216,15.064585],[-92.229249,15.251447],[-91.74796,16.066565],[-90.464473,16.069562],[-90.438867,16.41011],[-90.600847,16.470778],[-90.711822,16.687483],[-91.08167,16.918477],[-91.453921,17.252177],[-91.002269,17.254658],[-91.00152,17.817595],[-90.067934,17.819326],[-89.14308,17.808319],[-89.150806,17.015577],[-89.229122,15.886938],[-88.930613,15.887273],[-88.604586,15.70638],[-88.518364,15.855389],[-88.225023,15.727722],[-88.68068,15.346247],[-89.154811,15.066419],[-89.22522,14.874286],[-89.145535,14.678019],[-89.353326,14.424133],[-89.587343,14.362586],[-89.534219,14.244816],[-89.721934,14.134228],[-90.064678,13.88197],[-90.095555,13.735338]]]}}, -{"type":"Feature","id":"GUF","properties":{"name":"French Guiana"},"geometry":{"type":"Polygon","coordinates":[[[-52.556425,2.504705],[-52.939657,2.124858],[-53.418465,2.053389],[-53.554839,2.334897],[-53.778521,2.376703],[-54.088063,2.105557],[-54.524754,2.311849],[-54.27123,2.738748],[-54.184284,3.194172],[-54.011504,3.62257],[-54.399542,4.212611],[-54.478633,4.896756],[-53.958045,5.756548],[-53.618453,5.646529],[-52.882141,5.409851],[-51.823343,4.565768],[-51.657797,4.156232],[-52.249338,3.241094],[-52.556425,2.504705]]]}}, -{"type":"Feature","id":"GUY","properties":{"name":"Guyana"},"geometry":{"type":"Polygon","coordinates":[[[-59.758285,8.367035],[-59.101684,7.999202],[-58.482962,7.347691],[-58.454876,6.832787],[-58.078103,6.809094],[-57.542219,6.321268],[-57.147436,5.97315],[-57.307246,5.073567],[-57.914289,4.812626],[-57.86021,4.576801],[-58.044694,4.060864],[-57.601569,3.334655],[-57.281433,3.333492],[-57.150098,2.768927],[-56.539386,1.899523],[-56.782704,1.863711],[-57.335823,1.948538],[-57.660971,1.682585],[-58.11345,1.507195],[-58.429477,1.463942],[-58.540013,1.268088],[-59.030862,1.317698],[-59.646044,1.786894],[-59.718546,2.24963],[-59.974525,2.755233],[-59.815413,3.606499],[-59.53804,3.958803],[-59.767406,4.423503],[-60.111002,4.574967],[-59.980959,5.014061],[-60.213683,5.244486],[-60.733574,5.200277],[-61.410303,5.959068],[-61.139415,6.234297],[-61.159336,6.696077],[-60.543999,6.856584],[-60.295668,7.043911],[-60.637973,7.415],[-60.550588,7.779603],[-59.758285,8.367035]]]}}, -{"type":"Feature","id":"HND","properties":{"name":"Honduras"},"geometry":{"type":"Polygon","coordinates":[[[-87.316654,12.984686],[-87.489409,13.297535],[-87.793111,13.38448],[-87.723503,13.78505],[-87.859515,13.893312],[-88.065343,13.964626],[-88.503998,13.845486],[-88.541231,13.980155],[-88.843073,14.140507],[-89.058512,14.340029],[-89.353326,14.424133],[-89.145535,14.678019],[-89.22522,14.874286],[-89.154811,15.066419],[-88.68068,15.346247],[-88.225023,15.727722],[-88.121153,15.688655],[-87.901813,15.864458],[-87.61568,15.878799],[-87.522921,15.797279],[-87.367762,15.84694],[-86.903191,15.756713],[-86.440946,15.782835],[-86.119234,15.893449],[-86.001954,16.005406],[-85.683317,15.953652],[-85.444004,15.885749],[-85.182444,15.909158],[-84.983722,15.995923],[-84.52698,15.857224],[-84.368256,15.835158],[-84.063055,15.648244],[-83.773977,15.424072],[-83.410381,15.270903],[-83.147219,14.995829],[-83.489989,15.016267],[-83.628585,14.880074],[-83.975721,14.749436],[-84.228342,14.748764],[-84.449336,14.621614],[-84.649582,14.666805],[-84.820037,14.819587],[-84.924501,14.790493],[-85.052787,14.551541],[-85.148751,14.560197],[-85.165365,14.35437],[-85.514413,14.079012],[-85.698665,13.960078],[-85.801295,13.836055],[-86.096264,14.038187],[-86.312142,13.771356],[-86.520708,13.778487],[-86.755087,13.754845],[-86.733822,13.263093],[-86.880557,13.254204],[-87.005769,13.025794],[-87.316654,12.984686]]]}}, -{"type":"Feature","id":"HRV","properties":{"name":"Croatia"},"geometry":{"type":"Polygon","coordinates":[[[18.829838,45.908878],[19.072769,45.521511],[19.390476,45.236516],[19.005486,44.860234],[18.553214,45.08159],[17.861783,45.06774],[17.002146,45.233777],[16.534939,45.211608],[16.318157,45.004127],[15.959367,45.233777],[15.750026,44.818712],[16.23966,44.351143],[16.456443,44.04124],[16.916156,43.667722],[17.297373,43.446341],[17.674922,43.028563],[18.56,42.65],[18.450016,42.479991],[17.50997,42.849995],[16.930006,43.209998],[16.015385,43.507215],[15.174454,44.243191],[15.37625,44.317915],[14.920309,44.738484],[14.901602,45.07606],[14.258748,45.233777],[13.952255,44.802124],[13.656976,45.136935],[13.679403,45.484149],[13.71506,45.500324],[14.411968,45.466166],[14.595109,45.634941],[14.935244,45.471695],[15.327675,45.452316],[15.323954,45.731783],[15.67153,45.834154],[15.768733,46.238108],[16.564808,46.503751],[16.882515,46.380632],[17.630066,45.951769],[18.456062,45.759481],[18.829838,45.908878]]]}}, -{"type":"Feature","id":"HTI","properties":{"name":"Haiti"},"geometry":{"type":"Polygon","coordinates":[[[-73.189791,19.915684],[-72.579673,19.871501],[-71.712361,19.714456],[-71.624873,19.169838],[-71.701303,18.785417],[-71.945112,18.6169],[-71.687738,18.31666],[-71.708305,18.044997],[-72.372476,18.214961],[-72.844411,18.145611],[-73.454555,18.217906],[-73.922433,18.030993],[-74.458034,18.34255],[-74.369925,18.664908],[-73.449542,18.526053],[-72.694937,18.445799],[-72.334882,18.668422],[-72.79165,19.101625],[-72.784105,19.483591],[-73.415022,19.639551],[-73.189791,19.915684]]]}}, -{"type":"Feature","id":"HUN","properties":{"name":"Hungary"},"geometry":{"type":"Polygon","coordinates":[[[16.202298,46.852386],[16.534268,47.496171],[16.340584,47.712902],[16.903754,47.714866],[16.979667,48.123497],[17.488473,47.867466],[17.857133,47.758429],[18.696513,47.880954],[18.777025,48.081768],[19.174365,48.111379],[19.661364,48.266615],[19.769471,48.202691],[20.239054,48.327567],[20.473562,48.56285],[20.801294,48.623854],[21.872236,48.319971],[22.085608,48.422264],[22.64082,48.15024],[22.710531,47.882194],[22.099768,47.672439],[21.626515,46.994238],[21.021952,46.316088],[20.220192,46.127469],[19.596045,46.17173],[18.829838,45.908878],[18.456062,45.759481],[17.630066,45.951769],[16.882515,46.380632],[16.564808,46.503751],[16.370505,46.841327],[16.202298,46.852386]]]}}, -{"type":"Feature","id":"IDN","properties":{"name":"Indonesia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[120.715609,-10.239581],[120.295014,-10.25865],[118.967808,-9.557969],[119.90031,-9.36134],[120.425756,-9.665921],[120.775502,-9.969675],[120.715609,-10.239581]]],[[[124.43595,-10.140001],[123.579982,-10.359987],[123.459989,-10.239995],[123.550009,-9.900016],[123.980009,-9.290027],[124.968682,-8.89279],[125.07002,-9.089987],[125.08852,-9.393173],[124.43595,-10.140001]]],[[[117.900018,-8.095681],[118.260616,-8.362383],[118.87846,-8.280683],[119.126507,-8.705825],[117.970402,-8.906639],[117.277731,-9.040895],[116.740141,-9.032937],[117.083737,-8.457158],[117.632024,-8.449303],[117.900018,-8.095681]]],[[[122.903537,-8.094234],[122.756983,-8.649808],[121.254491,-8.933666],[119.924391,-8.810418],[119.920929,-8.444859],[120.715092,-8.236965],[121.341669,-8.53674],[122.007365,-8.46062],[122.903537,-8.094234]]],[[[108.623479,-6.777674],[110.539227,-6.877358],[110.759576,-6.465186],[112.614811,-6.946036],[112.978768,-7.594213],[114.478935,-7.776528],[115.705527,-8.370807],[114.564511,-8.751817],[113.464734,-8.348947],[112.559672,-8.376181],[111.522061,-8.302129],[110.58615,-8.122605],[109.427667,-7.740664],[108.693655,-7.6416],[108.277763,-7.766657],[106.454102,-7.3549],[106.280624,-6.9249],[105.365486,-6.851416],[106.051646,-5.895919],[107.265009,-5.954985],[108.072091,-6.345762],[108.486846,-6.421985],[108.623479,-6.777674]]],[[[134.724624,-6.214401],[134.210134,-6.895238],[134.112776,-6.142467],[134.290336,-5.783058],[134.499625,-5.445042],[134.727002,-5.737582],[134.724624,-6.214401]]],[[[127.249215,-3.459065],[126.874923,-3.790983],[126.183802,-3.607376],[125.989034,-3.177273],[127.000651,-3.129318],[127.249215,-3.459065]]],[[[130.471344,-3.093764],[130.834836,-3.858472],[129.990547,-3.446301],[129.155249,-3.362637],[128.590684,-3.428679],[127.898891,-3.393436],[128.135879,-2.84365],[129.370998,-2.802154],[130.471344,-3.093764]]],[[[134.143368,-1.151867],[134.422627,-2.769185],[135.457603,-3.367753],[136.293314,-2.307042],[137.440738,-1.703513],[138.329727,-1.702686],[139.184921,-2.051296],[139.926684,-2.409052],[141.00021,-2.600151],[141.017057,-5.859022],[141.033852,-9.117893],[140.143415,-8.297168],[139.127767,-8.096043],[138.881477,-8.380935],[137.614474,-8.411683],[138.039099,-7.597882],[138.668621,-7.320225],[138.407914,-6.232849],[137.92784,-5.393366],[135.98925,-4.546544],[135.164598,-4.462931],[133.66288,-3.538853],[133.367705,-4.024819],[132.983956,-4.112979],[132.756941,-3.746283],[132.753789,-3.311787],[131.989804,-2.820551],[133.066845,-2.460418],[133.780031,-2.479848],[133.696212,-2.214542],[132.232373,-2.212526],[131.836222,-1.617162],[130.94284,-1.432522],[130.519558,-0.93772],[131.867538,-0.695461],[132.380116,-0.369538],[133.985548,-0.78021],[134.143368,-1.151867]]],[[[125.240501,1.419836],[124.437035,0.427881],[123.685505,0.235593],[122.723083,0.431137],[121.056725,0.381217],[120.183083,0.237247],[120.04087,-0.519658],[120.935905,-1.408906],[121.475821,-0.955962],[123.340565,-0.615673],[123.258399,-1.076213],[122.822715,-0.930951],[122.38853,-1.516858],[121.508274,-1.904483],[122.454572,-3.186058],[122.271896,-3.5295],[123.170963,-4.683693],[123.162333,-5.340604],[122.628515,-5.634591],[122.236394,-5.282933],[122.719569,-4.464172],[121.738234,-4.851331],[121.489463,-4.574553],[121.619171,-4.188478],[120.898182,-3.602105],[120.972389,-2.627643],[120.305453,-2.931604],[120.390047,-4.097579],[120.430717,-5.528241],[119.796543,-5.6734],[119.366906,-5.379878],[119.653606,-4.459417],[119.498835,-3.494412],[119.078344,-3.487022],[118.767769,-2.801999],[119.180974,-2.147104],[119.323394,-1.353147],[119.825999,0.154254],[120.035702,0.566477],[120.885779,1.309223],[121.666817,1.013944],[122.927567,0.875192],[124.077522,0.917102],[125.065989,1.643259],[125.240501,1.419836]]],[[[128.688249,1.132386],[128.635952,0.258486],[128.12017,0.356413],[127.968034,-0.252077],[128.379999,-0.780004],[128.100016,-0.899996],[127.696475,-0.266598],[127.39949,1.011722],[127.600512,1.810691],[127.932378,2.174596],[128.004156,1.628531],[128.594559,1.540811],[128.688249,1.132386]]],[[[117.875627,1.827641],[118.996747,0.902219],[117.811858,0.784242],[117.478339,0.102475],[117.521644,-0.803723],[116.560048,-1.487661],[116.533797,-2.483517],[116.148084,-4.012726],[116.000858,-3.657037],[114.864803,-4.106984],[114.468652,-3.495704],[113.755672,-3.43917],[113.256994,-3.118776],[112.068126,-3.478392],[111.703291,-2.994442],[111.04824,-3.049426],[110.223846,-2.934032],[110.070936,-1.592874],[109.571948,-1.314907],[109.091874,-0.459507],[108.952658,0.415375],[109.069136,1.341934],[109.66326,2.006467],[109.830227,1.338136],[110.514061,0.773131],[111.159138,0.976478],[111.797548,0.904441],[112.380252,1.410121],[112.859809,1.49779],[113.80585,1.217549],[114.621355,1.430688],[115.134037,2.821482],[115.519078,3.169238],[115.865517,4.306559],[117.015214,4.306094],[117.882035,4.137551],[117.313232,3.234428],[118.04833,2.28769],[117.875627,1.827641]]],[[[105.817655,-5.852356],[104.710384,-5.873285],[103.868213,-5.037315],[102.584261,-4.220259],[102.156173,-3.614146],[101.399113,-2.799777],[100.902503,-2.050262],[100.141981,-0.650348],[99.26374,0.183142],[98.970011,1.042882],[98.601351,1.823507],[97.699598,2.453184],[97.176942,3.308791],[96.424017,3.86886],[95.380876,4.970782],[95.293026,5.479821],[95.936863,5.439513],[97.484882,5.246321],[98.369169,4.26837],[99.142559,3.59035],[99.693998,3.174329],[100.641434,2.099381],[101.658012,2.083697],[102.498271,1.3987],[103.07684,0.561361],[103.838396,0.104542],[103.437645,-0.711946],[104.010789,-1.059212],[104.369991,-1.084843],[104.53949,-1.782372],[104.887893,-2.340425],[105.622111,-2.428844],[106.108593,-3.061777],[105.857446,-4.305525],[105.817655,-5.852356]]]]}}, -{"type":"Feature","id":"IND","properties":{"name":"India"},"geometry":{"type":"Polygon","coordinates":[[[77.837451,35.49401],[78.912269,34.321936],[78.811086,33.506198],[79.208892,32.994395],[79.176129,32.48378],[78.458446,32.618164],[78.738894,31.515906],[79.721367,30.882715],[81.111256,30.183481],[80.476721,29.729865],[80.088425,28.79447],[81.057203,28.416095],[81.999987,27.925479],[83.304249,27.364506],[84.675018,27.234901],[85.251779,26.726198],[86.024393,26.630985],[87.227472,26.397898],[88.060238,26.414615],[88.174804,26.810405],[88.043133,27.445819],[88.120441,27.876542],[88.730326,28.086865],[88.814248,27.299316],[88.835643,27.098966],[89.744528,26.719403],[90.373275,26.875724],[91.217513,26.808648],[92.033484,26.83831],[92.103712,27.452614],[91.696657,27.771742],[92.503119,27.896876],[93.413348,28.640629],[94.56599,29.277438],[95.404802,29.031717],[96.117679,29.452802],[96.586591,28.83098],[96.248833,28.411031],[97.327114,28.261583],[97.402561,27.882536],[97.051989,27.699059],[97.133999,27.083774],[96.419366,27.264589],[95.124768,26.573572],[95.155153,26.001307],[94.603249,25.162495],[94.552658,24.675238],[94.106742,23.850741],[93.325188,24.078556],[93.286327,23.043658],[93.060294,22.703111],[93.166128,22.27846],[92.672721,22.041239],[92.146035,23.627499],[91.869928,23.624346],[91.706475,22.985264],[91.158963,23.503527],[91.46773,24.072639],[91.915093,24.130414],[92.376202,24.976693],[91.799596,25.147432],[90.872211,25.132601],[89.920693,25.26975],[89.832481,25.965082],[89.355094,26.014407],[88.563049,26.446526],[88.209789,25.768066],[88.931554,25.238692],[88.306373,24.866079],[88.084422,24.501657],[88.69994,24.233715],[88.52977,23.631142],[88.876312,22.879146],[89.031961,22.055708],[88.888766,21.690588],[88.208497,21.703172],[86.975704,21.495562],[87.033169,20.743308],[86.499351,20.151638],[85.060266,19.478579],[83.941006,18.30201],[83.189217,17.671221],[82.192792,17.016636],[82.191242,16.556664],[81.692719,16.310219],[80.791999,15.951972],[80.324896,15.899185],[80.025069,15.136415],[80.233274,13.835771],[80.286294,13.006261],[79.862547,12.056215],[79.857999,10.357275],[79.340512,10.308854],[78.885345,9.546136],[79.18972,9.216544],[78.277941,8.933047],[77.941165,8.252959],[77.539898,7.965535],[76.592979,8.899276],[76.130061,10.29963],[75.746467,11.308251],[75.396101,11.781245],[74.864816,12.741936],[74.616717,13.992583],[74.443859,14.617222],[73.534199,15.990652],[73.119909,17.92857],[72.820909,19.208234],[72.824475,20.419503],[72.630533,21.356009],[71.175273,20.757441],[70.470459,20.877331],[69.16413,22.089298],[69.644928,22.450775],[69.349597,22.84318],[68.176645,23.691965],[68.842599,24.359134],[71.04324,24.356524],[70.844699,25.215102],[70.282873,25.722229],[70.168927,26.491872],[69.514393,26.940966],[70.616496,27.989196],[71.777666,27.91318],[72.823752,28.961592],[73.450638,29.976413],[74.42138,30.979815],[74.405929,31.692639],[75.258642,32.271105],[74.451559,32.7649],[74.104294,33.441473],[73.749948,34.317699],[74.240203,34.748887],[75.757061,34.504923],[76.871722,34.653544],[77.837451,35.49401]]]}}, -{"type":"Feature","id":"IRL","properties":{"name":"Ireland"},"geometry":{"type":"Polygon","coordinates":[[[-6.197885,53.867565],[-6.032985,53.153164],[-6.788857,52.260118],[-8.561617,51.669301],[-9.977086,51.820455],[-9.166283,52.864629],[-9.688525,53.881363],[-8.327987,54.664519],[-7.572168,55.131622],[-7.366031,54.595841],[-7.572168,54.059956],[-6.95373,54.073702],[-6.197885,53.867565]]]}}, -{"type":"Feature","id":"IRN","properties":{"name":"Iran"},"geometry":{"type":"Polygon","coordinates":[[[53.921598,37.198918],[54.800304,37.392421],[55.511578,37.964117],[56.180375,37.935127],[56.619366,38.121394],[57.330434,38.029229],[58.436154,37.522309],[59.234762,37.412988],[60.377638,36.527383],[61.123071,36.491597],[61.210817,35.650072],[60.803193,34.404102],[60.52843,33.676446],[60.9637,33.528832],[60.536078,32.981269],[60.863655,32.18292],[60.941945,31.548075],[61.699314,31.379506],[61.781222,30.73585],[60.874248,29.829239],[61.369309,29.303276],[61.771868,28.699334],[62.72783,28.259645],[62.755426,27.378923],[63.233898,27.217047],[63.316632,26.756532],[61.874187,26.239975],[61.497363,25.078237],[59.616134,25.380157],[58.525761,25.609962],[57.397251,25.739902],[56.970766,26.966106],[56.492139,27.143305],[55.72371,26.964633],[54.71509,26.480658],[53.493097,26.812369],[52.483598,27.580849],[51.520763,27.86569],[50.852948,28.814521],[50.115009,30.147773],[49.57685,29.985715],[48.941333,30.31709],[48.567971,29.926778],[48.014568,30.452457],[48.004698,30.985137],[47.685286,30.984853],[47.849204,31.709176],[47.334661,32.469155],[46.109362,33.017287],[45.416691,33.967798],[45.64846,34.748138],[46.151788,35.093259],[46.07634,35.677383],[45.420618,35.977546],[44.77267,37.17045],[44.225756,37.971584],[44.421403,38.281281],[44.109225,39.428136],[44.79399,39.713003],[44.952688,39.335765],[45.457722,38.874139],[46.143623,38.741201],[46.50572,38.770605],[47.685079,39.508364],[48.060095,39.582235],[48.355529,39.288765],[48.010744,38.794015],[48.634375,38.270378],[48.883249,38.320245],[49.199612,37.582874],[50.147771,37.374567],[50.842354,36.872814],[52.264025,36.700422],[53.82579,36.965031],[53.921598,37.198918]]]}}, -{"type":"Feature","id":"IRQ","properties":{"name":"Iraq"},"geometry":{"type":"Polygon","coordinates":[[[45.420618,35.977546],[46.07634,35.677383],[46.151788,35.093259],[45.64846,34.748138],[45.416691,33.967798],[46.109362,33.017287],[47.334661,32.469155],[47.849204,31.709176],[47.685286,30.984853],[48.004698,30.985137],[48.014568,30.452457],[48.567971,29.926778],[47.974519,29.975819],[47.302622,30.05907],[46.568713,29.099025],[44.709499,29.178891],[41.889981,31.190009],[40.399994,31.889992],[39.195468,32.161009],[38.792341,33.378686],[41.006159,34.419372],[41.383965,35.628317],[41.289707,36.358815],[41.837064,36.605854],[42.349591,37.229873],[42.779126,37.385264],[43.942259,37.256228],[44.293452,37.001514],[44.772699,37.170445],[45.420618,35.977546]]]}}, -{"type":"Feature","id":"ISL","properties":{"name":"Iceland"},"geometry":{"type":"Polygon","coordinates":[[[-14.508695,66.455892],[-14.739637,65.808748],[-13.609732,65.126671],[-14.909834,64.364082],[-17.794438,63.678749],[-18.656246,63.496383],[-19.972755,63.643635],[-22.762972,63.960179],[-21.778484,64.402116],[-23.955044,64.89113],[-22.184403,65.084968],[-22.227423,65.378594],[-24.326184,65.611189],[-23.650515,66.262519],[-22.134922,66.410469],[-20.576284,65.732112],[-19.056842,66.276601],[-17.798624,65.993853],[-16.167819,66.526792],[-14.508695,66.455892]]]}}, -{"type":"Feature","id":"ISR","properties":{"name":"Israel"},"geometry":{"type":"Polygon","coordinates":[[[35.719918,32.709192],[35.545665,32.393992],[35.18393,32.532511],[34.974641,31.866582],[35.225892,31.754341],[34.970507,31.616778],[34.927408,31.353435],[35.397561,31.489086],[35.420918,31.100066],[34.922603,29.501326],[34.265433,31.219361],[34.556372,31.548824],[34.488107,31.605539],[34.752587,32.072926],[34.955417,32.827376],[35.098457,33.080539],[35.126053,33.0909],[35.460709,33.08904],[35.552797,33.264275],[35.821101,33.277426],[35.836397,32.868123],[35.700798,32.716014],[35.719918,32.709192]]]}}, -{"type":"Feature","id":"ITA","properties":{"name":"Italy"},"geometry":{"type":"MultiPolygon","coordinates":[[[[15.520376,38.231155],[15.160243,37.444046],[15.309898,37.134219],[15.099988,36.619987],[14.335229,36.996631],[13.826733,37.104531],[12.431004,37.61295],[12.570944,38.126381],[13.741156,38.034966],[14.761249,38.143874],[15.520376,38.231155]]],[[[9.210012,41.209991],[9.809975,40.500009],[9.669519,39.177376],[9.214818,39.240473],[8.806936,38.906618],[8.428302,39.171847],[8.388253,40.378311],[8.159998,40.950007],[8.709991,40.899984],[9.210012,41.209991]]],[[[12.376485,46.767559],[13.806475,46.509306],[13.69811,46.016778],[13.93763,45.591016],[13.141606,45.736692],[12.328581,45.381778],[12.383875,44.885374],[12.261453,44.600482],[12.589237,44.091366],[13.526906,43.587727],[14.029821,42.761008],[15.14257,41.95514],[15.926191,41.961315],[16.169897,41.740295],[15.889346,41.541082],[16.785002,41.179606],[17.519169,40.877143],[18.376687,40.355625],[18.480247,40.168866],[18.293385,39.810774],[17.73838,40.277671],[16.869596,40.442235],[16.448743,39.795401],[17.17149,39.4247],[17.052841,38.902871],[16.635088,38.843572],[16.100961,37.985899],[15.684087,37.908849],[15.687963,38.214593],[15.891981,38.750942],[16.109332,38.964547],[15.718814,39.544072],[15.413613,40.048357],[14.998496,40.172949],[14.703268,40.60455],[14.060672,40.786348],[13.627985,41.188287],[12.888082,41.25309],[12.106683,41.704535],[11.191906,42.355425],[10.511948,42.931463],[10.200029,43.920007],[9.702488,44.036279],[8.888946,44.366336],[8.428561,44.231228],[7.850767,43.767148],[7.435185,43.693845],[7.549596,44.127901],[7.007562,44.254767],[6.749955,45.028518],[7.096652,45.333099],[6.802355,45.70858],[6.843593,45.991147],[7.273851,45.776948],[7.755992,45.82449],[8.31663,46.163642],[8.489952,46.005151],[8.966306,46.036932],[9.182882,46.440215],[9.922837,46.314899],[10.363378,46.483571],[10.442701,46.893546],[11.048556,46.751359],[11.164828,46.941579],[12.153088,47.115393],[12.376485,46.767559]]]]}}, -{"type":"Feature","id":"JAM","properties":{"name":"Jamaica"},"geometry":{"type":"Polygon","coordinates":[[[-77.569601,18.490525],[-76.896619,18.400867],[-76.365359,18.160701],[-76.199659,17.886867],[-76.902561,17.868238],[-77.206341,17.701116],[-77.766023,17.861597],[-78.337719,18.225968],[-78.217727,18.454533],[-77.797365,18.524218],[-77.569601,18.490525]]]}}, -{"type":"Feature","id":"JOR","properties":{"name":"Jordan"},"geometry":{"type":"Polygon","coordinates":[[[35.545665,32.393992],[35.719918,32.709192],[36.834062,32.312938],[38.792341,33.378686],[39.195468,32.161009],[39.004886,32.010217],[37.002166,31.508413],[37.998849,30.5085],[37.66812,30.338665],[37.503582,30.003776],[36.740528,29.865283],[36.501214,29.505254],[36.068941,29.197495],[34.956037,29.356555],[34.922603,29.501326],[35.420918,31.100066],[35.397561,31.489086],[35.545252,31.782505],[35.545665,32.393992]]]}}, -{"type":"Feature","id":"JPN","properties":{"name":"Japan"},"geometry":{"type":"MultiPolygon","coordinates":[[[[134.638428,34.149234],[134.766379,33.806335],[134.203416,33.201178],[133.79295,33.521985],[133.280268,33.28957],[133.014858,32.704567],[132.363115,32.989382],[132.371176,33.463642],[132.924373,34.060299],[133.492968,33.944621],[133.904106,34.364931],[134.638428,34.149234]]],[[[140.976388,37.142074],[140.59977,36.343983],[140.774074,35.842877],[140.253279,35.138114],[138.975528,34.6676],[137.217599,34.606286],[135.792983,33.464805],[135.120983,33.849071],[135.079435,34.596545],[133.340316,34.375938],[132.156771,33.904933],[130.986145,33.885761],[132.000036,33.149992],[131.33279,31.450355],[130.686318,31.029579],[130.20242,31.418238],[130.447676,32.319475],[129.814692,32.61031],[129.408463,33.296056],[130.353935,33.604151],[130.878451,34.232743],[131.884229,34.749714],[132.617673,35.433393],[134.608301,35.731618],[135.677538,35.527134],[136.723831,37.304984],[137.390612,36.827391],[138.857602,37.827485],[139.426405,38.215962],[140.05479,39.438807],[139.883379,40.563312],[140.305783,41.195005],[141.368973,41.37856],[141.914263,39.991616],[141.884601,39.180865],[140.959489,38.174001],[140.976388,37.142074]]],[[[143.910162,44.1741],[144.613427,43.960883],[145.320825,44.384733],[145.543137,43.262088],[144.059662,42.988358],[143.18385,41.995215],[141.611491,42.678791],[141.067286,41.584594],[139.955106,41.569556],[139.817544,42.563759],[140.312087,43.333273],[141.380549,43.388825],[141.671952,44.772125],[141.967645,45.551483],[143.14287,44.510358],[143.910162,44.1741]]]]}}, -{"type":"Feature","id":"KAZ","properties":{"name":"Kazakhstan"},"geometry":{"type":"Polygon","coordinates":[[[70.962315,42.266154],[70.388965,42.081308],[69.070027,41.384244],[68.632483,40.668681],[68.259896,40.662325],[67.985856,41.135991],[66.714047,41.168444],[66.510649,41.987644],[66.023392,41.994646],[66.098012,42.99766],[64.900824,43.728081],[63.185787,43.650075],[62.0133,43.504477],[61.05832,44.405817],[60.239972,44.784037],[58.689989,45.500014],[58.503127,45.586804],[55.928917,44.995858],[55.968191,41.308642],[55.455251,41.259859],[54.755345,42.043971],[54.079418,42.324109],[52.944293,42.116034],[52.50246,41.783316],[52.446339,42.027151],[52.692112,42.443895],[52.501426,42.792298],[51.342427,43.132975],[50.891292,44.031034],[50.339129,44.284016],[50.305643,44.609836],[51.278503,44.514854],[51.316899,45.245998],[52.16739,45.408391],[53.040876,45.259047],[53.220866,46.234646],[53.042737,46.853006],[52.042023,46.804637],[51.191945,47.048705],[50.034083,46.60899],[49.10116,46.39933],[48.593241,46.561034],[48.694734,47.075628],[48.057253,47.743753],[47.315231,47.715847],[46.466446,48.394152],[47.043672,49.152039],[46.751596,49.356006],[47.54948,50.454698],[48.577841,49.87476],[48.702382,50.605128],[50.766648,51.692762],[52.328724,51.718652],[54.532878,51.02624],[55.716941,50.621717],[56.777961,51.043551],[58.363291,51.063653],[59.642282,50.545442],[59.932807,50.842194],[61.337424,50.79907],[61.588003,51.272659],[59.967534,51.96042],[60.927269,52.447548],[60.739993,52.719986],[61.699986,52.979996],[60.978066,53.664993],[61.436591,54.006265],[65.178534,54.354228],[65.666876,54.601267],[68.1691,54.970392],[69.068167,55.38525],[70.865267,55.169734],[71.180131,54.133285],[72.22415,54.376655],[73.508516,54.035617],[73.425679,53.48981],[74.384845,53.546861],[76.8911,54.490524],[76.525179,54.177003],[77.800916,53.404415],[80.03556,50.864751],[80.568447,51.388336],[81.945986,50.812196],[83.383004,51.069183],[83.935115,50.889246],[84.416377,50.3114],[85.11556,50.117303],[85.54127,49.692859],[86.829357,49.826675],[87.35997,49.214981],[86.598776,48.549182],[85.768233,48.455751],[85.720484,47.452969],[85.16429,47.000956],[83.180484,47.330031],[82.458926,45.53965],[81.947071,45.317027],[79.966106,44.917517],[80.866206,43.180362],[80.18015,42.920068],[80.25999,42.349999],[79.643645,42.496683],[79.142177,42.856092],[77.658392,42.960686],[76.000354,42.988022],[75.636965,42.8779],[74.212866,43.298339],[73.645304,43.091272],[73.489758,42.500894],[71.844638,42.845395],[71.186281,42.704293],[70.962315,42.266154]]]}}, -{"type":"Feature","id":"KEN","properties":{"name":"Kenya"},"geometry":{"type":"Polygon","coordinates":[[[40.993,-0.85829],[41.58513,-1.68325],[40.88477,-2.08255],[40.63785,-2.49979],[40.26304,-2.57309],[40.12119,-3.27768],[39.80006,-3.68116],[39.60489,-4.34653],[39.20222,-4.67677],[37.7669,-3.67712],[37.69869,-3.09699],[34.07262,-1.05982],[33.903711,-0.95],[33.893569,0.109814],[34.18,0.515],[34.6721,1.17694],[35.03599,1.90584],[34.59607,3.05374],[34.47913,3.5556],[34.005,4.249885],[34.620196,4.847123],[35.298007,5.506],[35.817448,5.338232],[35.817448,4.776966],[36.159079,4.447864],[36.855093,4.447864],[38.120915,3.598605],[38.43697,3.58851],[38.67114,3.61607],[38.89251,3.50074],[39.559384,3.42206],[39.85494,3.83879],[40.76848,4.25702],[41.1718,3.91909],[41.855083,3.918912],[40.98105,2.78452],[40.993,-0.85829]]]}}, -{"type":"Feature","id":"KGZ","properties":{"name":"Kyrgyzstan"},"geometry":{"type":"Polygon","coordinates":[[[70.962315,42.266154],[71.186281,42.704293],[71.844638,42.845395],[73.489758,42.500894],[73.645304,43.091272],[74.212866,43.298339],[75.636965,42.8779],[76.000354,42.988022],[77.658392,42.960686],[79.142177,42.856092],[79.643645,42.496683],[80.25999,42.349999],[80.11943,42.123941],[78.543661,41.582243],[78.187197,41.185316],[76.904484,41.066486],[76.526368,40.427946],[75.467828,40.562072],[74.776862,40.366425],[73.822244,39.893973],[73.960013,39.660008],[73.675379,39.431237],[71.784694,39.279463],[70.549162,39.604198],[69.464887,39.526683],[69.55961,40.103211],[70.648019,39.935754],[71.014198,40.244366],[71.774875,40.145844],[73.055417,40.866033],[71.870115,41.3929],[71.157859,41.143587],[70.420022,41.519998],[71.259248,42.167711],[70.962315,42.266154]]]}}, -{"type":"Feature","id":"KHM","properties":{"name":"Cambodia"},"geometry":{"type":"Polygon","coordinates":[[[103.49728,10.632555],[103.09069,11.153661],[102.584932,12.186595],[102.348099,13.394247],[102.988422,14.225721],[104.281418,14.416743],[105.218777,14.273212],[106.043946,13.881091],[106.496373,14.570584],[107.382727,14.202441],[107.614548,13.535531],[107.491403,12.337206],[105.810524,11.567615],[106.24967,10.961812],[105.199915,10.88931],[104.334335,10.486544],[103.49728,10.632555]]]}}, -{"type":"Feature","id":"KOR","properties":{"name":"South Korea"},"geometry":{"type":"Polygon","coordinates":[[[128.349716,38.612243],[129.21292,37.432392],[129.46045,36.784189],[129.468304,35.632141],[129.091377,35.082484],[128.18585,34.890377],[127.386519,34.475674],[126.485748,34.390046],[126.37392,34.93456],[126.559231,35.684541],[126.117398,36.725485],[126.860143,36.893924],[126.174759,37.749686],[126.237339,37.840378],[126.68372,37.804773],[127.073309,38.256115],[127.780035,38.304536],[128.205746,38.370397],[128.349716,38.612243]]]}}, -{"type":"Feature","id":"CS-KM","properties":{"name":"Kosovo"},"geometry":{"type":"Polygon","coordinates":[[[20.76216,42.05186],[20.71731,41.84711],[20.59023,41.85541],[20.52295,42.21787],[20.28374,42.32025],[20.0707,42.58863],[20.25758,42.81275],[20.49679,42.88469],[20.63508,43.21671],[20.81448,43.27205],[20.95651,43.13094],[21.143395,43.068685],[21.27421,42.90959],[21.43866,42.86255],[21.63302,42.67717],[21.77505,42.6827],[21.66292,42.43922],[21.54332,42.32025],[21.576636,42.245224],[21.3527,42.2068],[20.76216,42.05186]]]}}, -{"type":"Feature","id":"KWT","properties":{"name":"Kuwait"},"geometry":{"type":"Polygon","coordinates":[[[47.974519,29.975819],[48.183189,29.534477],[48.093943,29.306299],[48.416094,28.552004],[47.708851,28.526063],[47.459822,29.002519],[46.568713,29.099025],[47.302622,30.05907],[47.974519,29.975819]]]}}, -{"type":"Feature","id":"LAO","properties":{"name":"Laos"},"geometry":{"type":"Polygon","coordinates":[[[105.218777,14.273212],[105.544338,14.723934],[105.589039,15.570316],[104.779321,16.441865],[104.716947,17.428859],[103.956477,18.240954],[103.200192,18.309632],[102.998706,17.961695],[102.413005,17.932782],[102.113592,18.109102],[101.059548,17.512497],[101.035931,18.408928],[101.282015,19.462585],[100.606294,19.508344],[100.548881,20.109238],[100.115988,20.41785],[100.329101,20.786122],[101.180005,21.436573],[101.270026,21.201652],[101.80312,21.174367],[101.652018,22.318199],[102.170436,22.464753],[102.754896,21.675137],[103.203861,20.766562],[104.435,20.758733],[104.822574,19.886642],[104.183388,19.624668],[103.896532,19.265181],[105.094598,18.666975],[105.925762,17.485315],[106.556008,16.604284],[107.312706,15.908538],[107.564525,15.202173],[107.382727,14.202441],[106.496373,14.570584],[106.043946,13.881091],[105.218777,14.273212]]]}}, -{"type":"Feature","id":"LBN","properties":{"name":"Lebanon"},"geometry":{"type":"Polygon","coordinates":[[[35.821101,33.277426],[35.552797,33.264275],[35.460709,33.08904],[35.126053,33.0909],[35.482207,33.90545],[35.979592,34.610058],[35.998403,34.644914],[36.448194,34.593935],[36.61175,34.201789],[36.06646,33.824912],[35.821101,33.277426]]]}}, -{"type":"Feature","id":"LBR","properties":{"name":"Liberia"},"geometry":{"type":"Polygon","coordinates":[[[-7.712159,4.364566],[-7.974107,4.355755],[-9.004794,4.832419],[-9.91342,5.593561],[-10.765384,6.140711],[-11.438779,6.785917],[-11.199802,7.105846],[-11.146704,7.396706],[-10.695595,7.939464],[-10.230094,8.406206],[-10.016567,8.428504],[-9.755342,8.541055],[-9.33728,7.928534],[-9.403348,7.526905],[-9.208786,7.313921],[-8.926065,7.309037],[-8.722124,7.711674],[-8.439298,7.686043],[-8.485446,7.395208],[-8.385452,6.911801],[-8.60288,6.467564],[-8.311348,6.193033],[-7.993693,6.12619],[-7.570153,5.707352],[-7.539715,5.313345],[-7.635368,5.188159],[-7.712159,4.364566]]]}}, -{"type":"Feature","id":"LBY","properties":{"name":"Libya"},"geometry":{"type":"Polygon","coordinates":[[[14.8513,22.86295],[14.143871,22.491289],[13.581425,23.040506],[11.999506,23.471668],[11.560669,24.097909],[10.771364,24.562532],[10.303847,24.379313],[9.948261,24.936954],[9.910693,25.365455],[9.319411,26.094325],[9.716286,26.512206],[9.629056,27.140953],[9.756128,27.688259],[9.683885,28.144174],[9.859998,28.95999],[9.805634,29.424638],[9.48214,30.307556],[9.970017,30.539325],[10.056575,30.961831],[9.950225,31.37607],[10.636901,31.761421],[10.94479,32.081815],[11.432253,32.368903],[11.488787,33.136996],[12.66331,32.79278],[13.08326,32.87882],[13.91868,32.71196],[15.24563,32.26508],[15.71394,31.37626],[16.61162,31.18218],[18.02109,30.76357],[19.08641,30.26639],[19.57404,30.52582],[20.05335,30.98576],[19.82033,31.75179],[20.13397,32.2382],[20.85452,32.7068],[21.54298,32.8432],[22.89576,32.63858],[23.2368,32.19149],[23.60913,32.18726],[23.9275,32.01667],[24.92114,31.89936],[25.16482,31.56915],[24.80287,31.08929],[24.95762,30.6616],[24.70007,30.04419],[25,29.238655],[25,25.6825],[25,22],[25,20.00304],[23.85,20],[23.83766,19.58047],[19.84926,21.49509],[15.86085,23.40972],[14.8513,22.86295]]]}}, -{"type":"Feature","id":"LKA","properties":{"name":"Sri Lanka"},"geometry":{"type":"Polygon","coordinates":[[[81.787959,7.523055],[81.637322,6.481775],[81.21802,6.197141],[80.348357,5.96837],[79.872469,6.763463],[79.695167,8.200843],[80.147801,9.824078],[80.838818,9.268427],[81.304319,8.564206],[81.787959,7.523055]]]}}, -{"type":"Feature","id":"LSO","properties":{"name":"Lesotho"},"geometry":{"type":"Polygon","coordinates":[[[28.978263,-28.955597],[29.325166,-29.257387],[29.018415,-29.743766],[28.8484,-30.070051],[28.291069,-30.226217],[28.107205,-30.545732],[27.749397,-30.645106],[26.999262,-29.875954],[27.532511,-29.242711],[28.074338,-28.851469],[28.5417,-28.647502],[28.978263,-28.955597]]]}}, -{"type":"Feature","id":"LTU","properties":{"name":"Lithuania"},"geometry":{"type":"Polygon","coordinates":[[[22.731099,54.327537],[22.651052,54.582741],[22.757764,54.856574],[22.315724,55.015299],[21.268449,55.190482],[21.0558,56.031076],[22.201157,56.337802],[23.878264,56.273671],[24.860684,56.372528],[25.000934,56.164531],[25.533047,56.100297],[26.494331,55.615107],[26.588279,55.167176],[25.768433,54.846963],[25.536354,54.282423],[24.450684,53.905702],[23.484128,53.912498],[23.243987,54.220567],[22.731099,54.327537]]]}}, -{"type":"Feature","id":"LUX","properties":{"name":"Luxembourg"},"geometry":{"type":"Polygon","coordinates":[[[6.043073,50.128052],[6.242751,49.902226],[6.18632,49.463803],[5.897759,49.442667],[5.674052,49.529484],[5.782417,50.090328],[6.043073,50.128052]]]}}, -{"type":"Feature","id":"LVA","properties":{"name":"Latvia"},"geometry":{"type":"Polygon","coordinates":[[[21.0558,56.031076],[21.090424,56.783873],[21.581866,57.411871],[22.524341,57.753374],[23.318453,57.006236],[24.12073,57.025693],[24.312863,57.793424],[25.164594,57.970157],[25.60281,57.847529],[26.463532,57.476389],[27.288185,57.474528],[27.770016,57.244258],[27.855282,56.759326],[28.176709,56.16913],[27.10246,55.783314],[26.494331,55.615107],[25.533047,56.100297],[25.000934,56.164531],[24.860684,56.372528],[23.878264,56.273671],[22.201157,56.337802],[21.0558,56.031076]]]}}, -{"type":"Feature","id":"MAR","properties":{"name":"Morocco"},"geometry":{"type":"Polygon","coordinates":[[[-5.193863,35.755182],[-4.591006,35.330712],[-3.640057,35.399855],[-2.604306,35.179093],[-2.169914,35.168396],[-1.792986,34.527919],[-1.733455,33.919713],[-1.388049,32.864015],[-1.124551,32.651522],[-1.307899,32.262889],[-2.616605,32.094346],[-3.06898,31.724498],[-3.647498,31.637294],[-3.690441,30.896952],[-4.859646,30.501188],[-5.242129,30.000443],[-6.060632,29.7317],[-7.059228,29.579228],[-8.674116,28.841289],[-8.66559,27.656426],[-8.817809,27.656426],[-8.817828,27.656426],[-8.794884,27.120696],[-9.413037,27.088476],[-9.735343,26.860945],[-10.189424,26.860945],[-10.551263,26.990808],[-11.392555,26.883424],[-11.71822,26.104092],[-12.030759,26.030866],[-12.500963,24.770116],[-13.89111,23.691009],[-14.221168,22.310163],[-14.630833,21.86094],[-14.750955,21.5006],[-17.002962,21.420734],[-17.020428,21.42231],[-16.973248,21.885745],[-16.589137,22.158234],[-16.261922,22.67934],[-16.326414,23.017768],[-15.982611,23.723358],[-15.426004,24.359134],[-15.089332,24.520261],[-14.824645,25.103533],[-14.800926,25.636265],[-14.43994,26.254418],[-13.773805,26.618892],[-13.139942,27.640148],[-13.121613,27.654148],[-12.618837,28.038186],[-11.688919,28.148644],[-10.900957,28.832142],[-10.399592,29.098586],[-9.564811,29.933574],[-9.814718,31.177736],[-9.434793,32.038096],[-9.300693,32.564679],[-8.657476,33.240245],[-7.654178,33.697065],[-6.912544,34.110476],[-6.244342,35.145865],[-5.929994,35.759988],[-5.193863,35.755182]]]}}, -{"type":"Feature","id":"MDA","properties":{"name":"Moldova"},"geometry":{"type":"Polygon","coordinates":[[[26.619337,48.220726],[26.857824,48.368211],[27.522537,48.467119],[28.259547,48.155562],[28.670891,48.118149],[29.122698,47.849095],[29.050868,47.510227],[29.415135,47.346645],[29.559674,46.928583],[29.908852,46.674361],[29.83821,46.525326],[30.024659,46.423937],[29.759972,46.349988],[29.170654,46.379262],[29.072107,46.517678],[28.862972,46.437889],[28.933717,46.25883],[28.659987,45.939987],[28.485269,45.596907],[28.233554,45.488283],[28.054443,45.944586],[28.160018,46.371563],[28.12803,46.810476],[27.551166,47.405117],[27.233873,47.826771],[26.924176,48.123264],[26.619337,48.220726]]]}}, -{"type":"Feature","id":"MDG","properties":{"name":"Madagascar"},"geometry":{"type":"Polygon","coordinates":[[[49.543519,-12.469833],[49.808981,-12.895285],[50.056511,-13.555761],[50.217431,-14.758789],[50.476537,-15.226512],[50.377111,-15.706069],[50.200275,-16.000263],[49.860606,-15.414253],[49.672607,-15.710204],[49.863344,-16.451037],[49.774564,-16.875042],[49.498612,-17.106036],[49.435619,-17.953064],[49.041792,-19.118781],[48.548541,-20.496888],[47.930749,-22.391501],[47.547723,-23.781959],[47.095761,-24.94163],[46.282478,-25.178463],[45.409508,-25.601434],[44.833574,-25.346101],[44.03972,-24.988345],[43.763768,-24.460677],[43.697778,-23.574116],[43.345654,-22.776904],[43.254187,-22.057413],[43.433298,-21.336475],[43.893683,-21.163307],[43.89637,-20.830459],[44.374325,-20.072366],[44.464397,-19.435454],[44.232422,-18.961995],[44.042976,-18.331387],[43.963084,-17.409945],[44.312469,-16.850496],[44.446517,-16.216219],[44.944937,-16.179374],[45.502732,-15.974373],[45.872994,-15.793454],[46.312243,-15.780018],[46.882183,-15.210182],[47.70513,-14.594303],[48.005215,-14.091233],[47.869047,-13.663869],[48.293828,-13.784068],[48.84506,-13.089175],[48.863509,-12.487868],[49.194651,-12.040557],[49.543519,-12.469833]]]}}, -{"type":"Feature","id":"MEX","properties":{"name":"Mexico"},"geometry":{"type":"Polygon","coordinates":[[[-97.140008,25.869997],[-97.528072,24.992144],[-97.702946,24.272343],[-97.776042,22.93258],[-97.872367,22.444212],[-97.699044,21.898689],[-97.38896,21.411019],[-97.189333,20.635433],[-96.525576,19.890931],[-96.292127,19.320371],[-95.900885,18.828024],[-94.839063,18.562717],[-94.42573,18.144371],[-93.548651,18.423837],[-92.786114,18.524839],[-92.037348,18.704569],[-91.407903,18.876083],[-90.77187,19.28412],[-90.53359,19.867418],[-90.451476,20.707522],[-90.278618,20.999855],[-89.601321,21.261726],[-88.543866,21.493675],[-87.658417,21.458846],[-87.05189,21.543543],[-86.811982,21.331515],[-86.845908,20.849865],[-87.383291,20.255405],[-87.621054,19.646553],[-87.43675,19.472403],[-87.58656,19.04013],[-87.837191,18.259816],[-88.090664,18.516648],[-88.300031,18.499982],[-88.490123,18.486831],[-88.848344,17.883198],[-89.029857,18.001511],[-89.150909,17.955468],[-89.14308,17.808319],[-90.067934,17.819326],[-91.00152,17.817595],[-91.002269,17.254658],[-91.453921,17.252177],[-91.08167,16.918477],[-90.711822,16.687483],[-90.600847,16.470778],[-90.438867,16.41011],[-90.464473,16.069562],[-91.74796,16.066565],[-92.229249,15.251447],[-92.087216,15.064585],[-92.20323,14.830103],[-92.22775,14.538829],[-93.359464,15.61543],[-93.875169,15.940164],[-94.691656,16.200975],[-95.250227,16.128318],[-96.053382,15.752088],[-96.557434,15.653515],[-97.263592,15.917065],[-98.01303,16.107312],[-98.947676,16.566043],[-99.697397,16.706164],[-100.829499,17.171071],[-101.666089,17.649026],[-101.918528,17.91609],[-102.478132,17.975751],[-103.50099,18.292295],[-103.917527,18.748572],[-104.99201,19.316134],[-105.493038,19.946767],[-105.731396,20.434102],[-105.397773,20.531719],[-105.500661,20.816895],[-105.270752,21.076285],[-105.265817,21.422104],[-105.603161,21.871146],[-105.693414,22.26908],[-106.028716,22.773752],[-106.90998,23.767774],[-107.915449,24.548915],[-108.401905,25.172314],[-109.260199,25.580609],[-109.444089,25.824884],[-109.291644,26.442934],[-109.801458,26.676176],[-110.391732,27.162115],[-110.641019,27.859876],[-111.178919,27.941241],[-111.759607,28.467953],[-112.228235,28.954409],[-112.271824,29.266844],[-112.809594,30.021114],[-113.163811,30.786881],[-113.148669,31.170966],[-113.871881,31.567608],[-114.205737,31.524045],[-114.776451,31.799532],[-114.9367,31.393485],[-114.771232,30.913617],[-114.673899,30.162681],[-114.330974,29.750432],[-113.588875,29.061611],[-113.424053,28.826174],[-113.271969,28.754783],[-113.140039,28.411289],[-112.962298,28.42519],[-112.761587,27.780217],[-112.457911,27.525814],[-112.244952,27.171727],[-111.616489,26.662817],[-111.284675,25.73259],[-110.987819,25.294606],[-110.710007,24.826004],[-110.655049,24.298595],[-110.172856,24.265548],[-109.771847,23.811183],[-109.409104,23.364672],[-109.433392,23.185588],[-109.854219,22.818272],[-110.031392,22.823078],[-110.295071,23.430973],[-110.949501,24.000964],[-111.670568,24.484423],[-112.182036,24.738413],[-112.148989,25.470125],[-112.300711,26.012004],[-112.777297,26.32196],[-113.464671,26.768186],[-113.59673,26.63946],[-113.848937,26.900064],[-114.465747,27.14209],[-115.055142,27.722727],[-114.982253,27.7982],[-114.570366,27.741485],[-114.199329,28.115003],[-114.162018,28.566112],[-114.931842,29.279479],[-115.518654,29.556362],[-115.887365,30.180794],[-116.25835,30.836464],[-116.721526,31.635744],[-117.12776,32.53534],[-115.99135,32.61239],[-114.72139,32.72083],[-114.815,32.52528],[-113.30498,32.03914],[-111.02361,31.33472],[-109.035,31.34194],[-108.24194,31.34222],[-108.24,31.754854],[-106.50759,31.75452],[-106.1429,31.39995],[-105.63159,31.08383],[-105.03737,30.64402],[-104.70575,30.12173],[-104.45697,29.57196],[-103.94,29.27],[-103.11,28.97],[-102.48,29.76],[-101.6624,29.7793],[-100.9576,29.38071],[-100.45584,28.69612],[-100.11,28.11],[-99.52,27.54],[-99.3,26.84],[-99.02,26.37],[-98.24,26.06],[-97.53,25.84],[-97.140008,25.869997]]]}}, -{"type":"Feature","id":"MKD","properties":{"name":"Macedonia"},"geometry":{"type":"Polygon","coordinates":[[[20.59023,41.85541],[20.71731,41.84711],[20.76216,42.05186],[21.3527,42.2068],[21.576636,42.245224],[21.91708,42.30364],[22.380526,42.32026],[22.881374,41.999297],[22.952377,41.337994],[22.76177,41.3048],[22.597308,41.130487],[22.055378,41.149866],[21.674161,40.931275],[21.02004,40.842727],[20.60518,41.08622],[20.46315,41.51509],[20.59023,41.85541]]]}}, -{"type":"Feature","id":"MLI","properties":{"name":"Mali"},"geometry":{"type":"Polygon","coordinates":[[[-12.17075,14.616834],[-11.834208,14.799097],[-11.666078,15.388208],[-11.349095,15.411256],[-10.650791,15.132746],[-10.086846,15.330486],[-9.700255,15.264107],[-9.550238,15.486497],[-5.537744,15.50169],[-5.315277,16.201854],[-5.488523,16.325102],[-5.971129,20.640833],[-6.453787,24.956591],[-4.923337,24.974574],[-1.550055,22.792666],[1.823228,20.610809],[2.060991,20.142233],[2.683588,19.85623],[3.146661,19.693579],[3.158133,19.057364],[4.267419,19.155265],[4.27021,16.852227],[3.723422,16.184284],[3.638259,15.56812],[2.749993,15.409525],[1.385528,15.323561],[1.015783,14.968182],[0.374892,14.928908],[-0.266257,14.924309],[-0.515854,15.116158],[-1.066363,14.973815],[-2.001035,14.559008],[-2.191825,14.246418],[-2.967694,13.79815],[-3.103707,13.541267],[-3.522803,13.337662],[-4.006391,13.472485],[-4.280405,13.228444],[-4.427166,12.542646],[-5.220942,11.713859],[-5.197843,11.375146],[-5.470565,10.95127],[-5.404342,10.370737],[-5.816926,10.222555],[-6.050452,10.096361],[-6.205223,10.524061],[-6.493965,10.411303],[-6.666461,10.430811],[-6.850507,10.138994],[-7.622759,10.147236],[-7.89959,10.297382],[-8.029944,10.206535],[-8.335377,10.494812],[-8.282357,10.792597],[-8.407311,10.909257],[-8.620321,10.810891],[-8.581305,11.136246],[-8.376305,11.393646],[-8.786099,11.812561],[-8.905265,12.088358],[-9.127474,12.30806],[-9.327616,12.334286],[-9.567912,12.194243],[-9.890993,12.060479],[-10.165214,11.844084],[-10.593224,11.923975],[-10.87083,12.177887],[-11.036556,12.211245],[-11.297574,12.077971],[-11.456169,12.076834],[-11.513943,12.442988],[-11.467899,12.754519],[-11.553398,13.141214],[-11.927716,13.422075],[-12.124887,13.994727],[-12.17075,14.616834]]]}}, -{"type":"Feature","id":"MLT","properties":{"name":"Malta"},"geometry":{"type":"MultiPolygon","coordinates":[[[[14.566171,35.852721],[14.532684,35.820191],[14.436463,35.821664],[14.352334,35.872281],[14.3513,35.978399],[14.448348,35.957444],[14.537025,35.886285],[14.566171,35.852721]]],[[[14.313473,36.027569],[14.253632,36.012143],[14.194204,36.042245],[14.180354,36.060383],[14.263243,36.075809],[14.303758,36.062295],[14.320914,36.03625],[14.313473,36.027569]]]]}}, -{"type":"Feature","id":"MMR","properties":{"name":"Myanmar"},"geometry":{"type":"Polygon","coordinates":[[[99.543309,20.186598],[98.959676,19.752981],[98.253724,19.708203],[97.797783,18.62708],[97.375896,18.445438],[97.859123,17.567946],[98.493761,16.837836],[98.903348,16.177824],[98.537376,15.308497],[98.192074,15.123703],[98.430819,14.622028],[99.097755,13.827503],[99.212012,13.269294],[99.196354,12.804748],[99.587286,11.892763],[99.038121,10.960546],[98.553551,9.93296],[98.457174,10.675266],[98.764546,11.441292],[98.428339,12.032987],[98.509574,13.122378],[98.103604,13.64046],[97.777732,14.837286],[97.597072,16.100568],[97.16454,16.928734],[96.505769,16.427241],[95.369352,15.71439],[94.808405,15.803454],[94.188804,16.037936],[94.533486,17.27724],[94.324817,18.213514],[93.540988,19.366493],[93.663255,19.726962],[93.078278,19.855145],[92.368554,20.670883],[92.303234,21.475485],[92.652257,21.324048],[92.672721,22.041239],[93.166128,22.27846],[93.060294,22.703111],[93.286327,23.043658],[93.325188,24.078556],[94.106742,23.850741],[94.552658,24.675238],[94.603249,25.162495],[95.155153,26.001307],[95.124768,26.573572],[96.419366,27.264589],[97.133999,27.083774],[97.051989,27.699059],[97.402561,27.882536],[97.327114,28.261583],[97.911988,28.335945],[98.246231,27.747221],[98.68269,27.508812],[98.712094,26.743536],[98.671838,25.918703],[97.724609,25.083637],[97.60472,23.897405],[98.660262,24.063286],[98.898749,23.142722],[99.531992,22.949039],[99.240899,22.118314],[99.983489,21.742937],[100.416538,21.558839],[101.150033,21.849984],[101.180005,21.436573],[100.329101,20.786122],[100.115988,20.41785],[99.543309,20.186598]]]}}, -{"type":"Feature","id":"MNE","properties":{"name":"Montenegro"},"geometry":{"type":"Polygon","coordinates":[[[19.801613,42.500093],[19.738051,42.688247],[19.30449,42.19574],[19.37177,41.87755],[19.16246,41.95502],[18.88214,42.28151],[18.45,42.48],[18.56,42.65],[18.70648,43.20011],[19.03165,43.43253],[19.21852,43.52384],[19.48389,43.35229],[19.63,43.21378],[19.95857,43.10604],[20.3398,42.89852],[20.25758,42.81275],[20.0707,42.58863],[19.801613,42.500093]]]}}, -{"type":"Feature","id":"MNG","properties":{"name":"Mongolia"},"geometry":{"type":"Polygon","coordinates":[[[87.751264,49.297198],[88.805567,49.470521],[90.713667,50.331812],[92.234712,50.802171],[93.104219,50.49529],[94.147566,50.480537],[94.815949,50.013433],[95.814028,49.977467],[97.259728,49.726061],[98.231762,50.422401],[97.82574,51.010995],[98.861491,52.047366],[99.981732,51.634006],[100.88948,51.516856],[102.065223,51.259921],[102.255909,50.510561],[103.676545,50.089966],[104.621552,50.275329],[105.886591,50.406019],[106.888804,50.274296],[107.868176,49.793705],[108.475167,49.282548],[109.402449,49.292961],[110.662011,49.130128],[111.581231,49.377968],[112.89774,49.543565],[114.362456,50.248303],[114.96211,50.140247],[115.485695,49.805177],[116.678801,49.888531],[116.191802,49.134598],[115.485282,48.135383],[115.742837,47.726545],[116.308953,47.85341],[117.295507,47.697709],[118.064143,48.06673],[118.866574,47.74706],[119.772824,47.048059],[119.66327,46.69268],[118.874326,46.805412],[117.421701,46.672733],[116.717868,46.388202],[115.985096,45.727235],[114.460332,45.339817],[113.463907,44.808893],[112.436062,45.011646],[111.873306,45.102079],[111.348377,44.457442],[111.667737,44.073176],[111.829588,43.743118],[111.129682,43.406834],[110.412103,42.871234],[109.243596,42.519446],[107.744773,42.481516],[106.129316,42.134328],[104.964994,41.59741],[104.522282,41.908347],[103.312278,41.907468],[101.83304,42.514873],[100.845866,42.663804],[99.515817,42.524691],[97.451757,42.74889],[96.349396,42.725635],[95.762455,43.319449],[95.306875,44.241331],[94.688929,44.352332],[93.480734,44.975472],[92.133891,45.115076],[90.94554,45.286073],[90.585768,45.719716],[90.970809,46.888146],[90.280826,47.693549],[88.854298,48.069082],[88.013832,48.599463],[87.751264,49.297198]]]}}, -{"type":"Feature","id":"MOZ","properties":{"name":"Mozambique"},"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[35.312398,-11.439146],[36.514082,-11.720938],[36.775151,-11.594537],[37.471284,-11.568751],[37.827645,-11.268769],[38.427557,-11.285202],[39.52103,-10.896854],[40.316589,-10.317096],[40.478387,-10.765441],[40.437253,-11.761711],[40.560811,-12.639177],[40.59962,-14.201975],[40.775475,-14.691764],[40.477251,-15.406294],[40.089264,-16.100774],[39.452559,-16.720891],[38.538351,-17.101023],[37.411133,-17.586368],[36.281279,-18.659688],[35.896497,-18.84226],[35.1984,-19.552811],[34.786383,-19.784012],[34.701893,-20.497043],[35.176127,-21.254361],[35.373428,-21.840837],[35.385848,-22.14],[35.562546,-22.09],[35.533935,-23.070788],[35.371774,-23.535359],[35.60747,-23.706563],[35.458746,-24.12261],[35.040735,-24.478351],[34.215824,-24.816314],[33.01321,-25.357573],[32.574632,-25.727318],[32.660363,-26.148584],[32.915955,-26.215867],[32.83012,-26.742192],[32.071665,-26.73382],[31.985779,-26.29178],[31.837778,-25.843332],[31.752408,-25.484284],[31.930589,-24.369417],[31.670398,-23.658969],[31.191409,-22.25151],[32.244988,-21.116489],[32.508693,-20.395292],[32.659743,-20.30429],[32.772708,-19.715592],[32.611994,-19.419383],[32.654886,-18.67209],[32.849861,-17.979057],[32.847639,-16.713398],[32.328239,-16.392074],[31.852041,-16.319417],[31.636498,-16.07199],[31.173064,-15.860944],[30.338955,-15.880839],[30.274256,-15.507787],[30.179481,-14.796099],[33.214025,-13.97186],[33.7897,-14.451831],[34.064825,-14.35995],[34.459633,-14.61301],[34.517666,-15.013709],[34.307291,-15.478641],[34.381292,-16.18356],[35.03381,-16.8013],[35.339063,-16.10744],[35.771905,-15.896859],[35.686845,-14.611046],[35.267956,-13.887834],[34.907151,-13.565425],[34.559989,-13.579998],[34.280006,-12.280025],[34.559989,-11.52002]]]}}, -{"type":"Feature","id":"MRT","properties":{"name":"Mauritania"},"geometry":{"type":"Polygon","coordinates":[[[-12.17075,14.616834],[-12.830658,15.303692],[-13.435738,16.039383],[-14.099521,16.304302],[-14.577348,16.598264],[-15.135737,16.587282],[-15.623666,16.369337],[-16.12069,16.455663],[-16.463098,16.135036],[-16.549708,16.673892],[-16.270552,17.166963],[-16.146347,18.108482],[-16.256883,19.096716],[-16.377651,19.593817],[-16.277838,20.092521],[-16.536324,20.567866],[-17.063423,20.999752],[-16.845194,21.333323],[-12.929102,21.327071],[-13.118754,22.77122],[-12.874222,23.284832],[-11.937224,23.374594],[-11.969419,25.933353],[-8.687294,25.881056],[-8.6844,27.395744],[-4.923337,24.974574],[-6.453787,24.956591],[-5.971129,20.640833],[-5.488523,16.325102],[-5.315277,16.201854],[-5.537744,15.50169],[-9.550238,15.486497],[-9.700255,15.264107],[-10.086846,15.330486],[-10.650791,15.132746],[-11.349095,15.411256],[-11.666078,15.388208],[-11.834208,14.799097],[-12.17075,14.616834]]]}}, -{"type":"Feature","id":"MWI","properties":{"name":"Malawi"},"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[34.280006,-12.280025],[34.559989,-13.579998],[34.907151,-13.565425],[35.267956,-13.887834],[35.686845,-14.611046],[35.771905,-15.896859],[35.339063,-16.10744],[35.03381,-16.8013],[34.381292,-16.18356],[34.307291,-15.478641],[34.517666,-15.013709],[34.459633,-14.61301],[34.064825,-14.35995],[33.7897,-14.451831],[33.214025,-13.97186],[32.688165,-13.712858],[32.991764,-12.783871],[33.306422,-12.435778],[33.114289,-11.607198],[33.31531,-10.79655],[33.485688,-10.525559],[33.231388,-9.676722],[32.759375,-9.230599],[33.739729,-9.417151],[33.940838,-9.693674],[34.280006,-10.16],[34.559989,-11.52002]]]}}, -{"type":"Feature","id":"MYS","properties":{"name":"Malaysia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[101.075516,6.204867],[101.154219,5.691384],[101.814282,5.810808],[102.141187,6.221636],[102.371147,6.128205],[102.961705,5.524495],[103.381215,4.855001],[103.438575,4.181606],[103.332122,3.726698],[103.429429,3.382869],[103.502448,2.791019],[103.854674,2.515454],[104.247932,1.631141],[104.228811,1.293048],[103.519707,1.226334],[102.573615,1.967115],[101.390638,2.760814],[101.27354,3.270292],[100.695435,3.93914],[100.557408,4.76728],[100.196706,5.312493],[100.30626,6.040562],[100.085757,6.464489],[100.259596,6.642825],[101.075516,6.204867]]],[[[118.618321,4.478202],[117.882035,4.137551],[117.015214,4.306094],[115.865517,4.306559],[115.519078,3.169238],[115.134037,2.821482],[114.621355,1.430688],[113.80585,1.217549],[112.859809,1.49779],[112.380252,1.410121],[111.797548,0.904441],[111.159138,0.976478],[110.514061,0.773131],[109.830227,1.338136],[109.66326,2.006467],[110.396135,1.663775],[111.168853,1.850637],[111.370081,2.697303],[111.796928,2.885897],[112.995615,3.102395],[113.712935,3.893509],[114.204017,4.525874],[114.659596,4.007637],[114.869557,4.348314],[115.347461,4.316636],[115.4057,4.955228],[115.45071,5.44773],[116.220741,6.143191],[116.725103,6.924771],[117.129626,6.928053],[117.643393,6.422166],[117.689075,5.98749],[118.347691,5.708696],[119.181904,5.407836],[119.110694,5.016128],[118.439727,4.966519],[118.618321,4.478202]]]]}}, -{"type":"Feature","id":"NAM","properties":{"name":"Namibia"},"geometry":{"type":"Polygon","coordinates":[[[16.344977,-28.576705],[15.601818,-27.821247],[15.210472,-27.090956],[14.989711,-26.117372],[14.743214,-25.39292],[14.408144,-23.853014],[14.385717,-22.656653],[14.257714,-22.111208],[13.868642,-21.699037],[13.352498,-20.872834],[12.826845,-19.673166],[12.608564,-19.045349],[11.794919,-18.069129],[11.734199,-17.301889],[12.215461,-17.111668],[12.814081,-16.941343],[13.462362,-16.971212],[14.058501,-17.423381],[14.209707,-17.353101],[18.263309,-17.309951],[18.956187,-17.789095],[21.377176,-17.930636],[23.215048,-17.523116],[24.033862,-17.295843],[24.682349,-17.353411],[25.07695,-17.578823],[25.084443,-17.661816],[24.520705,-17.887125],[24.217365,-17.889347],[23.579006,-18.281261],[23.196858,-17.869038],[21.65504,-18.219146],[20.910641,-18.252219],[20.881134,-21.814327],[19.895458,-21.849157],[19.895768,-24.76779],[19.894734,-28.461105],[19.002127,-28.972443],[18.464899,-29.045462],[17.836152,-28.856378],[17.387497,-28.783514],[17.218929,-28.355943],[16.824017,-28.082162],[16.344977,-28.576705]]]}}, -{"type":"Feature","id":"NCL","properties":{"name":"New Caledonia"},"geometry":{"type":"Polygon","coordinates":[[[165.77999,-21.080005],[166.599991,-21.700019],[167.120011,-22.159991],[166.740035,-22.399976],[166.189732,-22.129708],[165.474375,-21.679607],[164.829815,-21.14982],[164.167995,-20.444747],[164.029606,-20.105646],[164.459967,-20.120012],[165.020036,-20.459991],[165.460009,-20.800022],[165.77999,-21.080005]]]}}, -{"type":"Feature","id":"NER","properties":{"name":"Niger"},"geometry":{"type":"Polygon","coordinates":[[[2.154474,11.94015],[2.177108,12.625018],[1.024103,12.851826],[0.993046,13.33575],[0.429928,13.988733],[0.295646,14.444235],[0.374892,14.928908],[1.015783,14.968182],[1.385528,15.323561],[2.749993,15.409525],[3.638259,15.56812],[3.723422,16.184284],[4.27021,16.852227],[4.267419,19.155265],[5.677566,19.601207],[8.572893,21.565661],[11.999506,23.471668],[13.581425,23.040506],[14.143871,22.491289],[14.8513,22.86295],[15.096888,21.308519],[15.471077,21.048457],[15.487148,20.730415],[15.903247,20.387619],[15.685741,19.95718],[15.300441,17.92795],[15.247731,16.627306],[13.972202,15.684366],[13.540394,14.367134],[13.956699,13.996691],[13.954477,13.353449],[14.595781,13.330427],[14.495787,12.859396],[14.213531,12.802035],[14.181336,12.483657],[13.995353,12.461565],[13.318702,13.556356],[13.083987,13.596147],[12.302071,13.037189],[11.527803,13.32898],[10.989593,13.387323],[10.701032,13.246918],[10.114814,13.277252],[9.524928,12.851102],[9.014933,12.826659],[7.804671,13.343527],[7.330747,13.098038],[6.820442,13.115091],[6.445426,13.492768],[5.443058,13.865924],[4.368344,13.747482],[4.107946,13.531216],[3.967283,12.956109],[3.680634,12.552903],[3.61118,11.660167],[2.848643,12.235636],[2.490164,12.233052],[2.154474,11.94015]]]}}, -{"type":"Feature","id":"NGA","properties":{"name":"Nigeria"},"geometry":{"type":"Polygon","coordinates":[[[8.500288,4.771983],[7.462108,4.412108],[7.082596,4.464689],[6.698072,4.240594],[5.898173,4.262453],[5.362805,4.887971],[5.033574,5.611802],[4.325607,6.270651],[3.57418,6.2583],[2.691702,6.258817],[2.749063,7.870734],[2.723793,8.506845],[2.912308,9.137608],[3.220352,9.444153],[3.705438,10.06321],[3.60007,10.332186],[3.797112,10.734746],[3.572216,11.327939],[3.61118,11.660167],[3.680634,12.552903],[3.967283,12.956109],[4.107946,13.531216],[4.368344,13.747482],[5.443058,13.865924],[6.445426,13.492768],[6.820442,13.115091],[7.330747,13.098038],[7.804671,13.343527],[9.014933,12.826659],[9.524928,12.851102],[10.114814,13.277252],[10.701032,13.246918],[10.989593,13.387323],[11.527803,13.32898],[12.302071,13.037189],[13.083987,13.596147],[13.318702,13.556356],[13.995353,12.461565],[14.181336,12.483657],[14.577178,12.085361],[14.468192,11.904752],[14.415379,11.572369],[13.57295,10.798566],[13.308676,10.160362],[13.1676,9.640626],[12.955468,9.417772],[12.753672,8.717763],[12.218872,8.305824],[12.063946,7.799808],[11.839309,7.397042],[11.745774,6.981383],[11.058788,6.644427],[10.497375,7.055358],[10.118277,7.03877],[9.522706,6.453482],[9.233163,6.444491],[8.757533,5.479666],[8.500288,4.771983]]]}}, -{"type":"Feature","id":"NIC","properties":{"name":"Nicaragua"},"geometry":{"type":"Polygon","coordinates":[[[-85.71254,11.088445],[-86.058488,11.403439],[-86.52585,11.806877],[-86.745992,12.143962],[-87.167516,12.458258],[-87.668493,12.90991],[-87.557467,13.064552],[-87.392386,12.914018],[-87.316654,12.984686],[-87.005769,13.025794],[-86.880557,13.254204],[-86.733822,13.263093],[-86.755087,13.754845],[-86.520708,13.778487],[-86.312142,13.771356],[-86.096264,14.038187],[-85.801295,13.836055],[-85.698665,13.960078],[-85.514413,14.079012],[-85.165365,14.35437],[-85.148751,14.560197],[-85.052787,14.551541],[-84.924501,14.790493],[-84.820037,14.819587],[-84.649582,14.666805],[-84.449336,14.621614],[-84.228342,14.748764],[-83.975721,14.749436],[-83.628585,14.880074],[-83.489989,15.016267],[-83.147219,14.995829],[-83.233234,14.899866],[-83.284162,14.676624],[-83.182126,14.310703],[-83.4125,13.970078],[-83.519832,13.567699],[-83.552207,13.127054],[-83.498515,12.869292],[-83.473323,12.419087],[-83.626104,12.32085],[-83.719613,11.893124],[-83.650858,11.629032],[-83.85547,11.373311],[-83.808936,11.103044],[-83.655612,10.938764],[-83.895054,10.726839],[-84.190179,10.79345],[-84.355931,10.999226],[-84.673069,11.082657],[-84.903003,10.952303],[-85.561852,11.217119],[-85.71254,11.088445]]]}}, -{"type":"Feature","id":"NLD","properties":{"name":"Netherlands"},"geometry":{"type":"Polygon","coordinates":[[[6.074183,53.510403],[6.90514,53.482162],[7.092053,53.144043],[6.84287,52.22844],[6.589397,51.852029],[5.988658,51.851616],[6.156658,50.803721],[5.606976,51.037298],[4.973991,51.475024],[4.047071,51.267259],[3.314971,51.345755],[3.830289,51.620545],[4.705997,53.091798],[6.074183,53.510403]]]}}, -{"type":"Feature","id":"NOR","properties":{"name":"Norway"},"geometry":{"type":"MultiPolygon","coordinates":[[[[28.165547,71.185474],[31.293418,70.453788],[30.005435,70.186259],[31.101079,69.55808],[29.399581,69.156916],[28.59193,69.064777],[29.015573,69.766491],[27.732292,70.164193],[26.179622,69.825299],[25.689213,69.092114],[24.735679,68.649557],[23.66205,68.891247],[22.356238,68.841741],[21.244936,69.370443],[20.645593,69.106247],[20.025269,69.065139],[19.87856,68.407194],[17.993868,68.567391],[17.729182,68.010552],[16.768879,68.013937],[16.108712,67.302456],[15.108411,66.193867],[13.55569,64.787028],[13.919905,64.445421],[13.571916,64.049114],[12.579935,64.066219],[11.930569,63.128318],[11.992064,61.800362],[12.631147,61.293572],[12.300366,60.117933],[11.468272,59.432393],[11.027369,58.856149],[10.356557,59.469807],[8.382,58.313288],[7.048748,58.078884],[5.665835,58.588155],[5.308234,59.663232],[4.992078,61.970998],[5.9129,62.614473],[8.553411,63.454008],[10.527709,64.486038],[12.358347,65.879726],[14.761146,67.810642],[16.435927,68.563205],[19.184028,69.817444],[21.378416,70.255169],[23.023742,70.202072],[24.546543,71.030497],[26.37005,70.986262],[28.165547,71.185474]]],[[[24.72412,77.85385],[22.49032,77.44493],[20.72601,77.67704],[21.41611,77.93504],[20.8119,78.25463],[22.88426,78.45494],[23.28134,78.07954],[24.72412,77.85385]]],[[[18.25183,79.70175],[21.54383,78.95611],[19.02737,78.5626],[18.47172,77.82669],[17.59441,77.63796],[17.1182,76.80941],[15.91315,76.77045],[13.76259,77.38035],[14.66956,77.73565],[13.1706,78.02493],[11.22231,78.8693],[10.44453,79.65239],[13.17077,80.01046],[13.71852,79.66039],[15.14282,79.67431],[15.52255,80.01608],[16.99085,80.05086],[18.25183,79.70175]]],[[[25.447625,80.40734],[27.407506,80.056406],[25.924651,79.517834],[23.024466,79.400012],[20.075188,79.566823],[19.897266,79.842362],[18.462264,79.85988],[17.368015,80.318896],[20.455992,80.598156],[21.907945,80.357679],[22.919253,80.657144],[25.447625,80.40734]]]]}}, -{"type":"Feature","id":"NPL","properties":{"name":"Nepal"},"geometry":{"type":"Polygon","coordinates":[[[88.120441,27.876542],[88.043133,27.445819],[88.174804,26.810405],[88.060238,26.414615],[87.227472,26.397898],[86.024393,26.630985],[85.251779,26.726198],[84.675018,27.234901],[83.304249,27.364506],[81.999987,27.925479],[81.057203,28.416095],[80.088425,28.79447],[80.476721,29.729865],[81.111256,30.183481],[81.525804,30.422717],[82.327513,30.115268],[83.337115,29.463732],[83.898993,29.320226],[84.23458,28.839894],[85.011638,28.642774],[85.82332,28.203576],[86.954517,27.974262],[88.120441,27.876542]]]}}, -{"type":"Feature","id":"NZL","properties":{"name":"New Zealand"},"geometry":{"type":"MultiPolygon","coordinates":[[[[173.020375,-40.919052],[173.247234,-41.331999],[173.958405,-40.926701],[174.247587,-41.349155],[174.248517,-41.770008],[173.876447,-42.233184],[173.22274,-42.970038],[172.711246,-43.372288],[173.080113,-43.853344],[172.308584,-43.865694],[171.452925,-44.242519],[171.185138,-44.897104],[170.616697,-45.908929],[169.831422,-46.355775],[169.332331,-46.641235],[168.411354,-46.619945],[167.763745,-46.290197],[166.676886,-46.219917],[166.509144,-45.852705],[167.046424,-45.110941],[168.303763,-44.123973],[168.949409,-43.935819],[169.667815,-43.555326],[170.52492,-43.031688],[171.12509,-42.512754],[171.569714,-41.767424],[171.948709,-41.514417],[172.097227,-40.956104],[172.79858,-40.493962],[173.020375,-40.919052]]],[[[174.612009,-36.156397],[175.336616,-37.209098],[175.357596,-36.526194],[175.808887,-36.798942],[175.95849,-37.555382],[176.763195,-37.881253],[177.438813,-37.961248],[178.010354,-37.579825],[178.517094,-37.695373],[178.274731,-38.582813],[177.97046,-39.166343],[177.206993,-39.145776],[176.939981,-39.449736],[177.032946,-39.879943],[176.885824,-40.065978],[176.508017,-40.604808],[176.01244,-41.289624],[175.239567,-41.688308],[175.067898,-41.425895],[174.650973,-41.281821],[175.22763,-40.459236],[174.900157,-39.908933],[173.824047,-39.508854],[173.852262,-39.146602],[174.574802,-38.797683],[174.743474,-38.027808],[174.697017,-37.381129],[174.292028,-36.711092],[174.319004,-36.534824],[173.840997,-36.121981],[173.054171,-35.237125],[172.636005,-34.529107],[173.007042,-34.450662],[173.551298,-35.006183],[174.32939,-35.265496],[174.612009,-36.156397]]]]}}, -{"type":"Feature","id":"OMN","properties":{"name":"Oman"},"geometry":{"type":"MultiPolygon","coordinates":[[[[58.861141,21.114035],[58.487986,20.428986],[58.034318,20.481437],[57.826373,20.243002],[57.665762,19.736005],[57.7887,19.06757],[57.694391,18.94471],[57.234264,18.947991],[56.609651,18.574267],[56.512189,18.087113],[56.283521,17.876067],[55.661492,17.884128],[55.269939,17.632309],[55.2749,17.228354],[54.791002,16.950697],[54.239253,17.044981],[53.570508,16.707663],[53.108573,16.651051],[52.782184,17.349742],[52.00001,19.000003],[54.999982,19.999994],[55.666659,22.000001],[55.208341,22.70833],[55.234489,23.110993],[55.525841,23.524869],[55.528632,23.933604],[55.981214,24.130543],[55.804119,24.269604],[55.886233,24.920831],[56.396847,24.924732],[56.84514,24.241673],[57.403453,23.878594],[58.136948,23.747931],[58.729211,23.565668],[59.180502,22.992395],[59.450098,22.660271],[59.80806,22.533612],[59.806148,22.310525],[59.442191,21.714541],[59.282408,21.433886],[58.861141,21.114035]]],[[[56.391421,25.895991],[56.261042,25.714606],[56.070821,26.055464],[56.362017,26.395934],[56.485679,26.309118],[56.391421,25.895991]]]]}}, -{"type":"Feature","id":"PAK","properties":{"name":"Pakistan"},"geometry":{"type":"Polygon","coordinates":[[[75.158028,37.133031],[75.896897,36.666806],[76.192848,35.898403],[77.837451,35.49401],[76.871722,34.653544],[75.757061,34.504923],[74.240203,34.748887],[73.749948,34.317699],[74.104294,33.441473],[74.451559,32.7649],[75.258642,32.271105],[74.405929,31.692639],[74.42138,30.979815],[73.450638,29.976413],[72.823752,28.961592],[71.777666,27.91318],[70.616496,27.989196],[69.514393,26.940966],[70.168927,26.491872],[70.282873,25.722229],[70.844699,25.215102],[71.04324,24.356524],[68.842599,24.359134],[68.176645,23.691965],[67.443667,23.944844],[67.145442,24.663611],[66.372828,25.425141],[64.530408,25.237039],[62.905701,25.218409],[61.497363,25.078237],[61.874187,26.239975],[63.316632,26.756532],[63.233898,27.217047],[62.755426,27.378923],[62.72783,28.259645],[61.771868,28.699334],[61.369309,29.303276],[60.874248,29.829239],[62.549857,29.318572],[63.550261,29.468331],[64.148002,29.340819],[64.350419,29.560031],[65.046862,29.472181],[66.346473,29.887943],[66.381458,30.738899],[66.938891,31.304911],[67.683394,31.303154],[67.792689,31.58293],[68.556932,31.71331],[68.926677,31.620189],[69.317764,31.901412],[69.262522,32.501944],[69.687147,33.105499],[70.323594,33.358533],[69.930543,34.02012],[70.881803,33.988856],[71.156773,34.348911],[71.115019,34.733126],[71.613076,35.153203],[71.498768,35.650563],[71.262348,36.074388],[71.846292,36.509942],[72.920025,36.720007],[74.067552,36.836176],[74.575893,37.020841],[75.158028,37.133031]]]}}, -{"type":"Feature","id":"PAN","properties":{"name":"Panama"},"geometry":{"type":"Polygon","coordinates":[[[-77.881571,7.223771],[-78.214936,7.512255],[-78.429161,8.052041],[-78.182096,8.319182],[-78.435465,8.387705],[-78.622121,8.718124],[-79.120307,8.996092],[-79.557877,8.932375],[-79.760578,8.584515],[-80.164481,8.333316],[-80.382659,8.298409],[-80.480689,8.090308],[-80.00369,7.547524],[-80.276671,7.419754],[-80.421158,7.271572],[-80.886401,7.220541],[-81.059543,7.817921],[-81.189716,7.647906],[-81.519515,7.70661],[-81.721311,8.108963],[-82.131441,8.175393],[-82.390934,8.292362],[-82.820081,8.290864],[-82.850958,8.073823],[-82.965783,8.225028],[-82.913176,8.423517],[-82.829771,8.626295],[-82.868657,8.807266],[-82.719183,8.925709],[-82.927155,9.07433],[-82.932891,9.476812],[-82.546196,9.566135],[-82.187123,9.207449],[-82.207586,8.995575],[-81.808567,8.950617],[-81.714154,9.031955],[-81.439287,8.786234],[-80.947302,8.858504],[-80.521901,9.111072],[-79.9146,9.312765],[-79.573303,9.61161],[-79.021192,9.552931],[-79.05845,9.454565],[-78.500888,9.420459],[-78.055928,9.24773],[-77.729514,8.946844],[-77.353361,8.670505],[-77.474723,8.524286],[-77.242566,7.935278],[-77.431108,7.638061],[-77.753414,7.70984],[-77.881571,7.223771]]]}}, -{"type":"Feature","id":"PER","properties":{"name":"Peru"},"geometry":{"type":"Polygon","coordinates":[[[-69.590424,-17.580012],[-69.858444,-18.092694],[-70.372572,-18.347975],[-71.37525,-17.773799],[-71.462041,-17.363488],[-73.44453,-16.359363],[-75.237883,-15.265683],[-76.009205,-14.649286],[-76.423469,-13.823187],[-76.259242,-13.535039],[-77.106192,-12.222716],[-78.092153,-10.377712],[-79.036953,-8.386568],[-79.44592,-7.930833],[-79.760578,-7.194341],[-80.537482,-6.541668],[-81.249996,-6.136834],[-80.926347,-5.690557],[-81.410943,-4.736765],[-81.09967,-4.036394],[-80.302561,-3.404856],[-80.184015,-3.821162],[-80.469295,-4.059287],[-80.442242,-4.425724],[-80.028908,-4.346091],[-79.624979,-4.454198],[-79.205289,-4.959129],[-78.639897,-4.547784],[-78.450684,-3.873097],[-77.837905,-3.003021],[-76.635394,-2.608678],[-75.544996,-1.56161],[-75.233723,-0.911417],[-75.373223,-0.152032],[-75.106625,-0.057205],[-74.441601,-0.53082],[-74.122395,-1.002833],[-73.659504,-1.260491],[-73.070392,-2.308954],[-72.325787,-2.434218],[-71.774761,-2.16979],[-71.413646,-2.342802],[-70.813476,-2.256865],[-70.047709,-2.725156],[-70.692682,-3.742872],[-70.394044,-3.766591],[-69.893635,-4.298187],[-70.794769,-4.251265],[-70.928843,-4.401591],[-71.748406,-4.593983],[-72.891928,-5.274561],[-72.964507,-5.741251],[-73.219711,-6.089189],[-73.120027,-6.629931],[-73.724487,-6.918595],[-73.723401,-7.340999],[-73.987235,-7.52383],[-73.571059,-8.424447],[-73.015383,-9.032833],[-73.226713,-9.462213],[-72.563033,-9.520194],[-72.184891,-10.053598],[-71.302412,-10.079436],[-70.481894,-9.490118],[-70.548686,-11.009147],[-70.093752,-11.123972],[-69.529678,-10.951734],[-68.66508,-12.5613],[-68.88008,-12.899729],[-68.929224,-13.602684],[-68.948887,-14.453639],[-69.339535,-14.953195],[-69.160347,-15.323974],[-69.389764,-15.660129],[-68.959635,-16.500698],[-69.590424,-17.580012]]]}}, -{"type":"Feature","id":"PHL","properties":{"name":"Philippines"},"geometry":{"type":"MultiPolygon","coordinates":[[[[126.376814,8.414706],[126.478513,7.750354],[126.537424,7.189381],[126.196773,6.274294],[125.831421,7.293715],[125.363852,6.786485],[125.683161,6.049657],[125.396512,5.581003],[124.219788,6.161355],[123.93872,6.885136],[124.243662,7.36061],[123.610212,7.833527],[123.296071,7.418876],[122.825506,7.457375],[122.085499,6.899424],[121.919928,7.192119],[122.312359,8.034962],[122.942398,8.316237],[123.487688,8.69301],[123.841154,8.240324],[124.60147,8.514158],[124.764612,8.960409],[125.471391,8.986997],[125.412118,9.760335],[126.222714,9.286074],[126.306637,8.782487],[126.376814,8.414706]]],[[[123.982438,10.278779],[123.623183,9.950091],[123.309921,9.318269],[122.995883,9.022189],[122.380055,9.713361],[122.586089,9.981045],[122.837081,10.261157],[122.947411,10.881868],[123.49885,10.940624],[123.337774,10.267384],[124.077936,11.232726],[123.982438,10.278779]]],[[[118.504581,9.316383],[117.174275,8.3675],[117.664477,9.066889],[118.386914,9.6845],[118.987342,10.376292],[119.511496,11.369668],[119.689677,10.554291],[119.029458,10.003653],[118.504581,9.316383]]],[[[121.883548,11.891755],[122.483821,11.582187],[123.120217,11.58366],[123.100838,11.165934],[122.637714,10.741308],[122.00261,10.441017],[121.967367,10.905691],[122.03837,11.415841],[121.883548,11.891755]]],[[[125.502552,12.162695],[125.783465,11.046122],[125.011884,11.311455],[125.032761,10.975816],[125.277449,10.358722],[124.801819,10.134679],[124.760168,10.837995],[124.459101,10.88993],[124.302522,11.495371],[124.891013,11.415583],[124.87799,11.79419],[124.266762,12.557761],[125.227116,12.535721],[125.502552,12.162695]]],[[[121.527394,13.06959],[121.26219,12.20556],[120.833896,12.704496],[120.323436,13.466413],[121.180128,13.429697],[121.527394,13.06959]]],[[[121.321308,18.504065],[121.937601,18.218552],[122.246006,18.47895],[122.336957,18.224883],[122.174279,17.810283],[122.515654,17.093505],[122.252311,16.262444],[121.662786,15.931018],[121.50507,15.124814],[121.728829,14.328376],[122.258925,14.218202],[122.701276,14.336541],[123.950295,13.782131],[123.855107,13.237771],[124.181289,12.997527],[124.077419,12.536677],[123.298035,13.027526],[122.928652,13.55292],[122.671355,13.185836],[122.03465,13.784482],[121.126385,13.636687],[120.628637,13.857656],[120.679384,14.271016],[120.991819,14.525393],[120.693336,14.756671],[120.564145,14.396279],[120.070429,14.970869],[119.920929,15.406347],[119.883773,16.363704],[120.286488,16.034629],[120.390047,17.599081],[120.715867,18.505227],[121.321308,18.504065]]]]}}, -{"type":"Feature","id":"PNG","properties":{"name":"Papua New Guinea"},"geometry":{"type":"MultiPolygon","coordinates":[[[[155.880026,-6.819997],[155.599991,-6.919991],[155.166994,-6.535931],[154.729192,-5.900828],[154.514114,-5.139118],[154.652504,-5.042431],[154.759991,-5.339984],[155.062918,-5.566792],[155.547746,-6.200655],[156.019965,-6.540014],[155.880026,-6.819997]]],[[[151.982796,-5.478063],[151.459107,-5.56028],[151.30139,-5.840728],[150.754447,-6.083763],[150.241197,-6.317754],[149.709963,-6.316513],[148.890065,-6.02604],[148.318937,-5.747142],[148.401826,-5.437756],[149.298412,-5.583742],[149.845562,-5.505503],[149.99625,-5.026101],[150.139756,-5.001348],[150.236908,-5.53222],[150.807467,-5.455842],[151.089672,-5.113693],[151.647881,-4.757074],[151.537862,-4.167807],[152.136792,-4.14879],[152.338743,-4.312966],[152.318693,-4.867661],[151.982796,-5.478063]]],[[[147.191874,-7.388024],[148.084636,-8.044108],[148.734105,-9.104664],[149.306835,-9.071436],[149.266631,-9.514406],[150.038728,-9.684318],[149.738798,-9.872937],[150.801628,-10.293687],[150.690575,-10.582713],[150.028393,-10.652476],[149.78231,-10.393267],[148.923138,-10.280923],[147.913018,-10.130441],[147.135443,-9.492444],[146.567881,-8.942555],[146.048481,-8.067414],[144.744168,-7.630128],[143.897088,-7.91533],[143.286376,-8.245491],[143.413913,-8.983069],[142.628431,-9.326821],[142.068259,-9.159596],[141.033852,-9.117893],[141.017057,-5.859022],[141.00021,-2.600151],[142.735247,-3.289153],[144.583971,-3.861418],[145.27318,-4.373738],[145.829786,-4.876498],[145.981922,-5.465609],[147.648073,-6.083659],[147.891108,-6.614015],[146.970905,-6.721657],[147.191874,-7.388024]]],[[[153.140038,-4.499983],[152.827292,-4.766427],[152.638673,-4.176127],[152.406026,-3.789743],[151.953237,-3.462062],[151.384279,-3.035422],[150.66205,-2.741486],[150.939965,-2.500002],[151.479984,-2.779985],[151.820015,-2.999972],[152.239989,-3.240009],[152.640017,-3.659983],[153.019994,-3.980015],[153.140038,-4.499983]]]]}}, -{"type":"Feature","id":"POL","properties":{"name":"Poland"},"geometry":{"type":"Polygon","coordinates":[[[15.016996,51.106674],[14.607098,51.745188],[14.685026,52.089947],[14.4376,52.62485],[14.074521,52.981263],[14.353315,53.248171],[14.119686,53.757029],[14.8029,54.050706],[16.363477,54.513159],[17.622832,54.851536],[18.620859,54.682606],[18.696255,54.438719],[19.66064,54.426084],[20.892245,54.312525],[22.731099,54.327537],[23.243987,54.220567],[23.484128,53.912498],[23.527536,53.470122],[23.804935,53.089731],[23.799199,52.691099],[23.199494,52.486977],[23.508002,52.023647],[23.527071,51.578454],[24.029986,50.705407],[23.922757,50.424881],[23.426508,50.308506],[22.51845,49.476774],[22.776419,49.027395],[22.558138,49.085738],[21.607808,49.470107],[20.887955,49.328772],[20.415839,49.431453],[19.825023,49.217125],[19.320713,49.571574],[18.909575,49.435846],[18.853144,49.49623],[18.392914,49.988629],[17.649445,50.049038],[17.554567,50.362146],[16.868769,50.473974],[16.719476,50.215747],[16.176253,50.422607],[16.238627,50.697733],[15.490972,50.78473],[15.016996,51.106674]]]}}, -{"type":"Feature","id":"PRI","properties":{"name":"Puerto Rico"},"geometry":{"type":"Polygon","coordinates":[[[-66.282434,18.514762],[-65.771303,18.426679],[-65.591004,18.228035],[-65.847164,17.975906],[-66.599934,17.981823],[-67.184162,17.946553],[-67.242428,18.37446],[-67.100679,18.520601],[-66.282434,18.514762]]]}}, -{"type":"Feature","id":"PRK","properties":{"name":"North Korea"},"geometry":{"type":"Polygon","coordinates":[[[130.640016,42.395009],[130.780007,42.220007],[130.400031,42.280004],[129.965949,41.941368],[129.667362,41.601104],[129.705189,40.882828],[129.188115,40.661808],[129.0104,40.485436],[128.633368,40.189847],[127.967414,40.025413],[127.533436,39.75685],[127.50212,39.323931],[127.385434,39.213472],[127.783343,39.050898],[128.349716,38.612243],[128.205746,38.370397],[127.780035,38.304536],[127.073309,38.256115],[126.68372,37.804773],[126.237339,37.840378],[126.174759,37.749686],[125.689104,37.94001],[125.568439,37.752089],[125.27533,37.669071],[125.240087,37.857224],[124.981033,37.948821],[124.712161,38.108346],[124.985994,38.548474],[125.221949,38.665857],[125.132859,38.848559],[125.38659,39.387958],[125.321116,39.551385],[124.737482,39.660344],[124.265625,39.928493],[125.079942,40.569824],[126.182045,41.107336],[126.869083,41.816569],[127.343783,41.503152],[128.208433,41.466772],[128.052215,41.994285],[129.596669,42.424982],[129.994267,42.985387],[130.640016,42.395009]]]}}, -{"type":"Feature","id":"PRT","properties":{"name":"Portugal"},"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.671946,42.134689],[-8.263857,42.280469],[-8.013175,41.790886],[-7.422513,41.792075],[-7.251309,41.918346],[-6.668606,41.883387],[-6.389088,41.381815],[-6.851127,41.111083],[-6.86402,40.330872],[-7.026413,40.184524],[-7.066592,39.711892],[-7.498632,39.629571],[-7.098037,39.030073],[-7.374092,38.373059],[-7.029281,38.075764],[-7.166508,37.803894],[-7.537105,37.428904],[-7.453726,37.097788],[-7.855613,36.838269],[-8.382816,36.97888],[-8.898857,36.868809],[-8.746101,37.651346],[-8.839998,38.266243],[-9.287464,38.358486],[-9.526571,38.737429],[-9.446989,39.392066],[-9.048305,39.755093],[-8.977353,40.159306],[-8.768684,40.760639],[-8.790853,41.184334],[-8.990789,41.543459],[-9.034818,41.880571]]]}}, -{"type":"Feature","id":"PRY","properties":{"name":"Paraguay"},"geometry":{"type":"Polygon","coordinates":[[[-62.685057,-22.249029],[-62.291179,-21.051635],[-62.265961,-20.513735],[-61.786326,-19.633737],[-60.043565,-19.342747],[-59.115042,-19.356906],[-58.183471,-19.868399],[-58.166392,-20.176701],[-57.870674,-20.732688],[-57.937156,-22.090176],[-56.88151,-22.282154],[-56.473317,-22.0863],[-55.797958,-22.35693],[-55.610683,-22.655619],[-55.517639,-23.571998],[-55.400747,-23.956935],[-55.027902,-24.001274],[-54.652834,-23.839578],[-54.29296,-24.021014],[-54.293476,-24.5708],[-54.428946,-25.162185],[-54.625291,-25.739255],[-54.788795,-26.621786],[-55.695846,-27.387837],[-56.486702,-27.548499],[-57.60976,-27.395899],[-58.618174,-27.123719],[-57.63366,-25.603657],[-57.777217,-25.16234],[-58.807128,-24.771459],[-60.028966,-24.032796],[-60.846565,-23.880713],[-62.685057,-22.249029]]]}}, -{"type":"Feature","id":"QAT","properties":{"name":"Qatar"},"geometry":{"type":"Polygon","coordinates":[[[50.810108,24.754743],[50.743911,25.482424],[51.013352,26.006992],[51.286462,26.114582],[51.589079,25.801113],[51.6067,25.21567],[51.389608,24.627386],[51.112415,24.556331],[50.810108,24.754743]]]}}, -{"type":"Feature","id":"ROU","properties":{"name":"Romania"},"geometry":{"type":"Polygon","coordinates":[[[22.710531,47.882194],[23.142236,48.096341],[23.760958,47.985598],[24.402056,47.981878],[24.866317,47.737526],[25.207743,47.891056],[25.945941,47.987149],[26.19745,48.220881],[26.619337,48.220726],[26.924176,48.123264],[27.233873,47.826771],[27.551166,47.405117],[28.12803,46.810476],[28.160018,46.371563],[28.054443,45.944586],[28.233554,45.488283],[28.679779,45.304031],[29.149725,45.464925],[29.603289,45.293308],[29.626543,45.035391],[29.141612,44.82021],[28.837858,44.913874],[28.558081,43.707462],[27.970107,43.812468],[27.2424,44.175986],[26.065159,43.943494],[25.569272,43.688445],[24.100679,43.741051],[23.332302,43.897011],[22.944832,43.823785],[22.65715,44.234923],[22.474008,44.409228],[22.705726,44.578003],[22.459022,44.702517],[22.145088,44.478422],[21.562023,44.768947],[21.483526,45.18117],[20.874313,45.416375],[20.762175,45.734573],[20.220192,46.127469],[21.021952,46.316088],[21.626515,46.994238],[22.099768,47.672439],[22.710531,47.882194]]]}}, -{"type":"Feature","id":"RUS","properties":{"name":"Russia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[143.648007,50.7476],[144.654148,48.976391],[143.173928,49.306551],[142.558668,47.861575],[143.533492,46.836728],[143.505277,46.137908],[142.747701,46.740765],[142.09203,45.966755],[141.906925,46.805929],[142.018443,47.780133],[141.904445,48.859189],[142.1358,49.615163],[142.179983,50.952342],[141.594076,51.935435],[141.682546,53.301966],[142.606934,53.762145],[142.209749,54.225476],[142.654786,54.365881],[142.914616,53.704578],[143.260848,52.74076],[143.235268,51.75666],[143.648007,50.7476]]],[[[22.731099,54.327537],[20.892245,54.312525],[19.66064,54.426084],[19.888481,54.86616],[21.268449,55.190482],[22.315724,55.015299],[22.757764,54.856574],[22.651052,54.582741],[22.731099,54.327537]]],[[[-175.01425,66.58435],[-174.33983,66.33556],[-174.57182,67.06219],[-171.85731,66.91308],[-169.89958,65.97724],[-170.89107,65.54139],[-172.53025,65.43791],[-172.555,64.46079],[-172.95533,64.25269],[-173.89184,64.2826],[-174.65392,64.63125],[-175.98353,64.92288],[-176.20716,65.35667],[-177.22266,65.52024],[-178.35993,65.39052],[-178.90332,65.74044],[-178.68611,66.11211],[-179.88377,65.87456],[-179.43268,65.40411],[-180,64.979709],[-180,68.963636],[-177.55,68.2],[-174.92825,67.20589],[-175.01425,66.58435]]],[[[180,70.832199],[178.903425,70.78114],[178.7253,71.0988],[180,71.515714],[180,70.832199]]],[[[-178.69378,70.89302],[-180,70.832199],[-180,71.515714],[-179.871875,71.55762],[-179.02433,71.55553],[-177.577945,71.26948],[-177.663575,71.13277],[-178.69378,70.89302]]],[[[143.60385,73.21244],[142.08763,73.20544],[140.038155,73.31692],[139.86312,73.36983],[140.81171,73.76506],[142.06207,73.85758],[143.48283,73.47525],[143.60385,73.21244]]],[[[150.73167,75.08406],[149.575925,74.68892],[147.977465,74.778355],[146.11919,75.17298],[146.358485,75.49682],[148.22223,75.345845],[150.73167,75.08406]]],[[[145.086285,75.562625],[144.3,74.82],[140.61381,74.84768],[138.95544,74.61148],[136.97439,75.26167],[137.51176,75.94917],[138.831075,76.13676],[141.471615,76.09289],[145.086285,75.562625]]],[[[57.535693,70.720464],[56.944979,70.632743],[53.677375,70.762658],[53.412017,71.206662],[51.601895,71.474759],[51.455754,72.014881],[52.478275,72.229442],[52.444169,72.774731],[54.427614,73.627548],[53.50829,73.749814],[55.902459,74.627486],[55.631933,75.081412],[57.868644,75.60939],[61.170044,76.251883],[64.498368,76.439055],[66.210977,76.809782],[68.15706,76.939697],[68.852211,76.544811],[68.180573,76.233642],[64.637326,75.737755],[61.583508,75.260885],[58.477082,74.309056],[56.986786,73.333044],[55.419336,72.371268],[55.622838,71.540595],[57.535693,70.720464]]],[[[106.97013,76.97419],[107.24,76.48],[108.1538,76.72335],[111.07726,76.71],[113.33151,76.22224],[114.13417,75.84764],[113.88539,75.32779],[112.77918,75.03186],[110.15125,74.47673],[109.4,74.18],[110.64,74.04],[112.11919,73.78774],[113.01954,73.97693],[113.52958,73.33505],[113.96881,73.59488],[115.56782,73.75285],[118.77633,73.58772],[119.02,73.12],[123.20066,72.97122],[123.25777,73.73503],[125.38,73.56],[126.97644,73.56549],[128.59126,73.03871],[129.05157,72.39872],[128.46,71.98],[129.71599,71.19304],[131.28858,70.78699],[132.2535,71.8363],[133.85766,71.38642],[135.56193,71.65525],[137.49755,71.34763],[138.23409,71.62803],[139.86983,71.48783],[139.14791,72.41619],[140.46817,72.84941],[149.5,72.2],[150.35118,71.60643],[152.9689,70.84222],[157.00688,71.03141],[158.99779,70.86672],[159.83031,70.45324],[159.70866,69.72198],[160.94053,69.43728],[162.27907,69.64204],[164.05248,69.66823],[165.94037,69.47199],[167.83567,69.58269],[169.57763,68.6938],[170.81688,69.01363],[170.0082,69.65276],[170.45345,70.09703],[173.64391,69.81743],[175.72403,69.87725],[178.6,69.4],[180,68.963636],[180,64.979709],[179.99281,64.97433],[178.7072,64.53493],[177.41128,64.60821],[178.313,64.07593],[178.90825,63.25197],[179.37034,62.98262],[179.48636,62.56894],[179.22825,62.3041],[177.3643,62.5219],[174.56929,61.76915],[173.68013,61.65261],[172.15,60.95],[170.6985,60.33618],[170.33085,59.88177],[168.90046,60.57355],[166.29498,59.78855],[165.84,60.16],[164.87674,59.7316],[163.53929,59.86871],[163.21711,59.21101],[162.01733,58.24328],[162.05297,57.83912],[163.19191,57.61503],[163.05794,56.15924],[162.12958,56.12219],[161.70146,55.28568],[162.11749,54.85514],[160.36877,54.34433],[160.02173,53.20257],[158.53094,52.95868],[158.23118,51.94269],[156.78979,51.01105],[156.42,51.7],[155.99182,53.15895],[155.43366,55.38103],[155.91442,56.76792],[156.75815,57.3647],[156.81035,57.83204],[158.36433,58.05575],[160.15064,59.31477],[161.87204,60.343],[163.66969,61.1409],[164.47355,62.55061],[163.25842,62.46627],[162.65791,61.6425],[160.12148,60.54423],[159.30232,61.77396],[156.72068,61.43442],[154.21806,59.75818],[155.04375,59.14495],[152.81185,58.88385],[151.26573,58.78089],[151.33815,59.50396],[149.78371,59.65573],[148.54481,59.16448],[145.48722,59.33637],[142.19782,59.03998],[138.95848,57.08805],[135.12619,54.72959],[136.70171,54.60355],[137.19342,53.97732],[138.1647,53.75501],[138.80463,54.25455],[139.90151,54.18968],[141.34531,53.08957],[141.37923,52.23877],[140.59742,51.23967],[140.51308,50.04553],[140.06193,48.44671],[138.55472,46.99965],[138.21971,46.30795],[136.86232,45.1435],[135.51535,43.989],[134.86939,43.39821],[133.53687,42.81147],[132.90627,42.79849],[132.27807,43.28456],[130.93587,42.55274],[130.78,42.22],[130.64,42.395],[130.633866,42.903015],[131.144688,42.92999],[131.288555,44.11152],[131.02519,44.96796],[131.883454,45.321162],[133.09712,45.14409],[133.769644,46.116927],[134.11235,47.21248],[134.50081,47.57845],[135.026311,48.47823],[133.373596,48.183442],[132.50669,47.78896],[130.98726,47.79013],[130.582293,48.729687],[129.397818,49.4406],[127.6574,49.76027],[127.287456,50.739797],[126.939157,51.353894],[126.564399,51.784255],[125.946349,52.792799],[125.068211,53.161045],[123.57147,53.4588],[122.245748,53.431726],[121.003085,53.251401],[120.177089,52.753886],[120.725789,52.516226],[120.7382,51.96411],[120.18208,51.64355],[119.27939,50.58292],[119.288461,50.142883],[117.879244,49.510983],[116.678801,49.888531],[115.485695,49.805177],[114.96211,50.140247],[114.362456,50.248303],[112.89774,49.543565],[111.581231,49.377968],[110.662011,49.130128],[109.402449,49.292961],[108.475167,49.282548],[107.868176,49.793705],[106.888804,50.274296],[105.886591,50.406019],[104.62158,50.27532],[103.676545,50.089966],[102.25589,50.51056],[102.06521,51.25991],[100.88948,51.516856],[99.981732,51.634006],[98.861491,52.047366],[97.82574,51.010995],[98.231762,50.422401],[97.25976,49.72605],[95.81402,49.97746],[94.815949,50.013433],[94.147566,50.480537],[93.10421,50.49529],[92.234712,50.802171],[90.713667,50.331812],[88.805567,49.470521],[87.751264,49.297198],[87.35997,49.214981],[86.829357,49.826675],[85.54127,49.692859],[85.11556,50.117303],[84.416377,50.3114],[83.935115,50.889246],[83.383004,51.069183],[81.945986,50.812196],[80.568447,51.388336],[80.03556,50.864751],[77.800916,53.404415],[76.525179,54.177003],[76.8911,54.490524],[74.38482,53.54685],[73.425679,53.48981],[73.508516,54.035617],[72.22415,54.376655],[71.180131,54.133285],[70.865267,55.169734],[69.068167,55.38525],[68.1691,54.970392],[65.66687,54.60125],[65.178534,54.354228],[61.4366,54.00625],[60.978066,53.664993],[61.699986,52.979996],[60.739993,52.719986],[60.927269,52.447548],[59.967534,51.96042],[61.588003,51.272659],[61.337424,50.79907],[59.932807,50.842194],[59.642282,50.545442],[58.36332,51.06364],[56.77798,51.04355],[55.71694,50.62171],[54.532878,51.02624],[52.328724,51.718652],[50.766648,51.692762],[48.702382,50.605128],[48.577841,49.87476],[47.54948,50.454698],[46.751596,49.356006],[47.043672,49.152039],[46.466446,48.394152],[47.31524,47.71585],[48.05725,47.74377],[48.694734,47.075628],[48.59325,46.56104],[49.10116,46.39933],[48.64541,45.80629],[47.67591,45.64149],[46.68201,44.6092],[47.59094,43.66016],[47.49252,42.98658],[48.58437,41.80888],[47.987283,41.405819],[47.815666,41.151416],[47.373315,41.219732],[46.686071,41.827137],[46.404951,41.860675],[45.7764,42.09244],[45.470279,42.502781],[44.537623,42.711993],[43.93121,42.55496],[43.75599,42.74083],[42.3944,43.2203],[40.92219,43.38215],[40.076965,43.553104],[39.955009,43.434998],[38.68,44.28],[37.53912,44.65721],[36.67546,45.24469],[37.40317,45.40451],[38.23295,46.24087],[37.67372,46.63657],[39.14767,47.04475],[39.1212,47.26336],[38.223538,47.10219],[38.255112,47.5464],[38.77057,47.82562],[39.738278,47.898937],[39.89562,48.23241],[39.67465,48.78382],[40.080789,49.30743],[40.06904,49.60105],[38.594988,49.926462],[38.010631,49.915662],[37.39346,50.383953],[36.626168,50.225591],[35.356116,50.577197],[35.37791,50.77394],[35.022183,51.207572],[34.224816,51.255993],[34.141978,51.566413],[34.391731,51.768882],[33.7527,52.335075],[32.715761,52.238465],[32.412058,52.288695],[32.15944,52.06125],[31.78597,52.10168],[31.540018,52.742052],[31.305201,53.073996],[31.49764,53.16743],[32.304519,53.132726],[32.693643,53.351421],[32.405599,53.618045],[31.731273,53.794029],[31.791424,53.974639],[31.384472,54.157056],[30.757534,54.811771],[30.971836,55.081548],[30.873909,55.550976],[29.896294,55.789463],[29.371572,55.670091],[29.229513,55.918344],[28.176709,56.16913],[27.855282,56.759326],[27.770016,57.244258],[27.288185,57.474528],[27.716686,57.791899],[27.42015,58.72457],[28.131699,59.300825],[27.98112,59.47537],[29.1177,60.02805],[28.07,60.50352],[30.211107,61.780028],[31.139991,62.357693],[31.516092,62.867687],[30.035872,63.552814],[30.444685,64.204453],[29.54443,64.948672],[30.21765,65.80598],[29.054589,66.944286],[29.977426,67.698297],[28.445944,68.364613],[28.59193,69.064777],[29.39955,69.15692],[31.10108,69.55811],[32.13272,69.90595],[33.77547,69.30142],[36.51396,69.06342],[40.29234,67.9324],[41.05987,67.45713],[41.12595,66.79158],[40.01583,66.26618],[38.38295,65.99953],[33.91871,66.75961],[33.18444,66.63253],[34.81477,65.90015],[34.878574,65.436213],[34.94391,64.41437],[36.23129,64.10945],[37.01273,63.84983],[37.14197,64.33471],[36.539579,64.76446],[37.17604,65.14322],[39.59345,64.52079],[40.4356,64.76446],[39.7626,65.49682],[42.09309,66.47623],[43.01604,66.41858],[43.94975,66.06908],[44.53226,66.75634],[43.69839,67.35245],[44.18795,67.95051],[43.45282,68.57079],[46.25,68.25],[46.82134,67.68997],[45.55517,67.56652],[45.56202,67.01005],[46.34915,66.66767],[47.89416,66.88455],[48.13876,67.52238],[50.22766,67.99867],[53.71743,68.85738],[54.47171,68.80815],[53.48582,68.20131],[54.72628,68.09702],[55.44268,68.43866],[57.31702,68.46628],[58.802,68.88082],[59.94142,68.27844],[61.07784,68.94069],[60.03,69.52],[60.55,69.85],[63.504,69.54739],[64.888115,69.234835],[68.51216,68.09233],[69.18068,68.61563],[68.16444,69.14436],[68.13522,69.35649],[66.93008,69.45461],[67.25976,69.92873],[66.72492,70.70889],[66.69466,71.02897],[68.54006,71.9345],[69.19636,72.84336],[69.94,73.04],[72.58754,72.77629],[72.79603,72.22006],[71.84811,71.40898],[72.47011,71.09019],[72.79188,70.39114],[72.5647,69.02085],[73.66787,68.4079],[73.2387,67.7404],[71.28,66.32],[72.42301,66.17267],[72.82077,66.53267],[73.92099,66.78946],[74.18651,67.28429],[75.052,67.76047],[74.46926,68.32899],[74.93584,68.98918],[73.84236,69.07146],[73.60187,69.62763],[74.3998,70.63175],[73.1011,71.44717],[74.89082,72.12119],[74.65926,72.83227],[75.15801,72.85497],[75.68351,72.30056],[75.28898,71.33556],[76.35911,71.15287],[75.90313,71.87401],[77.57665,72.26717],[79.65202,72.32011],[81.5,71.75],[80.61071,72.58285],[80.51109,73.6482],[82.25,73.85],[84.65526,73.80591],[86.8223,73.93688],[86.00956,74.45967],[87.16682,75.11643],[88.31571,75.14393],[90.26,75.64],[92.90058,75.77333],[93.23421,76.0472],[95.86,76.14],[96.67821,75.91548],[98.92254,76.44689],[100.75967,76.43028],[101.03532,76.86189],[101.99084,77.28754],[104.3516,77.69792],[106.06664,77.37389],[104.705,77.1274],[106.97013,76.97419]]],[[[105.07547,78.30689],[99.43814,77.921],[101.2649,79.23399],[102.08635,79.34641],[102.837815,79.28129],[105.37243,78.71334],[105.07547,78.30689]]],[[[51.136187,80.54728],[49.793685,80.415428],[48.894411,80.339567],[48.754937,80.175468],[47.586119,80.010181],[46.502826,80.247247],[47.072455,80.559424],[44.846958,80.58981],[46.799139,80.771918],[48.318477,80.78401],[48.522806,80.514569],[49.09719,80.753986],[50.039768,80.918885],[51.522933,80.699726],[51.136187,80.54728]]],[[[99.93976,78.88094],[97.75794,78.7562],[94.97259,79.044745],[93.31288,79.4265],[92.5454,80.14379],[91.18107,80.34146],[93.77766,81.0246],[95.940895,81.2504],[97.88385,80.746975],[100.186655,79.780135],[99.93976,78.88094]]]]}}, -{"type":"Feature","id":"RWA","properties":{"name":"Rwanda"},"geometry":{"type":"Polygon","coordinates":[[[30.419105,-1.134659],[30.816135,-1.698914],[30.758309,-2.28725],[30.469696,-2.413858],[29.938359,-2.348487],[29.632176,-2.917858],[29.024926,-2.839258],[29.117479,-2.292211],[29.254835,-2.21511],[29.291887,-1.620056],[29.579466,-1.341313],[29.821519,-1.443322],[30.419105,-1.134659]]]}}, -{"type":"Feature","id":"ESH","properties":{"name":"Western Sahara"},"geometry":{"type":"Polygon","coordinates":[[[-8.794884,27.120696],[-8.817828,27.656426],[-8.66559,27.656426],[-8.665124,27.589479],[-8.6844,27.395744],[-8.687294,25.881056],[-11.969419,25.933353],[-11.937224,23.374594],[-12.874222,23.284832],[-13.118754,22.77122],[-12.929102,21.327071],[-16.845194,21.333323],[-17.063423,20.999752],[-17.020428,21.42231],[-17.002962,21.420734],[-14.750955,21.5006],[-14.630833,21.86094],[-14.221168,22.310163],[-13.89111,23.691009],[-12.500963,24.770116],[-12.030759,26.030866],[-11.71822,26.104092],[-11.392555,26.883424],[-10.551263,26.990808],[-10.189424,26.860945],[-9.735343,26.860945],[-9.413037,27.088476],[-8.794884,27.120696]]]}}, -{"type":"Feature","id":"SAU","properties":{"name":"Saudi Arabia"},"geometry":{"type":"Polygon","coordinates":[[[42.779332,16.347891],[42.649573,16.774635],[42.347989,17.075806],[42.270888,17.474722],[41.754382,17.833046],[41.221391,18.6716],[40.939341,19.486485],[40.247652,20.174635],[39.801685,20.338862],[39.139399,21.291905],[39.023696,21.986875],[39.066329,22.579656],[38.492772,23.688451],[38.02386,24.078686],[37.483635,24.285495],[37.154818,24.858483],[37.209491,25.084542],[36.931627,25.602959],[36.639604,25.826228],[36.249137,26.570136],[35.640182,27.37652],[35.130187,28.063352],[34.632336,28.058546],[34.787779,28.607427],[34.83222,28.957483],[34.956037,29.356555],[36.068941,29.197495],[36.501214,29.505254],[36.740528,29.865283],[37.503582,30.003776],[37.66812,30.338665],[37.998849,30.5085],[37.002166,31.508413],[39.004886,32.010217],[39.195468,32.161009],[40.399994,31.889992],[41.889981,31.190009],[44.709499,29.178891],[46.568713,29.099025],[47.459822,29.002519],[47.708851,28.526063],[48.416094,28.552004],[48.807595,27.689628],[49.299554,27.461218],[49.470914,27.109999],[50.152422,26.689663],[50.212935,26.277027],[50.113303,25.943972],[50.239859,25.60805],[50.527387,25.327808],[50.660557,24.999896],[50.810108,24.754743],[51.112415,24.556331],[51.389608,24.627386],[51.579519,24.245497],[51.617708,24.014219],[52.000733,23.001154],[55.006803,22.496948],[55.208341,22.70833],[55.666659,22.000001],[54.999982,19.999994],[52.00001,19.000003],[49.116672,18.616668],[48.183344,18.166669],[47.466695,17.116682],[47.000005,16.949999],[46.749994,17.283338],[46.366659,17.233315],[45.399999,17.333335],[45.216651,17.433329],[44.062613,17.410359],[43.791519,17.319977],[43.380794,17.579987],[43.115798,17.08844],[43.218375,16.66689],[42.779332,16.347891]]]}}, -{"type":"Feature","id":"SDN","properties":{"name":"Sudan"},"geometry":{"type":"Polygon","coordinates":[[[33.963393,9.464285],[33.824963,9.484061],[33.842131,9.981915],[33.721959,10.325262],[33.206938,10.720112],[33.086766,11.441141],[33.206938,12.179338],[32.743419,12.248008],[32.67475,12.024832],[32.073892,11.97333],[32.314235,11.681484],[32.400072,11.080626],[31.850716,10.531271],[31.352862,9.810241],[30.837841,9.707237],[29.996639,10.290927],[29.618957,10.084919],[29.515953,9.793074],[29.000932,9.604232],[28.966597,9.398224],[27.97089,9.398224],[27.833551,9.604232],[27.112521,9.638567],[26.752006,9.466893],[26.477328,9.55273],[25.962307,10.136421],[25.790633,10.411099],[25.069604,10.27376],[24.794926,9.810241],[24.537415,8.917538],[24.194068,8.728696],[23.88698,8.61973],[23.805813,8.666319],[23.459013,8.954286],[23.394779,9.265068],[23.55725,9.681218],[23.554304,10.089255],[22.977544,10.714463],[22.864165,11.142395],[22.87622,11.38461],[22.50869,11.67936],[22.49762,12.26024],[22.28801,12.64605],[21.93681,12.58818],[22.03759,12.95546],[22.29658,13.37232],[22.18329,13.78648],[22.51202,14.09318],[22.30351,14.32682],[22.56795,14.94429],[23.02459,15.68072],[23.88689,15.61084],[23.83766,19.58047],[23.85,20],[25,20.00304],[25,22],[29.02,22],[32.9,22],[36.86623,22],[37.18872,21.01885],[36.96941,20.83744],[37.1147,19.80796],[37.48179,18.61409],[37.86276,18.36786],[38.41009,17.998307],[37.904,17.42754],[37.16747,17.26314],[36.85253,16.95655],[36.75389,16.29186],[36.32322,14.82249],[36.42951,14.42211],[36.27022,13.56333],[35.86363,12.57828],[35.26049,12.08286],[34.83163,11.31896],[34.73115,10.91017],[34.25745,10.63009],[33.96162,9.58358],[33.963393,9.464285]]]}}, -{"type":"Feature","id":"SSD","properties":{"name":"South Sudan"},"geometry":{"type":"Polygon","coordinates":[[[33.963393,9.464285],[33.97498,8.68456],[33.8255,8.37916],[33.2948,8.35458],[32.95418,7.78497],[33.56829,7.71334],[34.0751,7.22595],[34.25032,6.82607],[34.70702,6.59422],[35.298007,5.506],[34.620196,4.847123],[34.005,4.249885],[33.39,3.79],[32.68642,3.79232],[31.88145,3.55827],[31.24556,3.7819],[30.83385,3.50917],[29.95349,4.1737],[29.715995,4.600805],[29.159078,4.389267],[28.696678,4.455077],[28.428994,4.287155],[27.979977,4.408413],[27.374226,5.233944],[27.213409,5.550953],[26.465909,5.946717],[26.213418,6.546603],[25.796648,6.979316],[25.124131,7.500085],[25.114932,7.825104],[24.567369,8.229188],[23.88698,8.61973],[24.194068,8.728696],[24.537415,8.917538],[24.794926,9.810241],[25.069604,10.27376],[25.790633,10.411099],[25.962307,10.136421],[26.477328,9.55273],[26.752006,9.466893],[27.112521,9.638567],[27.833551,9.604232],[27.97089,9.398224],[28.966597,9.398224],[29.000932,9.604232],[29.515953,9.793074],[29.618957,10.084919],[29.996639,10.290927],[30.837841,9.707237],[31.352862,9.810241],[31.850716,10.531271],[32.400072,11.080626],[32.314235,11.681484],[32.073892,11.97333],[32.67475,12.024832],[32.743419,12.248008],[33.206938,12.179338],[33.086766,11.441141],[33.206938,10.720112],[33.721959,10.325262],[33.842131,9.981915],[33.824963,9.484061],[33.963393,9.464285]]]}}, -{"type":"Feature","id":"SEN","properties":{"name":"Senegal"},"geometry":{"type":"Polygon","coordinates":[[[-16.713729,13.594959],[-17.126107,14.373516],[-17.625043,14.729541],[-17.185173,14.919477],[-16.700706,15.621527],[-16.463098,16.135036],[-16.12069,16.455663],[-15.623666,16.369337],[-15.135737,16.587282],[-14.577348,16.598264],[-14.099521,16.304302],[-13.435738,16.039383],[-12.830658,15.303692],[-12.17075,14.616834],[-12.124887,13.994727],[-11.927716,13.422075],[-11.553398,13.141214],[-11.467899,12.754519],[-11.513943,12.442988],[-11.658301,12.386583],[-12.203565,12.465648],[-12.278599,12.35444],[-12.499051,12.33209],[-13.217818,12.575874],[-13.700476,12.586183],[-15.548477,12.62817],[-15.816574,12.515567],[-16.147717,12.547762],[-16.677452,12.384852],[-16.841525,13.151394],[-15.931296,13.130284],[-15.691001,13.270353],[-15.511813,13.27857],[-15.141163,13.509512],[-14.712197,13.298207],[-14.277702,13.280585],[-13.844963,13.505042],[-14.046992,13.794068],[-14.376714,13.62568],[-14.687031,13.630357],[-15.081735,13.876492],[-15.39877,13.860369],[-15.624596,13.623587],[-16.713729,13.594959]]]}}, -{"type":"Feature","id":"SLB","properties":{"name":"Solomon Islands"},"geometry":{"type":"MultiPolygon","coordinates":[[[[162.119025,-10.482719],[162.398646,-10.826367],[161.700032,-10.820011],[161.319797,-10.204751],[161.917383,-10.446701],[162.119025,-10.482719]]],[[[160.852229,-9.872937],[160.462588,-9.89521],[159.849447,-9.794027],[159.640003,-9.63998],[159.702945,-9.24295],[160.362956,-9.400304],[160.688518,-9.610162],[160.852229,-9.872937]]],[[[161.679982,-9.599982],[161.529397,-9.784312],[160.788253,-8.917543],[160.579997,-8.320009],[160.920028,-8.320009],[161.280006,-9.120011],[161.679982,-9.599982]]],[[[159.875027,-8.33732],[159.917402,-8.53829],[159.133677,-8.114181],[158.586114,-7.754824],[158.21115,-7.421872],[158.359978,-7.320018],[158.820001,-7.560003],[159.640003,-8.020027],[159.875027,-8.33732]]],[[[157.538426,-7.34782],[157.33942,-7.404767],[156.90203,-7.176874],[156.491358,-6.765943],[156.542828,-6.599338],[157.14,-7.021638],[157.538426,-7.34782]]]]}}, -{"type":"Feature","id":"SLE","properties":{"name":"Sierra Leone"},"geometry":{"type":"Polygon","coordinates":[[[-11.438779,6.785917],[-11.708195,6.860098],[-12.428099,7.262942],[-12.949049,7.798646],[-13.124025,8.163946],[-13.24655,8.903049],[-12.711958,9.342712],[-12.596719,9.620188],[-12.425929,9.835834],[-12.150338,9.858572],[-11.917277,10.046984],[-11.117481,10.045873],[-10.839152,9.688246],[-10.622395,9.26791],[-10.65477,8.977178],[-10.494315,8.715541],[-10.505477,8.348896],[-10.230094,8.406206],[-10.695595,7.939464],[-11.146704,7.396706],[-11.199802,7.105846],[-11.438779,6.785917]]]}}, -{"type":"Feature","id":"SLV","properties":{"name":"El Salvador"},"geometry":{"type":"Polygon","coordinates":[[[-87.793111,13.38448],[-87.904112,13.149017],[-88.483302,13.163951],[-88.843228,13.259734],[-89.256743,13.458533],[-89.812394,13.520622],[-90.095555,13.735338],[-90.064678,13.88197],[-89.721934,14.134228],[-89.534219,14.244816],[-89.587343,14.362586],[-89.353326,14.424133],[-89.058512,14.340029],[-88.843073,14.140507],[-88.541231,13.980155],[-88.503998,13.845486],[-88.065343,13.964626],[-87.859515,13.893312],[-87.723503,13.78505],[-87.793111,13.38448]]]}}, -{"type":"Feature","id":"-99","properties":{"name":"Somaliland"},"geometry":{"type":"Polygon","coordinates":[[[48.93813,9.451749],[48.486736,8.837626],[47.78942,8.003],[46.948328,7.996877],[43.67875,9.18358],[43.296975,9.540477],[42.92812,10.02194],[42.55876,10.57258],[42.776852,10.926879],[43.145305,11.46204],[43.47066,11.27771],[43.666668,10.864169],[44.117804,10.445538],[44.614259,10.442205],[45.556941,10.698029],[46.645401,10.816549],[47.525658,11.127228],[48.021596,11.193064],[48.378784,11.375482],[48.948206,11.410622],[48.942005,11.394266],[48.938491,10.982327],[48.938233,9.9735],[48.93813,9.451749]]]}}, -{"type":"Feature","id":"SOM","properties":{"name":"Somalia"},"geometry":{"type":"Polygon","coordinates":[[[49.72862,11.5789],[50.25878,11.67957],[50.73202,12.0219],[51.1112,12.02464],[51.13387,11.74815],[51.04153,11.16651],[51.04531,10.6409],[50.83418,10.27972],[50.55239,9.19874],[50.07092,8.08173],[49.4527,6.80466],[48.59455,5.33911],[47.74079,4.2194],[46.56476,2.85529],[45.56399,2.04576],[44.06815,1.05283],[43.13597,0.2922],[42.04157,-0.91916],[41.81095,-1.44647],[41.58513,-1.68325],[40.993,-0.85829],[40.98105,2.78452],[41.855083,3.918912],[42.12861,4.23413],[42.76967,4.25259],[43.66087,4.95755],[44.9636,5.00162],[47.78942,8.003],[48.486736,8.837626],[48.93813,9.451749],[48.938233,9.9735],[48.938491,10.982327],[48.942005,11.394266],[48.948205,11.410617],[49.26776,11.43033],[49.72862,11.5789]]]}}, -{"type":"Feature","id":"SRB","properties":{"name":"Republic of Serbia"},"geometry":{"type":"Polygon","coordinates":[[[20.874313,45.416375],[21.483526,45.18117],[21.562023,44.768947],[22.145088,44.478422],[22.459022,44.702517],[22.705726,44.578003],[22.474008,44.409228],[22.65715,44.234923],[22.410446,44.008063],[22.500157,43.642814],[22.986019,43.211161],[22.604801,42.898519],[22.436595,42.580321],[22.545012,42.461362],[22.380526,42.32026],[21.91708,42.30364],[21.576636,42.245224],[21.54332,42.32025],[21.66292,42.43922],[21.77505,42.6827],[21.63302,42.67717],[21.43866,42.86255],[21.27421,42.90959],[21.143395,43.068685],[20.95651,43.13094],[20.81448,43.27205],[20.63508,43.21671],[20.49679,42.88469],[20.25758,42.81275],[20.3398,42.89852],[19.95857,43.10604],[19.63,43.21378],[19.48389,43.35229],[19.21852,43.52384],[19.454,43.5681],[19.59976,44.03847],[19.11761,44.42307],[19.36803,44.863],[19.00548,44.86023],[19.390476,45.236516],[19.072769,45.521511],[18.82982,45.90888],[19.596045,46.17173],[20.220192,46.127469],[20.762175,45.734573],[20.874313,45.416375]]]}}, -{"type":"Feature","id":"SUR","properties":{"name":"Suriname"},"geometry":{"type":"Polygon","coordinates":[[[-57.147436,5.97315],[-55.949318,5.772878],[-55.84178,5.953125],[-55.03325,6.025291],[-53.958045,5.756548],[-54.478633,4.896756],[-54.399542,4.212611],[-54.006931,3.620038],[-54.181726,3.18978],[-54.269705,2.732392],[-54.524754,2.311849],[-55.097587,2.523748],[-55.569755,2.421506],[-55.973322,2.510364],[-56.073342,2.220795],[-55.9056,2.021996],[-55.995698,1.817667],[-56.539386,1.899523],[-57.150098,2.768927],[-57.281433,3.333492],[-57.601569,3.334655],[-58.044694,4.060864],[-57.86021,4.576801],[-57.914289,4.812626],[-57.307246,5.073567],[-57.147436,5.97315]]]}}, -{"type":"Feature","id":"SVK","properties":{"name":"Slovakia"},"geometry":{"type":"Polygon","coordinates":[[[18.853144,49.49623],[18.909575,49.435846],[19.320713,49.571574],[19.825023,49.217125],[20.415839,49.431453],[20.887955,49.328772],[21.607808,49.470107],[22.558138,49.085738],[22.280842,48.825392],[22.085608,48.422264],[21.872236,48.319971],[20.801294,48.623854],[20.473562,48.56285],[20.239054,48.327567],[19.769471,48.202691],[19.661364,48.266615],[19.174365,48.111379],[18.777025,48.081768],[18.696513,47.880954],[17.857133,47.758429],[17.488473,47.867466],[16.979667,48.123497],[16.879983,48.470013],[16.960288,48.596982],[17.101985,48.816969],[17.545007,48.800019],[17.886485,48.903475],[17.913512,48.996493],[18.104973,49.043983],[18.170498,49.271515],[18.399994,49.315001],[18.554971,49.495015],[18.853144,49.49623]]]}}, -{"type":"Feature","id":"SVN","properties":{"name":"Slovenia"},"geometry":{"type":"Polygon","coordinates":[[[13.806475,46.509306],[14.632472,46.431817],[15.137092,46.658703],[16.011664,46.683611],[16.202298,46.852386],[16.370505,46.841327],[16.564808,46.503751],[15.768733,46.238108],[15.67153,45.834154],[15.323954,45.731783],[15.327675,45.452316],[14.935244,45.471695],[14.595109,45.634941],[14.411968,45.466166],[13.71506,45.500324],[13.93763,45.591016],[13.69811,46.016778],[13.806475,46.509306]]]}}, -{"type":"Feature","id":"SWE","properties":{"name":"Sweden"},"geometry":{"type":"MultiPolygon","coordinates":[[[[22.183173,65.723741],[21.213517,65.026005],[21.369631,64.413588],[19.778876,63.609554],[17.847779,62.7494],[17.119555,61.341166],[17.831346,60.636583],[18.787722,60.081914],[17.869225,58.953766],[16.829185,58.719827],[16.44771,57.041118],[15.879786,56.104302],[14.666681,56.200885],[14.100721,55.407781],[12.942911,55.361737],[12.625101,56.30708],[11.787942,57.441817],[11.027369,58.856149],[11.468272,59.432393],[12.300366,60.117933],[12.631147,61.293572],[11.992064,61.800362],[11.930569,63.128318],[12.579935,64.066219],[13.571916,64.049114],[13.919905,64.445421],[13.55569,64.787028],[15.108411,66.193867],[16.108712,67.302456],[16.768879,68.013937],[17.729182,68.010552],[17.993868,68.567391],[19.87856,68.407194],[20.025269,69.065139],[20.645593,69.106247],[21.978535,68.616846],[23.539473,67.936009],[23.56588,66.396051],[23.903379,66.006927],[22.183173,65.723741]],[[17.061767,57.385783],[17.210083,57.326521],[16.430053,56.179196],[16.364135,56.556455],[17.061767,57.385783]],[[19.357910,57.958588],[18.803100,57.651279],[18.825073,57.444949],[18.995361,57.441993],[18.951416,57.370976],[18.693237,57.305756],[18.709716,57.204734],[18.462524,57.127295],[18.319702,56.926992],[18.105468,56.891003],[18.187866,57.109402],[18.072509,57.267163],[18.154907,57.394664],[18.094482,57.545312],[18.660278,57.929434],[19.039306,57.941098],[19.105224,57.993543],[19.374389,57.996454],[19.357910,57.958588]],[[20.846557,63.823710],[21.066284,63.829768],[20.972900,63.715670],[20.824584,63.579121],[20.695495,63.591340],[20.819091,63.714454],[20.799865,63.780059],[20.846557,63.823710]]]]}}, -{"type":"Feature","id":"SWZ","properties":{"name":"Swaziland"},"geometry":{"type":"Polygon","coordinates":[[[32.071665,-26.73382],[31.86806,-27.177927],[31.282773,-27.285879],[30.685962,-26.743845],[30.676609,-26.398078],[30.949667,-26.022649],[31.04408,-25.731452],[31.333158,-25.660191],[31.837778,-25.843332],[31.985779,-26.29178],[32.071665,-26.73382]]]}}, -{"type":"Feature","id":"SYR","properties":{"name":"Syria"},"geometry":{"type":"Polygon","coordinates":[[[38.792341,33.378686],[36.834062,32.312938],[35.719918,32.709192],[35.700798,32.716014],[35.836397,32.868123],[35.821101,33.277426],[36.06646,33.824912],[36.61175,34.201789],[36.448194,34.593935],[35.998403,34.644914],[35.905023,35.410009],[36.149763,35.821535],[36.41755,36.040617],[36.685389,36.259699],[36.739494,36.81752],[37.066761,36.623036],[38.167727,36.90121],[38.699891,36.712927],[39.52258,36.716054],[40.673259,37.091276],[41.212089,37.074352],[42.349591,37.229873],[41.837064,36.605854],[41.289707,36.358815],[41.383965,35.628317],[41.006159,34.419372],[38.792341,33.378686]]]}}, -{"type":"Feature","id":"TCD","properties":{"name":"Chad"},"geometry":{"type":"Polygon","coordinates":[[[14.495787,12.859396],[14.595781,13.330427],[13.954477,13.353449],[13.956699,13.996691],[13.540394,14.367134],[13.97217,15.68437],[15.247731,16.627306],[15.300441,17.92795],[15.685741,19.95718],[15.903247,20.387619],[15.487148,20.730415],[15.47106,21.04845],[15.096888,21.308519],[14.8513,22.86295],[15.86085,23.40972],[19.84926,21.49509],[23.83766,19.58047],[23.88689,15.61084],[23.02459,15.68072],[22.56795,14.94429],[22.30351,14.32682],[22.51202,14.09318],[22.18329,13.78648],[22.29658,13.37232],[22.03759,12.95546],[21.93681,12.58818],[22.28801,12.64605],[22.49762,12.26024],[22.50869,11.67936],[22.87622,11.38461],[22.864165,11.142395],[22.231129,10.971889],[21.723822,10.567056],[21.000868,9.475985],[20.059685,9.012706],[19.094008,9.074847],[18.81201,8.982915],[18.911022,8.630895],[18.389555,8.281304],[17.96493,7.890914],[16.705988,7.508328],[16.456185,7.734774],[16.290562,7.754307],[16.106232,7.497088],[15.27946,7.421925],[15.436092,7.692812],[15.120866,8.38215],[14.979996,8.796104],[14.544467,8.965861],[13.954218,9.549495],[14.171466,10.021378],[14.627201,9.920919],[14.909354,9.992129],[15.467873,9.982337],[14.923565,10.891325],[14.960152,11.555574],[14.89336,12.21905],[14.495787,12.859396]]]}}, -{"type":"Feature","id":"TGO","properties":{"name":"Togo"},"geometry":{"type":"Polygon","coordinates":[[[1.865241,6.142158],[1.060122,5.928837],[0.836931,6.279979],[0.570384,6.914359],[0.490957,7.411744],[0.712029,8.312465],[0.461192,8.677223],[0.365901,9.465004],[0.36758,10.191213],[-0.049785,10.706918],[0.023803,11.018682],[0.899563,10.997339],[0.772336,10.470808],[1.077795,10.175607],[1.425061,9.825395],[1.463043,9.334624],[1.664478,9.12859],[1.618951,6.832038],[1.865241,6.142158]]]}}, -{"type":"Feature","id":"THA","properties":{"name":"Thailand"},"geometry":{"type":"Polygon","coordinates":[[[102.584932,12.186595],[101.687158,12.64574],[100.83181,12.627085],[100.978467,13.412722],[100.097797,13.406856],[100.018733,12.307001],[99.478921,10.846367],[99.153772,9.963061],[99.222399,9.239255],[99.873832,9.207862],[100.279647,8.295153],[100.459274,7.429573],[101.017328,6.856869],[101.623079,6.740622],[102.141187,6.221636],[101.814282,5.810808],[101.154219,5.691384],[101.075516,6.204867],[100.259596,6.642825],[100.085757,6.464489],[99.690691,6.848213],[99.519642,7.343454],[98.988253,7.907993],[98.503786,8.382305],[98.339662,7.794512],[98.150009,8.350007],[98.25915,8.973923],[98.553551,9.93296],[99.038121,10.960546],[99.587286,11.892763],[99.196354,12.804748],[99.212012,13.269294],[99.097755,13.827503],[98.430819,14.622028],[98.192074,15.123703],[98.537376,15.308497],[98.903348,16.177824],[98.493761,16.837836],[97.859123,17.567946],[97.375896,18.445438],[97.797783,18.62708],[98.253724,19.708203],[98.959676,19.752981],[99.543309,20.186598],[100.115988,20.41785],[100.548881,20.109238],[100.606294,19.508344],[101.282015,19.462585],[101.035931,18.408928],[101.059548,17.512497],[102.113592,18.109102],[102.413005,17.932782],[102.998706,17.961695],[103.200192,18.309632],[103.956477,18.240954],[104.716947,17.428859],[104.779321,16.441865],[105.589039,15.570316],[105.544338,14.723934],[105.218777,14.273212],[104.281418,14.416743],[102.988422,14.225721],[102.348099,13.394247],[102.584932,12.186595]]]}}, -{"type":"Feature","id":"TJK","properties":{"name":"Tajikistan"},"geometry":{"type":"Polygon","coordinates":[[[71.014198,40.244366],[70.648019,39.935754],[69.55961,40.103211],[69.464887,39.526683],[70.549162,39.604198],[71.784694,39.279463],[73.675379,39.431237],[73.928852,38.505815],[74.257514,38.606507],[74.864816,38.378846],[74.829986,37.990007],[74.980002,37.41999],[73.948696,37.421566],[73.260056,37.495257],[72.63689,37.047558],[72.193041,36.948288],[71.844638,36.738171],[71.448693,37.065645],[71.541918,37.905774],[71.239404,37.953265],[71.348131,38.258905],[70.806821,38.486282],[70.376304,38.138396],[70.270574,37.735165],[70.116578,37.588223],[69.518785,37.608997],[69.196273,37.151144],[68.859446,37.344336],[68.135562,37.023115],[67.83,37.144994],[68.392033,38.157025],[68.176025,38.901553],[67.44222,39.140144],[67.701429,39.580478],[68.536416,39.533453],[69.011633,40.086158],[69.329495,40.727824],[70.666622,40.960213],[70.45816,40.496495],[70.601407,40.218527],[71.014198,40.244366]]]}}, -{"type":"Feature","id":"TKM","properties":{"name":"Turkmenistan"},"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[61.123071,36.491597],[60.377638,36.527383],[59.234762,37.412988],[58.436154,37.522309],[57.330434,38.029229],[56.619366,38.121394],[56.180375,37.935127],[55.511578,37.964117],[54.800304,37.392421],[53.921598,37.198918],[53.735511,37.906136],[53.880929,38.952093],[53.101028,39.290574],[53.357808,39.975286],[52.693973,40.033629],[52.915251,40.876523],[53.858139,40.631034],[54.736845,40.951015],[54.008311,41.551211],[53.721713,42.123191],[52.91675,41.868117],[52.814689,41.135371],[52.50246,41.783316],[52.944293,42.116034],[54.079418,42.324109],[54.755345,42.043971],[55.455251,41.259859],[55.968191,41.308642],[57.096391,41.32231],[56.932215,41.826026],[57.78653,42.170553],[58.629011,42.751551],[59.976422,42.223082],[60.083341,41.425146],[60.465953,41.220327],[61.547179,41.26637],[61.882714,41.084857],[62.37426,40.053886],[63.518015,39.363257],[64.170223,38.892407],[65.215999,38.402695],[66.54615,37.974685],[66.518607,37.362784],[66.217385,37.39379],[65.745631,37.661164],[65.588948,37.305217],[64.746105,37.111818],[64.546479,36.312073],[63.982896,36.007957],[63.193538,35.857166],[62.984662,35.404041],[62.230651,35.270664],[61.210817,35.650072]]]}}, -{"type":"Feature","id":"TLS","properties":{"name":"East Timor"},"geometry":{"type":"Polygon","coordinates":[[[124.968682,-8.89279],[125.086246,-8.656887],[125.947072,-8.432095],[126.644704,-8.398247],[126.957243,-8.273345],[127.335928,-8.397317],[126.967992,-8.668256],[125.925885,-9.106007],[125.08852,-9.393173],[125.07002,-9.089987],[124.968682,-8.89279]]]}}, -{"type":"Feature","id":"TTO","properties":{"name":"Trinidad and Tobago"},"geometry":{"type":"Polygon","coordinates":[[[-61.68,10.76],[-61.105,10.89],[-60.895,10.855],[-60.935,10.11],[-61.77,10],[-61.95,10.09],[-61.66,10.365],[-61.68,10.76]]]}}, -{"type":"Feature","id":"TUN","properties":{"name":"Tunisia"},"geometry":{"type":"Polygon","coordinates":[[[9.48214,30.307556],[9.055603,32.102692],[8.439103,32.506285],[8.430473,32.748337],[7.612642,33.344115],[7.524482,34.097376],[8.140981,34.655146],[8.376368,35.479876],[8.217824,36.433177],[8.420964,36.946427],[9.509994,37.349994],[10.210002,37.230002],[10.18065,36.724038],[11.028867,37.092103],[11.100026,36.899996],[10.600005,36.41],[10.593287,35.947444],[10.939519,35.698984],[10.807847,34.833507],[10.149593,34.330773],[10.339659,33.785742],[10.856836,33.76874],[11.108501,33.293343],[11.488787,33.136996],[11.432253,32.368903],[10.94479,32.081815],[10.636901,31.761421],[9.950225,31.37607],[10.056575,30.961831],[9.970017,30.539325],[9.48214,30.307556]]]}}, -{"type":"Feature","id":"TUR","properties":{"name":"Turkey"},"geometry":{"type":"MultiPolygon","coordinates":[[[[36.913127,41.335358],[38.347665,40.948586],[39.512607,41.102763],[40.373433,41.013673],[41.554084,41.535656],[42.619549,41.583173],[43.582746,41.092143],[43.752658,40.740201],[43.656436,40.253564],[44.400009,40.005],[44.79399,39.713003],[44.109225,39.428136],[44.421403,38.281281],[44.225756,37.971584],[44.772699,37.170445],[44.293452,37.001514],[43.942259,37.256228],[42.779126,37.385264],[42.349591,37.229873],[41.212089,37.074352],[40.673259,37.091276],[39.52258,36.716054],[38.699891,36.712927],[38.167727,36.90121],[37.066761,36.623036],[36.739494,36.81752],[36.685389,36.259699],[36.41755,36.040617],[36.149763,35.821535],[35.782085,36.274995],[36.160822,36.650606],[35.550936,36.565443],[34.714553,36.795532],[34.026895,36.21996],[32.509158,36.107564],[31.699595,36.644275],[30.621625,36.677865],[30.391096,36.262981],[29.699976,36.144357],[28.732903,36.676831],[27.641187,36.658822],[27.048768,37.653361],[26.318218,38.208133],[26.8047,38.98576],[26.170785,39.463612],[27.28002,40.420014],[28.819978,40.460011],[29.240004,41.219991],[31.145934,41.087622],[32.347979,41.736264],[33.513283,42.01896],[35.167704,42.040225],[36.913127,41.335358]]],[[[27.192377,40.690566],[26.358009,40.151994],[26.043351,40.617754],[26.056942,40.824123],[26.294602,40.936261],[26.604196,41.562115],[26.117042,41.826905],[27.135739,42.141485],[27.99672,42.007359],[28.115525,41.622886],[28.988443,41.299934],[28.806438,41.054962],[27.619017,40.999823],[27.192377,40.690566]]]]}}, -{"type":"Feature","id":"TWN","properties":{"name":"Taiwan"},"geometry":{"type":"Polygon","coordinates":[[[121.777818,24.394274],[121.175632,22.790857],[120.74708,21.970571],[120.220083,22.814861],[120.106189,23.556263],[120.69468,24.538451],[121.495044,25.295459],[121.951244,24.997596],[121.777818,24.394274]]]}}, -{"type":"Feature","id":"TZA","properties":{"name":"United Republic of Tanzania"},"geometry":{"type":"Polygon","coordinates":[[[33.903711,-0.95],[34.07262,-1.05982],[37.69869,-3.09699],[37.7669,-3.67712],[39.20222,-4.67677],[38.74054,-5.90895],[38.79977,-6.47566],[39.44,-6.84],[39.47,-7.1],[39.19469,-7.7039],[39.25203,-8.00781],[39.18652,-8.48551],[39.53574,-9.11237],[39.9496,-10.0984],[40.31659,-10.3171],[39.521,-10.89688],[38.427557,-11.285202],[37.82764,-11.26879],[37.47129,-11.56876],[36.775151,-11.594537],[36.514082,-11.720938],[35.312398,-11.439146],[34.559989,-11.52002],[34.28,-10.16],[33.940838,-9.693674],[33.73972,-9.41715],[32.759375,-9.230599],[32.191865,-8.930359],[31.556348,-8.762049],[31.157751,-8.594579],[30.74,-8.34],[30.2,-7.08],[29.62,-6.52],[29.419993,-5.939999],[29.519987,-5.419979],[29.339998,-4.499983],[29.753512,-4.452389],[30.11632,-4.09012],[30.50554,-3.56858],[30.75224,-3.35931],[30.74301,-3.03431],[30.52766,-2.80762],[30.46967,-2.41383],[30.758309,-2.28725],[30.816135,-1.698914],[30.419105,-1.134659],[30.76986,-1.01455],[31.86617,-1.02736],[33.903711,-0.95]]]}}, -{"type":"Feature","id":"UGA","properties":{"name":"Uganda"},"geometry":{"type":"Polygon","coordinates":[[[31.86617,-1.02736],[30.76986,-1.01455],[30.419105,-1.134659],[29.821519,-1.443322],[29.579466,-1.341313],[29.587838,-0.587406],[29.8195,-0.2053],[29.875779,0.59738],[30.086154,1.062313],[30.468508,1.583805],[30.85267,1.849396],[31.174149,2.204465],[30.77332,2.33989],[30.83385,3.50917],[31.24556,3.7819],[31.88145,3.55827],[32.68642,3.79232],[33.39,3.79],[34.005,4.249885],[34.47913,3.5556],[34.59607,3.05374],[35.03599,1.90584],[34.6721,1.17694],[34.18,0.515],[33.893569,0.109814],[33.903711,-0.95],[31.86617,-1.02736]]]}}, -{"type":"Feature","id":"UKR","properties":{"name":"Ukraine"},"geometry":{"type":"Polygon","coordinates":[[[31.785998,52.101678],[32.159412,52.061267],[32.412058,52.288695],[32.715761,52.238465],[33.7527,52.335075],[34.391731,51.768882],[34.141978,51.566413],[34.224816,51.255993],[35.022183,51.207572],[35.377924,50.773955],[35.356116,50.577197],[36.626168,50.225591],[37.39346,50.383953],[38.010631,49.915662],[38.594988,49.926462],[40.069058,49.601055],[40.080789,49.30743],[39.674664,48.783818],[39.895632,48.232405],[39.738278,47.898937],[38.770585,47.825608],[38.255112,47.5464],[38.223538,47.10219],[37.425137,47.022221],[36.759855,46.6987],[35.823685,46.645964],[34.962342,46.273197],[35.020788,45.651219],[35.510009,45.409993],[36.529998,45.46999],[36.334713,45.113216],[35.239999,44.939996],[33.882511,44.361479],[33.326421,44.564877],[33.546924,45.034771],[32.454174,45.327466],[32.630804,45.519186],[33.588162,45.851569],[33.298567,46.080598],[31.74414,46.333348],[31.675307,46.706245],[30.748749,46.5831],[30.377609,46.03241],[29.603289,45.293308],[29.149725,45.464925],[28.679779,45.304031],[28.233554,45.488283],[28.485269,45.596907],[28.659987,45.939987],[28.933717,46.25883],[28.862972,46.437889],[29.072107,46.517678],[29.170654,46.379262],[29.759972,46.349988],[30.024659,46.423937],[29.83821,46.525326],[29.908852,46.674361],[29.559674,46.928583],[29.415135,47.346645],[29.050868,47.510227],[29.122698,47.849095],[28.670891,48.118149],[28.259547,48.155562],[27.522537,48.467119],[26.857824,48.368211],[26.619337,48.220726],[26.19745,48.220881],[25.945941,47.987149],[25.207743,47.891056],[24.866317,47.737526],[24.402056,47.981878],[23.760958,47.985598],[23.142236,48.096341],[22.710531,47.882194],[22.64082,48.15024],[22.085608,48.422264],[22.280842,48.825392],[22.558138,49.085738],[22.776419,49.027395],[22.51845,49.476774],[23.426508,50.308506],[23.922757,50.424881],[24.029986,50.705407],[23.527071,51.578454],[24.005078,51.617444],[24.553106,51.888461],[25.327788,51.910656],[26.337959,51.832289],[27.454066,51.592303],[28.241615,51.572227],[28.617613,51.427714],[28.992835,51.602044],[29.254938,51.368234],[30.157364,51.416138],[30.555117,51.319503],[30.619454,51.822806],[30.927549,52.042353],[31.785998,52.101678]]]}}, -{"type":"Feature","id":"URY","properties":{"name":"Uruguay"},"geometry":{"type":"Polygon","coordinates":[[[-57.625133,-30.216295],[-56.976026,-30.109686],[-55.973245,-30.883076],[-55.60151,-30.853879],[-54.572452,-31.494511],[-53.787952,-32.047243],[-53.209589,-32.727666],[-53.650544,-33.202004],[-53.373662,-33.768378],[-53.806426,-34.396815],[-54.935866,-34.952647],[-55.67409,-34.752659],[-56.215297,-34.859836],[-57.139685,-34.430456],[-57.817861,-34.462547],[-58.427074,-33.909454],[-58.349611,-33.263189],[-58.132648,-33.040567],[-58.14244,-32.044504],[-57.874937,-31.016556],[-57.625133,-30.216295]]]}}, -{"type":"Feature","id":"USA","properties":{"name":"United States of America"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-155.54211,19.08348],[-155.68817,18.91619],[-155.93665,19.05939],[-155.90806,19.33888],[-156.07347,19.70294],[-156.02368,19.81422],[-155.85008,19.97729],[-155.91907,20.17395],[-155.86108,20.26721],[-155.78505,20.2487],[-155.40214,20.07975],[-155.22452,19.99302],[-155.06226,19.8591],[-154.80741,19.50871],[-154.83147,19.45328],[-155.22217,19.23972],[-155.54211,19.08348]]],[[[-156.07926,20.64397],[-156.41445,20.57241],[-156.58673,20.783],[-156.70167,20.8643],[-156.71055,20.92676],[-156.61258,21.01249],[-156.25711,20.91745],[-155.99566,20.76404],[-156.07926,20.64397]]],[[[-156.75824,21.17684],[-156.78933,21.06873],[-157.32521,21.09777],[-157.25027,21.21958],[-156.75824,21.17684]]],[[[-157.65283,21.32217],[-157.70703,21.26442],[-157.7786,21.27729],[-158.12667,21.31244],[-158.2538,21.53919],[-158.29265,21.57912],[-158.0252,21.71696],[-157.94161,21.65272],[-157.65283,21.32217]]],[[[-159.34512,21.982],[-159.46372,21.88299],[-159.80051,22.06533],[-159.74877,22.1382],[-159.5962,22.23618],[-159.36569,22.21494],[-159.34512,21.982]]],[[[-94.81758,49.38905],[-94.64,48.84],[-94.32914,48.67074],[-93.63087,48.60926],[-92.61,48.45],[-91.64,48.14],[-90.83,48.27],[-89.6,48.01],[-89.272917,48.019808],[-88.378114,48.302918],[-87.439793,47.94],[-86.461991,47.553338],[-85.652363,47.220219],[-84.87608,46.900083],[-84.779238,46.637102],[-84.543749,46.538684],[-84.6049,46.4396],[-84.3367,46.40877],[-84.14212,46.512226],[-84.091851,46.275419],[-83.890765,46.116927],[-83.616131,46.116927],[-83.469551,45.994686],[-83.592851,45.816894],[-82.550925,45.347517],[-82.337763,44.44],[-82.137642,43.571088],[-82.43,42.98],[-82.9,42.43],[-83.12,42.08],[-83.142,41.975681],[-83.02981,41.832796],[-82.690089,41.675105],[-82.439278,41.675105],[-81.277747,42.209026],[-80.247448,42.3662],[-78.939362,42.863611],[-78.92,42.965],[-79.01,43.27],[-79.171674,43.466339],[-78.72028,43.625089],[-77.737885,43.629056],[-76.820034,43.628784],[-76.5,44.018459],[-76.375,44.09631],[-75.31821,44.81645],[-74.867,45.00048],[-73.34783,45.00738],[-71.50506,45.0082],[-71.405,45.255],[-71.08482,45.30524],[-70.66,45.46],[-70.305,45.915],[-69.99997,46.69307],[-69.237216,47.447781],[-68.905,47.185],[-68.23444,47.35486],[-67.79046,47.06636],[-67.79134,45.70281],[-67.13741,45.13753],[-66.96466,44.8097],[-68.03252,44.3252],[-69.06,43.98],[-70.11617,43.68405],[-70.645476,43.090238],[-70.81489,42.8653],[-70.825,42.335],[-70.495,41.805],[-70.08,41.78],[-70.185,42.145],[-69.88497,41.92283],[-69.96503,41.63717],[-70.64,41.475],[-71.12039,41.49445],[-71.86,41.32],[-72.295,41.27],[-72.87643,41.22065],[-73.71,40.931102],[-72.24126,41.11948],[-71.945,40.93],[-73.345,40.63],[-73.982,40.628],[-73.952325,40.75075],[-74.25671,40.47351],[-73.96244,40.42763],[-74.17838,39.70926],[-74.90604,38.93954],[-74.98041,39.1964],[-75.20002,39.24845],[-75.52805,39.4985],[-75.32,38.96],[-75.071835,38.782032],[-75.05673,38.40412],[-75.37747,38.01551],[-75.94023,37.21689],[-76.03127,37.2566],[-75.72205,37.93705],[-76.23287,38.319215],[-76.35,39.15],[-76.542725,38.717615],[-76.32933,38.08326],[-76.989998,38.239992],[-76.30162,37.917945],[-76.25874,36.9664],[-75.9718,36.89726],[-75.86804,36.55125],[-75.72749,35.55074],[-76.36318,34.80854],[-77.397635,34.51201],[-78.05496,33.92547],[-78.55435,33.86133],[-79.06067,33.49395],[-79.20357,33.15839],[-80.301325,32.509355],[-80.86498,32.0333],[-81.33629,31.44049],[-81.49042,30.72999],[-81.31371,30.03552],[-80.98,29.18],[-80.535585,28.47213],[-80.53,28.04],[-80.056539,26.88],[-80.088015,26.205765],[-80.13156,25.816775],[-80.38103,25.20616],[-80.68,25.08],[-81.17213,25.20126],[-81.33,25.64],[-81.71,25.87],[-82.24,26.73],[-82.70515,27.49504],[-82.85526,27.88624],[-82.65,28.55],[-82.93,29.1],[-83.70959,29.93656],[-84.1,30.09],[-85.10882,29.63615],[-85.28784,29.68612],[-85.7731,30.15261],[-86.4,30.4],[-87.53036,30.27433],[-88.41782,30.3849],[-89.18049,30.31598],[-89.593831,30.159994],[-89.413735,29.89419],[-89.43,29.48864],[-89.21767,29.29108],[-89.40823,29.15961],[-89.77928,29.30714],[-90.15463,29.11743],[-90.880225,29.148535],[-91.626785,29.677],[-92.49906,29.5523],[-93.22637,29.78375],[-93.84842,29.71363],[-94.69,29.48],[-95.60026,28.73863],[-96.59404,28.30748],[-97.14,27.83],[-97.37,27.38],[-97.38,26.69],[-97.33,26.21],[-97.14,25.87],[-97.53,25.84],[-98.24,26.06],[-99.02,26.37],[-99.3,26.84],[-99.52,27.54],[-100.11,28.11],[-100.45584,28.69612],[-100.9576,29.38071],[-101.6624,29.7793],[-102.48,29.76],[-103.11,28.97],[-103.94,29.27],[-104.45697,29.57196],[-104.70575,30.12173],[-105.03737,30.64402],[-105.63159,31.08383],[-106.1429,31.39995],[-106.50759,31.75452],[-108.24,31.754854],[-108.24194,31.34222],[-109.035,31.34194],[-111.02361,31.33472],[-113.30498,32.03914],[-114.815,32.52528],[-114.72139,32.72083],[-115.99135,32.61239],[-117.12776,32.53534],[-117.295938,33.046225],[-117.944,33.621236],[-118.410602,33.740909],[-118.519895,34.027782],[-119.081,34.078],[-119.438841,34.348477],[-120.36778,34.44711],[-120.62286,34.60855],[-120.74433,35.15686],[-121.71457,36.16153],[-122.54747,37.55176],[-122.51201,37.78339],[-122.95319,38.11371],[-123.7272,38.95166],[-123.86517,39.76699],[-124.39807,40.3132],[-124.17886,41.14202],[-124.2137,41.99964],[-124.53284,42.76599],[-124.14214,43.70838],[-124.020535,44.615895],[-123.89893,45.52341],[-124.079635,46.86475],[-124.39567,47.72017],[-124.68721,48.184433],[-124.566101,48.379715],[-123.12,48.04],[-122.58736,47.096],[-122.34,47.36],[-122.5,48.18],[-122.84,49],[-120,49],[-117.03121,49],[-116.04818,49],[-113,49],[-110.05,49],[-107.05,49],[-104.04826,48.99986],[-100.65,49],[-97.22872,49.0007],[-95.15907,49],[-95.15609,49.38425],[-94.81758,49.38905]]],[[[-153.006314,57.115842],[-154.00509,56.734677],[-154.516403,56.992749],[-154.670993,57.461196],[-153.76278,57.816575],[-153.228729,57.968968],[-152.564791,57.901427],[-152.141147,57.591059],[-153.006314,57.115842]]],[[[-165.579164,59.909987],[-166.19277,59.754441],[-166.848337,59.941406],[-167.455277,60.213069],[-166.467792,60.38417],[-165.67443,60.293607],[-165.579164,59.909987]]],[[[-171.731657,63.782515],[-171.114434,63.592191],[-170.491112,63.694975],[-169.682505,63.431116],[-168.689439,63.297506],[-168.771941,63.188598],[-169.52944,62.976931],[-170.290556,63.194438],[-170.671386,63.375822],[-171.553063,63.317789],[-171.791111,63.405846],[-171.731657,63.782515]]],[[[-155.06779,71.147776],[-154.344165,70.696409],[-153.900006,70.889989],[-152.210006,70.829992],[-152.270002,70.600006],[-150.739992,70.430017],[-149.720003,70.53001],[-147.613362,70.214035],[-145.68999,70.12001],[-144.920011,69.989992],[-143.589446,70.152514],[-142.07251,69.851938],[-140.985988,69.711998],[-140.992499,66.000029],[-140.99777,60.306397],[-140.012998,60.276838],[-139.039,60.000007],[-138.34089,59.56211],[-137.4525,58.905],[-136.47972,59.46389],[-135.47583,59.78778],[-134.945,59.27056],[-134.27111,58.86111],[-133.355549,58.410285],[-132.73042,57.69289],[-131.70781,56.55212],[-130.00778,55.91583],[-129.979994,55.284998],[-130.53611,54.802753],[-131.085818,55.178906],[-131.967211,55.497776],[-132.250011,56.369996],[-133.539181,57.178887],[-134.078063,58.123068],[-135.038211,58.187715],[-136.628062,58.212209],[-137.800006,58.499995],[-139.867787,59.537762],[-140.825274,59.727517],[-142.574444,60.084447],[-143.958881,59.99918],[-145.925557,60.45861],[-147.114374,60.884656],[-148.224306,60.672989],[-148.018066,59.978329],[-148.570823,59.914173],[-149.727858,59.705658],[-150.608243,59.368211],[-151.716393,59.155821],[-151.859433,59.744984],[-151.409719,60.725803],[-150.346941,61.033588],[-150.621111,61.284425],[-151.895839,60.727198],[-152.57833,60.061657],[-154.019172,59.350279],[-153.287511,58.864728],[-154.232492,58.146374],[-155.307491,57.727795],[-156.308335,57.422774],[-156.556097,56.979985],[-158.117217,56.463608],[-158.433321,55.994154],[-159.603327,55.566686],[-160.28972,55.643581],[-161.223048,55.364735],[-162.237766,55.024187],[-163.069447,54.689737],[-164.785569,54.404173],[-164.942226,54.572225],[-163.84834,55.039431],[-162.870001,55.348043],[-161.804175,55.894986],[-160.563605,56.008055],[-160.07056,56.418055],[-158.684443,57.016675],[-158.461097,57.216921],[-157.72277,57.570001],[-157.550274,58.328326],[-157.041675,58.918885],[-158.194731,58.615802],[-158.517218,58.787781],[-159.058606,58.424186],[-159.711667,58.93139],[-159.981289,58.572549],[-160.355271,59.071123],[-161.355003,58.670838],[-161.968894,58.671665],[-162.054987,59.266925],[-161.874171,59.633621],[-162.518059,59.989724],[-163.818341,59.798056],[-164.662218,60.267484],[-165.346388,60.507496],[-165.350832,61.073895],[-166.121379,61.500019],[-165.734452,62.074997],[-164.919179,62.633076],[-164.562508,63.146378],[-163.753332,63.219449],[-163.067224,63.059459],[-162.260555,63.541936],[-161.53445,63.455817],[-160.772507,63.766108],[-160.958335,64.222799],[-161.518068,64.402788],[-160.777778,64.788604],[-161.391926,64.777235],[-162.45305,64.559445],[-162.757786,64.338605],[-163.546394,64.55916],[-164.96083,64.446945],[-166.425288,64.686672],[-166.845004,65.088896],[-168.11056,65.669997],[-166.705271,66.088318],[-164.47471,66.57666],[-163.652512,66.57666],[-163.788602,66.077207],[-161.677774,66.11612],[-162.489715,66.735565],[-163.719717,67.116395],[-164.430991,67.616338],[-165.390287,68.042772],[-166.764441,68.358877],[-166.204707,68.883031],[-164.430811,68.915535],[-163.168614,69.371115],[-162.930566,69.858062],[-161.908897,70.33333],[-160.934797,70.44769],[-159.039176,70.891642],[-158.119723,70.824721],[-156.580825,71.357764],[-155.06779,71.147776]]]]}}, -{"type":"Feature","id":"UZB","properties":{"name":"Uzbekistan"},"geometry":{"type":"Polygon","coordinates":[[[66.518607,37.362784],[66.54615,37.974685],[65.215999,38.402695],[64.170223,38.892407],[63.518015,39.363257],[62.37426,40.053886],[61.882714,41.084857],[61.547179,41.26637],[60.465953,41.220327],[60.083341,41.425146],[59.976422,42.223082],[58.629011,42.751551],[57.78653,42.170553],[56.932215,41.826026],[57.096391,41.32231],[55.968191,41.308642],[55.928917,44.995858],[58.503127,45.586804],[58.689989,45.500014],[60.239972,44.784037],[61.05832,44.405817],[62.0133,43.504477],[63.185787,43.650075],[64.900824,43.728081],[66.098012,42.99766],[66.023392,41.994646],[66.510649,41.987644],[66.714047,41.168444],[67.985856,41.135991],[68.259896,40.662325],[68.632483,40.668681],[69.070027,41.384244],[70.388965,42.081308],[70.962315,42.266154],[71.259248,42.167711],[70.420022,41.519998],[71.157859,41.143587],[71.870115,41.3929],[73.055417,40.866033],[71.774875,40.145844],[71.014198,40.244366],[70.601407,40.218527],[70.45816,40.496495],[70.666622,40.960213],[69.329495,40.727824],[69.011633,40.086158],[68.536416,39.533453],[67.701429,39.580478],[67.44222,39.140144],[68.176025,38.901553],[68.392033,38.157025],[67.83,37.144994],[67.075782,37.356144],[66.518607,37.362784]]]}}, -{"type":"Feature","id":"VEN","properties":{"name":"Venezuela"},"geometry":{"type":"Polygon","coordinates":[[[-71.331584,11.776284],[-71.360006,11.539994],[-71.94705,11.423282],[-71.620868,10.96946],[-71.633064,10.446494],[-72.074174,9.865651],[-71.695644,9.072263],[-71.264559,9.137195],[-71.039999,9.859993],[-71.350084,10.211935],[-71.400623,10.968969],[-70.155299,11.375482],[-70.293843,11.846822],[-69.943245,12.162307],[-69.5843,11.459611],[-68.882999,11.443385],[-68.233271,10.885744],[-68.194127,10.554653],[-67.296249,10.545868],[-66.227864,10.648627],[-65.655238,10.200799],[-64.890452,10.077215],[-64.329479,10.389599],[-64.318007,10.641418],[-63.079322,10.701724],[-61.880946,10.715625],[-62.730119,10.420269],[-62.388512,9.948204],[-61.588767,9.873067],[-60.830597,9.38134],[-60.671252,8.580174],[-60.150096,8.602757],[-59.758285,8.367035],[-60.550588,7.779603],[-60.637973,7.415],[-60.295668,7.043911],[-60.543999,6.856584],[-61.159336,6.696077],[-61.139415,6.234297],[-61.410303,5.959068],[-60.733574,5.200277],[-60.601179,4.918098],[-60.966893,4.536468],[-62.08543,4.162124],[-62.804533,4.006965],[-63.093198,3.770571],[-63.888343,4.02053],[-64.628659,4.148481],[-64.816064,4.056445],[-64.368494,3.79721],[-64.408828,3.126786],[-64.269999,2.497006],[-63.422867,2.411068],[-63.368788,2.2009],[-64.083085,1.916369],[-64.199306,1.492855],[-64.611012,1.328731],[-65.354713,1.095282],[-65.548267,0.789254],[-66.325765,0.724452],[-66.876326,1.253361],[-67.181294,2.250638],[-67.447092,2.600281],[-67.809938,2.820655],[-67.303173,3.318454],[-67.337564,3.542342],[-67.621836,3.839482],[-67.823012,4.503937],[-67.744697,5.221129],[-67.521532,5.55687],[-67.34144,6.095468],[-67.695087,6.267318],[-68.265052,6.153268],[-68.985319,6.206805],[-69.38948,6.099861],[-70.093313,6.960376],[-70.674234,7.087785],[-71.960176,6.991615],[-72.198352,7.340431],[-72.444487,7.423785],[-72.479679,7.632506],[-72.360901,8.002638],[-72.439862,8.405275],[-72.660495,8.625288],[-72.78873,9.085027],[-73.304952,9.152],[-73.027604,9.73677],[-72.905286,10.450344],[-72.614658,10.821975],[-72.227575,11.108702],[-71.973922,11.608672],[-71.331584,11.776284]]]}}, -{"type":"Feature","id":"VNM","properties":{"name":"Vietnam"},"geometry":{"type":"Polygon","coordinates":[[[108.05018,21.55238],[106.715068,20.696851],[105.881682,19.75205],[105.662006,19.058165],[106.426817,18.004121],[107.361954,16.697457],[108.269495,16.079742],[108.877107,15.276691],[109.33527,13.426028],[109.200136,11.666859],[108.36613,11.008321],[107.220929,10.364484],[106.405113,9.53084],[105.158264,8.59976],[104.795185,9.241038],[105.076202,9.918491],[104.334335,10.486544],[105.199915,10.88931],[106.24967,10.961812],[105.810524,11.567615],[107.491403,12.337206],[107.614548,13.535531],[107.382727,14.202441],[107.564525,15.202173],[107.312706,15.908538],[106.556008,16.604284],[105.925762,17.485315],[105.094598,18.666975],[103.896532,19.265181],[104.183388,19.624668],[104.822574,19.886642],[104.435,20.758733],[103.203861,20.766562],[102.754896,21.675137],[102.170436,22.464753],[102.706992,22.708795],[103.504515,22.703757],[104.476858,22.81915],[105.329209,23.352063],[105.811247,22.976892],[106.725403,22.794268],[106.567273,22.218205],[107.04342,21.811899],[108.05018,21.55238]]]}}, -{"type":"Feature","id":"VUT","properties":{"name":"Vanuatu"},"geometry":{"type":"MultiPolygon","coordinates":[[[[167.844877,-16.466333],[167.515181,-16.59785],[167.180008,-16.159995],[167.216801,-15.891846],[167.844877,-16.466333]]],[[[167.107712,-14.93392],[167.270028,-15.740021],[167.001207,-15.614602],[166.793158,-15.668811],[166.649859,-15.392704],[166.629137,-14.626497],[167.107712,-14.93392]]]]}}, -{"type":"Feature","id":"PSE","properties":{"name":"West Bank"},"geometry":{"type":"Polygon","coordinates":[[[35.545665,32.393992],[35.545252,31.782505],[35.397561,31.489086],[34.927408,31.353435],[34.970507,31.616778],[35.225892,31.754341],[34.974641,31.866582],[35.18393,32.532511],[35.545665,32.393992]]]}}, -{"type":"Feature","id":"YEM","properties":{"name":"Yemen"},"geometry":{"type":"Polygon","coordinates":[[[53.108573,16.651051],[52.385206,16.382411],[52.191729,15.938433],[52.168165,15.59742],[51.172515,15.17525],[49.574576,14.708767],[48.679231,14.003202],[48.238947,13.94809],[47.938914,14.007233],[47.354454,13.59222],[46.717076,13.399699],[45.877593,13.347764],[45.62505,13.290946],[45.406459,13.026905],[45.144356,12.953938],[44.989533,12.699587],[44.494576,12.721653],[44.175113,12.58595],[43.482959,12.6368],[43.222871,13.22095],[43.251448,13.767584],[43.087944,14.06263],[42.892245,14.802249],[42.604873,15.213335],[42.805015,15.261963],[42.702438,15.718886],[42.823671,15.911742],[42.779332,16.347891],[43.218375,16.66689],[43.115798,17.08844],[43.380794,17.579987],[43.791519,17.319977],[44.062613,17.410359],[45.216651,17.433329],[45.399999,17.333335],[46.366659,17.233315],[46.749994,17.283338],[47.000005,16.949999],[47.466695,17.116682],[48.183344,18.166669],[49.116672,18.616668],[52.00001,19.000003],[52.782184,17.349742],[53.108573,16.651051]]]}}, -{"type":"Feature","id":"ZAF","properties":{"name":"South Africa"},"geometry":{"type":"Polygon","coordinates":[[[31.521001,-29.257387],[31.325561,-29.401978],[30.901763,-29.909957],[30.622813,-30.423776],[30.055716,-31.140269],[28.925553,-32.172041],[28.219756,-32.771953],[27.464608,-33.226964],[26.419452,-33.61495],[25.909664,-33.66704],[25.780628,-33.944646],[25.172862,-33.796851],[24.677853,-33.987176],[23.594043,-33.794474],[22.988189,-33.916431],[22.574157,-33.864083],[21.542799,-34.258839],[20.689053,-34.417175],[20.071261,-34.795137],[19.616405,-34.819166],[19.193278,-34.462599],[18.855315,-34.444306],[18.424643,-33.997873],[18.377411,-34.136521],[18.244499,-33.867752],[18.25008,-33.281431],[17.92519,-32.611291],[18.24791,-32.429131],[18.221762,-31.661633],[17.566918,-30.725721],[17.064416,-29.878641],[17.062918,-29.875954],[16.344977,-28.576705],[16.824017,-28.082162],[17.218929,-28.355943],[17.387497,-28.783514],[17.836152,-28.856378],[18.464899,-29.045462],[19.002127,-28.972443],[19.894734,-28.461105],[19.895768,-24.76779],[20.165726,-24.917962],[20.758609,-25.868136],[20.66647,-26.477453],[20.889609,-26.828543],[21.605896,-26.726534],[22.105969,-26.280256],[22.579532,-25.979448],[22.824271,-25.500459],[23.312097,-25.26869],[23.73357,-25.390129],[24.211267,-25.670216],[25.025171,-25.71967],[25.664666,-25.486816],[25.765849,-25.174845],[25.941652,-24.696373],[26.485753,-24.616327],[26.786407,-24.240691],[27.11941,-23.574323],[28.017236,-22.827754],[29.432188,-22.091313],[29.839037,-22.102216],[30.322883,-22.271612],[30.659865,-22.151567],[31.191409,-22.25151],[31.670398,-23.658969],[31.930589,-24.369417],[31.752408,-25.484284],[31.837778,-25.843332],[31.333158,-25.660191],[31.04408,-25.731452],[30.949667,-26.022649],[30.676609,-26.398078],[30.685962,-26.743845],[31.282773,-27.285879],[31.86806,-27.177927],[32.071665,-26.73382],[32.83012,-26.742192],[32.580265,-27.470158],[32.462133,-28.301011],[32.203389,-28.752405],[31.521001,-29.257387]],[[28.978263,-28.955597],[28.5417,-28.647502],[28.074338,-28.851469],[27.532511,-29.242711],[26.999262,-29.875954],[27.749397,-30.645106],[28.107205,-30.545732],[28.291069,-30.226217],[28.8484,-30.070051],[29.018415,-29.743766],[29.325166,-29.257387],[28.978263,-28.955597]]]}}, -{"type":"Feature","id":"ZMB","properties":{"name":"Zambia"},"geometry":{"type":"Polygon","coordinates":[[[32.759375,-9.230599],[33.231388,-9.676722],[33.485688,-10.525559],[33.31531,-10.79655],[33.114289,-11.607198],[33.306422,-12.435778],[32.991764,-12.783871],[32.688165,-13.712858],[33.214025,-13.97186],[30.179481,-14.796099],[30.274256,-15.507787],[29.516834,-15.644678],[28.947463,-16.043051],[28.825869,-16.389749],[28.467906,-16.4684],[27.598243,-17.290831],[27.044427,-17.938026],[26.706773,-17.961229],[26.381935,-17.846042],[25.264226,-17.73654],[25.084443,-17.661816],[25.07695,-17.578823],[24.682349,-17.353411],[24.033862,-17.295843],[23.215048,-17.523116],[22.562478,-16.898451],[21.887843,-16.08031],[21.933886,-12.898437],[24.016137,-12.911046],[23.930922,-12.565848],[24.079905,-12.191297],[23.904154,-11.722282],[24.017894,-11.237298],[23.912215,-10.926826],[24.257155,-10.951993],[24.314516,-11.262826],[24.78317,-11.238694],[25.418118,-11.330936],[25.75231,-11.784965],[26.553088,-11.92444],[27.16442,-11.608748],[27.388799,-12.132747],[28.155109,-12.272481],[28.523562,-12.698604],[28.934286,-13.248958],[29.699614,-13.257227],[29.616001,-12.178895],[29.341548,-12.360744],[28.642417,-11.971569],[28.372253,-11.793647],[28.49607,-10.789884],[28.673682,-9.605925],[28.449871,-9.164918],[28.734867,-8.526559],[29.002912,-8.407032],[30.346086,-8.238257],[30.740015,-8.340007],[31.157751,-8.594579],[31.556348,-8.762049],[32.191865,-8.930359],[32.759375,-9.230599]]]}}, -{"type":"Feature","id":"ZWE","properties":{"name":"Zimbabwe"},"geometry":{"type":"Polygon","coordinates":[[[31.191409,-22.25151],[30.659865,-22.151567],[30.322883,-22.271612],[29.839037,-22.102216],[29.432188,-22.091313],[28.794656,-21.639454],[28.02137,-21.485975],[27.727228,-20.851802],[27.724747,-20.499059],[27.296505,-20.39152],[26.164791,-19.293086],[25.850391,-18.714413],[25.649163,-18.536026],[25.264226,-17.73654],[26.381935,-17.846042],[26.706773,-17.961229],[27.044427,-17.938026],[27.598243,-17.290831],[28.467906,-16.4684],[28.825869,-16.389749],[28.947463,-16.043051],[29.516834,-15.644678],[30.274256,-15.507787],[30.338955,-15.880839],[31.173064,-15.860944],[31.636498,-16.07199],[31.852041,-16.319417],[32.328239,-16.392074],[32.847639,-16.713398],[32.849861,-17.979057],[32.654886,-18.67209],[32.611994,-19.419383],[32.772708,-19.715592],[32.659743,-20.30429],[32.508693,-20.395292],[32.244988,-21.116489],[31.191409,-22.25151]]]}} -]} diff --git a/projects/wave-core/assets/csv-data-sources.json b/projects/wave-core/assets/csv-data-sources.json deleted file mode 100644 index 6268ac74..00000000 --- a/projects/wave-core/assets/csv-data-sources.json +++ /dev/null @@ -1,69 +0,0 @@ -[ - { - "name": "South African weather sensors", - "filename": "datasources/idessa/dwd.ttx", - "params": { - "geometry": "xy", - "time": "start", - "on_error": "skip", - "time1_format": { - "format": "dmyhm" - }, - "duration": "inf", - "columns": { - "x": "Longitude", - "y": "Latitude", - "time1": "DateT", - "numeric": ["Rain"], - "textual": ["StasName"] - } - } - }, - { - "name": "Bush Density Survey, Christiaan Harmse (2011-2012)", - "filename": "datasources/idessa/bush_densities.csv", - "params": { - "geometry": "xy", - "time": "none", - "on_error": "skip", - "columns": { - "x": "x", - "y": "y", - "numeric": ["Woody plants ha-1", "Tree equivalents ha-1"], - "textual": ["Site name"] - } - } - }, - { - "name": "GBIF - Loxodonta cyclotis (Matschie, 1900)", - "filename": "datasources/gfbio/gbif-0004807-160822134323880.csv", - "params": { - "geometry": "xy", - "time": "none", - "on_error": "skip", - "separator": ";", - "columns": { - "x": "decimallongitude", - "y": "decimallatitude", - "numeric": ["gbifid"], - "textual": [ - "datasetkey", - "occurrenceid", - "kingdom", - "phylum", - "class", - "order", - "family", - "genus", - "species", - "infraspecificepithet", - "taxonrank", - "scientificname", - "countrycode", - "locality", - "publishingorgkey" - ] - } - } - } -] diff --git a/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.eot b/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.eot deleted file mode 100644 index 70508ebabc9992e64f1314f866b2d7ab90438c58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143258 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 Hzx)3OGG_Ot diff --git a/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.ijmap b/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.ijmap deleted file mode 100644 index d9f1d259..00000000 --- a/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.ijmap +++ /dev/null @@ -1 +0,0 @@ -{"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} \ No newline at end of file diff --git a/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.svg b/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.svg deleted file mode 100644 index a449327e..00000000 --- a/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.svg +++ /dev/null @@ -1,2373 +0,0 @@ - - - - - -Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 - By shyndman -Copyright 2015 Google, Inc. All Rights Reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.ttf b/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.ttf deleted file mode 100644 index 7015564ad166a3e9d88c82f17829f0cc01ebe29a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128180 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 ohyj3!`#ee%L;DTjx@8!5k5~VH0QmdE^#A|> diff --git a/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.woff b/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.woff deleted file mode 100644 index b648a3eea2d16b6ce783906d6b7d5f251b9eb56c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57620 zcmY&^NelVwr$(CZQHhO+t!`$=Dp;-onGnG%1YJl`q9)OmoxnxQ~!cx z7yTwvL_vxFmrDfzAms%BFq1u;FO!o|pk)96AY1*_{QHG2qyvG0ft8*u0022U001yH z001b^-7WpDiJrqRN5%B30sjv_KLEfcmTtzs92WpU*)#y4J?2lST9B!co*@9hGW4&8 z`4=pp>u1uYzvM6XUw$aRAo>Fc^vBf7(e;Ws_PPwU|4;c6vAY`D4U;s#9fGPn0SECQP7GZX@2I3WUo4pB*5bE|8|@Fm_rEMeislDJkxA(b z7tCUlVW`i$#DWbQZsJMnX?Wci4^U?JYSLP9^{854ZTD(mZmHb5Kg#0WKDy&x2*LAw zTo>W>_}n7h_S_HghvODJCnAQCPwY%2)^GlIWGK?6;jNOlF0WOptuo*kv8|j_g}1_c zE+(DP(B{zS(DhLNP{BA|<)Y%`;w0l_Q6WO2EZKL|*ys_L#EFFrpqv(C%GE%Zc>Y>~HgyL!|@;oHhHQP}pO{tpwUsv%B#6 zd!u<`WFA2+30r%fO!U*(zhn@xA;rJNv7)dPqcC&`Gkpup)6p#8t-&S%`VH#+Vw47 z1ZrYVoekY6m!+MmkfSl@=(83Jh>RM=6@_BZ@#m2@gjSQDm~M#;i*tlcAUFkg;=PQs zMJnWEk_2tyBE8hNCL`jfI6N%DY2a%&bpE?0I6k{55d>M94FoUL_axD8r2MZ;xv-@Hvaw zq9i|4u;P4|nOd?89&S@e7$fg9w5ik7{;s1p<$%{Px^pXA)ZiJ*T_`9A%ZsrKN$)%D ztOb7M#2uWj)1nwnb0-iLgR~WM*q`jEA@w~(cU<3;TcGz6UD5z$GW#O`20df8;pRVY zzoC4zzo)g|0FvRy)=K0+BCPi)KabsDwpTdF%AsoFeo@XLYf`R3tW(N(V4APa8VTqO zYaFp!PT=^&)H+bv3U5T*5vk{AeXej$R;Oewpd^)uVn0)o;zmt7lRTM9REl*{mONZN z<|S<4WFKxe0$E{t$xn2nCGWG0$W{E${W(Sw*BQ{1U**^A&8 zI$rVs&Q8tZEFBp*nancPz{--(mmK4uN7@+{1uq?=-Qk{v}Ai(*JQ<Qb) ziI9oKiR_8ziS&uliH3S=!6yBgeC6Harr>SJm)-bB1PpopT0sz{MF16qoR^V~HVCLue&LVU6e$yTtP$;v!eHTHBEyb|!?`@o*sevdTrHJeop zwT0oAcEND0l*idnVa$A8P(K0ZVSeX`ivqs>8G5=X`&lYF5ee)Be(wuIckU$q*}<;@ z4r2#7nhUhaoUJcj*VC0s$-JYm=`HaJpLeRxTzn;J_aSv6KyL2}I@N-Vcnp-x5iQOX zh|qORY8E5lSTmQTC|@~e(_QfIL@S-9IHiq1PS)wZ*$t!IY(~`< z@a6PU3WzmFyeT?es(00UuAHM@*;!`}3SHx%=v)j#UpfM9*n2$NSKt9wR?y-h;`3^0 zlYNOTiCjHHknv2F8#vP^LJ`;lRH+t>(JB&-@R!sXn&Y*hje6bmXmdd%}w>*#3>A))z4~D%XF*+~}&sYg%I=ANO zz+0?E;B}3LCnPO}qgGQ!*}YM8HpXcy0t)~RdNRI{N?XQk$esPOG6h--f1AR(K2Yziif%z`E-CQd|Vjt8W*X++>o7Rd;B-rq6B<{d^Zlfz}sJqYrNd!pa_ zv~xQf91*{23mLP% z=BlE92usq)WUw6&Ro)nNR3PVL#>GlTLTK{`kJK^8KKJLHq&ZVA4;v&*36q<~QinCH z8E8{4&WTw=(-taC8{*&Y)m>{mW;<|X=qQp<-?&t`l^B*7m*i@fXMII|Q+)w_3;ssi z%qnt_Hr$~Zm1?=m@E-RRyV`{IWmoBEdvGCKTzT8TS91N#R<1Np$x??E36qMGdv<18 z-6C$)sM&E&c*s)~p)A_WQ4HKo+H)oAY8H!rC62qL1M);9P+;YW0|eykR*VC;U+M$b ztVo>Ecpx6C5U+sWXwHg;;i@n-q2H3Oeh+`um{bho(vHgJ^=3xK-bvtgD!Q+M%U>PP zQpY9F=}<8`)-ouvWJa~Y#!7b;#NGKhR^V@_k;Io-OE|z-BG$LdgV;o>~$$`2S05D;l@z?Bzz6w^+;vkT0VL`Ae&SJ zB7L8(p|q!#^NJ=dXA143B}42VU%KTfd%-Y_rKfmqA9`_DiO*O)Ij*dIQDvIVs0itZ>oVwYF~0%fjhehYKuIl;r$d0Z{9rb$9%=i zll)UXq1#cW|ECVFNqkfDd4YUbD+D05 zKJhAu2Ew|aPfc~ZCwAyQQIaVTo!aw5f0++2`+ zfh+wx1C4~2ezj|#t5caIHkncw<$=cm+JOvG0#m%$7+%6#0!l(uf>y#n0%Jl&f=7Z$ zLQ4YeM6o70Tq0?r$v#Hbi&S>oK*JS54wtBrT`Vs1WpP4tXE5gz9&el z<)-MSY1?K(>7M;TV#DV1BQd6`oqLQz>u%LYpC1Rvxm6ceTY_XuJ75~{Ri=3s%%yL4 z6#hikAX3@&grZH&61yjBtJqUC;@0^)_q%a0ZOcqWj3q!fZc&6{W!}EwL@8JOWf7;1 zoQZNbbVuXgqUc6R3poRBwF2_1*5G{UT9_g>pDmxZ=^WXsVIr-I@^#YnJ7jA-{r=6I&hH zN#!;#6L&mW<`MItoSS0tjqbmAvUogwxJflVDmDxZ*!0wKp7%)JmTY3p!_` zuHK_rDjtS~%J(<3mhcsP630pGaY|{xrTNUfkyAR2e)g|4d9Cps5uy_j7CP@6?Ks@& zD@oo9BS^C+ub8IcqJ0ttGfTxPO*MC3*);KI7SZWza^_vsPrlMgp+5&xU}>sG!wO{^ zR|1U!mknKuS7M8-wzvmTE^0?UT`PZ#$+IFUc4!P(5pCp z7b^|QjLrMQ$J5ibz-r3ga%PbOV#S%pE>P3v!h1SancBz>cSRYh9a=?~s;+s)!5DC* zhs}NNBxPb9{(sAtkPxmn)jm0+ne-N z2lo(C_W<2mr`PV|o*5!yugWoq57fBC^<~`xOZF1oV+Rm#!ZGsuSX|=0F%UyrA$%G| zty?ztS=*)7-2(-Vb5h7{7p#o(s;ls{VtRUJRB1_!?*J5fg}XrBY(FT1<1q@kF3-Y^ zhnto$jkY<0=g>?wnXk=`bXj66^8t?xUgLvG)2^uBq_m?G_vxMFH=`a4q-<@Kqbmp| zB>9l;CEI=+e-Y0nbj@oJ-|5m&y!eb})kCwC1|#U3#rTIz7s+a~y&WitVNrTy^J0QP zwIFd`$;0bb+`Qs*0EC3WQS1V8ibwY_8okmt%#-<84>$><$U7m0&Sf-WAIODLRZMEX z6z4JIJ>naiAf+1$V0b5GQ)-z#?pw6t_le&)} zV-DC~dpZj<`;$9K@y1FXhCI1<#^4?rl&@3QgD*^iA64x0!*B$+-7#UBWae z8y+5zDNDMW@1WS~!l&nI3&`zv23(b{R@kq!TJ?G{OPeS2z68QOa^h?zb6Fm#g5F+o z)565l!C0(>i90JJxK{xo!7Z9YB%l;G^8e{zs}KkH=E%>ead@Px{N;^xTF(Aih(%-(+? zaga~hD5!tGa;2Ed?Y7$VXPHjdNo>w;!jS;vL-J0eGAf_jEREX|t+DS-aJAM>a5*}7 znxOS_w%Y_v2!zBtliWNgr))mBt4GFNwi!;Gh3WME*}6}k3xFV`x< zLD6p(sai1gKU<~W5+)pyia28fSaQrTgkHOh4BzM%63Nh#v#v?$&}`kf48&L3fT`n} zq#E?+Nb_Xm?Xz(|{OZrxw>rH#%R1G<7`Fc2_ev)>5@uLnxCqhCGGIhAxt`=o za^rrmYEHK@DluA_x=!V0@^BC3fAe}SyPQ~?ad?~UXb`nlw!Yfj+{|txbSMd7OU!U^ z31UYoXj2)e46Auaq&@O5RqM+HH=mYQ{FHa^371(K-{zS5*J4HcUZbAtFDM_a62_-6 zhtjg78Cbj7yhMLTeqNnor!6X?j?v`G^whuBA<@G&WVQfbwss6WNV-0pTo@PYS(Z53 zCa2LF9}m@0K*EJ7gjNp06~1p~Dy68fV_%EYSZFn8Gv{>>FAAwXWTt18!lvP?EY%Dj zJ{}%)BNQKEpm@w2jH8EjF{LIST~-emATQdZTNhm$@1yqG(mxH9+IGf>Oayn;ho zgr3_1dOlpex`UYIRWQ*kUV$b(>T*L78OOW=L{D2zt8r#2)vTRS+NJPn4!cD2l=Qm> zCDT3vdEa6wLRLjfiTICBfIoE$nOu4he>^|toeqZ@MbCguI=8ItwBIdT)m|eG?Oi6W z`WU%V4M`Q~4ttQ(q8WLKZu z)AEbW>s2UiCgjd}(H4BydS_(kb;>oqjG*>GE|Maax~k(xvc8e}G4&zh&cjs3^pD#^ z@PkjZ^}lIv7cOrzZHM!QMzVVPn}?c1-aE(K4e)59b(9Ah2J^b*sf$s;f?FSaq%4I8 z3a%*hEijojCk&wi*oT_EGG22(GR*KWRjiK#{>^|Cm^6fj&b4K1D;idpG`RPFgi!&PcXzh}kwqAiwc$otwH-YVRm!q#YQJ%P&Lnt={ZWph5NFkx&SH>mQ z9R0T#;KyrtihYj6#PX~5KB7cR z=?sG$Sp{=PnlU!0s;KO#GxD8*}K%1W8<)k#|ooe|xCu5dRvXaU1MaI1r2So1D)!R|?Qa!}` zxlhNyu~9KGrfH1xF|+c>b%|O~;B%B!EPI|KN`=_4Qc1Yp1==k*xOyE&NUkN5mlY&V zzh$6;NIedWNI<4KD%EZtUn4p+(tYL5Kw7C7wed;|XI9emiYee@onsC2S%OA}siLnl z!S+<^Lf(0UMLl|=aC01W2;u=7WzJ>{ zCOnJCQjx|}GGWCScuq%(aeLgQ0<^m-b0x;3!Lpct?iI=ul-&Z|^fH?u+=054X>(WL zn>NGRNDmPHi=JT2!JkQy?1(1tP+uS`hCK5cv-^~R!vpy>lmEo-_Vuz76Pagjpc2=O z8S)vwxs()yw7TDz!{?|Dp;-&H5|;V?vO8#9Mcg_)`w?WlyUHCt9hN)hQxnLf=!?t< zE6X8qqtoFLWT?@4biJW>>KM-xl#~fL_k$Z$Q*^lA4g^YIGxaqaaP{?Q2aeO>(NjxFMOT>DrUj#tD|h-~DZ z+t(`cessRx)1Ncd?Y_c+#?C6f3c5ebY$1a!M_9Mxg6KNWaP;(PFG1zj?ea>=6H#A% zFd%fbE;F_1gl@k&tzMy(jZ(brs$XX}RmE7N_rRqzwf3;!xiT)Wm_%T1r=bt2Dbym9 zDkv@Hu6sKC06mUy>~J#@xR+c!LN+T@Ipx(Zh?Bx1*1&br5(;UX!y7!eZOmBYuvi_4 zF1nMcm?9z~krDCw_86JSPu>L|B5tq9rEZc^P_81~)Cze+Y+^AlYG9dB`W$e*2&=PS zdcWqCi6MNFa;yNWi9V9Ml9b2}G&kWnF_OKStk{z*H<%VY{{6boH(=8aCKLAm5gN*t zeu5{QWszDudu;9I2BP`!bZYO}%78#G&XA3M5hBZsU2TOta=alk=9kIC-U%ev>2H`G zwQAymG3vN3mLIz&l95`39l1cts_>&+Xb?X|T_F?aXBtD7DJ@;Tk+V+WEVo*k9bz@# z37+M5pP;60!T5spyVwhD2y$Zp;yl2OKub{etR6o}-ujDm#Pl(Wj_Q^%>Bss(C|aZN zw3!88I9;>;cFcK2df{w^$}td)k#l?(&dU3{XD8=5CPU2DxX@V`E3NNYYb#}EVJ~x@ z5%F0$6Hk=+Og3eL2M0XWQik1p^l}Q(_CHg06Bisv6n-YagwuLAE)BW&(~ zY8&0+G6Yx>fbN)UsVrPj7#AY2KhbRCo>7vGCXS2@b3AkIqk^e;nS@q`S&wWC?ZG76 za5BaVGco-O%-aAm#v6jtTvZ$Us+wURw`iH9r|-CXvcZlnDsbGcc zng6y^2tPHL_U$;kT_0(ghBIq8SGr^!hA-t~lnGd4ZR8zqWIYaN-d%=+kjtZ=gqku~ z{}H2TAxs9m!+!^fhaiBy84nqU;usmE9y}HW{8mwh4Fac^pji`U zeV7w>w55Iy9zV;rii7Xt!lbCS_IW>sXasYt)Z~YpA(fIcAIZMBHbnOIOTca63;grI zhq0SOY1>+-q?3B~b4i6+BDc2x$$gn8TF=Fkt3&5j7gU!>Kii|M@z7*;p4OM_@s}lG zB)3flH@%0&bJ1)*F66<~#<4WG14QyR84(F>t zJKwUP&Pz!#tg`QyL{BW zq&#q%U5FDtB7@T!?hqtgrN+X*skIAOv;b=zZBB-ER?C=Y+FCc$9q3kuEqD zyIEA-9LCD+IH1UYh}kwjYYs2HlzEG!6@F2rlGiKC|oLYe}fe zMNTJ;f{1#%58fpE1)P?&3(K7oMNPk%V$IYxgjyJXu-ppe86kDvmI2{o^ zEMV15dI-8`$+R`4U)P4($zoo{F4nC~b#OLQTC_sygyfj>?l!QleK$e;S!t1%o*pCm=VN~xwzT+le6Qq|bE&So zAnwtuG&1RkMDZIpDfRkHp;s@sqvGRYoB8iS8WqLEw$ag{l&qbKnH(O!3Wv({tZx(9 zrVG-Fh}u!&`2mB;R|cyvJM*)x;n=-!**cN9;ew-;rIoC(ay~fUia@`{U-Sr(Nxic6 zV4+!?uwHc#lnM|i?eH8~?ehpzOPxQ~^F!dn>jtnR*b@u`>)?i+dT9yg511ZXTEk_9 z4;OQX%m{^K1@_@IiEYsN>B0wl{fq0=P2>^sk}{+`-U#B(f+NcLDzb>uk_Q;oB4*q5 z1eXenJkr(JGeUp^6c$xV;wJ^ZfKBLwHTVp+oXD4D4RJu;*dSYZ?)zFP0)>jFI5ns; z`MbmMhaJ4&%i9DLOBwcR`xZ)8YlT&Eu?m#)tLu7|MMfTQffpqmvaz%=Y`E1ZO^%rf zB^|h)Yc6*YtO0R>N_*kNd54@5&QbqB`3$ zGxc6r%uWtB(G2a(H|=GJbi%E8e)UQG2OHe4oej(3FH{(QNe$gC#%85G^mpwV2{cP+ zWYoo??vPGz|NdOn#EZND+(h6v;igqoGHaFCcrOr>ot@3Mb}a!vi_BdWF}Z>YMev9U zdQFK-yTw$t1(V!_`xhBV_7KX6&dcoRv;lRCYQ?R*BMJiOkn1xm-CL>k90M(qla^>L z7u)BGp}ZzDI#zoEd^%Iy^W1JYEW5HEUUeEBDK59j?{Ai96-ITV6O&f@dg?dhrrJb_ zTLx0aWXe*63u#&Z*o<#=K-e>24OJ^3v<;@J{kGa-BI+k6_eO^snJVy+#?&bOB0Uva z9dt5nD|p`QbJK~8x!L52ZS*Ce0xJfQW@?;tRjzo!(FMyMW%b7I*fN3lC#Ubhqk!i zBY@}MCB;}M@2vF-Gbzjo@+>|td`#wFyuaZ`g+8nDD(5;Klt#;MxCbvCbRvj9Tjam2 zv*QNjKO<;Sm&Zv}doO!Y0diJcN(7VF$6@=f3p2mgmLp`=R1lNf5{9+09AGiB3xu z9U0v^z3hM7sJ^cA4#(nPq^z-3iW+7qAcJi{dw-%NMFosfx`@mT3=|0pEASo#k9K%S zs^G`yjm+Hfj+%+#otuh9U%s!RnH)HC1-QVZ;WqfD=`AyFWB^Zv9rHVMy%o6iN2aGt zbsQ`3@O2m6)J%SKDV-;)5IupQM`&6Imt+kvqQt~`(=Q^+Ha{P~u2SZnhT4k!EszM~ zy!Rmt6>-*?KinXOMO>r!dX`=j(ML);EE`t2RWKb=a}R+b)yBKq+eo7bDg)FJu2@Hd z)_C->k4dsxo^d_r(^h9b!bKN^(jh$2Me2wZAij(4l^ErF6_uF<8inX$N*KfrkZk1P zLC7}t*nyNWX=O*><2XZwFQ>bGC1P3x&A{h8HTGUYx_PbZMD9YiN(xmKlUbq)euF;T z!sNkeD-|>ry^R$@joo5C9RP`ou0mKW^eC!Z|~_q>TqxGE^JW` zgD68I9UUEgEdygOKmmNLuHHW&7--O+A4b14Nm*vmdPwMXfIvmiFIT|9Dd1Qt737dR zM%9guE0d{fMrRlOUke^q&}wr6zifDpRYpq(Sc?Ig|1=ubkW0Du(+?`6ilBHbKWGwx zm;_>CVb5MmqTydv!}7Y~-E1#`B9b+mQ74*cwvn_vVe~i6UTeT(&FO83$w?ZG~rF^Q=s^Y5r zZA6^(srpvF$0Oi7!B?<0wwNO3lF-2R4rjEG;UC(Z+`ts6B^elHE%U~6rI6B8xp-X{%|#>F;Up=Z|NP=H>|JzW4F>e)sM6)%MxX{!K$` zCRTLHsG?zPgXFvTJ72pVyBxb3yBNC`yA(T<52yIpDyOB`Ld56^{Xgw-{dT++eGsjP zO$6e-J4SRHfTF?7b0OD;A9=jo!8no7+|gJ4qU|X-QP%F9&1hhA9rYo*K<{kN%#wvQ z#-s+2UX+}`jAt8bYoiM;;jbOL*zZcu)?EK;^zgt8kv_1EXEWB?duZ1~f>V>$n+Cm2(X^CTUf`&zZu6m_X*tPSIlDwKta>5jV!(K-cNO-mK( z8L~#4y{Xms^Vm^In@bvwObEyw_9ZGvdOBu_Vt#gH39Np)bcy~ri?!-y3xHD#wnxxD zs_oAzD1UURp(=SZMuQR-$m1uKpV*y3ErRm}zu~L*s6cS@qHpt#Qx?;MG7BYySOmYf zS{S+umlE5fNuedLuB-JMrg)>hP1)ippzz47LK4;d~#PEl@t4jljp z0HBEy)ck8t1^o5p0=WWSx`ViGs5akrg;NjF58;zHBPHll#>KbSQBw+(iJv*jXJWY7 z{?G!SSzjD&O;b4uPfT9WFpf+_?%d$v(gZxDwrLwX?zE}cQ*oXdc+Z4Y7gkg_Omn~7 zqUg*1`TJ;YnNL6XS20YHz@C^uDBIyDjdAs|iJ;Y=&i*TT_Gj~F=8N~j8@fz%2xl{o z0Zq6xSF95pOaXP@vRieiGoK8M*LJTTjK-0=qPl#w_1|@D$q$JaZLnaV`H^~4s>y-e ziB?y?1Q&LWd*ARd6pMBKzjesZNtpQn1!Vb2d8OWILSPph4iZpD+d6b&y^4*i#f#!{ z%+@uFUNYdjR+xh?vH(a&u1JzoigdDjcBz$eX8S~tY_vbw74Y%3W@N#6T(zqWs8L0) zj-F$$ms4S$`|;-Jw?6K2$Y?q8>{oCh`**UdKJD{iL{NDUL(HbC}$2sXg*i=+26DI`coUniD8kh006JaS3WX zG>I1KO=J)9n;7OG`F*;NV2xfhKId~W-U|gWJxpJ(o76IGN5Sd*bL)?VW*hz|F+5G) zDBfo8b`R_0)Gd`%J6t?JB8OK1MpduT8KDZFQc32DV#6#bL0RbXt0X|W{&J*P|~e-Ycu^>GyjV)cXW`i`}0ND5j#f3 zB{DXVVO@R?N zj$H%A-%eL^S+Vj$U0q3K%vh$#p#$w&+Q~W340=zT2RXL_N!xA|Mn*G=Byt3?Y{r^4 zzgS7Al&~hIlbfd0pw>e7Rj2oQ5e;C};OARprmNX*{Wt$&WMJLV?}9N9Hg2IbJxp*! z-`t;vr2@T4Uh+nfMX-5flgtZL)ctDz$#Mv%9C0)2CyVdL2>=^!7 zY64g&U=d9NA|I)T5mu3Cn+w>s=oZN#**S!z|p-)!@HIMB|zQA_7&R z(TnGDn#je1v%^+~;b#&bSr$z{jg z3}Z41!#>bf;|OXnuA0mjqzC*>m+2@Rxt^>6txplh;xfM-8e4*qu}rFqLm4zDxx-Sz zk4}VRZ@XXCK4=6?U2hGY#g_c&FGA<8i zgQxYOh7}rb6K6v4tQ$(S8m+C=D=)ie&O;!L<`1LTAk5W%DRIU)YB7Ru;N=D*e#g3? zr0wPFxVXdUNN8JF1!NfuByZI-50{k;Z%hn1i;-wS5rRiQZ0-pZY-S~2MHeuUo2^Yj z^d{eJlG%yg@^H~rG?Q}9n6VRS8FY7lRy+i4OM{YRV1 zxLrT&@c=S^*TmW{Y8w%ar213h2Y_}c+udPyU@9egcHDC(_31ygMa>C=*6!iq`g3BI zGkFqj>4Xjd9Dwm7dsnJ_hZF)1fD4UbaqA!KO??S$$nU)~`3eei+s2NNgh;u~;fDyu zxa=N82tjSVlJw$)w6a?OQWo->7({>5Mp2&jJg1hg&tYRA>~VnKhQEPVa9uU+jEmVE z!e2)wLfPaj$;!)FNP`UJQ$Lq5?q5;gp@nr#%SdK{>7^t2DkTP!Pq1G_v;&-G5YQl> z&lqBBbWPKpZsUsUjB;jIpF5~zc|dHC)aEGnrSZ959e(>ki!31B%+N6HaeQB_VQJ$) zYWyQm&tA`Q9(?voO%4_o>cGe++e?Hm+a7`%0nzRSd(i}H$b}6EPTKQE@CFzYsRsbV zO<-u(8f;|SEwdkdm|(b)ycAz0jVCpk*#WZwrNni$LQj5I8i)u31kOC+)C8=_7SI8z zm{9S0IUlD+h2^)IkSo0gpDg!)LJ&*>h2)^n`=X;&F~=AnxpA{=&Cz%*(KXyhsG)Cg zJz<6bt!eF?Pi-9vE&=?=HY!IO>n-smT_c@)^f7J&b(>Oamr-k2eu`*EWXTbSRQ#ZM z7^ZfOn_=}~jWCz(e?mYp)zOn0mzR~b*2%O1>i{v-D19Oder!9v#p(bFlzyEx~NR(#3&6kQe7&=O>N#+a8#GMFS^dilnJn4 zi1c4$t8A)Fs0-6%6pW>|!n#jG?2|=n`QGwX1Q@=mW@?)1ZoW%rp`KM|mpwrvJcozr zjVBHB!GofNn7JM-@U@JB*%4p^{vgCUW-gL04|Wk+#fMF|o6lLgg?RdM5#y)h>7~Oo zP$QCwbfC36|2?-qV+sO{?LOw(9AKxw^Mz;2#?X`Bs@fF`70IW;616T3O;jHK>076j zgi&_!yl(I2n~bH&cZ2W(mPN{-$yUBujL``fI*dt`cA|*HYsITX?KB`V*qPrnP!lzg z$BVLIXfd(cK2cr&5D`v}`}zoO>uulmg|$4vd^@&}pyu}>_tCiUo7UUn$U|8PxA_cQ zxl&mqo;Hd67$J&_-A3^G32blFA%Smy9#3&Zs}vc-6mH@A;dt#oJTf0d$U0tefBUi( ze2n^uX_YzV)8BSUNT2{14~iMUsNVt7BU@$>my~q`!`vTqIr4#?RAWKE5Xp34odH0= z!2ve8S}kaCX;%!mf!EYJ`kB>L>;Ze+);l+JRB7ysO3!YJXV)w&QI zg}xroV1rIv;V0Kl16=!P5N^I?y;?92q`hxuB;Bud3M|+{Ni{u@&7bo-FzSn)l zY~`^@>=K}BBQ;}Q+#XZu4(=Fn`)2m+u)!k-G_>)UdJ*78UUl(<>*P2>@BVZQV5hAo zWdV$`;yyP3TZ3{RTFtno>T&DA(sXUt+4TmfK_BXYdXVNN5I_(bXG|D1LSh^9VT;y| zCpA&nrqT^h!G~aZWlz}4#k;5_=GaNjYLL@SqR-NUh5~Zl{)Hw@HTgsK$Y98DgS&r# z7rj>}&o-u{u_3iYVfUxYv{`wdIo8er;YDxyMH zVX!28fL8)SiwiLX+HepTd@VBLGF7d<_zh#^tukHsh1-u2Ye?|!@S~rvvlbOZm;8p7 z_!SdfyIusPt5*6}RMk=Ui-?i*|lhrKy2hiCCH} z{a@(TFv_2pG+_@}jHS$RHm6yAp=!JK!LfKU&a9(#Q(Y>cnBTL=nW-^ZO0c1BH6%jK zZw3{1(BHzM5B(T|nmeLVO=*Y=+nWa>q&%LQN!wKMn0Vf5)FMS|o;K+Yr5zQ#$P5 zFg~G|Y?1Fk+3ZAhIV;!-LmP_7*dU&ibWyQ9Uk-$m(!wHBRdOY90tYPT8hK;Z@ca6@ zJ1{})hP<-4q?DDag~ja-ab^K@&~kA(pdz!`Fryzo(ZD{WdNj$ZHfJBtiiN@UrPkny zJ6cCDpFD|>U-B`ilxv1+2wOV;0vXgig#$y$gQ3>PoVA+oXIybK!Q@rU3#xoj3<)7B zOgDj;Q^M!^@b;zl1c4;sl!>DJTnlnw3*$fQ+6Vm<&Pzn_C^Jdb57e?<=#d0m6E15i z9iK1zIz@_Sma~f2t31w|4#q}!F53sc-JfDx&3kc%DeNK8@?!QTFp4@t$~g*>Hd$au z_?_Z=aec1!ZeVe^8ChBqD6XmTsXTxg#>5tIruKxle$imQ2u6155Gkkv?^5x8<%CgQ zWRml$ff*laDKm9|_n!oQ5uNe&)qFLesnj~~u@dmO3tchZ6szr|t(^UX`cNRK3<<&qNnWx&VOqIInKK3wkQr+F@BM>gLl1 z=JIi4g7!8DJ42l?txuQp1oU3_8dFjh`ksh5Sr=A#D)oO*y$>~nyptk=jLuS^RubVP zk!Sv+0+0muLTV=LWyJ!ND~@u8?3-?fX7wue?;2mEnItj1YUxvo&)fhviuaF2Eh*x$JdD-csIjW~)&=oKD=Y@5D zzWA(k@|86e<`*}GkT9?1StV&jCI6!vG@n`co_ z?y3XSG8TvQcKAHIG`4%nm|6R};Ry3Wmk=OT(ciG+uh$H!}vG-N{$SsUD>zWAl!;I-|wfQ|y-z)@~rFB28`08RtSLizn}dG1lpvbu(MM4b2fdt0Vj zMn~rDo_`bcozzlB&xZ|vzol?Ps>$i)s}&HsCRyxp*0ZfjP7MMG$XoT$dCzR!Rad(iGWZZ|i7E3C%M_4yu=Y2%y zDD6U}$xYoHzk+*+qZwr=!lY$84wBMXv5FKJC98E}ZX|&~z6&WS1_3aNa6X|};8wx& z4Amf)I!IiBKA0vDf)cV*@kH0G0{A!_=D+18Xfas>fspz;a!CHr?>!(w$Q`|@xyo33 zumRun9>55_n0bAxa{?lGnHkyH8Q%33*6KG_EDZ{0kBZMP#bW~+o6-4ThIFBV7Bo1c z`T011(VUflrkCOCzsx#3(^>-L?FEoATY{eo6yJ4-b!?rbcVUuPPb)9_MMN5l98cuO zP9Q$(@MR4^4BYsL)A|K{a(32OCjn%{MMXYx*X`|Ptxz)^tPZ(TsrrEX%R(^Jtx`&sZFOlrsKxnJH{TUwey9>m{ysJ@I z{AAACnmx3%Ji__ZCkPP`Pr!+35kncGdc#)#c;O&v0^LCIPwP5+0Zt}p6>unz?V|(g z)WFOvv8;bnzdBHBU% zNlF%UbQ7$ia7qQiBkDCK^1Kb|E4p5#9oE^{msLot;F90$9oLBIq4aptx-FA+9b3S0 zC#Y16$RCtdL>$d8Oso{ThTSH{)~N^%Nws5ffvoRZHX%bq!y6d?q45$wYRCdu(ya?SFth-rGjSg|D)B0Xn((j%D-ITWgS-J z1U^4K7Z~4)B$n~r-z#4P3;o{S3#RAUWaQh+V?X^~Ir*;_Cy>1=jm|NT%IE;V7BNUB z2QYP_Ban0ebb2ZDuf-8b5@{=K_pb7IBlRZifea|`Q}`Jvp3d!&`K7BC7CLGnQ@-xj z3z;mxu_WQLySW6%KrQMwjL0}jj z3K;?a9Z1D*$6XrJr;udlV`S#;T1>GF;sqik*6a&xSQjQjp@}DvMrt2UFTY_qef7cv zU^;Hkn5|YPH1Q>P1WlMcTuxuNu#nDBtK@v+;ABV;RTUiH)6Y$u?{l7-hzv3b+}PS8 zdQ2PJw(+>>Pz|~-MYb)svsOcIG-y5L!9+jlg7!ZUCD^H^wdnUHqGXp~9a*G~)cMp; zpdaI6%QV0vfkQIP?JL}>H>Gk}Y7(g6W1HZVoSR)Ox2uL&7&e*>l_W=47?@pNrN8!Y ze2h>NB-lcnU8S9M{0r-xXUl@kMM`^|tAKIB4_{H$m4!lWx(Nf~Af1sKV2_8_O zsH`amIy8j3wr-lm5)_$Bh;ib9E)ogl*tK5tLt_FHpotu)A}3Stj43O@qpO{cO7=HR z-mLS`)=k{)C%cA<>#7k+zNY^OTKX-DgN=hIM*~gouk5gnIjgK+ftt_7lCe7`CL{jy z6O)q@g*~(HAEF5J*}&vvAUo+_gF(=QvqCm2d~B39+mG|O<49~0<#(4_uRu5Ob$Y7G zSak_8R^xF#8a*&KC(O*4B#*!slP-z=3}1~2iKzp{MnTA&oF+V2+2(i#-F#)9GyRn% z*#s-eENNko4yKS}Wf^vbG`UE&hQu0aD`j4!?p6eYIkHH_d?JxgK1K8}JmZ-TdA(k& zGGo}|4W$_`&rD5`2i{bW^S}ev>kUma9-a|*u4nHOl^{0eVG3l|Bjxqr6yx(T-dT?) zB1E>ky`&d=W<5;AU0Wg*a$r2{xsz~sw}Nm-F-@i3CAE{mP60+BX8Z9%@9Ve@eYBoO zYI{^0G=TgjVbuZef(LHx(cB7vHhNe4Opwz~fSY$Unvgz+w<21zi0K%)tOL?8%& z>}Cc*aE3FSo*X#4lNOlS*&uG#5-aVjw6l4oR@@}{Buf~Dv!vDflnBdtC1=5sqt>!d zI)Tpjt%Iz);hp94|JLdAVgB#E>IRA+Ig;-r`#us~9nh$%uCDOn?+ttCb)r0ap4F1t z{<*pR+3ZP8b~znmd-u=jC+4S7JtOPOC%}UL?>ZB&C0HWS_-&WWp!=xI<6^rKi3B{2 zAeG{hvOA5A2;*m+l2qtzkESeKC zQ%a@#RlRtn*pP}SXr%mKIemJv_l>)s&_Qxr#|EnVImHo$T>qFT!zB8S6y|~4KuZ-n z-$Ir_$HwwtRl_2jFqc$@W`+}QWS@%eZafWT^d#9YhaMR&Ib_Er=J$vD7X7tR-*Egd z8@EJv>o67qzGUNS*!M`{)C6M>4uF(XmqghJ$x{m4r$RPjFFgtpkqWy34nRgyv8>cS z$v#PQXc+G1Ci|(pwO5Eg!FO1^@YLR$m!A8|o=-d!9gRc-!6+Mh>cY~^FMs8^hd%LV zfoNnj8s(A}lK6B%Teg&DAQd(>6FwW5nC(6j>FZc!vT_McI?a|H$_AXnr`|5JY+8B- zHs@$_*;Y<(Aj?xLldEKR+Ge*J-NwsEX(mmGQ80fJ$h8|{H^ArQ?bMvLV9%T1+!Op6xMY8r&Pxt_ z{__E88@p&&|Iut@o!zH|;lQu%&;=E)j zm?yhkV8dqThFeCFe6KQepb52Xdbx7~Cox#XsOX7M=-q# z(1?)Llq>pj=nLVIaCqd~l=>V0pj7PdVE(blz( zlUtVA@;JI#PG|`kmQ2HdS<>{;_oA9EFfb61gb|9KLnIji!W*~(cL5xS*e_&HXMuX3 z^)$@?cKW}aW~+D(r~R+OX;W52Z>*nYRoUGV{1;$tWztXnH{N%j zi(XGX?0e`T?kz@o1Y7=DKnW($$f(#fnbd%<8fK-mp=lMpuIs#S86?5&usofhnLr|+ zd+dt$F%537YZX?8uLRp%iJ|2U$OR>kTd^Xn8l^R?|6c3qz0zUo^#u=dxLHuE5f4k; z5W1%Db5u!rEJnL9>4J3+-E0_i?2+=z@`QGM?T3!!WE0wnG zDizqqyQ0kxc6EJy)6#TMlNi_FS~?l9#vu!v`s*L+zv1JR3Nw1&cFP;iS1LALMEBv- z+IPyb3Mo^pAAs6U_!V-4@LO@^vsYs!WYsmGf=y614_RoPAwSTr51>W)B_IrL^@sZU zLM#EN@M+71I7Ts-&3={jCrKDmEjC>~p)Pgq2TeMmU&s|_74k44y}}4s3ygz} z_`I|mc!dLC%eM?Iq~xeaJFTq%Tb3UOJ$OK0!eoqJDrmL@j){C$P=~y$})T;26iQh28gnQSSr0Wgtj|J&932v>DgBCO43$%EETVX@% zclut3uh$?e;^#T#@5XsEozA;;W;EcjVS&;sHEHMBRe|an+)lq?n$5}8$=7Y7zB~Df zkdx84ONHeSe#WHH)3*i3?@8P<9{egv7|e2JYGY&SqDHl;vj4{#H?t%sgeejf{lF7+ z9e-Gz_20a(G<{?3{>;=RQyJ_MLqi>iPceU z_%Yci7DI*sjUli|rLg}pNDK^vb!r-LGg`#I0oNgkXq%)}eksfOX9X5TC5aB>n5S!V zL2!oOAvYcvxF!t*pw3gnT!uyZD2;)>b5c$ywl53*HLn!=?m39=HOIiurYQK#>*c@)F3qdq@c1UQ{QUAeaJYWPt+MJ36}e z)?1%Y?nM6ePUSz0onhWHW4GS=_)GlCOOo66RwSRk4zfTZD;9a1{HW){vaL;S&bO@L z3x~g3w-iu^t6c8OHNFlQwISlePy%J;ts-fn(y$sGeTgl^W^To--&@m^C-%pNpBf$e z&yC-T&D`=5UhFummml9BOG!fAc^gEf_MR6#v?9?XT{BqtYCHZyiuJ3Q8V z=(!_D?ml|-Zl3;HI9#pOv^Vh!l>YpUH%em8a1<9UHuwybZY$wW$pbL4iniiR7mHv; za{BwxW&G|bp&%TCV*Q)*vwKs{iu#I`EB_g#Cgs-8Pbn31BYq}Le3#mm7n4x)P;JZV zH^q!>-s78O*A4j;RGWiUh}jKP!A)~n zStB{WX2kBiGj{Ncv4aO=cQ&qC7t0z^Uq$TFH+XsJ4ow|G;zdt8_K?hFi*U<08a=&}2JC?RnIh&s> zOj>#}D*&wmuGeB21vi!|x9kddne3LY$Ima#{%sU}Jtqo0XHS})8y|P~CA!Wp#iEIL z8ZJNo^|4v#ue+n@^_lkYdK4z^*0Mv1Xl&_xSEA4Te{Y?B@NYs~pX?q^5;Ylo{RveE z_F33)T`B@EN(432OGWInfRVJu)*Adou&i;Q^n)?5f@NzuL(B=UG|&Elq*Ju|O&78t zWMn_fUVfP!dc5&CQ`xJpvYU!Ukpcy84YHsjzfbZyQ9_E1VudcC+i16#3ANJJj1cf0 zp|Jl-V@=czaZ@4i=9u<{aTJDq)1Y#zlUC6bIY-GO;Gg(ObD5Q%b@eUwgfs4nh8&~K%`j(k^s6CCh1k6*r zicF{LmUQn=*q=20C5TPQVnWgicGu&N-&Vcxu`2wrKY1MXkKI_kt?{STs^k)o9)`#_ zo@5=^k>pL!DC*Z}0Oy#N`5YK1eP3 zA<8yrGN%MJ!lDgBRGQgd#;;zthMTM$&a_vJn?0DKlDM{g?Wk=O_D>Fp+9pd#W!Ehk zWa98eHWvz|EwdR0Y!?a4Q5gdZ9J}|p5(`m%0OAIBjn@Xx^xXXcZ^Cn!UFz(7wj0%V*nI)q=cXYX3P<2`WiGo77Gg5N&d z2|pWu>~9~Rib4Gu)cBf1BL50}0;$lfp$hX>fwfgrM*IOamC3v~WL4_W*Pp#6J^OLS zc-0!$X#c+E*Yi||Ju87{ne^-@8rOIg7^8jE`ciUn3UnvC4^avWJejF0@Q+SGBz0wP zWyKQxwFaSNZt|E2koI|-0UzLmOpXiZNkrZ57ytlN$pM!#IjFf9w(Tm{bBkKV#zrO* z9&zaDC|D%6&141U*J&DSl*HMItf}x@)I3(VM(5id7#UqR9wBTi3wX?{(Fz7 zI}}cgWG5ykvLlIbsN3Ti_w-HdeI91HlDE6tTgD_d8GmKrb~f*Jb@ccETg>h5?CSOP zbhz9Lj=eV|kaNB*k|Yq zAi{;Tq~Qtj=tik@1=AWGLaW{@WoVuoZ(;+b#Py4s368kM5@byl8?a+WQ3>}Ok?3eN zVt{wmU}iAP1s)3Owfn>Sdjmk){+xy??|7ze`rjeobrwjO@#V~B=h6?^0()-jsH|ZT7)(8pd=v|q~KVAJt2@lk9Whd z+g6KMD*<`h;3gagtbG}4Qq>uO{50120c@H{TV2z26Sf-c$h}v`14!4&C8kb(SKP0P z4oHzg?3E-b|AJ>ZDlLOY$2n{@Qu@&5v~bDrIA@*PN};T9EN;1N?qLR2lW1st4HNpS z^V(ZqY1VaCfqUpVc#}|K>3&M|%xiS9NT>W3{_yk-%>}q{IPj<&*B*ouYw7o88Ms%6 z)R5ROXs0#O@gH74yz^Y@Iu;H(#J0!8coZmWN|M z?BU5x-bSbvLv6l^4+SZ{@FJvS*Kg~~Oll@NW6egO-DROre0luoP80Xn04LxrkUty%>#fT{xg5~Nh;3a_CFU&9CM#^^iKs%+h^Dg6D* z+T8A`DsM+>bH8;B>xQ^(^e#l*rf@FXJyWwgAsjVK`&6_4>>f#7td4z=o(OhaiO4%% zgMUv?ZQmowJ3NmRu=)dDJwhM11^5&&aiCWVhviu&& zD?AC(^|n4NNpG5TxBisfPi3n{xmF)+n5~Hvh7R>XtceNPH)lxx_b(sYs@+;vi!i8- zyRF6Kw$`IoYxOgY=5meK)3mBtZ=3%%_{=9YyAY#xEZQwsgztq3kIw$(PeUW!t|cGg zyhW`M!|;3IX>xSjHfro~L#<6BlIBI>NvNvLxeA}WId<%a5O3UmB@ZASO6!p2=LyFK z9gM(h;wvi-Aa_S9fPdfg}7 zu3jdSAT!EqyNZ#<$Yf8lD!1&k<>iDgNJnaj=wClFi7e664|oCw(zFYc6T=^R_sGo4 zK>ivv18v`xx#20M&mOZe@~UJV4$eK)lYIveIw`aG9%|#zi8gn0H z731{y$R3xw@k;dZ8=w3jNIis=xQCEC_*#rL;`}QpI=CZFihJG^vV3W-=-^|ZbT+>A zwfo-F*?GCM+t>L>XXhJpaag9irUsFJ^<{h$_nz*IbXm<%2>qcYb7?>F^M0cg9^2>uqneP1J?jHRpdtc+Xq6>-T{P6tIPxN;G+;ZRilQtE> zYPLN{0MXq7gzkp+AYZ#T2Y9~I>bnP~FH@DJXLdE}hG7&X$nsgKe;m?94vnBdY2c9J_0e8S&8FE}VFHoPo41G8$ihHTbGQNc^ZigLfG3PXcW z?hjm`I;Z%K>6&3`8@d4mSjjX?xRE@Syr5{VAZmbU4jA2j_%~|kU8k%XWhNP5=TmNlx;x8es!h zk$0_9r~vd~E+OL!aFCLtDPf~L3Q0n{Eo{!Civ10Y(kTyIfhro9#|e3m=QNk7@jT{5 zz8Cf+J^kwHa(;Yi99Xg<=oYJSU5{6*c|KB#_DEq$3gysA>?O>stgcqBNiP8Ur%^5& zx`|ddZDTdM8Ba=-s&y+_VsZ>o%ZW%^^6eysnHjvzH_A^6h#XW)oSx?6D^AB13b_8#hKC#&S zN8KN%A^Z+Xe@d{hd0{M>yh9k}|4Fp8vF*=Dt{&xREJ@^9a&3)FJ{mx8lfU6rU1>R6 zDEeBcTn1gGxv8~bnk<*4e?4npyU!3_msF6GAXXRZkCVg8Cz!T!Vv|?Mt1IS8o}Xa) zzmGK{`i5`D(5Q>J8C3x;x5%~0>?6#vzf%{)URAI&2^pTP?&$1 zK}hpB_F!YCj=tv-#T;p&^3BqCaWOF<+H&L3v-~tNt)-c6KLe<}uQBtSlgS5_a9{68F#F@VkuGOnU(cN`Z(?{RAB+E&`H{XJufw71 z%+37$djlS)+&eV;*hI+VML8~WvTijEcyNPbE!;qECrL9uk#cx|`^)=KW6IP{PkvF=2|f1~Xo%v5skbc|=_bKP=HtfX{4}M{m-$6SR9dOtcme zNs#VbNKwW~RyT}k8bja0>`bP>R14P-CK}g5R02R9&O@%BgE|DIVNQ#Qg1`d21@feC zi2~om3el-R(nyYj6mU(jbFh*kEBJ!C|iHW+lTOO-|i- zLKo>v;*I`tVKBYin>rplHoRg<4%T7gcFg8FPyXiY8?;*ODoJN__#QqwzoTf~L0;?2 zlFnXk&hdnCt;%WG3Ksu^O~_U!ViS$8#3o{I)-+tLP4@6aY;rO-5jPE(xQx|RuFZLc z)mdJO+HZ6?oASVB`|_%}dED5GD9Ih^Ug|yu+lY9=@}L+>z@N2~+FKcGg)}`dV%W|b z(9Aq?Pno@9(-}6pWY(fH*egIGtg}$rC^Mupj4}}#qPAxk{q@saR?KUfK`E|>My$f0 zBm|m?W*CXs!HWygfeDA^Sll&~zIm5An0IN;gS#G~MdU5r^Ly2vXm456`6=2aXp zFQbI~#g{rdzKFx-)%f^${FPT`e$5uK>k0_#(JxzKP1~M+@=D+&A~8$oh7n>P8{55a zys?pAJ}|AEoY;MVY0kac_`c=*%yD;i`ncGN{ZgdK56*E{4ystQ)mBL7I-813$WAm4 zbn-wP@Um06^dJLcLOULZ;796~2DlA&R!(oNU;VwY2ghTqzpa*)_r~5h9y_tAszRO~ z^4_6gr53h%=(15V%I#0S0gTMr<{WK3P?aQ|I=o5iRWP(>v8=z`ExWH&N&xQoR2tvZ ze{B2>nzHEslwUrUW5Z*+C*sLWByngat|qcm(B3*KLi*5(MO)6#op9(-g+e0UpNV9; zW)5}7!^g$e;u>6wTHr5%S81EJW0gpTiW*(&>czUSp|(ec*gsgvbQ z{Owv(M_RS?ruOCp^1afYCtszvS+}^kfre|fsc(RzjJfUI1yb7k#cN_Q>{lUv2qT z7Uvc@AeABJUI_(MH4v&s&?o+)Sd38LE@`OU8+dE}gwI)O;XR@#lZ?Nsf_h+Y}&M6#%hz24-$~Q+;YeaXQt6nU4iux3AQ!P;FDG z6|7Ntecwtjb;YWe*xQ|?wMOz}8=rPq{n4A1S)Bk$9i8{Uk$m?D); zY76pWMO)K25&{|e5LaXX)1=cHYP&JA<<}-%O<59g;B%5h@TVs=rpV`#axFu!YFA(hZB}#i_bti zansT%JMGv^TTRl5Tr92;m={mL&KCW#$wz;2t z@lpoBUBE!FXhbq>1*qxuF6z}+=^e$Fp?;=mV z0^adO`tgraN@aWz$|%zJSt^5m`bA2GcrRY^j8b_awZ=D2;teO6qTPT8H#B1eJxBT@ zqW`mWvk7HjSus=BzeWdAw}sGBYocp&&WCdY8q8`-XbGDu{GYrIskml*w>P4cuG$hA zt~9IAfi7G$gt>|+P-=}%8Y5P7BvJkKOS~Oen3YX_Xrub@SYtjOTZx*ufKIxglK5G= zukm#@g#x2Lr!%dIYghZ3Go-dk2AJy|6XfFmE&lnNy^Wk#I+xzDCrG& z4xDvha>k&$!Y^_BrCPSdPO1%md+jyi@n5e%y*LnAt8QgN7htigR~s8xIRa&%L~;mq z42w^j-<)}>{dqBZVZE`T>x%HiqD;}&*dwk~bB=Gy7cuwdB*g_^w9(uz=Pi)X@;W)z zg#9FY^oKW}RJEd6SzkA|`HD`+gx@rqa*F>7_45%Ohk+xU`6TIg(7htHapnAZhQau1 z`_5ls|MheGR~r8hMgzTvJ?LH8FF6IfSXolJRqS>?VeHbY|Gq?BX$=#T=?#3T3})5_ zU16n2M&kMLb%`XelwZ@Qx;@Wg?HoxJA3-*#iV5Xg!*v#0>^q7BQ@6v>208)Z4e7%gc>XQy_u1hjqfKj7sY_Y4?E|mEi-|Vem3C}py?#osYZy0T2m2MENfn2r< zd7(KTOy%?Q=s>72srJURXWv*`JnOAM?<|=&e;^qAz|CgmOM&|j{?dUbBuQ>c%*C}l zEyTDI_9XWY*rZs2I9e1Fkr|f>ZN<1`9Rs0(dJeuZi}Xk4Cq~mYIQ;!V!*dC^rM-kt zzr`;sKs+j*wEI&270vR&3;RHFP1ydB?Zsws79!)j_Tl$TS5nzB$gkG()h#eDfg9+6~QmN~O@c;(2(^x?zPxWO@#tb+~v zi_O^e^z1vthp4qXg;loo10zWz%(vvF5P%*UZtQ>+t1T;&nmcdV-;#MMD;Fu!Tq!UB{dXWxE$_d0aeujZNKTN~ ztdfuqaXtldVn%b!^BA6dBWr0^1Q<5>tgd2&{hDo8h8i-lk40h36}DeP?2cbRt7)t% z*-dBd@xhmtT5;9e)8jSKEc{V=do!C)p6 z7#a*@fZWq<`GiZreng57sw=f&O=bm|Mf*y?ei$|E{RgNX+)JG)V*CZtz@Mcw%;O$Z zh$E!rUpa>D7Q`>fa$wq`mo#W5TM@neBQ*DIY*InmSeKMzg!>@NvZ`)}b3JT<5{JpGZY>dnRnuAB`v0GwW zZ1?lh>!kan2PMh2#ZYH44p@G!y`9|rdh`1%Y&kf#?b_{gx&1zC-;N#6hLNW34s~{R z-7B`e0T;Sp%R?HVTky&9@yV-P$GXmySy}z)W?UbPu$Z^&FYDy*dm{5VTtYt##aX zEA8+LB%&QctB89R<4-B11~v_BjaRtQC>;J6aV@tA_A$%MB=SfVkm<5bM6%XZm1onxL({d4 z5%P1hN|s(rj#3%rl>FY59j+iB3LT)PT7~AgVxKUWYX2)W{0mWb%iw8-Edep?_Bi@| z-GRQYJq#PA!}BRz~|9dEO zqWP9;!hrmQ@HSPt^*OtPG@#@P-2STg+f_Qc396=S`MqH4Aw+G{X>R;1O|-P?aL%Ti zGzz3`rBGb+^_!o5`sUr!GrM-pOtU)NJUDpQ!*>l1(h8)r%67l0U3mKG3&XJk=gu97 z(Qi6}5B<atzKg8^uxuwxYqs{LE+Ef#k`1z_0H=V^Z3W z=cIjW+WmwiiCk^T^v5-8spiqii~WMf^QFZvfdx?GKf{Pk%_V!I>|=0>7d_v~L{hUl zbY{sT^hY18AYm!S(S+v-t|Oa+i5WDA=srhUTd+a~m8Q&P4c~CxsNA@CQu*TVotiwD zc;H1B`?PD}UeCYB)BowfZ^F~^v#DpME6@0kUi-zsz`0S__Wop-0_Ue3&rG{*4Iq^t z6(xd!oVvw|%w|r%N!+h)W)HO_xrb7t3!|e870&rGP2>!J6TcZHzFT4yhs2RBNI$I* z50cL}HBNF~)DPKKb4dPIAjA-sbj1Ms4g-&#BK&ROHR`WokfB#~>rJAw0e_2C9^>Y( z$VbvH-AibI60@E(RM??#Gzy05V;SM6H&Mp2Vw>%DGll8@xtH5|=7 z`JrsWGs48ecVkt{tOj?bwY7+!w8J6t$OKjc{Sj)LKTK)VNaO$tM6#MyB7)^TM>j~} z8%S?~G>~l+1KC#aG*^xaA=3lTRIJkx9)FCZi_m3O#H+eaC-oxUQ{nI;9+841sfQ-z zwqlv7-$QM9lq4?|dv%)%)p_hAD);Ahs+PzJdHD<+$XU$Qw&sVr#`&w7!KBi@FNxe0 zGl{*b7FSP2?Q3DbB(%3pQ_QtE%Z$Kbiu(eeMaV6bj&KC9*VC#yLFswnxN_>DedFn# z{=WX6)0ZwWNgz}C=k;{u$L~Hmz7**03i^8b5qp!*kH1Z_3WZyE1ROtBkeS}{>4uKLkqP7Z)x zLJ)!w2e`V5Hq*MkiYK9PY`2oW(YG$ z6-riSZ?kDaJPWC6@OZW)!6Pqy(+a(GdKei=6 zuCA@s1&Kj>l+Jd1g!UY^7uSh6GksE+>{T|YP;vp>Vbv-O+6&~Hm?Da91=5T8|W8luUi&c#r0!fLc@RPl=aEgnhVmo{?>cGF&x@Tp*Lq;B`%+Va)i z+NU??_fPkn%pKgW1w@a5?^Vj)mWdE=ap$)|R{9(dWT#$ABmV_fXD^6x677G&=V)#( zVE8^w7#|KxbDvH+pMC7H#&0nbrABqIoc=$x-xgyfd!!JLal!)Ii0lG1miXL(irJ7^ zYf()bw65#ioSEzo1XV$U~orNx2I97R?WW%jf|KaaoV(c zRf799rDr*uxy+q=<_lz3ni^J8VDt^BNNld;l3jjv?^}QF=KgNk(K$FdIS@vR>gArU zfG4UR7)jg#*g1XO?#Rr@K-j8JmFm;qtdA^Ck5%2cTVAKBmujY2Q?6CNI>iT=hWZIV zQa4vm_D}`6UAh{wo}o&@&2_4(x2rR#^mI)Q^z`^G^}-MxLi z-923cBLh8d0A-hhsewq)-G}_wXQ3uHLroNl&IN^LGs9R2j6s#K-}8BS4oiojPo;C) zd8T){I^~eu>FNs0T}qelofr1|Wj4^$(>L1J(=)(ENBtg;%jNO-M|Umsy8Qj4yX1$L zB7@_L@jkc5eVUL)Q& zuHRi1T_@=45>><8_T><`0Mw~}fKaiak~_aAp`|G15=FD)K8N3>B3coeeB1JCRd9y5 z-Z=3H?IDxoeV25Aw@6lK6>DcV%=g+p&_Xn5U|jRjbDee~2!k*mJqfhU6#Zi4r_ZhZ|MDoKN#y7~6?L`yO-8^+!ihFJ)}$-lSS@uaI`f> zeLkhO)f^i>yLm*?Y$MdLL`JfPLFz$BHtZThi<`vWSH((J6`V>H@X|v=1H-Pea}%8# zBKmA=4P_u7E0q?p2Pb8wnVaItSJyUkseQB(=_Hl=p80WZ5mDcU6Ss7TKd}=NF4)AW zlD64TKn{`3^mp|Y*gZ0q*JqDh$6H{k>+pCgx7B07<|!Q#+3OGS2#vt60u#KY3xX)p zf{|P~v3v&;VfBke2G7j&<>mHHRxC=))-6*knm`g*>nzi24b5B`-b1m%&F~q?*|yeP zf2G-Bk*Qp-mv>0x(m4Aj`=({>5GD)1XK9jNL=;`zxNo*qG-Ay25VcC;ZNIEVu8L z7=Dqa%jL|(Qtp$~e~OgNTi~|bo9Mpx3HKr0I3xMl@3HR?rc9Ijmr?r#mJIViB2wod z-xla2FgP(rPt2jh6;C!pDl#6w76>^mRDNP2-5(n^j1I3OH8hlRcsmSZIOdQ&PNzq9 zw0%=0dD2ap!@iFG#bi3|l6yRWItEx{o*vniPA3=pnajzT)5W&?9^ZgCi+72(&lZva zdbz=t5u&{yhB5^kfxQg-4eeu-vB^)zCS&j90Z~kI2rd-0EL>uyVw!J*Q~1Pwi(Z9W zdn=sWWt#7YOW-VLNoxLx_!jc5WH~68U>yp{oSbv!Q|!Lku!0cVy<>+Pb>L+y2D|M> z4dsfpYf_EV@Lb#Bwm2sMF(=@0^m1e6KI}U81d%ZRD{b054p0&;aE(z-q0A_fj6$B#Vx-sNuA9((zaPAR2hyO#{JN9 zWUoP6Ub&9HJH1u%S!g;^67DI$ND#kID~7(sCtl<5H~d>ugRp1lq+s$}D?0r#L!8^q z7K)QjzMnQf-fr(8=wRCRp6kW07w)5w^x+3d9R46lXBX-C{aYi})7N2ErL#R@N=c5s z$m7$CsqiiI3ixB+V&B5(kkl(+6#SR*$DvSjq4{$Jb}AU_(~>jr4oz7 zFIZn=K8ki*C-iu!gw}pv(BoR^1SQmaY+1n;zXw4hK$~-i<1OTNwS<3~kcw*(0;`(z zVba#4Hqc`jXE7q%g=GQJ;ZpN)V zMp^Nkew2=@f@U*8$EY*YB#rl?W?Yr5bdpEkv;FlvZQ6w_d>695Q(I6&vd6|7vT=-U zbU=33jW^y9BSrpk($~l7c;to~Zu~_$zo+Q&-0JD*^xRYg@z`x1PZ2KM28YF)JOTK| z1HZrV2|;}yr{g$WP0{(>4!Mw1Q~bHWEsj zXG_EyiGB(s8$+oM&hLI!;L8J<_H7M;S}ue9v{O&$dg3*KVo#i4aQ!v744)P8S-(fR zQq;Qnpe+Zb5kiMW`&Npo0{av{Aw$(XsIGI?K81T`dqQqB-6BmqGQoRn>AXhnir~U{ z=`=Ixl#bz=z*TU1bAo0%EJ;?gxO0*VvWzxOB?#S|J z5{%`U0vPY+{80!)cJj05H0`F2bA_b~7nXM2Wbs9R2){%ron#wff+SU@Y*J0}TuNzX z`9?AxXE&c*0QrtW0Sc5VWzQ7S;0JfzB%jk(38K4XSjCa&smYErlW^f>3iEWFJEz`B zJMug=S&`onz#Fo4bSb@)nY8=A+CIVd77!=^_qG%Olf;M*uQf>k2~)`-S`BQq84&FR zHdzRW7z--RcC*mkQ^TYn0;_F5sf9p8MC6o0z3I1oK8I`NH&$E@`(W_K+b*0td-H{J ztlHD~jUGoT<>+C%X1tn0((THX)*!i?3P*$S9jt3hI`5-(=ER zW75daS6cex@*B<;{<@k-R5y8C{j1uz{ot*NWPzJRJ~#sF%`}%;=UVb-m4JFv7R@PJ z%hBw7);ijDJ<^p8UY&~aDzHz9e1A_q-_u_XbmtRFcK~?eW(B(dZNPFWSq6jZgsCM$ z269$`LI_eV@OklBM4Jlo|JjKS4=CK_$~IJQw}5!9c3{teleoYPZew%M_!a~hjzo;1 z%+OGVb6_iMgT2W8{I=SfLJ6t|E@bCLufD;Ln}dTUCd?4L`F`iZv11ot!+iVc4g8HA zRg{G|vRVPO#x!CHI&9VrG z?)jmifmnL-b&=>q2Fff#nV+-0;>gpNB*HS64yRBE4AK@)%Q7m@UXQs9zA2{0N2Wih zyZ!OO^LJnsuqt0rW0UC+Ui17)OpT?FzU~|quTxbHNbTB;9r!aHG#*nG56|Fzf01MyDfHckil>It+dL*O_N^n(J3Y%8eArEJ@ zohWf88wLi3yanay6LEiJm|MahlzaL<=It2lT6IP~-rdZ z7tnnEq^9-z8prSP=*C~okNA6?J#+bi4tJu@*MIa41B1K9-uTA6>U2Au4pfaeJkAbx zS7%qc*Om2k##B#-)6?N_db`z3k1IB$xSYGw*QBpujGvpOx3Dk6(=SN3OA^CJ1M%~= z4;Lb=OL(^S=aca+a_J?5o;d<8Mf;+rbrGS0KN4rm2~X-_9UWc$-X7TlPa0V8yGKKQ zcvRWlHyG^aj~eiOQX5cD098P$zf9>}-F|H{5>9kDGLcTFHtp}rXe_BZT}~%+Zh6q& zUVKt0!_(~>peGHwov}VG-48BVL2u{Tr0VVhomq=6aT9RE#N# z5=!w8odR+=krGe@%)w3IxF*_xlpXn<;Q6<+C!_PT3#Tt77JmauU5~}IL_BzYX>>R- zz58IksQk|G*wO`7YP>5tpLpoh?&-ywW5@p=T|XI%=MU_jj>EU-gYkrhS_%;hsaxu& zngP-ltwSIT$3%f7uK*@u)=r#$T#%Z;exGtUK6uIJd}|`M^g)N?eQ$O8E-l4Qz;fiG zaaZ^Bg$%ztwB+imh59@OEKf_pzQ#|pv$!a+M+6>#N7eF5al(t{N^q4UehXkDph5E| z>!@Hdi@IT;45CN}Ok=3&Hcf&sgVjTa{WVG2B$*SVWLuVkDr8IE+OUUXy6Chcpc{IT zjCblf9GIF0zRvYJ8cdsn|F6TY4jV&^O+;NXu7|p0V`wRPNQBLf;)2JjaGm1WpkSv~ zsugR+4cM1fiwd1!7G_)RJ8b;YEak~_ z1eGavB}?ziF2yo21&qfj)>UfA+%VR)-_FD`PY-2cU)A5~-)2zdb6@U{r={0b8dGTLF$wLNRaCPFNmRhOr1$iP5zy#*=XH zFcg*Fw~wuIb%g#HREaIa4RG|3D671oTiYB9n(CIop2DOKXm$At|vHhj~{14p?A>mkA2<%Ax z@U_kIR~a;6N%pfe62w`KFx8wm!q9>Ongk_bSqn>e6}s*r*w_I`9@n(D!R}qCMN@o?D zXAOkBkecvRZ{<-p^FwEx-q&H`h#0c?WfFfdGu%I< z4K_BG@Wu~q;5`JSVTA7+T+WXzHm>a+1@SJml+HE?X~<7f3PKHrLIr@EEVY*)hS}@P zHO1Fo9~~Tmta`DaCEciG4^cM&V<$oc{W&OSXmB(`6?r=?upE_t-Ndhrc7#*X;aK<- zvb7KFC}F;Td^{M0?ViQOXk>9QQr%YK%;Ys9Cmk~*_;@zCTi`K(I}Qe?m(cMI`@WCXz`7BXcG&&6}D*J3Z7 zjA4BOpZ|OSIB7axhnM%?l%9tl?on9KAF<@Ke@fUV96Q8Tm;i7uMX{MH8-7r3BIl%< zM;X-qeuK0MKTfHB;nNquRTR8H*SaC~g_r{Prvj(!tmlS@b9KPR!51A0VVViHWOfy+ zHWNs%WmE07NvqAWlg*<7YC2#+PF(#{D&_YnWn<&M4#@wSM7wcM_-dFbD_<2V^JTNz zszudQpzQRu2K!^O2OCBofdGnwSvFIkaNtdJKNUI*FoYiX(CQ3(I3kWO1Rv8h8{Zt2 z6(9r*(*WW?kw@7~I=zxk&oEe{C&r4!u?bC^9L?UE9c3nB{53XyC@6Q_#W88_>X3s! z#I326@o_~Tj7DKtxy3g|oc|c7ee71s;&GdfPQ~ykBza*2Wm(KD2hV0%V^b)Z^>KWWV%e)|zqpz-BAp;iA ztGQGv_o`LEzwxs)k%$S$k>br??Xck_wYF=96`M;4AeQY^4 z0a+ft$STpr&n|r?9*(n(#--?)vz6$Ri?LxSVE*F!l*!LdH#Xvdn8cdx6@(%F-?F1s#8ay>la;j^x=PoG zrV){_!yN0^FWSg8r(p`PfsLcjrp#0h10Nxm3C;xl0|v$`#y-YZ^Y1ig`310Qy%BQ# z7tQq<&ej%yxC?E2_+1wRdEn~6MkLVZ^(Jl}?8n^&ezvjl3QZvV^A&TA@C+18*UXRx z&_P3;ooP@|ZF3}2fW$4gBGd!tO=*hkGe{Il_+t4aD=JDzFQPxDUN_cCYX;MpROWER zA;nNa2FSHbEMyREN239bddOm-kW@p|Q?e*Yb0(c0YNjlErlav{#~bD{iM~F=WTx&I z=v(g_aG=Y26VOl)6Mr|Hbo)bz=T2WbeF;A71;Uj)lI-nG zh7z4FM1gg6CPH)`?{Fc8qN^kRmk*tK=+r4ltaa#ROPZB$SrN#DR;utCQS%D07K#;r z%oa2j*rTKvDVr>V^-HXiUpM&4z(p9R@!<)T={^ogwYu1=zCs9(FEScZfT_2FqyD2V zh~LsP5#stk{%&NBbzxg@vYeWv29pt=PKK~0#OR|vWU8rc;AWnU`jH^p)8TWT^o2hW zVD7(12E#pcgU$_^IR*%OQ0wk+yPprGoNnMjIy>_(HR|+@Fv>Z8<#n+Am{|m0lG3UG z91G|0*$`RX@7pTl=DPN##v&_C2wDrPr#0h1w9m~2Y$c8z#NpU-lvet~_H29TvGDAX zBJt|1O8{#t*z+~c-Hl&+JbZMPS}AV5DL?je{tzFR-~>w62q6P8qdDoYgnma%Y8O#%CAW=sm&4xP|^2rA(qjO2~nY``XzDjNT>e zF_lES7Sd}swT?l~G}#VmD!0pF5Bq#qd?UV^4_t;p@mMB;>#}bIuENEB0A%+`jwXsC zy#r>&Q7w=O7*?A_$d1cEL8MV+3eZ)hD!gBlna$OV-a)vnpDVJ;;{_&B4pSr?jH*sg z#Cqei16FvCnr6Zk)6`0Vg92{pAX=k?eX<(jQwE&nEc-9+on2wBcnL>uhe}V zsBUz1u*hxGQ=M)fo!776m!l)y9m0G~QA1iiK4amlW@c5VlS9lHL=+GI)eW^;jYjiJ zH0BM^3bNwA5zSziN!E%iF9ZFxWge;GpXdyrm&-soY=TvA2{Z)sU*a9$CAoxoyFfFG zZMR0=Z+r~vYgZ!~@ZBwDA`B$_HM;uA)m2! zi~}u;e7(x{#y=4Izz1Ug(dQ4xPfm8k!^USXhQn7_r*(b62**1nZ-|Hcq8GzQ!WHRX z8L!H=LgPA`v6cj(0A1VFqKWLuhEfau{7po!82Q&VK1)Yz*}%!hgpK0NT&6+z`TPsC z|5~w(^9^nrATt*2Ww<2ZU&edW1oOS{-+43t-8gVv=U!vYQ8T=KoS=5JSM$Q@3m={y z9-bb)#m0NZb)gypszOisVP9rIPBipd@~3leHBSdwKlyej}J!wmDaF7IRJ zo1B!E|JTI-VxwJ+U-3G|CdOG8J3t45S0&+%2{L9N`aE_pK43EDtr&c^zmug*y=i=0 zUOA{8T#@aAKPJCHj_`9%{DKagmZt`jR^S<4BpU~b1+eQg>BZjnzrUB&8&C8aMlbYZ z8-tvzxH$SwvfsiSA4cy*dD21D9T~Z-M*QISJp6vJ%7Tc^FzFUG#(k{7ktUt)oqI}$ zX<2dz$mRpBbs>XOWsd{0bmix+5*66-)cN?h-rMI1&SevOD%j)6% zXX8tPR)=cI5$NSqt}qWvj4U@r^)i3om-UtW2fW^lSN;Igxy5@ij81eP@XB!e2VUWt zogy>gP5qBPb}e`>-XOw1S({d@D~u%&}!(ccfV-*I}w zd?eB+M43qIpg?xVkk}IgMKBQ(n-r&e{(2-FrVsQqd$&F^Xp9VYcL2jRIAZV*oxxQ! zUPmg<|1Mf3-x7((Zj!oIW&JEvq_&4!-dm&8lN|2Z{mCfc^?UTyF4MTobPd$MBW}iVSjRbMr(iqn$xB?v90b!ixK~{QRmmIh-G! zBvZXup;20ch`GZvj#|wzGhBf`fg42|GxBc-J!sCJ{R`hSKUyv7Mg4b(-(1{@AvG)I z7ng}Ao%(JJDd~Y|J?i4t*nyxbTcnD|rd4Dd1>Dhb?zOS6cSrmm?Mo1ma%|2>#vxl~ z?t<$y1I2D6%I0Xc>#hFC+!)hzw;{ zVBXp@^T5*L;iNh+lGu|-45&$$KG`Tu>iSE+Sg&^y&G#HJbf5nK(k&lQlLOvF!aI;; zlYNIK8vlh2OdRU-SIRj7r(2Yl%a%-exYY0dsVu&$DS2?ji&Vp>(ti%r%RKUPzKG z(yAjk1uL)LMrFS|6mjsPhtG|M-ik=KV%^xPh?4Ac6pm4n^hbC{AjFNjXlZ~?J+!f zj4%UgtV~uQh#62>hvTxy1v>~At&nQE)JnxQCpYyft#NBE%B2pu7?Oi*V=Cn`yrcGd zSi!-vOu{-e{+YQRWmT+&_Lxv!7a`hZN%5)5Fby^>&&oI45VJp@q8j{+aD^FmwB6%` z{r8;Yrn<0fq4wvoYto~!&+y&%!@tLl=}TB^Hho3QEvr2GXw3ewM}?Ek@#q-+gh`lP zj1_4|cT^eF&AtPw4;6whtR`Z>5u~tnZAn4>}qWlkabyQ)mS%H zwJUI~1Q&PA2QVY3|5I)XrK|`))K-l(ZFN;+MQydQ4!K-~i*SXcv^M6ZfFTGhlN&aJ zVg}I0OdYZ*>pHC=z-Kevw&(5N0im6X3O-8dUs1|*NH%|Py{Exr79^%=-2;zN~OPpar=A<7wb>x~BaqRKgD~B_4D6i2DbdUGkx_IR7yN?{@ zmw|_v$}AiM+ZyQCABWuTB&h=R6zn6;0=|6eY=;hgno{;&+BJTQb`t&0fZx^l@6x27 zD)3<}9g5*yls-l2uTk1I-U9d=K$nz@)oT1v?J;54iSa)=sfXtfLl*Aeh~4mO`gb74 zA2VV%tY4Ghh;lVph3=(Dj3j2uLRW{7e&5l5?S@zl4w$rlLu_*m=xG5&q`<0T6_^X= zAuFchbJTA-$d@O@qdcPMs)KqvQs*%`g1aB32#j>M7;O-3qW*L9?musi64Gz}nT3R& zZI3#`DU~EqA}W|bz&Nu)%drB{Bo9;i`Mr(xy%YU2i9?B*{>EQ14Ov%12#|4p0z7n< zCno$eeSI_j#vd1p=s+mBn{<~0jss|AOZq%NOz<*NcYLw{rG5xw~GTRD?Yz6qchGMqBTv_Y6 zOml$fa)a!F0>bI|TMwxduP7(i2*c_SLA=uOQll(%k-jZ7ai@$5hSwK$lq9|c$!?#vZ zN=VnHFf(`NB4*`7z|$QU0m#) z>D)UxxwrG>Hr>M1tus>{F5gd$1}}{UAMf3>r+4NI-gw5AYHm=iQs1pc91M4-N`OKA z4h63O)l_b`HXN5Eh6)I74@!IadZjZX11c`<{L<-5%C;3?QY51Tz{Gg~`dHq+BCR^` z_rDwJaNYOsziy2_8j2|wv4}Dz@$tm=^{RIEhC;oat-jHTYU^v#4s|5#!Gkn9hR`lF z&2?wwLX-zLZ}c3p4G`xOX>Lu8^A!6hk0%d?hJ!=C$=6T%5@9$7cgXwMaO0m6=JJZE zRDOhCiuAa94)pdO=ymrF@Za41!m^owJFbXck5)7a%>H`qfHvCS&4|++t#m5*j(laX`$xy#}u9ZYT^_q%CD(@ti67e8`ZDY%1SR5v3^pU zyxNZ2*+YJj$cdAjNJXLmGqio96tvR9D8JEo?{ePSfxy=&mW+Fj%#OvQ$^0_Yn}={6 z>bFnMQk%?=EBJAMq# zOt^Zlr!yW7;SGnUwRmi34lc){0LC}l;~96le~e$@-#R>rUbjfAP)zVN$0jUbZLk8o zKFEM&DJVj-IvZMbcJ|mpW-2{h)av}eoSoe;&022u$l|R%HfnKRkQNDzIl%#gGv&&?GK36E}Sx)AL z@F@lNdFzDHNSVr@v8O zU$25g$hvNtqGbY~4`c!%D72}HfZa1&luPx{q3YpZ6h@nfzTHVEg*RY7#Ks{KypRhu z=Sf>!$`ebLt3p35TzAa@ccc4UrH0O)zJO7^;z_`X^mXVa1k{Olj!!8uW%6o=gUGT(adg zk_H|R>R3f99oXK=*331Ntu;1ksafX7Yp`9?bP!FLIf>SbGW$0BR4YHqE+iM+GCJ|3 zW#Gg^p`V@3h5WF6s+U!I?pR~fy^VjE_`-0E&ERF&?i>B#(c$40*XZjWKj1T($Wvu# z@qRu|pknPdMGZ}~C^FZt*ycnQdeC398kcRSL5Ihc!I%dj%!Sg3UC z@imvDUB?D|;l{&YKVXh8Y47tzJR_A%q-qXSy4>D-h~TK%R8+lL0=G=b+ht&dH2jkIRg%!kQv+O4D_xj zCND#a`2tMhc{V=Xs~SbCoZhC*<{zL9B2mODwGPl1AhMYUy%$WTSyff&S`OY{&VjEL z4m|AQlZi7wtft&UPBp+ny{YNB>7~$JS4Q`EVBKbdOKzpBPrAeb7IJG)YYv}yy9%hpLtpwVn=4-Qhnkq%DD$wD*CTaqeP zjW0hC$qWTppfBd%6;-VTy)-SN-9wmNRTw(^ly7Vnno@A(Mk9Kf9Il@q~LJn!Bq5Ofg=5o1A6=DT8!Sl7JKcr5|`8U9FunG~ozOljkX z&6i@am&_L_jQ!;oC8uSX^GOTWP(l|W8K`y@_u2Ubos^e;0^D=oGOkBXMvRR+S>O)+ z^sA>g_U_fk;Tl}J;|~4QsTS%G*URaft=F=!;X0zWA%$)DzW{VL11C(p{ZPeFIuHxF?)j zoa))-9h)#a8~>g41jGGZo&VsK1fMPiDTIIm;VWBu(JXHRCTDpAkWBJdvhKyP@qM5T z{nLlx;h7^c;Pv3stK%5HJv%xNPZ{?A^q=74H$E5{aKO`teLBqoMNTCUz1L5clRWqy zP6AEwXU;aP!XgQ)w?Oq_Wy7del_DXOcCTw|XjA2nTqzj_7*DafVd(n0VVEQV&1q;< z753A+&*I_hg>FaBzO{6Cb7h-GbzXC_mzenli}pdVu7F8!(HJY!L3QO9q2+#P6mkfYunQ zmr7)j!2ospJ{k<0ysSGY{yIqeWq$~qOtXFj<6)sM$q$@7`GEW-{mg?8UWEg;1{c26 zD0!dw^b?Xx_-2^ZNFn(119%$Ujrf^f)eNO&htz_)G|AX?m&rq$;%jb5N0JH~S z61*SWeJ;nJz$xNNlQpVUe@|;J$Z_%Re_kx@*;De;n69JeCb)O9FkV}{L^Hvy3!~ZH zS&q&52;l^fWf1z%W-T|CCiFys)%T}m-4iYq&BTkvy^F=;i?L%D?>)MgJ#c*SSZ?x; z5?n7GIXo9LP919H`8?E9vSg0gW%%WXVlNjTfjie?zf-d9LmiS7C46s*@o`U}xs(Y0 zC=?~AIVs=?5MGdE`4CkJFA!*h@UU-k(wFj0O!|hynMhf?AruP*0WfE+!xvCvAz1d8 z6m{7jkw-@4Fp6N3{xJRox3E76Yp7lcb>E4E<(=JlyQ2O|#NXAmZ(mmz@;N@yBV-G{ zLr&U7Qc&*MZTmbZBEmG^+RqWY%+KwVOH~dh&i{1luUc=E>NPS_UaJ#)5|hYYxk%UA zP8xM)N`h}{Cr6|uN{)=!=fLEL4wKNr^KEcItT=dJ!PMlRUpP=`)E6E@sx$pA9+AFp zM9t^NV~qCd$Zoi1e^5&)nGT6nEGcM8nj-BRm6Em!Zbd3bO$YCKHIk}s&NqCwlz%dq!#vtgQGM!mJ^*O~`)vTORcLSfpzTqs3N(d)imxqnQ> z4)0KG9g4kw$6}i}i?2ulk}i-vI`lEyWes|POfW$(Ty;Qb$W5TTVh;S?OOdLsDEjK` ziLPE`CwjY1%mV9AvL!oDne-`58Fyiu+&z>#D^A`xSr-ZbCz4Xd94i#Y%+R*QSf$jc z=3&yMWMRV2p|M74_w08oA7k9Gf^=x_cu zb2F!-RoXy*KieJtkGrC}qL;@Ki-Y!RLGkQ)ybx)GN-8K@A5kS*CCx$T`bWaWlJK0G z`$+7ZyYaQ7ZryzjXoCK4thPUHwv>w*_dPdz{yswz+7>a$Ml7^p86CCM>%6=C>f+++ z;=9}5Ae+i$j%PB9JG{u9<2@GSd?0Jbdz1@8yvM9c@gB>eQYlmhqp;ObiDOg1DXZ~) zqmI|g2ESvC?iTFVyE)<#*H@-OR7$9T)_ZD>%YQT5qPa=q`y3N4;6Iad&7(&*L%UV> zjmy9e!m_d6JTlr~-u~6+Vc9OPi8eb1R_#kIuQr=&$h4iST>Z*xMk5UB$?JxK9`+Ei zmOk{RAO9!e_|>B$kxWaz~#o;?~+}3eG1m;%te3^&Ji!z^d2DXx-??_GMj5H zEX_vk#B3CfTJaY`ZttSSqip5rYSyKL_=P0Z$Er{>D#x&gF4*n(s&R5(V{PAY%Jpp* zO3d{j8tg?j`ZYAX*S?X%Z@!T9sjBbKfLIAC734YWOO_*jDk4)-`P_ukE%W?nIf6^Cy@k4t?4;ss0P;q!XnHclB%8UBAHrCUf z9|VupxynswGW5V%Z*p>CI5;O-nA$yX%v!-S!!Y%S+E(p$qf%VOQ{g+qsqToddarV0 zO-f-U*R-I-PkhJF!@&dYkxoF_}3p50+Kim-gXOUb{7 z54(tu?b@OIs+JrZOPb%y6T@gEnrXtOnhJvT1W#qUvOV=AtMC_6>F-B`|k35`u-{~v&bien#-S=Fv zCHD0GNS2_Y0SnxobH`HHZ*Blb%7MBho3IS^(XsL5F#{+(6mP4M(6b&eZ2XII< zppEhg>97UxNl>BC5jpS{lMqTw+#I@819xE#_mcP%3R*8jWf$zj=l^OP^-%_yO@b6ta-oj#XuK<(;* zIZ*ZYc1OKF^$#tKF2TovEQeW&yn!)IHcggmg!jhGuX7_(qXDW@1_Ue7D15B7MMaYW zNDI43X_r)-77*QQuQbXGm^|pLl?@Pr8L)K08e6=w3P;kFE4J-H-SXB?x2%F>vW9Ad z_*HD*0d|b$qkLVlO{8!H)bN0t107uhi>VfzyFy^eZT2W}7_$~}GH+2RSu98xdnS{> zbFfBK;~()tc!3o~0oTEYiJ%n5<#wZ}kb%6LQIYI6{)v~S*o7M}u#Zv}AEwcC@8Q8r zdgv;ZcCTfxN7{m~unlXj-34{tgb|R>;cTep01}%J1VU{#!G(M)=J!WhkO4=6LH9`K zm1Q}77QqB+WuyLQp!+;L^;-y!LefJ!^GkPaG7QHjdAz~W<5Bt!^qnBnQd(6AeCeEHs zo=ZqVIU+`>KnHr-%0%l}88)WS1C0rVvI-RT3YKc{r`Qk*J_*Gopjap|WtGSgjgsW~ zN{}@kqFkIINo`7MX|;1>nIsf!*(g3S2(`ZhtM&ive$_k_>J^&f^>+JzbrrvQNob6>G~3@plJUC3 zMYMDTD9KsrWXmoF404mu2pLcx5D!ELAW>3)02>UydMd4SI{V+ z(j90XeYp;x;LCWt%u}DZ>Iqgu1>CM@m4k9EFeYiY60mh*Bp-?I9NjCYP?~48&5FGu zc^|B@@y0hHb!$K_-h47GY+s9V44u7WOrrVq$sH;p)`aAu z>6Y(uQx?5#4gQ{r)!=V!O9NC${qr@T?$Oq)y->kM(IfSc^dnC=_ur+_!Tz$`vHio= zzzL;nFlnc!+*)FR`q2FKOO!x_WbE*k5qQ7;UCX0+DrHm4*DtPKjlH)Jdv5#UD%IF~ z3bCCEY_pJK$a0d-ju_D_iMC`CZGr6^dtdaPBgJBVx%VO1;&j4p8Jj(Fk5MWb%lTOB z&~iQ*jayeFAy%|U3iFtsu)-F$foXHn3(iI;^zeH9LfOGe}Qu8)#-zh#6Mh z8eaz9kcFJmX>k!*%SaI-sZ_##Vi~H2!HUFnH1Bpvz1$Y75D~|qR_34#DKV!o-&u&Xa|KA}n~o$hbSoXb^(Gv;?wHu)Up%tt-(#Kh z4y0mJup~~!QUkqA;)(;U$E)ay+@lYrK-JMB!-=;CnjsaNbUG(vDV&WNy!URl!Twqb zS@u7kY}Nw?wHfqhpGTTWW`8L&?@Vv+mq*UT5`DqjjaxGp5;1>o*%grSa<4y@xRANk zxV6705j!&?M1rC|6+qy15}wHD+>usOK|AmY`1ZG1SSrGa(Xz-)So^$)r{dsP4atC< zWD;t%o@IRmFz5aw$suYj>``Q|@SNA&OSB~CGV8XkgVrW7`lMia*A@}j299O`HPc#~ z>R0HmjQxOSunis^4k9Ndo=+%=?^FMU=OYU>)Ar-a65oy~E8KNg%rxHvTkNinljEV~ z>?C6N5rQ*ePj2UD!EyRFWA&j&RNXW;WAklYX?wX{v>%!$Y1<_#;HT9vAz?Lerb6I* zfWN0vC88JM{U9xO`jeKCBl?z{2(5-*VG{8rtg7pZ(x@?s8b-8_c92y9MW4$ymmjrh z&P=4qBaawsYXIGBnKVO78kb)sH5)5Jwd}SPo=7HH)l_R`YmY&*)Ae`qkjVsT*jU4K zYReU75Pxv5ufqg`MM!*&DlrZB(FtAN+3R%Z(|>`x82PQ0*+0S^c+}0QT81~ONXd4@ z9*wb!@oUm!@tdD{Cicvq<9UpJdh@S68+*3R^C!+de*!Q~Z{vDHR2jaNtGcqu>n2o2 zKOa-y>~d2pmqm$1II!$! z7^brE|69-&;G50#DfjdRo~AuUHk&&06K6(g*uN6&?hbZ;{U^@+1S`_m-`|Z_NE*Yv zV5X?9wxrrtV{o$;jBZ2&+1;7U?%9KLdk^m#oSr;X z7@9dWF>z=nd(+aAV2NG z4<~eGesbEeGJ7zzIGvBj5AU6$VjtGW_e_Qo+F&R&s3k&^d&YGKyYbM>P~p(z^k8&p z>831JM*6<{57>BnASbou!z%Hs+XLsEffBon*=*-Od z_(XP>S9krp>~62_y=h@DUHj$N$L|}Wqv`a>f0$0spP&<|d(&*)$2nodogk}|IcY)K zBT057ezzU^!EJ}|m+>lGp`dRRvPb5j3FhXTVVDgaL+~>R7YT}_Lgz4?i%9V6CWX=E z?s!P4KwNydhe_)g*Pru0c&hVQ{!GHlJW_K$GO$EM|gNB86~;KLZo^l1b#@M@hrv^}PnyG>RV0>B1tbP>nh{9+c$; z!ENrfN(J~|eWOw_&3~z+*R@4wB8{}+-Z|Q(^!vsWfC5@1WT+x0i5!>D)0JPPE7v4C zVfq$%w!*am%z`J%aXd$ub>OgoJ^@YD-2Nb_B{dLvc1OZmIIJC{QdnPb5F)aspuvW_ zqtRqnGWvc^W2;n9o5U}=Rc`JUbRnA}Zuw$`g8kVfLU#&ZSQ@`NX&DBI27%o8^vG#V z{!kc6Vvb3P<-S{Xqu^#CHokZ10!VUY^djKpzXEtvR-3il}LJuYkc+HBB2vLvppP)G9@3Qrb06DqP#pZV~!H zO~b4<#18Nk)7+%#jltXDu9$@#$c&Bk^Ote{CymLl3hzd@5`IEQQY zTfOa=$8*d%wl}e_GwgKU?R3r#cAxFu)fwEINbC)Eo<8Pu9`jW3+GBYBd9Ixtj14N| zF9a7x&nn{zeBL@XKE6IW5?okY2#$3 z`FiZ@Cs%cwAVs}?I!gs7JTJyD#MbfnKRgRVj3=Cpz9Qc)$5#N=E z2jU0+M&r*e(@DB*+grb_93cq3(sT$iacypu_hqQW7?gRDDpFiuXOd7JR)fmqRe{kf zl-xxevxjmtE?Mht%Fa zi0l`N_ulgP?QnK~p${;&`}%tE##@+gJJ4N;@j5sp;-I&(NrX<$1T|`B^kt-3k@5A)o)vM5OhOq=2NVfC zBChs_k+o{97s&&M=_S)#=SAuDy3WneelR0b@EsH|>nLJhTBaFYR!A&a;A=0J7qU

wF7DI|Kx|V1sBQ9FYs>m5C)C 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 BJ$(QG diff --git a/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.woff2 b/projects/wave-core/assets/fonts/material-design-icons/MaterialIcons-Regular.woff2 deleted file mode 100644 index 9fa211252080046a23b2449dbdced6abc2b0bb34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 diff --git a/projects/wave-core/assets/fonts/material-design-icons/README.md b/projects/wave-core/assets/fonts/material-design-icons/README.md deleted file mode 100644 index 39c1c014..00000000 --- a/projects/wave-core/assets/fonts/material-design-icons/README.md +++ /dev/null @@ -1,8 +0,0 @@ -The recommended way to use the Material Icons font is by linking to the web font hosted on Google Fonts: - -```html - -``` - -Read more in our full usage guide: -http://google.github.io/material-design-icons/#icon-font-for-the-web diff --git a/projects/wave-core/assets/fonts/material-design-icons/codepoints b/projects/wave-core/assets/fonts/material-design-icons/codepoints deleted file mode 100644 index 3c8b0750..00000000 --- a/projects/wave-core/assets/fonts/material-design-icons/codepoints +++ /dev/null @@ -1,932 +0,0 @@ -3d_rotation e84d -ac_unit eb3b -access_alarm e190 -access_alarms e191 -access_time e192 -accessibility e84e -accessible e914 -account_balance e84f -account_balance_wallet e850 -account_box e851 -account_circle e853 -adb e60e -add e145 -add_a_photo e439 -add_alarm e193 -add_alert e003 -add_box e146 -add_circle e147 -add_circle_outline e148 -add_location e567 -add_shopping_cart e854 -add_to_photos e39d -add_to_queue e05c -adjust e39e -airline_seat_flat e630 -airline_seat_flat_angled e631 -airline_seat_individual_suite e632 -airline_seat_legroom_extra e633 -airline_seat_legroom_normal e634 -airline_seat_legroom_reduced e635 -airline_seat_recline_extra e636 -airline_seat_recline_normal e637 -airplanemode_active e195 -airplanemode_inactive e194 -airplay e055 -airport_shuttle eb3c -alarm e855 -alarm_add e856 -alarm_off e857 -alarm_on e858 -album e019 -all_inclusive eb3d -all_out e90b -android e859 -announcement e85a -apps e5c3 -archive e149 -arrow_back e5c4 -arrow_downward e5db -arrow_drop_down e5c5 -arrow_drop_down_circle e5c6 -arrow_drop_up e5c7 -arrow_forward e5c8 -arrow_upward e5d8 -art_track e060 -aspect_ratio e85b -assessment e85c -assignment e85d -assignment_ind e85e -assignment_late e85f -assignment_return e860 -assignment_returned e861 -assignment_turned_in e862 -assistant e39f -assistant_photo e3a0 -attach_file e226 -attach_money e227 -attachment e2bc -audiotrack e3a1 -autorenew e863 -av_timer e01b -backspace e14a -backup e864 -battery_alert e19c -battery_charging_full e1a3 -battery_full e1a4 -battery_std e1a5 -battery_unknown e1a6 -beach_access eb3e -beenhere e52d -block e14b -bluetooth e1a7 -bluetooth_audio e60f -bluetooth_connected e1a8 -bluetooth_disabled e1a9 -bluetooth_searching e1aa -blur_circular e3a2 -blur_linear e3a3 -blur_off e3a4 -blur_on e3a5 -book e865 -bookmark e866 -bookmark_border e867 -border_all e228 -border_bottom e229 -border_clear e22a -border_color e22b -border_horizontal e22c -border_inner e22d -border_left e22e -border_outer e22f -border_right e230 -border_style e231 -border_top e232 -border_vertical e233 -branding_watermark e06b -brightness_1 e3a6 -brightness_2 e3a7 -brightness_3 e3a8 -brightness_4 e3a9 -brightness_5 e3aa -brightness_6 e3ab -brightness_7 e3ac -brightness_auto e1ab -brightness_high e1ac -brightness_low e1ad -brightness_medium e1ae -broken_image e3ad -brush e3ae -bubble_chart e6dd -bug_report e868 -build e869 -burst_mode e43c -business e0af -business_center eb3f -cached e86a -cake e7e9 -call e0b0 -call_end e0b1 -call_made e0b2 -call_merge e0b3 -call_missed e0b4 -call_missed_outgoing e0e4 -call_received e0b5 -call_split e0b6 -call_to_action e06c -camera e3af -camera_alt e3b0 -camera_enhance e8fc -camera_front e3b1 -camera_rear e3b2 -camera_roll e3b3 -cancel e5c9 -card_giftcard e8f6 -card_membership e8f7 -card_travel e8f8 -casino eb40 -cast e307 -cast_connected e308 -center_focus_strong e3b4 -center_focus_weak e3b5 -change_history e86b -chat e0b7 -chat_bubble e0ca -chat_bubble_outline e0cb -check e5ca -check_box e834 -check_box_outline_blank e835 -check_circle e86c -chevron_left e5cb -chevron_right e5cc -child_care eb41 -child_friendly eb42 -chrome_reader_mode e86d -class e86e -clear e14c -clear_all e0b8 -close e5cd -closed_caption e01c -cloud e2bd -cloud_circle e2be -cloud_done e2bf -cloud_download e2c0 -cloud_off e2c1 -cloud_queue e2c2 -cloud_upload e2c3 -code e86f -collections e3b6 -collections_bookmark e431 -color_lens e3b7 -colorize e3b8 -comment e0b9 -compare e3b9 -compare_arrows e915 -computer e30a -confirmation_number e638 -contact_mail e0d0 -contact_phone e0cf -contacts e0ba -content_copy e14d -content_cut e14e -content_paste e14f -control_point e3ba -control_point_duplicate e3bb -copyright e90c -create e150 -create_new_folder e2cc -credit_card e870 -crop e3be -crop_16_9 e3bc -crop_3_2 e3bd -crop_5_4 e3bf -crop_7_5 e3c0 -crop_din e3c1 -crop_free e3c2 -crop_landscape e3c3 -crop_original e3c4 -crop_portrait e3c5 -crop_rotate e437 -crop_square e3c6 -dashboard e871 -data_usage e1af -date_range e916 -dehaze e3c7 -delete e872 -delete_forever e92b -delete_sweep e16c -description e873 -desktop_mac e30b -desktop_windows e30c -details e3c8 -developer_board e30d -developer_mode e1b0 -device_hub e335 -devices e1b1 -devices_other e337 -dialer_sip e0bb -dialpad e0bc -directions e52e -directions_bike e52f -directions_boat e532 -directions_bus e530 -directions_car e531 -directions_railway e534 -directions_run e566 -directions_subway e533 -directions_transit e535 -directions_walk e536 -disc_full e610 -dns e875 -do_not_disturb e612 -do_not_disturb_alt e611 -do_not_disturb_off e643 -do_not_disturb_on e644 -dock e30e -domain e7ee -done e876 -done_all e877 -donut_large e917 -donut_small e918 -drafts e151 -drag_handle e25d -drive_eta e613 -dvr e1b2 -edit e3c9 -edit_location e568 -eject e8fb -email e0be -enhanced_encryption e63f -equalizer e01d -error e000 -error_outline e001 -euro_symbol e926 -ev_station e56d -event e878 -event_available e614 -event_busy e615 -event_note e616 -event_seat e903 -exit_to_app e879 -expand_less e5ce -expand_more e5cf -explicit e01e -explore e87a -exposure e3ca -exposure_neg_1 e3cb -exposure_neg_2 e3cc -exposure_plus_1 e3cd -exposure_plus_2 e3ce -exposure_zero e3cf -extension e87b -face e87c -fast_forward e01f -fast_rewind e020 -favorite e87d -favorite_border e87e -featured_play_list e06d -featured_video e06e -feedback e87f -fiber_dvr e05d -fiber_manual_record e061 -fiber_new e05e -fiber_pin e06a -fiber_smart_record e062 -file_download e2c4 -file_upload e2c6 -filter e3d3 -filter_1 e3d0 -filter_2 e3d1 -filter_3 e3d2 -filter_4 e3d4 -filter_5 e3d5 -filter_6 e3d6 -filter_7 e3d7 -filter_8 e3d8 -filter_9 e3d9 -filter_9_plus e3da -filter_b_and_w e3db -filter_center_focus e3dc -filter_drama e3dd -filter_frames e3de -filter_hdr e3df -filter_list e152 -filter_none e3e0 -filter_tilt_shift e3e2 -filter_vintage e3e3 -find_in_page e880 -find_replace e881 -fingerprint e90d -first_page e5dc -fitness_center eb43 -flag e153 -flare e3e4 -flash_auto e3e5 -flash_off e3e6 -flash_on e3e7 -flight e539 -flight_land e904 -flight_takeoff e905 -flip e3e8 -flip_to_back e882 -flip_to_front e883 -folder e2c7 -folder_open e2c8 -folder_shared e2c9 -folder_special e617 -font_download e167 -format_align_center e234 -format_align_justify e235 -format_align_left e236 -format_align_right e237 -format_bold e238 -format_clear e239 -format_color_fill e23a -format_color_reset e23b -format_color_text e23c -format_indent_decrease e23d -format_indent_increase e23e -format_italic e23f -format_line_spacing e240 -format_list_bulleted e241 -format_list_numbered e242 -format_paint e243 -format_quote e244 -format_shapes e25e -format_size e245 -format_strikethrough e246 -format_textdirection_l_to_r e247 -format_textdirection_r_to_l e248 -format_underlined e249 -forum e0bf -forward e154 -forward_10 e056 -forward_30 e057 -forward_5 e058 -free_breakfast eb44 -fullscreen e5d0 -fullscreen_exit e5d1 -functions e24a -g_translate e927 -gamepad e30f -games e021 -gavel e90e -gesture e155 -get_app e884 -gif e908 -golf_course eb45 -gps_fixed e1b3 -gps_not_fixed e1b4 -gps_off e1b5 -grade e885 -gradient e3e9 -grain e3ea -graphic_eq e1b8 -grid_off e3eb -grid_on e3ec -group e7ef -group_add e7f0 -group_work e886 -hd e052 -hdr_off e3ed -hdr_on e3ee -hdr_strong e3f1 -hdr_weak e3f2 -headset e310 -headset_mic e311 -healing e3f3 -hearing e023 -help e887 -help_outline e8fd -high_quality e024 -highlight e25f -highlight_off e888 -history e889 -home e88a -hot_tub eb46 -hotel e53a -hourglass_empty e88b -hourglass_full e88c -http e902 -https e88d -image e3f4 -image_aspect_ratio e3f5 -import_contacts e0e0 -import_export e0c3 -important_devices e912 -inbox e156 -indeterminate_check_box e909 -info e88e -info_outline e88f -input e890 -insert_chart e24b -insert_comment e24c -insert_drive_file e24d -insert_emoticon e24e -insert_invitation e24f -insert_link e250 -insert_photo e251 -invert_colors e891 -invert_colors_off e0c4 -iso e3f6 -keyboard e312 -keyboard_arrow_down e313 -keyboard_arrow_left e314 -keyboard_arrow_right e315 -keyboard_arrow_up e316 -keyboard_backspace e317 -keyboard_capslock e318 -keyboard_hide e31a -keyboard_return e31b -keyboard_tab e31c -keyboard_voice e31d -kitchen eb47 -label e892 -label_outline e893 -landscape e3f7 -language e894 -laptop e31e -laptop_chromebook e31f -laptop_mac e320 -laptop_windows e321 -last_page e5dd -launch e895 -layers e53b -layers_clear e53c -leak_add e3f8 -leak_remove e3f9 -lens e3fa -library_add e02e -library_books e02f -library_music e030 -lightbulb_outline e90f -line_style e919 -line_weight e91a -linear_scale e260 -link e157 -linked_camera e438 -list e896 -live_help e0c6 -live_tv e639 -local_activity e53f -local_airport e53d -local_atm e53e -local_bar e540 -local_cafe e541 -local_car_wash e542 -local_convenience_store e543 -local_dining e556 -local_drink e544 -local_florist e545 -local_gas_station e546 -local_grocery_store e547 -local_hospital e548 -local_hotel e549 -local_laundry_service e54a -local_library e54b -local_mall e54c -local_movies e54d -local_offer e54e -local_parking e54f -local_pharmacy e550 -local_phone e551 -local_pizza e552 -local_play e553 -local_post_office e554 -local_printshop e555 -local_see e557 -local_shipping e558 -local_taxi e559 -location_city e7f1 -location_disabled e1b6 -location_off e0c7 -location_on e0c8 -location_searching e1b7 -lock e897 -lock_open e898 -lock_outline e899 -looks e3fc -looks_3 e3fb -looks_4 e3fd -looks_5 e3fe -looks_6 e3ff -looks_one e400 -looks_two e401 -loop e028 -loupe e402 -low_priority e16d -loyalty e89a -mail e158 -mail_outline e0e1 -map e55b -markunread e159 -markunread_mailbox e89b -memory e322 -menu e5d2 -merge_type e252 -message e0c9 -mic e029 -mic_none e02a -mic_off e02b -mms e618 -mode_comment e253 -mode_edit e254 -monetization_on e263 -money_off e25c -monochrome_photos e403 -mood e7f2 -mood_bad e7f3 -more e619 -more_horiz e5d3 -more_vert e5d4 -motorcycle e91b -mouse e323 -move_to_inbox e168 -movie e02c -movie_creation e404 -movie_filter e43a -multiline_chart e6df -music_note e405 -music_video e063 -my_location e55c -nature e406 -nature_people e407 -navigate_before e408 -navigate_next e409 -navigation e55d -near_me e569 -network_cell e1b9 -network_check e640 -network_locked e61a -network_wifi e1ba -new_releases e031 -next_week e16a -nfc e1bb -no_encryption e641 -no_sim e0cc -not_interested e033 -note e06f -note_add e89c -notifications e7f4 -notifications_active e7f7 -notifications_none e7f5 -notifications_off e7f6 -notifications_paused e7f8 -offline_pin e90a -ondemand_video e63a -opacity e91c -open_in_browser e89d -open_in_new e89e -open_with e89f -pages e7f9 -pageview e8a0 -palette e40a -pan_tool e925 -panorama e40b -panorama_fish_eye e40c -panorama_horizontal e40d -panorama_vertical e40e -panorama_wide_angle e40f -party_mode e7fa -pause e034 -pause_circle_filled e035 -pause_circle_outline e036 -payment e8a1 -people e7fb -people_outline e7fc -perm_camera_mic e8a2 -perm_contact_calendar e8a3 -perm_data_setting e8a4 -perm_device_information e8a5 -perm_identity e8a6 -perm_media e8a7 -perm_phone_msg e8a8 -perm_scan_wifi e8a9 -person e7fd -person_add e7fe -person_outline e7ff -person_pin e55a -person_pin_circle e56a -personal_video e63b -pets e91d -phone e0cd -phone_android e324 -phone_bluetooth_speaker e61b -phone_forwarded e61c -phone_in_talk e61d -phone_iphone e325 -phone_locked e61e -phone_missed e61f -phone_paused e620 -phonelink e326 -phonelink_erase e0db -phonelink_lock e0dc -phonelink_off e327 -phonelink_ring e0dd -phonelink_setup e0de -photo e410 -photo_album e411 -photo_camera e412 -photo_filter e43b -photo_library e413 -photo_size_select_actual e432 -photo_size_select_large e433 -photo_size_select_small e434 -picture_as_pdf e415 -picture_in_picture e8aa -picture_in_picture_alt e911 -pie_chart e6c4 -pie_chart_outlined e6c5 -pin_drop e55e -place e55f -play_arrow e037 -play_circle_filled e038 -play_circle_outline e039 -play_for_work e906 -playlist_add e03b -playlist_add_check e065 -playlist_play e05f -plus_one e800 -poll e801 -polymer e8ab -pool eb48 -portable_wifi_off e0ce -portrait e416 -power e63c -power_input e336 -power_settings_new e8ac -pregnant_woman e91e -present_to_all e0df -print e8ad -priority_high e645 -public e80b -publish e255 -query_builder e8ae -question_answer e8af -queue e03c -queue_music e03d -queue_play_next e066 -radio e03e -radio_button_checked e837 -radio_button_unchecked e836 -rate_review e560 -receipt e8b0 -recent_actors e03f -record_voice_over e91f -redeem e8b1 -redo e15a -refresh e5d5 -remove e15b -remove_circle e15c -remove_circle_outline e15d -remove_from_queue e067 -remove_red_eye e417 -remove_shopping_cart e928 -reorder e8fe -repeat e040 -repeat_one e041 -replay e042 -replay_10 e059 -replay_30 e05a -replay_5 e05b -reply e15e -reply_all e15f -report e160 -report_problem e8b2 -restaurant e56c -restaurant_menu e561 -restore e8b3 -restore_page e929 -ring_volume e0d1 -room e8b4 -room_service eb49 -rotate_90_degrees_ccw e418 -rotate_left e419 -rotate_right e41a -rounded_corner e920 -router e328 -rowing e921 -rss_feed e0e5 -rv_hookup e642 -satellite e562 -save e161 -scanner e329 -schedule e8b5 -school e80c -screen_lock_landscape e1be -screen_lock_portrait e1bf -screen_lock_rotation e1c0 -screen_rotation e1c1 -screen_share e0e2 -sd_card e623 -sd_storage e1c2 -search e8b6 -security e32a -select_all e162 -send e163 -sentiment_dissatisfied e811 -sentiment_neutral e812 -sentiment_satisfied e813 -sentiment_very_dissatisfied e814 -sentiment_very_satisfied e815 -settings e8b8 -settings_applications e8b9 -settings_backup_restore e8ba -settings_bluetooth e8bb -settings_brightness e8bd -settings_cell e8bc -settings_ethernet e8be -settings_input_antenna e8bf -settings_input_component e8c0 -settings_input_composite e8c1 -settings_input_hdmi e8c2 -settings_input_svideo e8c3 -settings_overscan e8c4 -settings_phone e8c5 -settings_power e8c6 -settings_remote e8c7 -settings_system_daydream e1c3 -settings_voice e8c8 -share e80d -shop e8c9 -shop_two e8ca -shopping_basket e8cb -shopping_cart e8cc -short_text e261 -show_chart e6e1 -shuffle e043 -signal_cellular_4_bar e1c8 -signal_cellular_connected_no_internet_4_bar e1cd -signal_cellular_no_sim e1ce -signal_cellular_null e1cf -signal_cellular_off e1d0 -signal_wifi_4_bar e1d8 -signal_wifi_4_bar_lock e1d9 -signal_wifi_off e1da -sim_card e32b -sim_card_alert e624 -skip_next e044 -skip_previous e045 -slideshow e41b -slow_motion_video e068 -smartphone e32c -smoke_free eb4a -smoking_rooms eb4b -sms e625 -sms_failed e626 -snooze e046 -sort e164 -sort_by_alpha e053 -spa eb4c -space_bar e256 -speaker e32d -speaker_group e32e -speaker_notes e8cd -speaker_notes_off e92a -speaker_phone e0d2 -spellcheck e8ce -star e838 -star_border e83a -star_half e839 -stars e8d0 -stay_current_landscape e0d3 -stay_current_portrait e0d4 -stay_primary_landscape e0d5 -stay_primary_portrait e0d6 -stop e047 -stop_screen_share e0e3 -storage e1db -store e8d1 -store_mall_directory e563 -straighten e41c -streetview e56e -strikethrough_s e257 -style e41d -subdirectory_arrow_left e5d9 -subdirectory_arrow_right e5da -subject e8d2 -subscriptions e064 -subtitles e048 -subway e56f -supervisor_account e8d3 -surround_sound e049 -swap_calls e0d7 -swap_horiz e8d4 -swap_vert e8d5 -swap_vertical_circle e8d6 -switch_camera e41e -switch_video e41f -sync e627 -sync_disabled e628 -sync_problem e629 -system_update e62a -system_update_alt e8d7 -tab e8d8 -tab_unselected e8d9 -tablet e32f -tablet_android e330 -tablet_mac e331 -tag_faces e420 -tap_and_play e62b -terrain e564 -text_fields e262 -text_format e165 -textsms e0d8 -texture e421 -theaters e8da -thumb_down e8db -thumb_up e8dc -thumbs_up_down e8dd -time_to_leave e62c -timelapse e422 -timeline e922 -timer e425 -timer_10 e423 -timer_3 e424 -timer_off e426 -title e264 -toc e8de -today e8df -toll e8e0 -tonality e427 -touch_app e913 -toys e332 -track_changes e8e1 -traffic e565 -train e570 -tram e571 -transfer_within_a_station e572 -transform e428 -translate e8e2 -trending_down e8e3 -trending_flat e8e4 -trending_up e8e5 -tune e429 -turned_in e8e6 -turned_in_not e8e7 -tv e333 -unarchive e169 -undo e166 -unfold_less e5d6 -unfold_more e5d7 -update e923 -usb e1e0 -verified_user e8e8 -vertical_align_bottom e258 -vertical_align_center e259 -vertical_align_top e25a -vibration e62d -video_call e070 -video_label e071 -video_library e04a -videocam e04b -videocam_off e04c -videogame_asset e338 -view_agenda e8e9 -view_array e8ea -view_carousel e8eb -view_column e8ec -view_comfy e42a -view_compact e42b -view_day e8ed -view_headline e8ee -view_list e8ef -view_module e8f0 -view_quilt e8f1 -view_stream e8f2 -view_week e8f3 -vignette e435 -visibility e8f4 -visibility_off e8f5 -voice_chat e62e -voicemail e0d9 -volume_down e04d -volume_mute e04e -volume_off e04f -volume_up e050 -vpn_key e0da -vpn_lock e62f -wallpaper e1bc -warning e002 -watch e334 -watch_later e924 -wb_auto e42c -wb_cloudy e42d -wb_incandescent e42e -wb_iridescent e436 -wb_sunny e430 -wc e63d -web e051 -web_asset e069 -weekend e16b -whatshot e80e -widgets e1bd -wifi e63e -wifi_lock e1e1 -wifi_tethering e1e2 -work e8f9 -wrap_text e25b -youtube_searched_for e8fa -zoom_in e8ff -zoom_out e900 -zoom_out_map e56b diff --git a/projects/wave-core/assets/fonts/material-design-icons/material-icons.css b/projects/wave-core/assets/fonts/material-design-icons/material-icons.css deleted file mode 100644 index c183a6e0..00000000 --- a/projects/wave-core/assets/fonts/material-design-icons/material-icons.css +++ /dev/null @@ -1,33 +0,0 @@ -@font-face { - font-family: 'Material Icons'; - font-style: normal; - font-weight: 400; - src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ - src: local('Material Icons'), local('MaterialIcons-Regular'), url(MaterialIcons-Regular.woff2) format('woff2'), - url(MaterialIcons-Regular.woff) format('woff'), url(MaterialIcons-Regular.ttf) format('truetype'); -} - -.material-icons { - font-family: 'Material Icons'; - font-weight: normal; - font-style: normal; - font-size: 24px; /* Preferred icon size */ - display: inline-block; - line-height: 1; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - white-space: nowrap; - direction: ltr; - - /* Support for all WebKit browsers. */ - -webkit-font-smoothing: antialiased; - /* Support for Safari and Chrome. */ - text-rendering: optimizeLegibility; - - /* Support for Firefox. */ - -moz-osx-font-smoothing: grayscale; - - /* Support for IE. */ - font-feature-settings: 'liga'; -} diff --git a/projects/wave-core/assets/fonts/pacifico/FwZY7-Qmy14u9lezJ-6D6MmTpA.woff2 b/projects/wave-core/assets/fonts/pacifico/FwZY7-Qmy14u9lezJ-6D6MmTpA.woff2 deleted file mode 100644 index fdba996965e8211bad571fca1e3770c2f318485b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22420 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 XBr^VjGr6>tzULGFM}Gc7fbS6im?)KF diff --git a/projects/wave-core/assets/fonts/pacifico/FwZY7-Qmy14u9lezJ-6H6Mk.woff2 b/projects/wave-core/assets/fonts/pacifico/FwZY7-Qmy14u9lezJ-6H6Mk.woff2 deleted file mode 100644 index ffb22897cb2f9d4a360591dd2d15acf8cda2d7ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30928 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

#f*0PY5FK$ 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 DW3l_X diff --git a/projects/wave-core/assets/fonts/pacifico/FwZY7-Qmy14u9lezJ-6I6MmTpA.woff2 b/projects/wave-core/assets/fonts/pacifico/FwZY7-Qmy14u9lezJ-6I6MmTpA.woff2 deleted file mode 100644 index b43fba2f04f9e658a0b9a98a5d4441f8a9126be3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10312 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

u!w}Was})k45OgA5r@DkLC81xHA+u+28DG1w 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%0DPT+2T~e^d|0 z4YGenE_TG;wF{dnX?>NP2Z)tP8|th+1Cs!q4Bm}-|{SA(S$bKWsHgZA|o?SiCAZeDvbf6L)Y{4E$%yzh&;Qc`PJuvar=v{ z$)R?YO>2`i{FM~@uB43yL`}sS5W^7-gTs76l}DIg%7~zmbG_GF6J)6{SVtJfQWM5*gLLesP_R4~l zYX1iA=zJ?`C~KttY}RUiKE=#j^wJoq@;X$V0?y;!ayk|c?0viOa(rJenkbOclGLOn zgjINk0g5db75JQfsk&WRfo#)X4?B@TI=?~9s}#F1F|kmCU`}=hvyLg%m$HRBMt~YN z%?W`-Mq99m<1|5xx-X@dp@xLO_nILHk_MLj`)juGbdRrI_%-Gj4cyiSH$=EBBZ z05)80O9U=h`&xWoM`t9lyuVCCd0{}L42`$z^(~LfNI*zTlpsoQ+%(qu&B zN(SkVhZ#13cW$aJ&>pu(cnP}ZEg3ZYe0oKM&>-PBELi|iFa>+U;wWAcd<8S8iK#S_ z2^^ucDU?c~etZxCH`KVYeUhuUuYosP{>rH}B1c9Iv9&Dl{|obz3G0(zrr#g$UV+3W8D#gyuvd z+oTPf<=K#ppR$gXh>qsmV|bGtIgS-==VqHC{8W>qnBjG`p2%x3!j!daYlAj^$p|sfnKdHQ z-ejGW^d{JP3iwCTv6?QS(b5x6N@fZt5vLm&v!-(??$u*~pz^``~DbSC8ja0E<(^R5lhoWljNsh8_Ys4#5%G z#1)5eC4dr&S@xy^Z-HcP-98GYA+AJl6^QN%P(e9kOy6&|6CX9`G4o*-8}oogdy9T77UgVfutTnwrJFi`u6WlPM?PDHd+n}| zqVLIMOF*yX-Eb+(EXJaoA?5#`_zT=R^RCgQbvYCI38ft#eVqS||NXCV1AqPS-It%g zJoz=fA#6A3RsW@^ByF!RODPYHxAXdzmmr#&YlDP^xCz%NgCaA8ca=YcF@*~j>vZ1= zA(g4K@`-$Lg}p->878g`d6&XU7dhjJAE=@{qje|L$88D*UjTv&g!dkOE9;B*Wrh|c zNiyM{qm#MJic)NY*}RB12uGE=;`Ly=Vx_ajvpAYBK;!Y?Od$Ae@S86`fA{77cD0<2 zdB1jKEduZ-GD&#X$OR9KtK@sRSZqA><5An){yfSXCjZ0ltQF14kj&^NQRQ=L`Mc= zxbX(FftObF-kC8OP;FMY(2aPCm(8Oq)3$TEHbwi{?3q?~B7`?Gq5s&YRMh87Daz-q zC`8G$=dH?vWJxM5CQcl}lM_gaoWP9$AjI%h&UrX7VLPGQ(v1fjSAoW)G48fS9W|BJ z=?-d*$*_F@?-lOoE5?M96{VA|_-yQs<61WJQ{3U`x^^wr_PLPleM;#uBj3bHfw9T}m9hA~ z^cnYuz(VXy^QVOIXp(8c^CWe?9d^O>sHazpe0X_pno_|ecsoFafzj%gZ{mS_lGZ?P zb2&x%tj3av^<`caA_z_m0Fa19GL12!6{FBWsjIo)Yn;;1pQAQnb`}AdacQCzhQ?{3 z=r|_3e~mIeS73aOo!o%Q+{Efff|$Z(m=}d*1Ca;aAB}_TSJTDVTt^F~v@|ZROP|uJxDqICotx#c7(gBq&gF8_c==)TXz%N4)& z%7jEV91TEnLK!!dBNBf}{DN6lzDTakelZA#w@6<YGDV7*r6k7jazoy}5*kj~2|z3AKf)FRutGY%H--?=YtQQX3*Et4Bp3=b{o?`^1y zRhAUx=jQm$MuSeRWHZHBpOl1D^Z8`_o$|@|exyh|LaxySbMvspSVdWyQveBDJfYE) zsrr&W8kuszdgmvMLD_WTV)`^_+`X{A?P5czwv4$sUtz5GPvV(0`6ByW)$xTYd!({^ z66DVsQVbVJ(y{;Gx>SL~{A*AoykyuUEY7ePyJ!`QPH)ZTqE6H|3*S&BzgqijPAkf- zB_0?<|23|k={xPa8TLnz-#p!fT9;YnPJVY|-+vE$|M&Y}@ke$azxec%$NS5JmLbxF zo$D{bTX^z0Y0FD?eDR2edQVOMLA5_e_6!JX{zGfq>Bj7XzC?|TnvL{GpUVRlBNJ*+ zZ`98?Oxz|S%2?n8ynLlZd=ZvsX2USvb<51PL>dY@X94gB|M>f-Pd~o8+^$uz$ys#U za|(P+LVdx>Q`P0Ss!WHn`LQ?K+Y^)j&}`6UWEYL%=EYiVEUEj-`>iMz~o zSa!R0e;*r(>kzSv8ODR^vd^w(`oQVK`x7_^_VyyNFO7y2fw6P?g};6O?)8J`$J?vJ zer-(0@#A(cN1`k+Qx&opEm{2Ofs-Oln&@cxIUqNhrI zZ3UI7@=STcYh^KIRET<|sb+JgJhAJbi0fTj#2MFAL`nF5msDvblvF^U^An*4g*B?~ z;!&4ssq+B*^IZ82U+5@~eQ%YnP9}GXO%e6=mDZ)bzJLAv@x#XtsNF)huJ#w_b5&DB ztXEFQc6cRKQZ|yLLq@{VmnOz0+*ov2oD^k{NmB8x3@GCxmC-TjI;iN`H^~7~2&GX= z7G8c3chl68f#q?7Y-vCbeKX5Qi|a~o@Ejx&(kiZ??^j=E=j+oWrq9yn{Mr1O<~QNL zyE$AqYsKL}Wj$qWPr7s0;M`U!@W)LQF)B)gx6g#g%D%e_5sBGV-CbeN84@O$3*lO% z3-%@5SbCiyA;-wz4D36Pg^fpEUVxXEFR%EV&+J<4J-Ti4V<6L-I%BGGbyp_3WZ&Xn z0N3qZZ(bZ=8qkIzU@;-G+~pF%vv~fU9cU;ty73dGL2I1aHvtNndlzqnN)#EU9+4}%bPIneO`v$*ePpfv-8-$v5IRYV+k%NZ_v#}$ z@U9~0CC(%SJ5p`i_s-aD);OH!$3(=0QqInO0vI@qCl>UH2d#6sxdCn--aO+Tcc-#j zV=a)yUngcSS~sw)nUN9=P>Cv1XJ*wXZpM81j=lnOH?R~eb$cwrh!H$7Fnt;{?y6hG z&zDaVZ30Hf8s>Bo<%;d!=#ffY^qp%#>}uz=0dp~w7Gfytwy5jyP6Z3IdP=RUO1mN! zpHM;0!~;u;^pnDCZoJRNQ^#%?)h2!>CN%fz#umKUT<S|5ywn#{bLzM}W}N4z=Ly`Hy)MfM(Q zvn1)u?Vs^r=xMAcJ=-z}YQBs&mUPg0Y32pRW0XDWt@QL9yL`U1X*8B}oM+oY6c@WZ zDEVxBjh*)oV-CG8I36D6eR%fpK0fB;^m4VN$-(z<`j9S;N$E3!-%<-1V1Y0i48kVA z$^|HBn>DQJ`v?(J;ID=w^m86gn}%n?+Rb{uHCU28O}mumfb?XmQ%Z}))I?jV@@E}BmbD`wq4($%X5NA;XjAqntTG)C0yq%k_*y`I~?)jL3p=s2WKwC|~vFy>v358)Q764pY(kSKG90I&WV~ zgx4c&88JCW4kcKV%?Sg`?Az*$o%p-%sNFp52&m3#)A)af7gqo!yrmal0U@cK$@xup z7{ufuKy*eE@eEt)D}c2rMb4YUYK%-yw&a<&v2-m}BK#7vU&e6?Juz$aQ+nP;uEZR7qjt5;p zY29a_gLnU;HI$zZXlZ3oQDFsNZ02h%lzAs^XQtd8)6BtlX@!N_#7{5gHEEE4?4)Sq zIB?G2?Z-Zj7lokg>SL=qRCqr zqKzT(05x12lMyGA{d-z(gE&muvtw&ry?67g;!##Ts?V>=EAtQ=Voy&CKD~JQ5TEkN z?d#2IF&l9k=nOGTxnHHb0}1trEXqInt^%p5*|Q9)p&V^c9ZL8mW^dH2^sNm(@IIdz z$mh>Z;kaWwZWuSl&EDe8CJi;aH18m3J5e_do?MTc6{+l_9Ti2Z<~yobee|@Osyr$% zODc}6vXx+OxxrDSB6>4SbY_^X&JKsn3|Uh>Y_+jD@xI^yT~`%HBccuPc>HsI&aYp+ zzWZ`>b+OehFJq81Ns;&T>mUc@I0H;dtSuo|h|du9W3~-<)FcWU%jX5Pl9n-QVsu z=ks3Ye6$cD1Xa!LS*8En1CoZBvS^W#FET++N;ica&Il%LF`Jp9o=%P{$pH~tQE#oK zRj#RN(!l~n>imd|ywXj7sMbV=j&mLsf$m-imzW~nM`)wM07&5$(LgI)1 z{Cs3mlU7^$^gXyq^Uv-0aEh){2&n_Ya#2)j){-r*nBl>GPN0^kQ>n+9X8IhLM!;x$ zWXz{{lQ+(5l#k$5#RI>k1rMZ&mnX9P+KOtDom_F(Qy&!cKi3tJADoi59u~7BcXl-^XdJ>v4Vr!Ncj zi+_4SJMym@cktc({#H8@x9poXg=taSQCQ0(cp>}YJS9cX2_bwkuHs)*4tr#T8mQA{ELD=NrwFmB0Vs| zWPWpshTTzwd2h|@Flne{a})uH)dg8nz$3WgmqTxe9>!>F(71bViQD~6E=lw>cmTdK zzwMlo8!eHyjO4v*UVvHBO(s=HXCMk9Hjz(RgH=NWx#=-k6uAY&vay75`^)Y9@Y}#f z-e3;L;(Yv`+I+dkQsq9a3YIlvXR9%z5!QA3d5pX(Q$2N;Vn;=unqK2Se6=yxC>iZM z%iN`K3l_NJ!O0=5I=XN$Sn;WBNy<&bKRY%G_~@J3^w}x*GbVnh$js~1EYrQ%Se@(# ziPVamR7}dVzFbDoto(VG=$iTiWliO5XXwhwY=C;!TumlQTrSU{ysW2H+&AsGzP)_8 z*V>HUkhooXDE+1)^WY>o5k4NiQ33Q4I;S|ZJGQ!{y)Cdk*C5RUjSP4$kqQLL-}cy~x&-TV{IK@}_&%ZXZH@eWNPqtf+!3Zxc{dT5|fk zWJ4YLsyyTr-z2dR(GJ{^o6i!%U*{)}?_OVS*T!-<=sb2C&}<@{u-+zEF8;AxGvp<( z8;W#S-QhiIJm8=zzt7+nvtmS}B>_w@ZFw|nZmEp20UnPzh}UC?cB?A978478_IVwb zm)at1tv4z)fd>WtogfZkGau*Vl4lIifQv)XC*P(l6B3=lwhRVN$%jqJ)@L{ifCINW z;e;yTwh=hMkW7-79$g$s~0EUIZq(V3T#sS!;S*5^s1icS1Q*?O0)Q8uOo`G&Hs=9bnFVI$g+C`SAqgpSiipJ@*g5zyhG`pW zi*XO3(~t=z4I=;JK`kyclb|=VG*Ipk@61tljRJ8dXL=@OAB@tJXF%0iYwg<1 z_BDjpu5I6`w4fVCl(x0WxN811PRQYGIodcsky&}^?>6}W>hX%Yb3*G8n=*cgM6lWJ|ex-H6pVQdkL`Zu~QdEG)P zf?fnz+>`jKDmiHK1#Ni=&~juf7n)j)TXMyAkgR1|%Jp3wRk&9OQOX%#!uU}v1F+_e zX&GykuG9DB0=$AI(X+L}x3ZmTLB3uIKh)X%=qbZ*A zK##0k17wI(Z|+WR<4T#i-X{2|JG8+}hyCJ&d`5C5cmv|g+E?^|Cf(U3rwZ?iY@z>y zQvnz@a*U2Ul$*~MJE)+6m7vo#}Cp$WEI1?C{w&QdP!Bm^m~pnwZ+otQmDfN2xSDD#S&Y;0Y- zy%_NMi7fL5P6elkVHoLup(&?O#m0LHBd!#iZkNC$r)JaH-;2ve603?i0m-JDx zLXFt1?15koH)evNwd)n-fxU*KU{k^^pxn<4vz31McxK3&)?qG<&7Dug2dK3w5lt!N z=N)~{i^-Ni3GgStPDASFH}a=gya$@um&yX9?sf^QoFzfJX}KEHvI1F! zic|5jw}3pJ8K%0a%DG7KZ8G*^9O?ChKo?=bfMC#b43QQ)MMNn=aQ4II4psyzox}5b z7G;#QQdiS)lfR#lJ!#^l6Ip(BIbo7rcH}|LBJFJOHCh!i9s=vG(5dW-IPfqLTUa~gOApy!$BjrZS0Td47lLOJ9&=( zZ?T4&ar5-ytf!THzX^tWS#Q0ZkB2LCKJ=q)U3*w#qa`-8vZ!0H=URJf^krujWUm>* zh_JK3D8MB1Xn;xK(^mK~snZt!+Tn5JQRa>Dm!%wyNb8@f7c1FaYqM)lxAD;aMI-XT z{{>jIulGw2%sY=AoqG2O-7|f}p81~5Rq_E2Y>V#NqAqggI@_4hCM-WEW^#yXc z!~N~$elfcnLf)^FH1fMf-l`PAq&EmilaLA#NKbYa!WTE9?;-katg8`D>OvX07xcCr zH}e;gw6C39JMu^(|3HCWeryqfg{j?kB6FJa%r6SsOr4d6z1%UV?0*ad%+D# zFUHW#lkRY<0eyKN^J6JdShhh)v84vr#s~r z1@bbnpLOUuE8mx&s+$@jOC#8kC0BS00Fr1Kx}eaFJNJ}8($(Q&w_Ge3<}bXm(_?FG zjh-e!P`UQlv}o(+-7-k$Hf0~M#XZfW;<87c9FX*m1{huTUoxJsi+!k!25YETw6e8a z`__1xxeLgioLj-AZ|t!0p$t0z8EBmSupzqNQYWMb6f7PbDpLJ3jK+qJz~42z&a;iZ{9GK=q+4^f^IfqcKaLKD^P53b-23F6{963 zRYZ1Zh2p_>Msb*csul=ltqS6Y$0ww4h{|HZjOvcVisWA*yh5haDBq%i>h|Zf1c<{4 zx&K?i!P}u?+zg0b@DAfE)O;X-*2PCH0h-Io9e62^kHF$hp{LgO@!Nc=OlVV6F zd0HhhMq0OSueQv)IPUk+mX|!Dn7&0!>iha$uhkk%XPJ6cvjs`{*)%fysy5vhBH$M` z-c9M!a<`CfUCS}Dk*iLc{qNb=8~n4%bs19 zJ>-B8{%~h6n1tqv$8WqJ7tL`B#l;#hYq*j#0=#E1L9Ont=!|yI)@x<#I>dO}&4X!4 zdbPfy@b7BdeI1&DB19nIOdLBsuW7kjV`TWG@rG~}1(T)cKqGmy^Xg^piqoiFen$wZNKv^VQb#|8K-@q<~v{XTqa?ulZCgN#-=;KCSN$YCOlO)2WuaOk$98*rU#Pd~&h ze|fpPTJ32cKSx>!lLW*Mb+6(Dou&_J`@*{_`PB9=Iq9;N>y~SK4J8MXZYAUW#?Wm} z1o}3K@_P9UFSK@2bg{1#TtMb!emMp-j5jQ;Y;3uRgKLC)D9-aYaBfm)z^kg0EtfZ^t+4(e;E_4{pM)FmD zzgf*D)Z@qhxEDF3HE5hWzMTFNf3ENp1&DAG0LU1ZDg?S&>;u+i|8Ke{6x44vUZ%gq z&O1UO&1*%K^kO73R(|tXwN?qB{8DSr7B<;wR zSp^O|;8>%mqWDy3T{IvkTjjCg@0SwqjacQXuT3*2lV0$3Bq~Ocv;-5kkeRzxSX<1D z>|oeWA|L=FY3stb;n$IIzlAdL766=ke$fB`_nrg-8@BDk+u(T`fB*#m073X~AME+l zfX%VcW&^H7(UHF7Z8Ne~)cmg6tvvJPzKn_W=A)+(I|EzKF$1EnW^tRoQ+Q_rUC#5* zFT!(zE5DDqAl-5=2Z3^>*2+wg+g;IG|G}`&vmZ7C8iYZS?Q%j z(GLS9d5zl>!L8p3KBjb*vc=t?9Ml`Apr<%?1DE~kN&R(l*BneguOt_%KXvTa4y{<{_<@D6*q(>rZ={51NB>YEb{|VPUyW zUj}5QqKF@VHA@ELV;`T<*Q*clsDtO#d**w>8zi6vEP23E&2iZTx@@Bzxz2o7SUXbW zC#KpOO;prFcpXGu5JAjiUc88QQ+*&Eaf&{M+)Z^9IYYBoq-2#NkdUOgktj(9$#iAO za|=}A5BK*-glUn-hccRF{E~IWnnl*CZj;D8W2gE1{c&<)L<1RC{Xm zJbu}a@}@ccrD{hbo7Ekc!^mOZuAx#a`Tov{xh*IxCAK*AR~hAWD)$a$Q;S92w8ZC~8h* zSF$S85YC;kF+9Ql{_VIe8?x=w2gGSD5a0%@vDRWxOnR6C;Mhtvg7`Sn`3M{$0N4nQ zUxDN{zJkKr{|X|)*;mlC{=b6Z5|3A~w22D-8eUjBNKvfB0A+Gz%TYng!o)0!R+}>2 zcd><@dbdJ9xmm@?GBK~A-gzNOrI}N&E>lj+pUz-O5n>o;J6mqja;07jL@JE1I96sW z&{w~kMe%SsW6|3Kf}xeZyR2kyPh~a;1r3tn;DRYq*-2+Ro%2*KaA77tlNH^ z*Bi~Hwm#qc};kyeO->X}f+H!89-Hwjbwp zKkxVZ1Bfu8j0>r>vCao!6enqx7iCp9ZPyRuG%xG6ALn&H@AsG5I>uc4@V>9MeQFYB9XddR zNF7&d&l1Lk0)vEcp}-(vTqrO|7#M@9_-9D_#J4zsbBUDQVhqu=-Ledh0QnTxaui|7 zTL{h~D8M9k6&@Uxyj$?Wg;F$4@4*~S4C;=f192)0EWq%cKsj8J=H*+AU^qbmCTFpN z;RFSkoCO8L2?{WYoz(+iAe?2GFy%PGYhR8N`tuiS{#zXj2d1a*V*l93_}}a} zG+plj@>M(G4K)4;XU})2Mx1&P{N25eKduJB@plmS<3U3pUOXyJ8s^3NMe0Sg_~cw# zMlS?TxA{nN{F{8Zbodfro}fv_NVWp&wuPskfPmCj-Z=i8-){ZiVHow9_;2Q2Yy8Rn17w}ia+eWVfrjU>PY|qYcELa diff --git a/projects/wave-core/assets/fonts/pacifico/pacifico.css b/projects/wave-core/assets/fonts/pacifico/pacifico.css deleted file mode 100644 index 120374dc..00000000 --- a/projects/wave-core/assets/fonts/pacifico/pacifico.css +++ /dev/null @@ -1,41 +0,0 @@ -/* cyrillic-ext */ -@font-face { - font-family: 'Pacifico'; - font-style: normal; - font-weight: 400; - src: local('Pacifico Regular'), local('Pacifico-Regular'), url(FwZY7-Qmy14u9lezJ-6K6MmTpA.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Pacifico'; - font-style: normal; - font-weight: 400; - src: local('Pacifico Regular'), local('Pacifico-Regular'), url(FwZY7-Qmy14u9lezJ-6D6MmTpA.woff2) format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* vietnamese */ -@font-face { - font-family: 'Pacifico'; - font-style: normal; - font-weight: 400; - src: local('Pacifico Regular'), local('Pacifico-Regular'), url(FwZY7-Qmy14u9lezJ-6I6MmTpA.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Pacifico'; - font-style: normal; - font-weight: 400; - src: local('Pacifico Regular'), local('Pacifico-Regular'), url(FwZY7-Qmy14u9lezJ-6J6MmTpA.woff2) format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Pacifico'; - font-style: normal; - font-weight: 400; - src: local('Pacifico Regular'), local('Pacifico-Regular'), url(FwZY7-Qmy14u9lezJ-6H6Mk.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, - U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} diff --git a/projects/wave-core/assets/fonts/roboto/-2n2p-_Y08sg57CNWQfKNvesZW2xOQ-xsNqO47m55DA.woff2 b/projects/wave-core/assets/fonts/roboto/-2n2p-_Y08sg57CNWQfKNvesZW2xOQ-xsNqO47m55DA.woff2 deleted file mode 100644 index ed0b13ca09d1372918d42c2a7e3f944b762d80dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1432 zcmV;J1!wwqPew8T0RR9100o!;5&!@I010pa00le%0ssI200000000000000000000 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 diff --git a/projects/wave-core/assets/fonts/roboto/Fcx7Wwv8OzT71A3E1XOAjvesZW2xOQ-xsNqO47m55DA.woff2 b/projects/wave-core/assets/fonts/roboto/Fcx7Wwv8OzT71A3E1XOAjvesZW2xOQ-xsNqO47m55DA.woff2 deleted file mode 100644 index 0c7aec28f513926a7e749abc12863001e2f1b65c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12008 zcmV15C-=YD)d5n~(-7Vu&e!NviA)NIQBKSGo-Ov^y72Ovb!q=aIX+2ag~ zBym!K%A+ob1=d>XS1aY+H!}_#007KcZNG0KliQ7i9jw^cp-c?PYVd*gZU6xM2_TXc zNC5!Ahu`Ba@C3|T06+tFR1%y$!%%{Rc;MI8yk8s8VsW^x)qowiw9!NxU26w=0oaXt znRo?8FJ|xuXqz2^Fngg9Zott7~f(2F~Kt~ckhtVQzt z^Y=cv_I>x90zy#$TOc6?L5CD(=_s#vkGohQz1aAIUP$HoKz;(0x03o?!lJ{Nm zDh#@MAY0q&Knad-5%|OZe`{qmq^EkAdL~3@frO2g_rFuSnJsd(KgxNFW=a^6D>w5PcBDp|QxOHKe4J}U{JFFe1e|Pd-q%+i#fB&=n0h>BN zP6q#yPI6kERIucr3dG}2O7vSEaq5IS@Y{KqaacQSU6=mf(q=a|vsWuPmfD2@q2lCD zq3q87d$-B;xz;w+B$U?Gf#RW>t7SuL38fatNgl!>6dqyJS^V5v>Nh0!Zhc&P1UbZE z@q|n$LddnO{4MA@*#1wTBPD6msMPq@2;fasSI}u%|8ok>X^YTaXF`hAgmvB^ z2w z6lk;)ju7NHs8hNA!z$=x$TG+f4+tIm5k)DYfx2~02qF;7AN!;~_i^|4%znw++@<=4 znl}OFErIi~+jrxSe&267oQ+R^2VfS1AoH<7E>_QWvTwoM#t(lpyRY>6A^l~0O+RTu zyW1aTK|ht@y3Z`g`Drt!_J#fy=IFE7T!R^)6jiwSU@|pNKkur(Ab#hUeKzhtS^nT1jb>Fx970idh7JP`(wQoLE{TIyV93t%!^NAJp&I}JM z5Ww`zt5Let1^lA^e=a0QktRc?ECUTP*bqYvGu#LxjWXI8V~sPxM3YQ5#Z=QwH^WSe zEVhK(ax1O2&IX%ovCR(IcG>MypZVMua^%Xh$6os!aL5toU6k*NFMaJ>-}}+ee)XH* z{ozl4DR9l-3SD>8ZFk&r-vbYM6no^cCp_Iw&Zhu6u=QBl)2sNLc?Hn$wXOOEzpcWC zzACT+24E>vYZWW~Q1Dk1MB&i5bsQh-QSE?@fJ3|}MJu-**g_T358n2wx}ebBAqw7N zFR^BCJAQO}1@Gg7gH21cLjhDpAH{t(ehNWF`{Iwhku(fVJvgFK2W&`;i&hK**+r4J zFV$WM!ij!9bZCJn58yE4jV)C9inB-*RnD<5l~@sy07)bkH}KGNj_T zUj0SZ_^E33krc6;@hZ&(Dgi`1kBguk%#Vu_$l7HCa3VVZT8pA_;=DDlw(CPsk#TZ6 z$UK@10`2P0vku}X0g=hoC`LV&v5R+taxY0Cq#)IyYYN>!-JyHRfcINCU7?a*=TtkqB~V)*Y>m{~A0V5W5{ z%!KaWf5_*Bw2xLV`VCOxd*lBbc{h@;KfnG43jZkTTKIY4j>7E-(59_HD}*Ge&X8n~ zQ>6KQrFceDQZ;9j&9>NTo9%YksRb=J(AUz6)|_?DMVI8eEKT~By?Zv?lcE^J?+3INP9>J&;q0*#09b;k&vi}y%>pxbOSk%o{(g)ACdw|1!p0TSCLF` z5t0QN7{{x~Ajk}G1u|0&L>rJ51JM>_b!6H>c0#g&q~Q)g4g%{59+10`caZlW1M&f4 z0{=iMR}5PooQ4uS@+aUtl&1aA84iXO03N{6X4tmCJve3!J3lCdS9fDca7u0)k3X@R&+DCI(d!9wvo=mIJTTkQf&clm-N2c!zwym?w&6i+A~neEao@ zdEudGN1%?qyuiB7#U)G@k|GDI?m?_wX%}`~=Vh8&t&9E8Jd$|UXMD&1=`@kp_%5JT z8_Bya%glZX2B6cnpShb6FT1KQp#h^&%8RoE(u$tbD3RFRjCSO%ufG?!Zd9~(^>~-o z5VMSg@v_lKZCoxc(JnS?$7ioo?zwv5$s=P`;#MJ485Mc82g`RpOAi;c69$Z4qRnPD zQf6ifXNn(t9L*2ge1_bQ(vAc_p>v z0}dBTF`l#N>;pTxALggu-hKYL(|B@em)~7yha1W3r_&Sm3s0FZfAY5}4Y1BV;Pcln z@3i}~GrQPxxS71ZIK9h7coN<`j{$E1$TNqnU{;TFKHocMIS!_61grJ^uPI6gw-KnsLw#vHhogf<@h%iiz$?!YY!a?E_sg9OTP%C~HH#ZO#YD zUAf=vm&FjZIE^LAWoyUZolACbHTZq?><|+n*Di>i z#N}v=DD0O+wIG-5r}9!+Ga;9JR?sSUB}*YM$X(27GVjzNH1P#j1T0dxA4WmtFQD&6 zcdn7DkIiLxEO`oolGHXZ=-Mb&qQlF+$7=0x2UM-c6KwwHlUZUKOT;Z!B4I%i;!W|| zM!jBldc@v-2S=NkX`OBeLAF*PHon~D+#z?ut0~+-8Dk2?MYzxgryptNNPESM*X~s5 zzzt_siLk30-mY<&A0s2Kk=_jJ;TrI z8NmUI*J4vq;hx##wQZ86oek~4fCyFe!}e=@X7J16E%<}Q4mY*{dzv{#mI|m?zB|Fg zABPq*AP`<31Lk)LaYfqcu;17S>LE3r9GFqUy;ldSE&EZ*d;ZIV@3a_Wh$LgTU+ zke>QaFZjIe%zQg+2Izo9+Iw*39V7}TD&qlBnv!AF^Y;Ubk)m}D!`u3C6EIrKn`oMK zeauLi{Q9bXttMnVF%-bfzXT2g^3}4-l(Xk;K9Gt~=rk(3)}iWgOHxi7C}q={9N?Z~ zSuOxfH( zlx{tXxsSqouAQ{DUZWYFqD%cWZdi@RBErm=MS?I5_JRldo`#D z`Au}0p)7(Bi-m#UP>VJ~-R3s}hq}BSy;vS;+Gh+`SQkj*Ow+T`mK23mgEJ%QBAUheThw2ET40l?#;}EZe?bdwN~N_4YIv+lSe_}vJ(Nc zLk)r5{D?FIlLm)@9=vBWmDX%N6hoq7h?-T>`=L<98bvLUw{OxssEJK-v(}^ntt(nDHcDrTO@w`<9deBV{kxyvdV_q*7d?q2$0<|@(MBcH1H=|kl4Na- za;3pxZ$(OFV_$CeYlB@hmSkF446SvSd4Oa^5?bLAx7@%G33&pj+acZrcoO7@>a2l| zl6eER6r^R`c_%FoNtgb!SY%hHXcH4j^|lBLal#K%e9)(lNBN!0I}ooW1t~vbge6T{4K}C`u@V@S7JXOv8mlr%bv|sK2=A3bAe6h1?ysaLpiZ; z>D;fJkK-5URV{hKoyN_WPg6c9-AGXdrVHH1)Wjli<)`-wUn8CzsI)@($rCkTY4VrrI{H3TUvepJ@r`zhY^~g@NK6HtjQcqo>)K^On&?>FtNCLQ zS)CUp`l7s0bghKXN4+6{Q)#S-SNgLmjUE(`j@@y>YVI#3Lmy&SXl^7QsFc;@nd%J^w z?KKgM&7Ms9Acm2W+LG${jp9gO^C-SGKyMGdz3){@pu9yr?J@8J`s;I&pM^o7r%wjA zDeaG{Yunl>JKE1?gom!R@qxeB@D_f*dO&RStn>?(kRXl9Hzp$#UOW7eGE^ZUxVrkU z#cywmqw>Xv#kW!ILNzK3$XD{9FH(3Z-*SvJlSxJNzbY(Rw^<32*_XcdFK8vFc2>=G zWi~tvblTiY=Ep<%p~3L`Dhzjw4l8HJ{r)%i{_0ynu=O6el0KH{ zhqqBOh;YU)@!@77NHx3#VrMzC@nslqnLqb$uqMK@xT2dSR=z)7iP}fOoV>&D7PR4s zq)gB7q~XDLP{v_z@e-bDNBQJX)`BN3KM+9n#u3Mz*-~a1bHF(C?b~j6Zy9SaVK0ke z?#O^KCdK5!LKEHMLql{0x?sH;!aC5RZz^r{4UzqPVz=I zCd7b6^LN46@$uzTorw~Lbd#-2`15}TVedTjuMZ{WXHizc?xmCaeTu8AVJkbQes_}I zw40sLxCOtCD`{#j#IOx;pqY44FTbd(D*Yw>M2slJ8pWhp5ccNL_85-$9L*GKK0CL z>~ABHpSADpJBEbCp)pxucD;OrgRXuY)gEfEi)eSkth@&9kKN>;whtB;#aMpQ!;@q5 zB8X;WbHR@t=-s0dpgz`jq%T zh3R={M=A571k}u2QJ>m~Pq}HWd8l)Gw#{b`=h5{-+GG{DzxN4CN>5%yw>HXUQfi( zH7s|b(Eze`d|&UFwFI^JM|j4xuo0vI97$6Pqe92-OsTa_`jY9bwcy||t)F5;quux; zVW&%R?X#V|i=dg)bq&4cM|H4@TZS1U-C)xp@zAb{i_Sz4F{$7Th|^ z*4Wrnro(%tU>9y+6667CCA7wX8XommV?3{5fva{acqDH2j!lZZ|AteIMLNJj#!9|E zcWc|1vNCTDkCcav)*RYCt-#3um~BCD!2eGknz;l*D&VS%_zV+HJybGLdO^u7qghA} zfyZZ+ew}neGe_Xg`R=Bztc8IL;(zu!mfI)2uyTdA#NtT-CZ4M+f@WZ!{(G!!k5_gT z6jXwZY2aXIx|IiT5L`;cG}K4P0an=3+)<(hrBgADs_>ek|0nL!;^v~}($gpBB2+}! z9p5~C755+B(LV$1WC^*{|6}V4PS+R4kW4HQ<|YVhQ(3NcXFIysMX9J{=lDo>kGQC| zxY)j?6R~hqFoZ)D;Rb$&Mo=XK;~V!XBHWzJ5Q>_oV~lUQxdsL~xu%xJsmm+B+zpLO z^|;>YqthmGodS*L2#Lw^l*V~$N{ZjqfXnI1tpEGT$~T9~k8jBnwGt1ypnNP$eZ5Uh zygkgVd_A3vr1ebxnQt6asm8BzZEOqJXaO-6MYzdYa$t%}108kFlFh&kn8;5ack@T! zh1zY{u))i8-1dO2Tx9DQXbQ-ii_NGdu>p*)NhGuPOdc0c4eqUW429f_zm2(Hn#kVc zk?0J@BZ-c zsNViS8kH0tA-xPf83*rCF7ztaB|5pfwn1K4ARQ?#ecJVWAM|X`M^4L;OL#j@I(I&3 zoqo=X1`>Wu1ImL1+~IO$euaS(&P(!Sa-cyi*dMe^(BP`4+J^AD9gUzjqI5Zx>oDji zmJU%0Iti%((A2q8E;$NEqhCotu(G|3DbQmwq(FR*F_SAn;RgLb!5C)~;Rt;!InD6+ z6&S}q#J@;c%vdBZZe4oE`*C)ir20|}(xqTn zt@>;AA@vQ?hEYB@iLz$&+A4+ahWVEC7Li5+h;7m~GnLvn{^tq>c3LjKW?7q?l-CrJ zhRyaXxRr^S{=pEWq|f=1!zgQ8izKqm@Sn@L(ma9ZBs2aJ0fC}_&E~aQGRx4leSxFD zt7|)85{6X;K^%`zU)L=#x5Q`30&Y{Cs_e~-Ym#2;Fi(BZEAs3+Z@V=)zHW8lg1~}5 z=^(-N7x#fR8BbGSWp{j<-mx#j-ZsQ;8M#8@o(T0Auzv<)hBdK-23HjzV5dPZ^2)Dg ze=T0YH><7pI5%wR@8E26c;9^XmS$Rk>I4E7YH5y8s?&68T5{YXg+FOxn#E>CdWP~< z+7yX_vSHRkudZH5Q;Muj1nF9sOr(z*B9uLGb3qqBZ)ecuu4?bfBL{C+g!@FelfGFI zuLTTr*%3HV0b0VbR;9oqJZp6>JNf{mecMH?Ko5%OFb3?jZg zfGs5SHLh6p7NhLyxooJYZ8D2Pfh!FZJW9l@&?h0aXH`RDZejqtC-GDsIJK+_Vt~A~ z=x!AgwOMUtidlx5ZK46qsJ1GDWY-=V7BnN#O$Jdx7)1STQ&y#G*`L@OF0Uzu6sGZ3 z>H(V&3zg--Bl32-Bq6F~b=JCe!!7`yAW;!i0pbb$38I$iH3}E4-hC%B#Xs0OF6C>5Q=~z zrC;N~6gzRvxWAwjo5=A5wKSdu++5JbhGv52PA+-C@~L4j6nEyYy`;ud+HaBV-234+*KcSW5`*A!Q#D6O<;7t;dOsf~WG8D%K> z+Z;zhXp&V2daTw#OZibo#&X?p^oewrmyC%~QaEIcB0!n7AjS#mYT^oT*%Yg-dhuQ5 z&LO7(`A{w?0rHbGJf_GuGd;3o$gu2&E5?Z>QSu)f3u9XJb!S#;u~}Cxg~0lly)IPdnSqTj!HsJlq-7+Ggrab!L&^|s0O#<_fsFW`JsD^!r#bg&lUfo z2?4#rE;775$Aguur>;+_buw+Abt^EjJ+olrR~dVfeKOcu_1wHit#V^l$5hKIV9X5tqRogN`B(SOsy-vwFb6s z<@(TWsD-4*A*?r*XX^AyMYPkGkXP+ZdoYMwmQ>2isU=5T; zyNHq?B1)eUkYmgmLaKuV*axbpZtVmK0XOnj3Acw!aW{kaXDs0+jSKVaSfMdNVw=r) zVgT&fDE3TGv-qouxlA82O^qfCkmX}FE` zOK)gXwu-(`kJR5HZGFch#DzgeOy)CK`fPo%?OD_69}{}_nse?M&{JX#e|_Rc%cK)< zz*R|D#b1AOE>5o=Mt5jSVN9Aeq+}=)Et=t@3wbwV`IY>xpQbNUqN@idi~}=E)H8B#Eax}{)s4QBo_Av%;T?KR(<1zKTP7b&j zm=nXp>3eS=%mNIHdT=U>sc9l6w=zB7WG69qelRSVZ+rK#K{|tyrKbb(F0QDEpBF`e zvtQp`zL-NMUHJw?HXbgsZ@{z%h#XMfaXXBk= zCp3f#wYQF#5C!xWZm|v_vNw5YbB{W8?v(=+p|f7m3i6c#$RNWAC8ih(Nh&FT!e3|? z;SvT4czvp8Ti0EGLrk#*Ucr0#3Mo+^7@<|(;op85I)}3_vff!%HX&QUpYhlHBhRbC zyrEkn6C%47UZEwF1^EeDXh(%CI+wbO>CN`;6PlV2C$eiUO*Z;IRYZA*RzM?wLlD3MhnGcu zijfGF>hAXSRA4q4SaqzbL$G8M$A^@gT?NCss0~I|e>SU(XXbQU479&ntuPkSgCQ(b zw-e;O4+)3}AZ`PykSO)p)S#}uj)PMaUe$VSP}f+nHcWPR1qr6l>@l`x6Hn# z)AVDzsNRdRb`J1=9|D7P={rOibmj!pI>{7oRjJt>!r)eki3ESTfW6*>8X5B9 zZ5TLh1;NN9sn&b2Xc5qX#6yz(fCP66U>=s&q-uh4_!97=O$4vxip^#SNJXZn2)%A6 zRuP-CnZghY9T$r2#h6oPMXrkcX1S`E{VOn2%VN8jMoSL86(`&zB#2T2r7Bp;DInzy z_r@s#oSNFgj`*f(VR(0UZ3nT1NV`=A zZQIWkU+uGyIW0`>cL0+vwaP=8rXP^B>l};;KR%;xRqnL){h(}sL&u>~&T=vXpM#og zmy$FaGZ%UPuZB>iNqt^bR(mA>a983(u&BlV<3TMPNjl42Jl@x}u+Rx&B!G7KmHwUG+jKQ|Nz7SwhH!j5Rp4#zD zl=ytl!G|bl&P@=5GU|mRfSzO;6oDL70)`Vs%^JzYJx3kB$|!2I<3eZvtV@+&1-|VK z8yqaetCTrd(Md{i%h0cE>3H0gq1zQ-2?Z1@ta%OQ)I`#Gv`t(>$lb)Fi{%V+Es;0` zt-zIKN9qtjpN7TY!0lip)C~Y7Z~$iH2<>1zE(n1|pcqBy>;q^l2r~5NB$l>*1OO7@ zMFF*q_0wBhtaV3s>L=Ia7p}>DDJVIBc_S9O)%?aLaHBbB9iJq24ElM@Gue_Aq_s;J zUCQFN8UQmn8zg%UJ@7bMv>fTXmm3NUiqi=mha$tbj#V(vY8HuHP>d0Ye-d*-aYV$c z>bz(`n%noB2q75!WGdlREGFH_MlcRR8iC#~L;;paOvfe4{b*GW-c1p_0#PuHhGe;x zHRCTpC?C)&6;t09f)i`02jHy5=#HIW_O4%sOpN9UY3uaa1g(3@2(Q>9R#s(uGt}{V z#qxpkta=p9JnvEBCCE^ z^!D_URas5m6eZVbpt(LTG7LQ{RH!+UBEs2f#DP31^D*F|JZK`2C?fBbZP7(2w>^+r z)G7%Qd->}pvDdT$=+EuRtmaTcMLc1W*9=pQLP+O_NrS#)ZUcU9KYarB(^FW=Wyhyi zICdQC$PydS$)jJCbhgVtP0LpI0}ChC`6$*0K9CYR+Bj)e8v2aRqo8c~BK9!i5tBmX zBz?DR|X_rNdWmX|K z30p_fQR`s*HsS}I=lT>(SkkoTMEK%pD2pxee7$b6oK&Ks;6RVH&7MYn0aWEuIUH(8 z7zIAG5SF|4d1eTx6B3K8V;Z}3PGofNKEd?1lR=0Rl%hphddPF8Wh9^xH>^XLa?V=W zcxsMM4hA@_a2yFfWp#hSPp2|ok@EOUH@cxiFp`}F#bb%tbe30MW}EPN8lNhCQProb zd$S(f8@Vxy{aLS{*tYa#DY-O~jP71w^)vrvoE)q8jI*s+^yT-sGwzOLBh6%uOB)@O zPda|r1=LK==vdA>a?^l`lzK{K)oBA>x*y10L@IFx(2EsgSOqA4gnOT#;-FwN+hF3IGN>`uXftmq)wu)P>7OK;M>#-6 z&=GINC8vaPX*zkCtp);lI%udj@c!@g@e$^l{xZrgQuD-*_BJ+dHF|@J_h(HNQ zL7J;lQG3O}a$Pn1t`BK(R)HiX`Uzf|mn8+NqPw}mv6^cDmw`jb$mP44hfDX?S=w`K zO50C5Xt@!a^9GZt&)`mDA2S{N7FQe zuRmXCUmgHLL-p=+=}7_f@8RGtc;mf}N?EjmjRu5I4I+b2zqDD-GQDfFGa%|187hin z%-&^WN-gfCHuT~Cpmkt>9S>=Bdz9nKKCbX0K9e>=hGlrk>5!`^k<@fm`eWMF_>xll z|MsL&%6gAwok4lDQ)6}_IgPaU+nGYrj*c93up>+)yS9qt*j86!$A~HX#{IMg3OWl} zwm`%Uq$D0Mp9wivJ%FzO;$G@S#Cu*rlHysGX;couD4D?efML zbt0@yMv3lj*h1c5PGjghWR7LmB`$jQ=F03cFEjN{3%_fS={m{LiJB|1GMZI*bc<;6 zcJ3lPYsH0636VZt*UEmIE~Zd>S&V{bom*8Pnnq9kdEQ1L*tDYW5ccSlmO(vAT@~F- z;@Jd1T&8>X9<9a6eK>_q2&=73wwO!sue zr!wY-fe;19LY~z=ndqZ!-e686ji-@1s~t1o=k?E3v`P6HVV~!j0bWGkq|Gs{_Q81N z7ws}rVr|pHQzu-NHg3at`zIvSXa?PM&`APUlIG1!9U?|2OFd+VIZMw^;r9#L5NYF< zq0=@yM2@1iF#BovZNCO@`tlHmyTaVDhFoWM@5bd9d?cBdXEWsPtgkeic1@?T5PJrP zV0;LOf++@4b$-S;$BZ+1ZIFyn!Z3_6!=*;*lAu%}Sbl^)Sz(wr2H{S~bYx60B?N|q z(6S|qp$YnhKenlRIjby&0)`>zvL%M=0=bdi>4Ypt@|{HPx)hAE2Gxd?Z!xNj;)D7g z`NHl>4gR?lEPMR$>yxC_SI7evU-^*kb}#z#>)RjwHTl~Gq5g#f+yAe9altIZ{#h`a z>sR;h-Mk(s{u^BjZFsA?WxSb!yocUQh^}g4>B*hhEeM@L;Y_J6xkJv08LY7mF#*I` z>o+hyMwM*B{3vG*iJud~bVcrcNo#F^pZ2ZZM+Hrpthwf9_*9fIA4r}$5@({6iRR9M zWqI2}^X$0!fvp?NQXiYUXPyD08}EjMW z$MrKA?|8Aq&U6E+Oa=LA%f#6{ZB$mStE^|)WuD5a{I;|35(lGi)eM=l!1mSVanB=* z2G~4$jLAK6xQ}47rF|?%yUF8*aCO4e@mtbxGXo!!(C14tNP_{(QAH!q7gz4e*(lA8 zo7}anq9&!b7RjlbNh})`6)*|;W5+?XBCLtq%TqNi4KW*0$o(SrI7Y3FC@naCtr1Gu zXkC(=HXPsWQ8=wQ1+5WEEly9PbijiFJ?- zV0=Um<<7B-1vtlXKH@ybImz-p@|(UR&P|+`L_Q+wW;;?I96!9i@LHg$7kr3gty*$B z7%I>%o8A{8z*|-*Lr?npKd&z+C_xOp*+PFRqS;ixH(V!WkxlUbzmm7r8 zrP-IB(sVbnuZ%RVeYWm04K&^`smAE7J^L7A4K~sUPQs}VDa9H>vEo`&e3n%hyyPA$ zXp!~e2rv|4(VDzbi)b~}j258PZ^H^gB@|{_4-gL5Yq-N?R?NW}LqH-gC%^;~RonmF zwkY6Pnb$c8Zs^XJatqy0`YH7KwFuobX*w=9y{@a4Z`r*xoUrS?9^fZpy1_?C5rxMeS@!SlAO+t80 zqqGyEpn%#b?kI7q@GaBU`JjWF(|r*B*>4j)lrO^34+?Z3J|0P*1x5`=(fvZEBO^t~ GC;$N0_xDr) diff --git a/projects/wave-core/assets/fonts/roboto/Fl4y0QdOxyyTHEGMXX8kcRJtnKITppOI_IvcXXDNrsc.woff2 b/projects/wave-core/assets/fonts/roboto/Fl4y0QdOxyyTHEGMXX8kcRJtnKITppOI_IvcXXDNrsc.woff2 deleted file mode 100644 index 137a9771227db1cff7cbf4caff402acf42735804..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9780 zcmV-4Cd=7(Pew8T0RR91046j55dZ)H09d#H043A_0ssI200000000000000000000 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 O{Yz6`=tuIX`v3s@w%oS> diff --git a/projects/wave-core/assets/fonts/roboto/Hgo13k-tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2 b/projects/wave-core/assets/fonts/roboto/Hgo13k-tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2 deleted file mode 100644 index c34c128065cbeee902296858fc0fc97860766212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14524 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 diff --git a/projects/wave-core/assets/fonts/roboto/NYDWBdD4gIq26G5XYbHsFBJtnKITppOI_IvcXXDNrsc.woff2 b/projects/wave-core/assets/fonts/roboto/NYDWBdD4gIq26G5XYbHsFBJtnKITppOI_IvcXXDNrsc.woff2 deleted file mode 100644 index a940e021c8cdb9e5674dc19427398f3dc6fa0497..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4836 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 K`BT6{N&x^*cwD0Z diff --git a/projects/wave-core/assets/fonts/roboto/NdF9MtnOpLzo-noMoG0miPesZW2xOQ-xsNqO47m55DA.woff2 b/projects/wave-core/assets/fonts/roboto/NdF9MtnOpLzo-noMoG0miPesZW2xOQ-xsNqO47m55DA.woff2 deleted file mode 100644 index 7936b665b54003fab3aafced6d6ae16c751d3736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4896 zcmV+*6W{E2Pew8T0RR91023ep5&!@I04{U@0206e0ssI200000000000000000000 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 Stqovy*8;1vBH2AlK^6c6HeG@M diff --git a/projects/wave-core/assets/fonts/roboto/Pru33qjShpZSmG3z6VYwnRJtnKITppOI_IvcXXDNrsc.woff2 b/projects/wave-core/assets/fonts/roboto/Pru33qjShpZSmG3z6VYwnRJtnKITppOI_IvcXXDNrsc.woff2 deleted file mode 100644 index 8acbd411cb60099d01efa22a6a49e89602cbab61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11852 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 G3>5`@hY1G& diff --git a/projects/wave-core/assets/fonts/roboto/ek4gzZ-GeXAPcSbHtCeQI_esZW2xOQ-xsNqO47m55DA.woff2 b/projects/wave-core/assets/fonts/roboto/ek4gzZ-GeXAPcSbHtCeQI_esZW2xOQ-xsNqO47m55DA.woff2 deleted file mode 100644 index e4546e49304d4499c5dfb8dd45626afc3dd8459a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15832 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 ilgW1vW5`h!}HUcCAgd7Wk5C8-q1%eOcS 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 WCa?E`${Nr6J&WjV<7!di4FCYRVoq}a diff --git a/projects/wave-core/assets/fonts/roboto/roboto.css b/projects/wave-core/assets/fonts/roboto/roboto.css deleted file mode 100644 index b1b63637..00000000 --- a/projects/wave-core/assets/fonts/roboto/roboto.css +++ /dev/null @@ -1,114 +0,0 @@ -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(0eC6fl06luXEYWpBSJvXCBJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); - unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(Fl4y0QdOxyyTHEGMXX8kcRJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(-L14Jk06m6pUHB-5mXQQnRJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(I3S1wsgSg9YCurV6PUkTORJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(NYDWBdD4gIq26G5XYbHsFBJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); - unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(Pru33qjShpZSmG3z6VYwnRJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); - unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(Hgo13k-tfSpn0qi1SFdUfVtXRa8TVwTICgirnJhmVJw.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, - U+F000; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(ek4gzZ-GeXAPcSbHtCeQI_esZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); - unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(mErvLBYg_cXG3rLvUsKT_fesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(-2n2p-_Y08sg57CNWQfKNvesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(u0TOpm082MNkS5K0Q4rhqvesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(NdF9MtnOpLzo-noMoG0miPesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); - unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(Fcx7Wwv8OzT71A3E1XOAjvesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); - unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(CWB0XYA8bzo0kSThX0UTuA.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, - U+F000; -} diff --git a/projects/wave-core/assets/fonts/roboto/u0TOpm082MNkS5K0Q4rhqvesZW2xOQ-xsNqO47m55DA.woff2 b/projects/wave-core/assets/fonts/roboto/u0TOpm082MNkS5K0Q4rhqvesZW2xOQ-xsNqO47m55DA.woff2 deleted file mode 100644 index f630772d1010d173db182c0a7d6fa3f95da19972..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7208 zcmV+@9M|J_Pew8T0RR91030X)5&!@I06E+M02{^t0ssI200000000000000000000 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�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 diff --git a/projects/wave-core/assets/gbif-default-fields.json b/projects/wave-core/assets/gbif-default-fields.json deleted file mode 100644 index e40dff87..00000000 --- a/projects/wave-core/assets/gbif-default-fields.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "name": "gbifid", - "datatype": "Int32" - }, - { - "name": "basisofrecord", - "datatype": "Alphanumeric" - }, - { - "name": "scientificname", - "datatype": "Alphanumeric" - } -] diff --git a/projects/wave-core/assets/geobon-logo.svg b/projects/wave-core/assets/geobon-logo.svg deleted file mode 100644 index 03e10243..00000000 --- a/projects/wave-core/assets/geobon-logo.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/projects/wave-core/assets/icons/cogs.svg b/projects/wave-core/assets/icons/cogs.svg deleted file mode 100644 index db93d9b7..00000000 --- a/projects/wave-core/assets/icons/cogs.svg +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/projects/wave-core/assets/icons/grid4_24.svg b/projects/wave-core/assets/icons/grid4_24.svg deleted file mode 100644 index 2864703c..00000000 --- a/projects/wave-core/assets/icons/grid4_24.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/projects/wave-core/assets/icons/grid5_24.svg b/projects/wave-core/assets/icons/grid5_24.svg deleted file mode 100644 index b2bc0f73..00000000 --- a/projects/wave-core/assets/icons/grid5_24.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/projects/wave-core/assets/icons/line_24.svg b/projects/wave-core/assets/icons/line_24.svg deleted file mode 100644 index 1af01def..00000000 --- a/projects/wave-core/assets/icons/line_24.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projects/wave-core/assets/icons/point_24.svg b/projects/wave-core/assets/icons/point_24.svg deleted file mode 100644 index 444f0f8a..00000000 --- a/projects/wave-core/assets/icons/point_24.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projects/wave-core/assets/icons/polygon_24.svg b/projects/wave-core/assets/icons/polygon_24.svg deleted file mode 100644 index bad514e8..00000000 --- a/projects/wave-core/assets/icons/polygon_24.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projects/wave-core/assets/images/lineage.png b/projects/wave-core/assets/images/lineage.png deleted file mode 100644 index 4e5e11389ecd7cd8915af9aee82afa361aa14f51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66283 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 KMNUMnLSTZb(i67; diff --git a/projects/wave-core/assets/images/logo_umr.png b/projects/wave-core/assets/images/logo_umr.png deleted file mode 100644 index a4b3111a046e582e647b372f7babe241e24b2000..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19199 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 z 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%0AD>UxfhHKJKY^X!qf~L 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≦>I*Fq5_uon^g8U7DF@}FQvF( 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 diff --git a/projects/wave-core/assets/mapping-data-sources.json b/projects/wave-core/assets/mapping-data-sources.json deleted file mode 100644 index 81c590a6..00000000 --- a/projects/wave-core/assets/mapping-data-sources.json +++ /dev/null @@ -1,913 +0,0 @@ -{ - "sourcelist": { - "isric_wise": { - "name": "ISRIC-WISE", - "channels": [ - { - "name": "bsat", - "datatype": "Float64", - "max": 100, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "bulk", - "datatype": "Float64", - "max": 2, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "cecc", - "datatype": "Float64", - "max": 115, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "cecs", - "datatype": "Float64", - "max": 103, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "cfrag", - "datatype": "Float64", - "max": 37, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "clpc", - "datatype": "Float64", - "max": 54, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "cnrt", - "datatype": "Float64", - "max": 29, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "ecec", - "datatype": "Float64", - "max": 51, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "elco", - "datatype": "Float64", - "max": 32, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "gyps", - "datatype": "Float64", - "max": 200, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "phaq", - "datatype": "Float64", - "max": 9, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "prop", - "datatype": "Float64", - "max": 100, - "min": 24, - "nodata": -1.7976931348623e308 - }, - { - "name": "sdto", - "datatype": "Float64", - "max": 98, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "tawc", - "datatype": "Float64", - "max": 38, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "tceq", - "datatype": "Float64", - "max": 212, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "totc", - "datatype": "Float64", - "max": 408, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "totn", - "datatype": "Float64", - "max": 26, - "min": -7, - "nodata": -1.7976931348623e308 - }, - { - "name": "stpc", - "datatype": "Float64", - "max": 51, - "min": -7, - "nodata": -1.7976931348623e308 - } - ], - "coords": { - "epsg": 4326, - "origin": [-179.99999999952, 83.583332774984], - "scale": [0.083333333, -0.083333333], - "size": [4319, 1675] - } - }, - "worldclim": { - "name": "WorldClim", - "channels": [ - { - "name": "Min Temp", - "colorizer": "temperature", - "datatype": "Int16", - "max": 1000, - "min": -1000, - "nodata": -9999, - "transform": { - "datatype": "Float32", - "offset": 0, - "scale": 0.1 - } - }, - { - "name": "Max Temp", - "colorizer": "temperature", - "datatype": "Int16", - "max": 1000, - "min": -1000, - "nodata": -9999, - "transform": { - "datatype": "Float32", - "offset": 0, - "scale": 0.1 - } - }, - { - "name": "Avg Temp", - "colorizer": "temperature", - "datatype": "Int16", - "max": 1000, - "min": -1000, - "nodata": -9999, - "transform": { - "datatype": "Float32", - "offset": 0, - "scale": 0.1 - } - }, - { - "name": "Precipitation", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Altitude", - "colorizer": "height", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Bio 1 (annual mean temperature)", - "colorizer": "temperature", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999, - "transform": { - "datatype": "Float32", - "offset": 0, - "scale": 0.1 - } - }, - { - "name": "Bio 2 (mean diurnal range)", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Bio 3 (isothermality)", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Bio 4 (temp seasonality)", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Bio 5 (max temp of warmest month)", - "colorizer": "temperature", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999, - "transform": { - "datatype": "Float32", - "offset": 0, - "scale": 0.1 - } - }, - { - "name": "Bio 6 (min temp of coldest month)", - "colorizer": "temperature", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999, - "transform": { - "datatype": "Float32", - "offset": 0, - "scale": 0.1 - } - }, - { - "name": "Bio 7 (temp annual range)", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Bio 8 (mean temp of wettest quarter)", - "colorizer": "temperature", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999, - "transform": { - "datatype": "Float32", - "offset": 0, - "scale": 0.1 - } - }, - { - "name": "Bio 9 (mean temp of dryest quarter)", - "colorizer": "temperature", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999, - "transform": { - "datatype": "Float32", - "offset": 0, - "scale": 0.1 - } - }, - { - "name": "Bio 10 (mean temp of warmest quarter)", - "colorizer": "temperature", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999, - "transform": { - "datatype": "Float32", - "offset": 0, - "scale": 0.1 - } - }, - { - "name": "Bio 11 (mean temp of coldest quarter)", - "colorizer": "temperature", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999, - "transform": { - "datatype": "Float32", - "offset": 0, - "scale": 0.1 - } - }, - { - "name": "Bio 12 (annual precipitation)", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Bio 13 (prec of wettest month)", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Bio 14 (prec of driest month)", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Bio 15 (prec seasonality)", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Bio 16 (prec of wettest quarter)", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Bio 17 (prec of driest quarter)", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Bio 18 (prec of warmest quarter)", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Bio 19 (prec of coldest quarter)", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - } - ], - "coords": { - "epsg": 4326, - "origin": [-180, 90], - "scale": [0.0083333333333333, -0.0083333333333333], - "size": [43200, 18000] - } - }, - "msg9_geos": { - "name": "Meteosat 2nd Generation", - "colorizer": "grey", - "channels": [ - { - "datatype": "Int16", - "nodata": 0, - "name": "VIS 0.6", - "unit": { - "measurement": "raw", - "unit": "unknown", - "interpolation": "continuous", - "min": 0, - "max": 1023 - }, - "transform": { - "datatype": "Float32", - "offset": "msg.CalibrationOffset", - "scale": "msg.CalibrationSlope", - "unit": { - "measurement": "radiance", - "unit": "W\u00b7m^(-2)\u00b7sr^(-1)\u00b7cm^(-1)", - "interpolation": "continuous" - } - } - }, - { - "datatype": "Int16", - "nodata": 0, - "name": "VIS 0.8", - "unit": { - "measurement": "raw", - "unit": "unknown", - "interpolation": "continuous", - "min": 0, - "max": 1023 - }, - "transform": { - "datatype": "Float32", - "offset": "msg.CalibrationOffset", - "scale": "msg.CalibrationSlope", - "unit": { - "measurement": "radiance", - "unit": "W\u00b7m^(-2)\u00b7sr^(-1)\u00b7cm^(-1)", - "interpolation": "continuous" - } - } - }, - { - "datatype": "Int16", - "nodata": 0, - "name": "NIR 1.6", - "unit": { - "measurement": "raw", - "unit": "unknown", - "interpolation": "continuous", - "min": 0, - "max": 1023 - }, - "transform": { - "datatype": "Float32", - "offset": "msg.CalibrationOffset", - "scale": "msg.CalibrationSlope", - "unit": { - "measurement": "radiance", - "unit": "W\u00b7m^(-2)\u00b7sr^(-1)\u00b7cm^(-1)", - "interpolation": "continuous" - } - } - }, - { - "datatype": "Int16", - "nodata": 0, - "name": "IR 3.9", - "unit": { - "measurement": "raw", - "unit": "unknown", - "interpolation": "continuous", - "min": 0, - "max": 1023 - }, - "transform": { - "datatype": "Float32", - "offset": "msg.CalibrationOffset", - "scale": "msg.CalibrationSlope", - "unit": { - "measurement": "radiance", - "unit": "W\u00b7m^(-2)\u00b7sr^(-1)\u00b7cm^(-1)", - "interpolation": "continuous" - } - } - }, - { - "datatype": "Int16", - "nodata": 0, - "name": "WV 6.2", - "unit": { - "measurement": "raw", - "unit": "unknown", - "interpolation": "continuous", - "min": 0, - "max": 1023 - }, - "transform": { - "datatype": "Float32", - "offset": "msg.CalibrationOffset", - "scale": "msg.CalibrationSlope", - "unit": { - "measurement": "radiance", - "unit": "W\u00b7m^(-2)\u00b7sr^(-1)\u00b7cm^(-1)", - "interpolation": "continuous" - } - } - }, - { - "datatype": "Int16", - "nodata": 0, - "name": "WV 7.3", - "unit": { - "measurement": "raw", - "unit": "unknown", - "interpolation": "continuous", - "min": 0, - "max": 1023 - }, - "transform": { - "datatype": "Float32", - "offset": "msg.CalibrationOffset", - "scale": "msg.CalibrationSlope", - "unit": { - "measurement": "radiance", - "unit": "W\u00b7m^(-2)\u00b7sr^(-1)\u00b7cm^(-1)", - "interpolation": "continuous" - } - } - }, - { - "datatype": "Int16", - "nodata": 0, - "name": "IR 8.7", - "unit": { - "measurement": "raw", - "unit": "unknown", - "interpolation": "continuous", - "min": 0, - "max": 1023 - }, - "transform": { - "datatype": "Float32", - "offset": "msg.CalibrationOffset", - "scale": "msg.CalibrationSlope", - "unit": { - "measurement": "radiance", - "unit": "W\u00b7m^(-2)\u00b7sr^(-1)\u00b7cm^(-1)", - "interpolation": "continuous" - } - } - }, - { - "datatype": "Int16", - "nodata": 0, - "name": "IR 9.7", - "unit": { - "measurement": "raw", - "unit": "unknown", - "interpolation": "continuous", - "min": 0, - "max": 1023 - }, - "transform": { - "datatype": "Float32", - "offset": "msg.CalibrationOffset", - "scale": "msg.CalibrationSlope", - "unit": { - "measurement": "radiance", - "unit": "W\u00b7m^(-2)\u00b7sr^(-1)\u00b7cm^(-1)", - "interpolation": "continuous" - } - } - }, - { - "datatype": "Int16", - "nodata": 0, - "name": "IR 10.8", - "unit": { - "measurement": "raw", - "unit": "unknown", - "interpolation": "continuous", - "min": 0, - "max": 1023 - }, - "transform": { - "datatype": "Float32", - "offset": "msg.CalibrationOffset", - "scale": "msg.CalibrationSlope", - "unit": { - "measurement": "radiance", - "unit": "W\u00b7m^(-2)\u00b7sr^(-1)\u00b7cm^(-1)", - "interpolation": "continuous" - } - } - }, - { - "datatype": "Int16", - "nodata": 0, - "name": "IR 12.0", - "unit": { - "measurement": "raw", - "unit": "unknown", - "interpolation": "continuous", - "min": 0, - "max": 1023 - }, - "transform": { - "datatype": "Float32", - "offset": "msg.CalibrationOffset", - "scale": "msg.CalibrationSlope", - "unit": { - "measurement": "radiance", - "unit": "W\u00b7m^(-2)\u00b7sr^(-1)\u00b7cm^(-1)", - "interpolation": "continuous" - } - } - }, - { - "datatype": "Int16", - "nodata": 0, - "name": "IR 13.4", - "unit": { - "measurement": "raw", - "unit": "unknown", - "interpolation": "continuous", - "min": 0, - "max": 1023 - }, - "transform": { - "datatype": "Float32", - "offset": "msg.CalibrationOffset", - "scale": "msg.CalibrationSlope", - "unit": { - "measurement": "radiance", - "unit": "W\u00b7m^(-2)\u00b7sr^(-1)\u00b7cm^(-1)", - "interpolation": "continuous" - } - } - } - ], - "coords": { - "epsg": 40453, - "origin": [-5570248.4773393, 5570248.4773393], - "scale": [3000.4031658173, -3000.4031658173], - "size": [3712, 3712] - } - }, - "srtm": { - "name": "SRTM elevation model", - "colorizer": "height", - "channels": [ - { - "name": "Elevation", - "datatype": "Int16", - "nodata": -32768, - "unit": { - "measurement": "elevation", - "unit": "m" - } - } - ], - "coords": { - "epsg": 4326, - "origin": [-180, 60], - "scale": [0.00083333333333334, -0.00083333333333334], - "size": [432000, 144000] - } - }, - "glc2000_global": { - "name": "Global Land Cover Map for the Year 2000", - "colorizer": "glc", - "channels": [ - { - "datatype": "Byte", - "nodata": 0, - "unit": { - "measurement": "land usage", - "unit": "classification", - "classes": { - "1": "Tree Cover, broadleaved, evergreen", - "2": "Tree Cover, broadleaved, deciduous, closed", - "3": "Tree Cover, broadleaved, deciduous, open", - "4": "Tree Cover, needle-leaved, evergreen", - "5": "Tree Cover, needle-leaved, deciduous", - "6": "Tree Cover, mixed leaf type", - "7": "Tree Cover, regularly flooded, fresh water", - "8": "Tree Cover, regularly flooded, saline water", - "9": "Mosaic: Tree Cover / Other natural vegetation", - "10": "Tree Cover, burnt", - "11": "Shrub Cover, closed-open, evergreen", - "12": "Shrub Cover, closed-open, deciduous", - "13": "Herbaceous Cover, closed-open", - "14": "Sparse Herbaceous or sparse Shrub Cover", - "15": "Regularly flooded Shrub and/or Herbaceous Cover", - "16": "Cultivated and managed areas", - "17": "Mosaic: Cropland / Tree Cover / Other natural vegetation", - "18": "Mosaic: Cropland / Shrub or Grass Cover", - "19": "Bare Areas", - "20": "Water Bodies", - "21": "Snow and Ice", - "22": "Artificial surfaced and associated areas" - } - } - } - ], - "coords": { - "epsg": 4326, - "origin": [-180, 90], - "scale": [0.0089285714, -0.0089285714], - "size": [40320, 16353] - } - }, - "cruts": { - "name": "CRU Time Series", - "colorizer": "grey", - "channels": [ - { - "datatype": "Float64", - "max": 100, - "min": -100, - "nodata": 9.9692099683869e36, - "name": "Mean temperature (tmp)", - "colorizer": "temperature" - }, - { - "datatype": "Float64", - "max": 100, - "min": -100, - "nodata": 9.9692099683869e36, - "name": "Min temperature (tmn)", - "colorizer": "temperature" - }, - { - "datatype": "Float64", - "max": 100, - "min": -100, - "nodata": 9.9692099683869e36, - "name": "Max temperature (tmx)", - "colorizer": "temperature" - }, - { - "datatype": "Float64", - "max": 100, - "min": -100, - "nodata": 9.9692099683869e36, - "name": "Diurnal temperature range (dtr)" - }, - { - "datatype": "Float64", - "max": 100, - "min": -100, - "nodata": 9.9692099683869e36, - "name": "cloud cover (cld)" - }, - { - "datatype": "Float64", - "max": 100, - "min": -100, - "nodata": 9.9692099683869e36, - "name": "Potential evopotranspiration (pet)" - }, - { - "datatype": "Float64", - "max": 100, - "min": -100, - "nodata": 9.9692099683869e36, - "name": "Precipitation total (pre)" - }, - { - "datatype": "Float64", - "max": 100, - "min": -100, - "nodata": 9.9692099683869e36, - "name": "Vapor Pressure (vap)" - }, - { - "datatype": "Float64", - "max": 31, - "min": 0, - "nodata": 9.9692099683869e36, - "name": "Rainday counts (wet)" - }, - { - "datatype": "Float64", - "max": 31, - "min": 0, - "nodata": 9.9692099683869e36, - "name": "Frostdays counts (frs)" - } - ], - "coords": { - "epsg": 4326, - "origin": [-180, 90], - "scale": [0.5, -0.5], - "size": [720, 360] - } - }, - "msg9_geos_hrv": { - "name": "Meteosat 2nd Generation HRV", - "colorizer": "grey", - "channels": [ - { - "datatype": "Int16", - "nodata": 0, - "name": "HRV", - "unit": { - "measurement": "raw", - "unit": "unknown", - "interpolation": "continuous", - "min": 0, - "max": 1023 - }, - "transform": { - "datatype": "Float32", - "offset": "msg.CalibrationOffset", - "scale": "msg.CalibrationSlope", - "unit": { - "measurement": "radiance", - "unit": "W\u00b7m^(-2)\u00b7sr^(-1)\u00b7cm^(-1)", - "interpolation": "continuous" - } - } - } - ], - "coords": { - "epsg": 40453, - "origin": [-5571248.3903748, 5571248.3903748], - "scale": [1000.1343488693, -1000.1343488693], - "size": [11136, 11136] - } - }, - "modis_vcf": { - "name": "MODIS Vegetation Continuous Fields", - "colorizer": "gray", - "channels": [ - { - "name": "TRE", - "datatype": "Byte", - "max": 100, - "min": 0, - "nodata": 200 - } - ], - "coords": { - "epsg": 4326, - "origin": [-180, 84], - "scale": [0.002083333333333, -0.002083333333333], - "size": [172800, 71040] - } - }, - "btw2015_paper_demo": { - "name": "BTW Paper Demo Data", - "channels": [ - { - "name": "Worldclim Precipitation December", - "datatype": "Int16", - "max": 310, - "min": 0, - "nodata": -9999 - }, - { - "name": "Worldclim Precipitation January", - "datatype": "Int16", - "max": 310, - "min": 0, - "nodata": -9999 - }, - { - "name": "Mean Temperature December", - "colorizer": "temperature", - "datatype": "Int16", - "max": 300, - "min": -400, - "nodata": -9999, - "transform": { - "datatype": "Float32", - "offset": 0, - "scale": 0.1 - } - }, - { - "name": "Mean Temperature January", - "colorizer": "temperature", - "datatype": "Int16", - "max": 300, - "min": -400, - "nodata": -9999, - "transform": { - "datatype": "Float32", - "offset": 0, - "scale": 0.1 - } - }, - { - "name": "Worldclim Altitude", - "colorizer": "height", - "datatype": "Int16", - "max": 1500, - "min": -0, - "nodata": -9999 - }, - { - "name": "Global Land Cover 2000", - "colorizer": "glc", - "datatype": "Byte", - "max": 23, - "min": 1, - "nodata": 0 - }, - { - "name": "Result of the workflow", - "colorizer": "grey", - "datatype": "Byte", - "min": 0, - "max": 2, - "nodata": 2 - } - ], - "coords": { - "epsg": 4326, - "origin": [-179.004, 85.0045], - "scale": [0.00833333, -0.00833333], - "size": [42960, 16800] - } - } - } -} diff --git a/projects/wave-core/assets/operator-type-icons/expression.png b/projects/wave-core/assets/operator-type-icons/expression.png deleted file mode 100644 index 5d32eb61af191a25934e4851d16013377a19e653..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3247 zcmc&%c{~)}79ZOr*(HXoza%?9ga%WVkeF`PgO5ZOx1Od}1+5@C=m zg^_*Vm$8osZ~DAH-h2PPKi<2a&$;Jw@BQ9$&i94<|%o(X8l+iJsx<2o%|GC2e_TEmiUcQg=Hr4q60A^_eom=KX`5P0#-kJLX9orNyZANzONOpYy zh{ogzjMki9N6oySrYt$yH>>jNf{Bc%XmP;c;}^7vrbTv1dJMWcIzFWjqvaEsv?8y) z%D?Ry&F*`4)Pbvq3ZtAqKN$VhuP*!7N7*&|-ZqU)+kiN)?qX#@x2h9Z^W=sdq?oGp> zZE5t0^Mc%h(y;nSZqpdcd%#!|7#}f2G`tM~OLTgG5ufegZtE7PiiRwmIE1HuI#wg| zkcA$8;Mw+DmTBj$+uXnW&xHOznElIVydBi2iAnqT&I^M>PW=4b>`jcgsjMNl^nRp$ zRl%J)=AmoPQG+4VcA!}v^!&r@fvY~7~v)C1yvYAj96hNF+#J40;R zs|woaXoO<>nT_;(h^!CpENmVsT7oib;&KHo=ORQnTDb?cdW`3nixP*Jy zWIj5gm!IU_y(Hgbbqv4q(giQsI?sQEM-5P4246aCO^UPP?5@2H7XX93gFUjQtLd|P z*#_C%ZvdcyQvflXvcp zSb?dLiQ+GI(l7EMeqacFu>)y9!#gu-JZ7IL^PQ933b;_9h6;L2NOO5&5=U`nb$%z( zwCWn$uyw+)QG5F4sv;25`?giZ{vm^s*BLD|{8Kz%*X-0SJV{WV=ue|bXGI6)M_jjZ zvwS)lS4E20>N%FC`yr`r21;l)wzH%b9tVm+ZI4)E0WSFpNuV(;NPg&^skTkT9(Ur7 zoS5bed!x{0ThBwu#mCduW7#sNlDvo;w1srQpPtwrMuK0XWad`Sjyb7uf)g(u`Z|}VD8arT9Au`#)+VjRNH@A0tFNE) z$f&NDlw&J2Hn~OD>}yomwa2?(y>(YRV9=!L#^CJ`3tpplkPzjO!rDDq>kB2ac~-A` zUp+ee+C#Z4TfMm=$mYGtLrL(ls;mtMa@WU-ia*505J?*Fi%kiLd>m@7uF@8sJKVNhuBRjkw4YSv`Pex9JjfM>*g zWs+PFCuKqXL!FakiemJX5gBX`Aq)_=cjDVK(Sut!ukXQx;NvF|B6rkL6 zpK&7A*zsGwsU4IN0@u(}n_qHt!57aQ(LiXnw(m|Y1g!}kf7~b%qKb0(n30g`v*PGj zz?G{JJ#Auc+Je<<=pvcRNIHfVwuV8JD(w0Otx1Uu|xAIy+@dmboj#Q}O%vjd0Oj90c za6Q86qr$pEJsVidG?A=x_A|=**FwpXqAfim@0=JT&yzoQ}vs*`WvN5 z{2;UY*UBhwhR%o`mW_ZdKzri8v#H?QzwyCmP&S%dgaaJPZg?ldAj)cPDRMB-M9o}YpU*hC zI^e*w55li!gCh$yXip)WYU1Yd($=aaZSm_UXpZ0u3){R;tNLceO02)$p)|7@mh7C+-9hkNwERpPRYTSVUgfxFR=tC+;0paPvTf0 z(ubJC_hiZBRqmUHaV!2EBNK6!`}2Z;RaG>dEz2i0NVM-yFYGQaB3<29I1ES;7dd+1 zcG9?n{AyxMC&+}zM>oH-%nAM&L5z37e{oE9bx#gvQawWj(j_bOe080j{~ac@Z{4kO zUm5Z3-Z+m5oj~3y+N>6*u&6MdyL;W}I+6Lt=O!V=ZFs-Yd(tLr)x=YWFxuar_h@sc zPw{#CyGNS($Dq_tyIQ<{8A;VAcWvO<+h{p&P$8eExF{B@6p-whP}ow@-VlE zQU_GV(uoz?iMGj+j4AS@9pzxIa%DX6I%4&7sc_2;jmHgbb3;Er(%XO_ArK{0>hK0$(@t zvdx{gJ!Pl?oX}+N^}R-6com6*G_imb3?Yqi4{}K#h=xUJ7fksm!|p^EG)Qs$tBd=$ dp13W7CJ5Ln diff --git a/projects/wave-core/karma.conf.js b/projects/wave-core/karma.conf.js deleted file mode 100644 index 2dc5bb88..00000000 --- a/projects/wave-core/karma.conf.js +++ /dev/null @@ -1,32 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular-devkit/build-angular/plugins/karma'), - ], - client: { - clearContext: false, // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - dir: require('path').join(__dirname, '../../coverage/wave-core'), - reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true, - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true, - }); -}; diff --git a/projects/wave-core/ng-package.json b/projects/wave-core/ng-package.json deleted file mode 100644 index 5533c0f3..00000000 --- a/projects/wave-core/ng-package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", - "dest": "../../dist/wave-core", - "lib": { - "entryFile": "src/public-api.ts", - "umdModuleIds": { - "codemirror": "codemirror", - "d3": "d3", - "dagre-d3": "dagreD3", - "immutable": "immutable", - "moment": "moment", - "ngx-color-picker": "ngxColorPicker", - "ol/Collection": "OlCollection", - "ol/Map": "OlMap", - "ol/View": "OlView", - "ol/extent": "extent", - "ol/format": "format", - "ol/format/GeoJSON": "OlFormatGeoJSON", - "ol/geom/GeometryType": "OlGeometryType", - "ol/geom/Point": "OlGeomPoint", - "ol/interaction/Draw": "OlInteractionDraw", - "ol/interaction/Select": "OlInteractionSelect", - "ol/layer": "layer", - "ol/layer/Image": "OlLayerImage", - "ol/layer/Tile": "OlLayerTile", - "ol/layer/Vector": "OlLayerVector", - "ol/proj": "proj", - "ol/proj/proj4": "olproj4", - "ol/source": "source", - "ol/source/ImageStatic": "OlImageStatic", - "ol/source/OSM": "OlSourceOSM", - "ol/source/TileWMS": "OlTileWmsSource", - "ol/source/Vector": "OlSourceVector", - "ol/source/XYZ": "XYZ", - "ol/style": "style", - "ol/style/Fill": "OlStyleFill", - "ol/style/Stroke": "OlStyleStroke", - "ol/style/Style": "OlStyleStyle", - "papaparse": "papaparse", - "proj4": "proj4" - } - }, - "assets": ["assets"] -} diff --git a/projects/wave-core/package.json b/projects/wave-core/package.json deleted file mode 100644 index 64129d34..00000000 --- a/projects/wave-core/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "@umr-dbs/wave-core", - "version": "0.2.11", - "repository": { - "type": "git", - "url": "git://github.com/umr-dbs/wave.git" - }, - "publishConfig": { - "registry": "https://npm.pkg.github.com/" - }, - "peerDependencies": { - "@angular/cdk": "~10.2.4", - "@angular/common": "^10.1.5", - "@angular/core": "^10.1.5", - "@angular/forms": "~10.1.5", - "@angular/material": "~10.2.4", - "codemirror": "~5.58.1", - "d3": "~5.16.0", - "dagre": "~0.8.5", - "dagre-d3": "~0.6.4", - "immutable": "~4.0.0-rc.12", - "moment": "~2.29.1", - "ngx-color-picker": "~9.0.0", - "ol": "~6.4.3", - "papaparse": "~5.3.0", - "proj4": "~2.6.2", - "tslib": "^1.14.0" - } -} diff --git a/projects/wave-core/src/lib/colors/color-breakpoint-component/color-breakpoint.component.html b/projects/wave-core/src/lib/colors/color-breakpoint-component/color-breakpoint.component.html deleted file mode 100644 index dadc6bc5..00000000 --- a/projects/wave-core/src/lib/colors/color-breakpoint-component/color-breakpoint.component.html +++ /dev/null @@ -1,38 +0,0 @@ -

diff --git a/projects/wave-core/src/lib/colors/color-breakpoint-component/color-breakpoint.component.scss b/projects/wave-core/src/lib/colors/color-breakpoint-component/color-breakpoint.component.scss deleted file mode 100644 index 3b4d0375..00000000 --- a/projects/wave-core/src/lib/colors/color-breakpoint-component/color-breakpoint.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -.colorizerEntries { - font-size: 0.8rem; -} - -mat-form-field >>> .color_cell { - color: black !important; - text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff !important; -} diff --git a/projects/wave-core/src/lib/colors/color-breakpoint-component/color-breakpoint.component.ts b/projects/wave-core/src/lib/colors/color-breakpoint-component/color-breakpoint.component.ts deleted file mode 100644 index 521acd94..00000000 --- a/projects/wave-core/src/lib/colors/color-breakpoint-component/color-breakpoint.component.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { - Component, - ChangeDetectionStrategy, - ChangeDetectorRef, - AfterViewInit, - Input, - forwardRef, - OnChanges, - SimpleChanges, -} from '@angular/core'; - -import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms'; -import {ColorBreakpoint} from '../color-breakpoint.model'; -import {Color, stringToRgbaStruct} from '../color'; - -@Component({ - selector: 'wave-color-breakpoint', - templateUrl: './color-breakpoint.component.html', - styleUrls: ['./color-breakpoint.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ColorBreakpointInputComponent), multi: true}], -}) -export class ColorBreakpointInputComponent implements ControlValueAccessor, AfterViewInit, OnChanges { - @Input() disabledAttribute: false; - @Input() disabledColor: false; - @Input() inputType: 'number' | 'string' = 'number'; - @Input() attributePlaceholder = 'attribute'; - @Input() colorPlaceholder: 'color'; - - private _colorBreakpoint: ColorBreakpoint; - onTouched: () => void; - onChange: (_: ColorBreakpoint) => void = undefined; - - constructor(private changeDetectorRef: ChangeDetectorRef) {} - - get colorBreakpoint(): ColorBreakpoint { - return this._colorBreakpoint; - } - - // set accessor including call the onchange callback - set colorBreakpoint(brk: ColorBreakpoint) { - if (brk && !brk.equals(this._colorBreakpoint)) { - this._colorBreakpoint = brk; - } - } - - updateValue(value: number | string) { - // TODO: should this really clone? - if (value && value !== this.colorBreakpoint.value) { - if (this.inputType === 'number' && typeof value === 'string') { - this.colorBreakpoint.setValue(parseFloat(value as string)); - } else { - this.colorBreakpoint.setValue(value); - } - this.propagateChange(); - } - } - - updateColor(color: string) { - // TODO: should this really clone? - if (color) { - const clr = Color.fromRgbaLike(stringToRgbaStruct(color)); - if (!clr.equals(this._colorBreakpoint.rgba)) { - this.colorBreakpoint.setColor(clr); - } - this.propagateChange(); - } - } - - ngAfterViewInit() { - // setTimeout(() => this.changeDetectorRef.markForCheck(), 0); - } - - ngOnChanges(changes: SimpleChanges) { - for (const propName in changes) { - // eslint-disable-line guard-for-in - switch (propName) { - case 'inputType': - case 'attributePlaceholder': - case 'colorPlaceholder': { - this.changeDetectorRef.markForCheck(); - break; - } - - default: { - } // DO NOTHING - } - } - } - - // Set touched on blur - onBlur() { - this.onTouched(); - } - - writeValue(brk: ColorBreakpoint): void { - this.colorBreakpoint = brk; - } - - registerOnChange(fn: (_: ColorBreakpoint) => void): void { - this.onChange = fn; - this.propagateChange(); - } - - registerOnTouched(fn: () => void): void { - this.onTouched = fn; - } - - private propagateChange() { - if (this.onChange && this.colorBreakpoint) { - this.onChange(this.colorBreakpoint.clone()); - } - } -} diff --git a/projects/wave-core/src/lib/colors/color-breakpoint.model.ts b/projects/wave-core/src/lib/colors/color-breakpoint.model.ts deleted file mode 100644 index 70721f6d..00000000 --- a/projects/wave-core/src/lib/colors/color-breakpoint.model.ts +++ /dev/null @@ -1,108 +0,0 @@ -import {Color, RgbaLike, RgbaStruct} from './color'; - -export type BreakPointValue = string | number; - -export interface ColorBreakpointDict { - value: BreakPointValue; - rgba: RgbaLike; -} - -/** - * A ColorBreakpoint is a tuple consisting of value and RGBA. - */ -export class ColorBreakpoint implements ColorBreakpointDict { - value: BreakPointValue; - rgba: Color; - - constructor(config: ColorBreakpointDict) { - this.rgba = Color.fromRgbaLike(config.rgba); - this.value = config.value; - } - - /** - * Clones the ColorBreakpoint - */ - clone(): ColorBreakpoint { - return new ColorBreakpoint({ - value: this.value, - rgba: this.rgba.clone(), - }); - } - - /** - * Clones the ColorBreakpoint and replaces the color. - */ - cloneWithColor(color: RgbaLike): ColorBreakpoint { - const cln = this.clone(); - cln.setColor(color); - return cln; - } - - /** - * Clones the ColorBreakpoint and replaces the value. - */ - cloneWithValue(value: BreakPointValue): ColorBreakpoint { - const cln = this.clone(); - cln.setValue(value); - return cln; - } - - /** - * Transforms the ColorBreakpoint int a ColorBreakpointDict. - */ - toDict(): ColorBreakpointDict { - return { - value: this.value, - rgba: this.rgba.rgbaTuple(), - }; - } - - /** - * Sets the color to the provided value. - */ - setColor(color: RgbaLike) { - this.rgba = Color.fromRgbaLike(color); - } - - /** - * Sets the value of the ColorBreakpoint to the provided value. - */ - setValue(value: BreakPointValue) { - this.value = value; - } - - /** - * Returns true if the value is a number. - */ - valueIsNumber(): boolean { - return typeof this.value === 'number'; - } - - /** - * Tests a ColorBreakpoint for equality with another one. - */ - equals(other: ColorBreakpoint): boolean { - return other && this.rgba.equals(other.rgba) && this.value === other.value; - } - - /** - * Transforms the ColorBreakpoint into a representation understood by Mapping's colorizer. - */ - asMappingRasterColorizerBreakpoint(): IMappingRasterColorizerBreakpoint { - return { - value: this.value as number, // TODO: handle cases where this might be a string? - r: this.rgba.r, - g: this.rgba.g, - b: this.rgba.b, - a: this.rgba.a * 255, // TODO: mapping uses alpha values from 0-255 change this? - }; - } -} - -/** - * The json representation expected by mapping. - */ -export interface IMappingRasterColorizerBreakpoint extends RgbaStruct { - value: number; - name?: string; -} diff --git a/projects/wave-core/src/lib/colors/color.ts b/projects/wave-core/src/lib/colors/color.ts deleted file mode 100644 index 217e9368..00000000 --- a/projects/wave-core/src/lib/colors/color.ts +++ /dev/null @@ -1,223 +0,0 @@ -export interface RgbaStruct { - r: number; - g: number; - b: number; - a: number; -} - -interface RgbStruct { - r: number; - g: number; - b: number; -} - -export type RgbaTuple = [number, number, number, number]; -export type RgbTuple = [number, number, number]; -export type RgbaLike = RgbaTuple | RgbTuple | RgbaStruct | RgbStruct | Color | IRgba | string; - -/** - * An interface for types representing a Rgba color - */ -export interface IRgba { - rgbaTuple(): RgbaTuple; - rgbaStruct(): RgbaStruct; - rgbaCssString(): string; -} - -/** - * Color class representing colors - */ -export class Color implements IRgba, RgbaStruct { - r: number; - g: number; - b: number; - a: number; - - constructor(config: RgbaStruct) { - this.r = config.r; - this.g = config.g; - this.b = config.b; - this.a = config.a; - } - - rgbaStruct(): RgbaStruct { - return this as RgbaStruct; - } - - rgbaTuple(): RgbaTuple { - return [this.r, this.g, this.b, this.a]; - } - - rgbTuple(): RgbTuple { - return [this.r, this.g, this.b]; - } - - rgbaCssString(): string { - return Color.rgbaToCssString(this); - } - - clone(): Color { - return new Color({ - r: this.r, - g: this.g, - b: this.b, - a: this.a, - }); - } - - equals(other: RgbaLike) { - const o = Color.fromRgbaLike(other); - return this.r === o.r && this.g === o.g && this.b === o.b && this.a === o.a; - } - - static rgbaToCssString(rgba: RgbaLike): string { - const temp = Color.fromRgbaLike(rgba, false).rgbaStruct(); - return `rgba(${temp.r.toString()}, ${temp.g.toString()}, ${temp.b.toString()}, ${temp.a.toString()})`; - } - - static rgbaTupleToStruct(rgbaTuple: RgbaTuple | RgbTuple): RgbaStruct { - if (rgbaTuple.length < 3 || rgbaTuple.length > 4) { - throw new Error('Invalid RGB(A) tuple size!'); - } - - const alpha = rgbaTuple.length < 4 ? 1.0 : rgbaTuple[3]; - return {r: rgbaTuple[0], g: rgbaTuple[1], b: rgbaTuple[2], a: alpha}; - } - - /** - * Creates a Color instance from RgbaLike Types. - * @param {RgbaLike} rgba: the rgba like input - * @param {boolean} clone: clone if already an instance of Color. Defaults to TRUE! - * @returns {Color} - */ - static fromRgbaLike(rgba: RgbaLike, clone: boolean = true): Color { - if (!rgba) { - // return some default on empty deserialization - return BLACK; - } - - if (rgba instanceof Color) { - if (clone) { - return rgba.clone(); - } - return rgba; - } - - if (rgba instanceof Array) { - return new Color(Color.rgbaTupleToStruct(rgba)); - } - - if ((rgba).rgbaStruct) { - return new Color((rgba).rgbaStruct()); - } - - if ((rgba).a || (rgba).a === 0) { - return new Color(rgba); - } - - if ((rgba).r) { - const rgb = rgba as RgbStruct; - return new Color({ - r: rgb.r, - g: rgb.g, - b: rgb.b, - a: 1.0, - }); - } - /* - if (isString(rgba)) { - return new Color(stringToRgbaStruct(rgba as string)) - } -*/ - console.error('ERROR Color.fromRgbaLike', rgba); - - throw new Error('invalid RgbaLike ' + rgba.toString()); - } - - /** - * Interpolates between two colors - * @param a: first Color -> 0 - * @param b: second Color -> 1 - * @param value: value between 0 and 1 - */ - static interpolate(a: RgbaLike, b: RgbaLike, fraction: number): Color { - const ra = Color.fromRgbaLike(a, false); - const rb = Color.fromRgbaLike(b, false); - if (fraction === 0) { - return ra; - } - if (fraction === 1) { - return rb; - } - if (ra.equals(rb)) { - return ra; - } - const clr = { - r: ra.r * (1 - fraction) + rb.r * fraction, - g: ra.g * (1 - fraction) + rb.g * fraction, - b: ra.b * (1 - fraction) + rb.b * fraction, - a: ra.a * (1 - fraction) + rb.a * fraction, - }; - return Color.fromRgbaLike(clr, false); - } - - static colorDifference(a: RgbaLike, b: RgbaLike): number { - const ra = Color.fromRgbaLike(a, false).rgbTuple(); - const rb = Color.fromRgbaLike(b, false).rgbTuple(); - - return ra.map((baseColor, i) => Math.pow(baseColor - rb[i], 2)).reduce((acc, value) => acc + value); - } -} - -export const BLACK = Color.fromRgbaLike([0, 0, 0, 1]); -export const WHITE = Color.fromRgbaLike([255, 255, 255, 1]); -export const TRANSPARENT = Color.fromRgbaLike([0, 0, 0, 0]); - -/** - * Should a string also be RgbaLike? - * @param {string} rgbaCssString - * @returns {RgbaStruct} - */ -export function stringToRgbaStruct(rgbaCssString: string): RgbaStruct { - if (rgbaCssString === undefined || rgbaCssString === '') { - throw new Error('cant parse empty string into a color'); - } - - let rgba = - rgbaCssString.match(/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+.*\d*)\s*\)$/i) || - rgbaCssString.match(/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i) || - rgbaCssString.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i); - - if (rgba) { - return { - r: parseInt(rgba[1], 10), - g: parseInt(rgba[2], 10), - b: parseInt(rgba[3], 10), - a: rgba[4] === undefined ? 1 : parseFloat(rgba[4]), - }; - } - - let threeDigit = rgbaCssString.match(/^#([0-9a-f]{3})$/i)[1]; - if (threeDigit) { - // in three-character format, each value is multiplied by 0x11 to give an - // even scale fromRgbaLike 0x00 to 0xff - return { - r: parseInt(threeDigit.charAt(0), 16) * 0x11, - g: parseInt(threeDigit.charAt(1), 16) * 0x11, - b: parseInt(threeDigit.charAt(2), 16) * 0x11, - a: 1, - }; - } - - let sixDigit = rgbaCssString.match(/^#([0-9a-f]{6})$/i)[1]; - if (sixDigit) { - return { - r: parseInt(sixDigit.substr(0, 2), 16), - g: parseInt(sixDigit.substr(2, 2), 16), - b: parseInt(sixDigit.substr(4, 2), 16), - a: 1, - }; - } - - throw new Error('cant parse string into a color' + rgbaCssString); -} diff --git a/projects/wave-core/src/lib/colors/colorizer-data.model.ts b/projects/wave-core/src/lib/colors/colorizer-data.model.ts deleted file mode 100644 index f91bd19b..00000000 --- a/projects/wave-core/src/lib/colors/colorizer-data.model.ts +++ /dev/null @@ -1,307 +0,0 @@ -import {BreakPointValue, ColorBreakpoint, ColorBreakpointDict, IMappingRasterColorizerBreakpoint} from './color-breakpoint.model'; -import {Color} from './color'; - -/** - * DEPRECATED - */ -export interface DeprecatedMappingColorizerDoNotUse { - interpolation: string; - breakpoints: Array<[number, string, string]>; - result?: string | number; -} - -/** - * The colorizer types supported by Mapping. - */ -export type ColorizerType = 'gradient' | 'logarithmic' | 'palette' | 'rgba_composite'; - -/** - * An interface for the data representing a colorizer. - */ -export interface IColorizerData { - breakpoints: Array; - type?: ColorizerType; -} - -/** - * The interface for colorizers supported by Mapping. - */ -export interface MappingRasterColorizerDict { - breakpoints: Array; - type?: ColorizerType; - nodata?: IMappingRasterColorizerBreakpoint; - default?: IMappingRasterColorizerBreakpoint; -} - -/** - * The information within ColorizerData allows colorization of vector and raster data. - */ -export class ColorizerData implements IColorizerData { - breakpoints: Array; - type: ColorizerType; - - /** - * Generate a new gray scale colorizer for values between min and max. - */ - static grayScaleColorizer(minMax: {min: number; max: number}): ColorizerData { - const saveMin = minMax.min ? minMax.min : -1000; - const saveMax = minMax.max ? minMax.max : 1000; - const saveCenter = (saveMin + saveMax) / 2.0; - - const min_br: ColorBreakpointDict = { - value: saveMin, - rgba: Color.fromRgbaLike({ - r: 0, - g: 0, - b: 0, - a: 1, - }), - }; - - const mid_br: ColorBreakpointDict = { - value: saveCenter, - rgba: Color.fromRgbaLike({ - r: 128, - g: 128, - b: 128, - a: 1, - }), - }; - - const max_br: ColorBreakpointDict = { - value: saveMax, - rgba: Color.fromRgbaLike({ - r: 255, - g: 255, - b: 255, - a: 1, - }), - }; - - return new ColorizerData({ - breakpoints: [min_br, mid_br, max_br], - type: 'gradient', - }); - } - - /** - * Deserialization for IColorizerData into ColorizerData. - */ - static fromDict(dict: IColorizerData): ColorizerData { - if (!dict) { - // return some default value in case of empty deserialization - return ColorizerData.grayScaleColorizer({ - min: 0, - max: 100, - }); - } - - return new ColorizerData(dict); - } - - /** - * Generates an instance of ColorizerData without any breakpoints. - */ - static empty(): ColorizerData { - return new ColorizerData({ - breakpoints: [], - type: 'gradient', - }); - } - - /** - * Check if an instance of (I)ColorizerData is valid. - */ - static is_valid(colorizerData: IColorizerData) { - return colorizerData.breakpoints.length >= 2; - } - - /** - * The constructor for ColorizerData. - */ - constructor(config: IColorizerData) { - this.breakpoints = config.breakpoints ? config.breakpoints.map((br) => new ColorBreakpoint(br)) : []; - this.type = config.type ? config.type : 'gradient'; - } - - /** - * Removes all breakpoints. - */ - clear() { - this.breakpoints = []; - } - - /** - * Adds a breakpoint to the end of the list. - */ - addBreakpoint(brk: ColorBreakpointDict) { - this.breakpoints.push(new ColorBreakpoint(brk)); - } - - /** - * Adds a breakpoint at position i in the list. - */ - addBreakpointAt(i: number, brk: ColorBreakpoint) { - this.breakpoints.splice(i, 0, brk); - } - - /** - * Removes the breakpoint at position i in the list. - */ - removeBreakpointAt(i: number) { - this.breakpoints.splice(i, 1); - } - - /** - * Updates the ColorBreakpoint at position i. - */ - updateBreakpointAt(i: number, brk: ColorBreakpoint): boolean { - const equal = this.getBreakpointAt(i).equals(brk); - if (brk && !equal) { - this.breakpoints[i] = brk; - return true; - } - return false; - } - - /** - * Returns the ColorBreakpoint at position i. - */ - getBreakpointAt(i: number): ColorBreakpoint { - return this.breakpoints[i]; - } - - /** - * Get a (new) breakpoint for a value. - */ - getBreakpointForValue(value: BreakPointValue, interpolate: boolean = false): ColorBreakpoint | undefined { - if (!value || !this.breakpoints || this.breakpoints.length <= 0) { - return undefined; - } - - const isGradient = this.type === 'gradient'; - const isNumber = typeof value === 'number'; - const firstBrkIsNumber = this.getBreakpointAt(0).valueIsNumber(); // TODO: this is prob. not always the correct type. - const lookUpValue = firstBrkIsNumber && !isNumber ? parseFloat(value as string) : value; - const isLookupNumber = typeof lookUpValue === 'number'; - - let brk_index = -1; - for (let index = 0; index < this.breakpoints.length; index++) { - const brk_i = this.breakpoints[index]; - if (isLookupNumber && brk_i.value <= lookUpValue) { - brk_index = index; - } else if (brk_i.value === lookUpValue) { - brk_index = index; - } - } - const brk = this.breakpoints[brk_index]; - const validBrk = brk_index >= 0 && (this.breakpoints.length > 1 || brk.value === lookUpValue); - const isLastBrk = brk_index >= this.breakpoints.length - 1; - - if (!validBrk) { - return undefined; - } - - if (!interpolate || isLastBrk || brk.value === lookUpValue || !isGradient) { - return brk; - } - - // handling gradients for numbers... - const brk_next = this.breakpoints[brk_index + 1]; - if (typeof lookUpValue === 'number' && typeof brk.value === 'number' && typeof brk_next.value === 'number') { - const diff = lookUpValue - brk.value; - const frac_diff = diff / (brk_next.value - brk.value); - const color = Color.interpolate(brk.rgba, brk_next.rgba, frac_diff); - - return new ColorBreakpoint({ - rgba: color, - value: brk.value + diff, - }); - } - - return undefined; - } - - get firstBreakpoint(): ColorBreakpoint | undefined { - return !this.breakpoints || this.isEmpty() ? undefined : this.breakpoints[0]; - } - - get lastBreakpoint(): ColorBreakpoint | undefined { - return !this.breakpoints || this.isEmpty() ? undefined : this.breakpoints[this.breakpoints.length - 1]; - } - - /** - * Checks if the list of breakpoints is empty. - */ - isEmpty(): boolean { - return !this.breakpoints || this.breakpoints.length === 0; - } - - /** - * Update the type of the ColorizerData. - */ - updateType(type: ColorizerType): boolean { - if (type && (!this.type || type !== this.type)) { - this.type = type; - return true; - } - return false; - } - - /** - * Returns a clone of the ColorizerData. - */ - clone(): ColorizerData { - return new ColorizerData(this.toDict() as IColorizerData); - } - - /** - * Compares this ColorizerData with another one. - */ - equals(other: ColorizerData): boolean { - if (!other || this.breakpoints.length !== other.breakpoints.length || this.type !== other.type) { - return false; - } - - for (let i = 0; i < this.breakpoints.length; i++) { - if (!this.getBreakpointAt(i).equals(other.getBreakpointAt(i))) { - return false; - } - } - - return true; - } - - /** - * Transforms ColorizerData into an interface object. - */ - toDict(): IColorizerData { - return { - breakpoints: this.breakpoints.map((br) => br.toDict()), - type: this.type, - }; - } - - /** - * Generates a ColorizerData instance from a MappingColorizer. - */ - static fromMappingColorizerData(mcd: MappingRasterColorizerDict): ColorizerData { - return new ColorizerData({ - type: !mcd || !mcd.type ? 'gradient' : mcd.type, - breakpoints: - !mcd || !mcd.breakpoints - ? [] - : mcd.breakpoints.map((br) => { - return new ColorBreakpoint({ - rgba: { - r: br.r, - g: br.g, - b: br.b, - a: br.a ? br.a : 1.0, - }, - value: br.value, - }); - }), - }); - } -} diff --git a/projects/wave-core/src/lib/colors/colorizer-editor/colorizer-editor.component.html b/projects/wave-core/src/lib/colors/colorizer-editor/colorizer-editor.component.html deleted file mode 100644 index 07eaffb9..00000000 --- a/projects/wave-core/src/lib/colors/colorizer-editor/colorizer-editor.component.html +++ /dev/null @@ -1,36 +0,0 @@ -
-
- - - linear gradient - logarithmic gradient - palette - - -
- -
- -
- - -
- - -
-
-
-
-
diff --git a/projects/wave-core/src/lib/colors/colorizer-editor/colorizer-editor.component.scss b/projects/wave-core/src/lib/colors/colorizer-editor/colorizer-editor.component.scss deleted file mode 100644 index 6039fbff..00000000 --- a/projects/wave-core/src/lib/colors/colorizer-editor/colorizer-editor.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -.colorizerEntries { -} - -mat-form-field >>> .color_cell { - color: black !important; - text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff !important; -} diff --git a/projects/wave-core/src/lib/colors/colorizer-editor/colorizer-editor.component.ts b/projects/wave-core/src/lib/colors/colorizer-editor/colorizer-editor.component.ts deleted file mode 100644 index c5577316..00000000 --- a/projects/wave-core/src/lib/colors/colorizer-editor/colorizer-editor.component.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { - Component, - Input, - ChangeDetectionStrategy, - OnChanges, - SimpleChanges, - forwardRef, - ChangeDetectorRef, - AfterViewInit, -} from '@angular/core'; - -import {ColorizerData, ColorizerType} from '../colorizer-data.model'; -import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms'; -import {ColorBreakpoint} from '../color-breakpoint.model'; - -/** - * The ColorizerEditorComponent is the main dialog for editing ColorizerData / ColorBreakpoints - */ -@Component({ - selector: 'wave-colorizer-editor', - templateUrl: 'colorizer-editor.component.html', - styleUrls: ['colorizer-editor.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ColorizerEditorComponent), multi: true}], -}) -export class ColorizerEditorComponent implements ControlValueAccessor, OnChanges { - private _colorizer: ColorizerData = undefined; - onTouched: () => void; - onChange: (_: ColorizerData) => void = undefined; - - get colorizer(): ColorizerData { - return this._colorizer; - } - - set colorizer(clr: ColorizerData) { - if (clr && !clr.equals(this._colorizer)) { - this._colorizer = clr.clone(); - this.notify(); - } - } - - /** - * Toggles the colorizer type selector. Default = true. - */ - @Input() showTypeSelect = true; - - /** - * Toggles the name hinting column. Default = false. - */ - @Input() showNameHintColumn = false; - - /** - * Switches the attribute input to disabled. Default = false; - */ - @Input() disabledAttribute = false; - - /** - * Switches the color input to disabled. Default = false; - */ - @Input() disabledColor = false; - - /** - * The data type of the attribute input. Default = number. - */ - @Input() inputType: 'number' | 'string' = 'number'; - - /** - * The attribute input placeholder string. - */ - @Input() attributePlaceholder = 'attribute'; - - /** - * the color input placeholder string. - */ - @Input() colorPlaceholder = 'color'; - - /** - * The constructor. - */ - constructor(private changeDetectorRef: ChangeDetectorRef) {} - - ngOnChanges(changes: SimpleChanges) { - for (const propName in changes) { - // eslint-disable-line guard-for-in - switch (propName) { - case 'inputType': - case 'attributePlaceholder': - case 'colorPlaceholder': { - this.changeDetectorRef.markForCheck(); - break; - } - - default: { - // DO NOTHING - } - } - } - } - - /** - * Update the colorizer type of the colorizer data. - */ - updateType(type: ColorizerType) { - if (type && this._colorizer) { - const diff = this._colorizer.updateType(type); - if (diff) { - this.notify(); - } - } - } - - /** - * Update the breakpoint in the colorizer data at position i. - */ - updateBreakpointAt(i: number, brk: ColorBreakpoint) { - // TODO: check if this is valid - if (this._colorizer && this._colorizer.breakpoints.length > i) { - const diff = this._colorizer.updateBreakpointAt(i, brk); - this.notify(); - } - } - - /** - * Add a new breakpoint at position i. Clones the next breakpoint if possible. - */ - addBreakpointAt(i: number) { - if (this._colorizer && this._colorizer.breakpoints.length > i) { - this._colorizer.addBreakpointAt(i, this._colorizer.getBreakpointAt(i).clone()); - } else { - this._colorizer.addBreakpoint(this._colorizer.getBreakpointAt(i)); - } - this.notify(); - } - - /** - * Removes the breakpoint at position i. - */ - removeBreakpointAt(i: number) { - if (this._colorizer && this._colorizer.breakpoints.length > i) { - this._colorizer.removeBreakpointAt(i); - this.notify(); - } - } - - /** - * Sends the wip colorizer to a registred reciever. - */ - notify() { - if (this.onChange && this._colorizer) { - this.onChange(this._colorizer.clone()); - } - } - - registerOnChange(fn: (_: ColorizerData) => void): void { - if (fn) { - this.onChange = fn; - this.notify(); - } - } - - registerOnTouched(fn: () => void): void { - if (fn) { - this.onTouched = fn; - } - } - - writeValue(colorizerData: ColorizerData): void { - this.colorizer = colorizerData; - } -} diff --git a/projects/wave-core/src/lib/colors/colormap-colorizer/colormap-colorizer.component.html b/projects/wave-core/src/lib/colors/colormap-colorizer/colormap-colorizer.component.html deleted file mode 100644 index b9c58739..00000000 --- a/projects/wave-core/src/lib/colors/colormap-colorizer/colormap-colorizer.component.html +++ /dev/null @@ -1,93 +0,0 @@ -
-
-
- - Min - - - Specify a minimum and a maximum. - - - Min value must be greater then {{ form.controls.colormapStepScales?.value.requiresValueAbove }} - - - - Max - - - The maximum must be greater or equal to the minimum. - - - Max value must be lower then {{ form.controls.colormapStepScales?.value.requiresValueBelow }} - - -
- - - Colormap name - - - - {{ colormapName }} - - - - - Reverse colormap - - - Step distribution - - - {{ colormapStepScale.stepScaleName }} - - - - -
- - - - - - - - - - -
Color steps - - - {{ form.controls.colormapSteps.value }}
Preview - invalid configuration -
-
-
- - - - -
-
diff --git a/projects/wave-core/src/lib/colors/colormap-colorizer/colormap-colorizer.component.scss b/projects/wave-core/src/lib/colors/colormap-colorizer/colormap-colorizer.component.scss deleted file mode 100644 index 1b5e759d..00000000 --- a/projects/wave-core/src/lib/colors/colormap-colorizer/colormap-colorizer.component.scss +++ /dev/null @@ -1,42 +0,0 @@ -table { - width: 100%; - font-size: 0.8em; -} - -mat-divider { - padding-bottom: 1rem; -} - -td:first-child, -td:last-child { - width: 1%; - white-space: nowrap; -} - -mat-slider { - min-width: unset; - width: 100%; -} - -.component_container { - width: 100%; - padding-top: 5px; -} - -.colorizer_preview { - min-height: 20px; - border: #000 solid 1px; -} - -.colorizer_option_preview { - min-height: 20px; - border: #000 solid 1px; - width: 30%; - display: inline-block; - margin: auto; - vertical-align: middle; -} - -.fill_width { - width: 100%; -} diff --git a/projects/wave-core/src/lib/colors/colormap-colorizer/colormap-colorizer.component.ts b/projects/wave-core/src/lib/colors/colormap-colorizer/colormap-colorizer.component.ts deleted file mode 100644 index 5b73145e..00000000 --- a/projects/wave-core/src/lib/colors/colormap-colorizer/colormap-colorizer.component.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - EventEmitter, - Input, - OnChanges, - OnDestroy, - OnInit, - Output, - SimpleChanges, -} from '@angular/core'; -import {ColorizerData} from '../colorizer-data.model'; -import { - BoundedColormapStepScale, - COLORMAP_STEP_SCALES_WITH_BOUNDS, - COLORMAP_NAMES, - Colormap, - ColormapNames, -} from '../colormaps/colormap.model'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; -import {valueRelation, WaveValidators} from '../../util/form.validators'; -import {Subscription} from 'rxjs'; - -/** - * The ColormapColorizerComponent is a dialog to generate ColorizerData from colormaps. - */ -@Component({ - selector: 'wave-colormap-colorizer', - templateUrl: 'colormap-colorizer.component.html', - styleUrls: ['colormap-colorizer.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ColormapColorizerComponent implements OnInit, OnDestroy, OnChanges { - /** - * Emmits new ColorizerData instances generated from user input. - */ - @Output() colormapColorizerData = new EventEmitter(); - - /** - * Number of breakpoints used in the ColorizerData. - */ - @Input() defaultNumberOfSteps = 16; - - /** - * Max allowed number of breakpoints in the ColorizerData. - */ - @Input() maxColormapSteps = 16; - - /** - * Sets the min value used for ColorizerData generation. - */ - @Input() minValue = 0; - - /** - * Sets the max value used for ColorizerData generation. - */ - @Input() maxValue = 1; - - /** - * Sends the min value selected in the ui. - */ - @Output() minValueChange = new EventEmitter(); - - /** - * Sends the max value selected in the ui. - */ - @Output() maxValueChange = new EventEmitter(); - - // make colormap names and step scales available to the tamplate. - readonly colormapNames = COLORMAP_NAMES; - readonly boundedColormapStepScales = COLORMAP_STEP_SCALES_WITH_BOUNDS; - - /** - * The form control used in the template. - */ - form: FormGroup; - - /** - * The local (work-in-progress) ColorizerData. - */ - colorizerData: ColorizerData = Colormap.createColorizerDataWithName(this.colormapNames[0], 0, 1); - - private subscriptions: Array = []; - - constructor(private changeDetectorRef: ChangeDetectorRef, private formBuilder: FormBuilder) { - this.form = formBuilder.group( - { - bounds: formBuilder.group( - { - min: [0], - max: [1], - }, - { - validators: [WaveValidators.minAndMax('min', 'max', {checkBothExist: true})], - }, - ), - colormapName: [this.colormapNames[0], [Validators.required]], - colormapSteps: [this.defaultNumberOfSteps, [Validators.required, Validators.min(2)]], - colormapStepScales: [this.boundedColormapStepScales[0]], - colormapReverseColors: [false], - }, - { - validators: [ - valueRelation( - (c) => c.get('bounds').get('min').value, - (c) => c.get('colormapStepScales').value['requiresValueAbove'], - {checkEqual: true, checkBelow: true}, - ), - valueRelation( - (c) => c.get('bounds').get('max').value, - (c) => c.get('colormapStepScales').value['requiresValueBelow'], - {checkEqual: true, checkAbove: true}, - ), - ], - }, - ); - } - - /** - * Replace the min and max values. - */ - patchMinMaxValues(min: number, max: number) { - const patchConfig: {min?: number; max?: number} = {}; - const boundsMin: number = this.form.controls['bounds'].value.min; - const boundsMax: number = this.form.controls['bounds'].value.max; - - if (min !== undefined && min !== boundsMin) { - patchConfig.min = min; - } - - if (max !== undefined && max !== boundsMax) { - patchConfig.max = max; - } - - this.form.controls.bounds.patchValue(patchConfig); - } - - private checkValidConfig() { - const colormapName: ColormapNames = this.form.controls['colormapName'].value; - const colormapSteps: number = this.form.controls['colormapSteps'].value; - const boundedColormapStepScales: BoundedColormapStepScale = this.form.controls['colormapStepScales'].value; - const boundsMin: number = this.form.controls['bounds'].value.min; - const boundsMax: number = this.form.controls['bounds'].value.max; - - if (!COLORMAP_NAMES.find((x) => x === colormapName)) { - return false; - } - if (colormapSteps > this.maxColormapSteps) { - return false; - } - if (boundsMin >= boundsMax) { - return false; - } - if (boundedColormapStepScales.requiresValueAbove && boundsMin <= boundedColormapStepScales.requiresValueAbove) { - return false; - } - if (boundedColormapStepScales.requiresValueBelow && boundsMax >= boundedColormapStepScales.requiresValueBelow) { - return false; - } - return true; - } - - /** - * Clears the local colorizer data. - */ - removeColorizerData() { - this.colorizerData = undefined; - } - - private updateColorizerData() { - if (!this.checkValidConfig()) { - this.colorizerData = undefined; - return; - } - const colormapName: ColormapNames = this.form.controls['colormapName'].value; - const colormapSteps: number = this.form.controls['colormapSteps'].value; - const boundedColormapStepScales: BoundedColormapStepScale = this.form.controls['colormapStepScales'].value; - const boundsMin: number = this.form.controls['bounds'].value.min; - const boundsMax: number = this.form.controls['bounds'].value.max; - const reverseColormap: boolean = this.form.controls['colormapReverseColors'].value; - - const colorizerData = Colormap.createColorizerDataWithName( - colormapName, - boundsMin, - boundsMax, - colormapSteps, - boundedColormapStepScales.stepScaleName, - reverseColormap, - ); - - this.colorizerData = colorizerData; - } - - /** - * Apply a new color table to the colorizer data. - */ - applyNewColorTable(_: any) { - if (this.colorizerData) { - this.colormapColorizerData.emit(this.colorizerData); - } - } - - ngOnInit(): void { - const sub = this.form.valueChanges.subscribe((_) => { - if (this.form.invalid) { - this.removeColorizerData(); - } - this.updateColorizerData(); - }); - this.subscriptions.push(sub); - - if (this.minValue && this.maxValue) { - this.patchMinMaxValues(this.minValue, this.maxValue); - } - - const subMinMax = this.form.controls['bounds'].valueChanges.subscribe((x) => { - if (Number.isFinite(x.min)) { - this.minValueChange.emit(x.min.value); - } - if (Number.isFinite(x.max)) { - this.maxValueChange.emit(x.max.value); - } - }); - this.subscriptions.push(subMinMax); - } - - ngOnDestroy(): void { - this.subscriptions.forEach((s) => s.unsubscribe()); - } - - ngOnChanges(changes: SimpleChanges): void { - for (const propName in changes) { - // eslint-disable-line guard-for-in - switch (propName) { - case 'minValue': - case 'maxValue': { - this.patchMinMaxValues(this.minValue, this.maxValue); - break; - } - - default: { - // DO NOTHING - } - } - } - } -} diff --git a/projects/wave-core/src/lib/colors/colormap-colorizer/colormap-name-to-colorizer-data.pipe.ts b/projects/wave-core/src/lib/colors/colormap-colorizer/colormap-name-to-colorizer-data.pipe.ts deleted file mode 100644 index 8cd9d162..00000000 --- a/projects/wave-core/src/lib/colors/colormap-colorizer/colormap-name-to-colorizer-data.pipe.ts +++ /dev/null @@ -1,19 +0,0 @@ -import {Pipe, PipeTransform} from '@angular/core'; -import {IColorizerData} from '../colorizer-data.model'; -import {Colormap, ColormapNames, ColormapStepScale} from '../colormaps/colormap.model'; - -/** - * A pipe to transform a color map into a colorizer data. - */ -@Pipe({name: 'waveColormapNameToColorizerData'}) -export class ColormapNameToColorizerDataPipe implements PipeTransform { - transform( - colormapName: ColormapNames, - min: number = 0, - max: number = 0, - steps: number = 10, - stepScale: ColormapStepScale = 'linear', - ): IColorizerData { - return Colormap.createColorizerDataWithName(colormapName, min, max, steps, stepScale); - } -} diff --git a/projects/wave-core/src/lib/colors/colormaps/colormap.model.ts b/projects/wave-core/src/lib/colors/colormaps/colormap.model.ts deleted file mode 100644 index 69821a00..00000000 --- a/projects/wave-core/src/lib/colors/colormaps/colormap.model.ts +++ /dev/null @@ -1,262 +0,0 @@ -import {ColorBreakpointDict} from '../color-breakpoint.model'; -import {Color} from '../color'; -import {ColorizerData} from '../colorizer-data.model'; -import { - colormap_inferno_data, - colormap_magma_data, - colormap_plasma_data, - colormap_viridis_data, - MPL_COLORMAP_NAMES, - MplColormapName, -} from './mpl-colormaps'; -import {coolwarm_data, MORELAND_COLORMAP_NAMES, MorelandColormapName} from './moreland-colormaps'; -import { - colormap_arcon_data, - colormap_bamako_data, - colormap_batlow_data, - colormap_berlin_data, - colormap_bilbao_data, - colormap_broc_data, - colormap_broco_data, - colormap_buda_data, - colormap_corc_data, - colormap_corco_data, - colormap_davos_data, - colormap_devon_data, - colormap_grayc_data, - colormap_hawaii_data, - colormap_imola_data, - colormap_lajolla_data, - colormap_lapaz_data, - colormap_lisbon_data, - colormap_nuuk_data, - colormap_oleron_data, - colormap_oslo_data, - colormap_roma_data, - colormap_romao_data, - colormap_tofino_data, - colormap_tokyo_data, - colormap_turku_data, - colormap_vik_data, - colormap_viko_data, - SCIENTIFIC_COLORMAP_NAMES, - ScientificColormapName, -} from './scientific-colormaps/scientific-colormaps'; -import {colormap_rainbow_data, GENERIC_COLORMAP_NAMES, GenericColormapName} from './generic-colormaps'; - -/** - * Type for ColormapData / a wrapper for RGB values. - */ -export type ColormapData = Array<[number, number, number]>; - -/** - * All allowed `Colormap` names. - */ -export type ColormapNames = MplColormapName | MorelandColormapName | ScientificColormapName | GenericColormapName; - -/** - * A list of all `Colormap` names. - */ -export const COLORMAP_NAMES: Array = [ - ...MPL_COLORMAP_NAMES, - ...MORELAND_COLORMAP_NAMES, - ...SCIENTIFIC_COLORMAP_NAMES, - ...GENERIC_COLORMAP_NAMES, -]; - -/** - * The `Colormap` step scaling methods. - */ -export type ColormapStepScale = 'linear' | 'log' | 'square root' | 'square'; - -/** - * An interface for bounded step scales. E.g. log is only possible for values >= 1. - */ -export interface BoundedColormapStepScale { - stepScaleName: ColormapStepScale; - requiresValueAbove?: number; - requiresValueBelow?: number; -} - -/** - * A list of all step scales with possible bounds. - */ -export const COLORMAP_STEP_SCALES_WITH_BOUNDS: Array = [ - {stepScaleName: 'linear'}, - {stepScaleName: 'log', requiresValueAbove: 0}, - {stepScaleName: 'square root', requiresValueBelow: 5000}, - {stepScaleName: 'square', requiresValueBelow: 5000}, -]; - -/** - * Abstract class for common `Colormap` functions. - */ -export abstract class Colormap { - /** - * Resolves the `Colormap` data for a `Colormap` name. - */ - static getColormapForName(colormapName: ColormapNames): ColormapData { - switch (colormapName) { - case 'INFERNO': - return colormap_inferno_data; - case 'MAGMA': - return colormap_magma_data; - case 'PLASMA': - return colormap_plasma_data; - case 'VIRIDIS': - return colormap_viridis_data; - case 'COOLWARM': - return coolwarm_data; - case 'ARCON': - return colormap_arcon_data; - case 'BAMAKO': - return colormap_bamako_data; - case 'BATLOW': - return colormap_batlow_data; - case 'BERLIN': - return colormap_berlin_data; - case 'BILBAO': - return colormap_bilbao_data; - case 'BROC': - return colormap_broc_data; - case 'BROCO': - return colormap_broco_data; - case 'BUDA': - return colormap_buda_data; - case 'CORC': - return colormap_corc_data; - case 'CORCO': - return colormap_corco_data; - case 'DAVOS': - return colormap_davos_data; - case 'DEVON': - return colormap_devon_data; - case 'GRAYC': - return colormap_grayc_data; - case 'HAWAII': - return colormap_hawaii_data; - case 'IMOLA': - return colormap_imola_data; - case 'LAJOLLA': - return colormap_lajolla_data; - case 'LAPAZ': - return colormap_lapaz_data; - case 'LISBON': - return colormap_lisbon_data; - case 'NUUK': - return colormap_nuuk_data; - case 'OLERON': - return colormap_oleron_data; - case 'OSLO': - return colormap_oslo_data; - case 'ROMA': - return colormap_roma_data; - case 'ROMAO': - return colormap_romao_data; - case 'TOFINO': - return colormap_tofino_data; - case 'TOKYO': - return colormap_tokyo_data; - case 'TURKU': - return colormap_turku_data; - case 'VIK': - return colormap_vik_data; - case 'VIKO': - return colormap_viko_data; - case 'RAINBOW': - return colormap_rainbow_data; - } - } - - private static calculateStepScales( - stepScale: ColormapStepScale, - stepFractions: Array, - min: number, - max: number, - ): Array { - switch (stepScale) { - case 'linear': - return Colormap.linearNormInverse(stepFractions, min, max); - case 'log': - return Colormap.logNormInverse(stepFractions, min, max); - case 'square root': - return Colormap.powerNormInverse(stepFractions, min, max, 0.5); - case 'square': - return Colormap.powerNormInverse(stepFractions, min, max, 2); - } - } - - private static colormapColorToRgb(colormapColor: [number, number, number]): [number, number, number] { - return [colormapColor[0] * 255, colormapColor[1] * 255, colormapColor[2] * 255]; - } - - static createColorizerDataWithName( - colormapName: ColormapNames, - min: number, - max: number, - steps: number | undefined = 16, - stepScale: ColormapStepScale = 'linear', - reverseColors: boolean = false, - ): ColorizerData { - let colormap = Colormap.getColormapForName(colormapName); - if (reverseColors) { - colormap = [...colormap].reverse(); // use a clone since 'reverse' mutates the original array - } - const trueSteps = steps && steps <= colormap.length ? steps : colormap.length; - const colormapStepFractions = Colormap.generateLinearStepFractions(trueSteps); - const colormapValues = Colormap.calculateStepScales(stepScale, colormapStepFractions, min, max); - const breakpoints = Colormap.createColormapColorizerBreakpoints(colormap, colormapStepFractions, colormapValues); - return new ColorizerData({ - breakpoints, - type: stepScale === 'log' ? 'logarithmic' : 'gradient', - }); - } - - private static logNormInverse(stepFractions: Array, min: number, max: number): Array { - return stepFractions.map((x) => min * Math.pow(max / min, x)); - } - - private static powerNormInverse(stepFractions: Array, min: number, max: number, gamma: number = 2): Array { - return stepFractions.map((x) => Math.pow(x, 1 / gamma) * (max - min) + min); - } - - private static linearNormInverse(stepFractions: Array, min: number, max: number): Array { - return stepFractions.map((x) => min + x * (max - min)); - } - - private static createColormapColorizerBreakpoints( - colormap: ColormapData, - colorStepScales: Array, - colormapValues: Array, - ): Array { - if (!colorStepScales || !colormapValues || colorStepScales.length !== colormapValues.length || colorStepScales.length < 2) { - throw new Error('colormap creation requires colorMapStepScales and colormapValues with identical length >2'); - } - const breakpoints = new Array(colorStepScales.length); - for (let i = 0; i < colorStepScales.length; i++) { - const value = colormapValues[i]; - const colormapIndex = Math.round(colorStepScales[i] * (colormap.length - 1)); - const colorMapValue = colormap[colormapIndex]; - const color = Color.fromRgbaLike(Colormap.colormapColorToRgb(colorMapValue), false); - breakpoints[i] = { - value, - rgba: color, - }; - } - return breakpoints; - } - - private static generateLinearStepFractions(steps: number): Array { - const maxIndex = steps - 1; - const stepFractions = new Array(steps); - stepFractions[0] = 0; - stepFractions[maxIndex] = 1; - - for (let i = 1; i < maxIndex; i++) { - // fill the values between 0 and 1. - stepFractions[i] = i / maxIndex; - } - - return stepFractions; - } -} diff --git a/projects/wave-core/src/lib/colors/colormaps/generic-colormaps.ts b/projects/wave-core/src/lib/colors/colormaps/generic-colormaps.ts deleted file mode 100644 index 69b2668c..00000000 --- a/projects/wave-core/src/lib/colors/colormaps/generic-colormaps.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * The color map name. - */ -export type GenericColormapName = 'RAINBOW'; - -/** - * The list of available color map names. - */ -export const GENERIC_COLORMAP_NAMES: Array = ['RAINBOW']; - -/** - * The rainbow color map. - */ -export const colormap_rainbow_data: Array<[number, number, number]> = [ - [0.0, 0.0, 0.5], - [0.0, 0.0, 0.803], - [0.0, 0.03333, 1.0], - [0.0, 0.3, 1.0], - [0.0, 0.5666, 1.0], - [0.0, 0.8333, 1.0], - [0.1613, 1.0, 0.8064], - [0.3763, 1.0, 0.5914], - [0.5914, 1.0, 0.376], - [0.8064, 1.0, 0.1613], - [1.0, 0.9012, 0.0], - [1.0, 0.6543, 0.0], - [1.0, 0.4074, 0.0], - [1.0, 0.1605, 0.0], - [0.803, 0.0, 0.0], - [0.5, 0.0, 0.0], -]; diff --git a/projects/wave-core/src/lib/colors/colormaps/moreland-colormaps.ts b/projects/wave-core/src/lib/colors/colormaps/moreland-colormaps.ts deleted file mode 100644 index d9f94621..00000000 --- a/projects/wave-core/src/lib/colors/colormaps/moreland-colormaps.ts +++ /dev/null @@ -1,55 +0,0 @@ -import {ColormapNames} from './colormap.model'; - -/** - * This color maps are from CoolWarmFloat33.csv of "Diverging Color Maps for Scientific Visualization" by Kenneth Moreland - * on - */ - -/** - * The color map name. - */ -export type MorelandColormapName = 'COOLWARM'; - -/** - * The list of available color map names. - */ -export const MORELAND_COLORMAP_NAMES: Array = ['COOLWARM']; - -/** - * The coolwarm color map. - */ -export const coolwarm_data: Array<[number, number, number]> = [ - [0.2298057, 0.298717966, 0.753683153], - [0.26623388, 0.353094838, 0.801466763], - [0.30386891, 0.406535296, 0.84495867], - [0.342804478, 0.458757618, 0.883725899], - [0.38301334, 0.50941904, 0.917387822], - [0.424369608, 0.558148092, 0.945619588], - [0.46666708, 0.604562568, 0.968154911], - [0.509635204, 0.648280772, 0.98478814], - [0.552953156, 0.688929332, 0.995375608], - [0.596262162, 0.726149107, 0.999836203], - [0.639176211, 0.759599947, 0.998151185], - [0.681291281, 0.788964712, 0.990363227], - [0.722193294, 0.813952739, 0.976574709], - [0.761464949, 0.834302879, 0.956945269], - [0.798691636, 0.849786142, 0.931688648], - [0.833466556, 0.860207984, 0.901068838], - [0.865395197, 0.86541021, 0.865395561], - [0.897787179, 0.848937047, 0.820880546], - [0.924127593, 0.827384882, 0.774508472], - [0.944468518, 0.800927443, 0.726736146], - [0.958852946, 0.769767752, 0.678007945], - [0.96732803, 0.734132809, 0.628751763], - [0.969954137, 0.694266682, 0.579375448], - [0.966811177, 0.650421156, 0.530263762], - [0.958003065, 0.602842431, 0.481775914], - [0.943660866, 0.551750968, 0.434243684], - [0.923944917, 0.49730856, 0.387970225], - [0.89904617, 0.439559467, 0.343229596], - [0.869186849, 0.378313092, 0.300267182], - [0.834620542, 0.312874446, 0.259301199], - [0.795631745, 0.24128379, 0.220525627], - [0.752534934, 0.157246067, 0.184115123], - [0.705673158, 0.01555616, 0.150232812], -]; diff --git a/projects/wave-core/src/lib/colors/colormaps/mpl-colormaps.ts b/projects/wave-core/src/lib/colors/colormaps/mpl-colormaps.ts deleted file mode 100644 index 7d9c5010..00000000 --- a/projects/wave-core/src/lib/colors/colormaps/mpl-colormaps.ts +++ /dev/null @@ -1,1052 +0,0 @@ -/** - * The colormap data in this file are based on: - * "New matplotlib colormaps by Nathaniel J. Smith, Stefan van der Walt, and (in the case of viridis) Eric Firing." - * @see(https://github.com/BIDS/colormap/blob/master/colormaps.py) - * They are licensed under the CC0 license. - */ - -/** - * The color map names. - */ -export type MplColormapName = 'MAGMA' | 'INFERNO' | 'PLASMA' | 'VIRIDIS'; - -/** - * The list of available color map names. - */ -export const MPL_COLORMAP_NAMES: Array = ['MAGMA', 'INFERNO', 'PLASMA', 'VIRIDIS']; - -export const colormap_magma_data: Array<[number, number, number]> = [ - [0.001462, 0.000466, 0.013866], - [0.002258, 0.001295, 0.018331], - [0.003279, 0.002305, 0.023708], - [0.004512, 0.00349, 0.029965], - [0.00595, 0.004843, 0.03713], - [0.007588, 0.006356, 0.044973], - [0.009426, 0.008022, 0.052844], - [0.011465, 0.009828, 0.06075], - [0.013708, 0.011771, 0.068667], - [0.016156, 0.01384, 0.076603], - [0.018815, 0.016026, 0.084584], - [0.021692, 0.01832, 0.09261], - [0.024792, 0.020715, 0.100676], - [0.028123, 0.023201, 0.108787], - [0.031696, 0.025765, 0.116965], - [0.03552, 0.028397, 0.125209], - [0.039608, 0.03109, 0.133515], - [0.04383, 0.03383, 0.141886], - [0.048062, 0.036607, 0.150327], - [0.05232, 0.039407, 0.158841], - [0.056615, 0.04216, 0.167446], - [0.060949, 0.044794, 0.176129], - [0.06533, 0.047318, 0.184892], - [0.069764, 0.049726, 0.193735], - [0.074257, 0.052017, 0.20266], - [0.078815, 0.054184, 0.211667], - [0.083446, 0.056225, 0.220755], - [0.088155, 0.058133, 0.229922], - [0.092949, 0.059904, 0.239164], - [0.097833, 0.061531, 0.248477], - [0.102815, 0.06301, 0.257854], - [0.107899, 0.064335, 0.267289], - [0.113094, 0.065492, 0.276784], - [0.118405, 0.066479, 0.286321], - [0.123833, 0.067295, 0.295879], - [0.12938, 0.067935, 0.305443], - [0.135053, 0.068391, 0.315], - [0.140858, 0.068654, 0.324538], - [0.146785, 0.068738, 0.334011], - [0.152839, 0.068637, 0.343404], - [0.159018, 0.068354, 0.352688], - [0.165308, 0.067911, 0.361816], - [0.171713, 0.067305, 0.370771], - [0.178212, 0.066576, 0.379497], - [0.184801, 0.065732, 0.387973], - [0.19146, 0.064818, 0.396152], - [0.198177, 0.063862, 0.404009], - [0.204935, 0.062907, 0.411514], - [0.211718, 0.061992, 0.418647], - [0.218512, 0.061158, 0.425392], - [0.225302, 0.060445, 0.431742], - [0.232077, 0.059889, 0.437695], - [0.238826, 0.059517, 0.443256], - [0.245543, 0.059352, 0.448436], - [0.25222, 0.059415, 0.453248], - [0.258857, 0.059706, 0.45771], - [0.265447, 0.060237, 0.46184], - [0.271994, 0.060994, 0.46566], - [0.278493, 0.061978, 0.46919], - [0.284951, 0.063168, 0.472451], - [0.291366, 0.064553, 0.475462], - [0.29774, 0.066117, 0.478243], - [0.304081, 0.067835, 0.480812], - [0.310382, 0.069702, 0.483186], - [0.316654, 0.07169, 0.48538], - [0.322899, 0.073782, 0.487408], - [0.329114, 0.075972, 0.489287], - [0.335308, 0.078236, 0.491024], - [0.341482, 0.080564, 0.492631], - [0.347636, 0.082946, 0.494121], - [0.353773, 0.085373, 0.495501], - [0.359898, 0.087831, 0.496778], - [0.366012, 0.090314, 0.49796], - [0.372116, 0.092816, 0.499053], - [0.378211, 0.095332, 0.500067], - [0.384299, 0.097855, 0.501002], - [0.390384, 0.100379, 0.501864], - [0.396467, 0.102902, 0.502658], - [0.402548, 0.10542, 0.503386], - [0.408629, 0.10793, 0.504052], - [0.414709, 0.110431, 0.504662], - [0.420791, 0.11292, 0.505215], - [0.426877, 0.115395, 0.505714], - [0.432967, 0.117855, 0.50616], - [0.439062, 0.120298, 0.506555], - [0.445163, 0.122724, 0.506901], - [0.451271, 0.125132, 0.507198], - [0.457386, 0.127522, 0.507448], - [0.463508, 0.129893, 0.507652], - [0.46964, 0.132245, 0.507809], - [0.47578, 0.134577, 0.507921], - [0.481929, 0.136891, 0.507989], - [0.488088, 0.139186, 0.508011], - [0.494258, 0.141462, 0.507988], - [0.500438, 0.143719, 0.50792], - [0.506629, 0.145958, 0.507806], - [0.512831, 0.148179, 0.507648], - [0.519045, 0.150383, 0.507443], - [0.52527, 0.152569, 0.507192], - [0.531507, 0.154739, 0.506895], - [0.537755, 0.156894, 0.506551], - [0.544015, 0.159033, 0.506159], - [0.550287, 0.161158, 0.505719], - [0.556571, 0.163269, 0.50523], - [0.562866, 0.165368, 0.504692], - [0.569172, 0.167454, 0.504105], - [0.57549, 0.16953, 0.503466], - [0.581819, 0.171596, 0.502777], - [0.588158, 0.173652, 0.502035], - [0.594508, 0.175701, 0.501241], - [0.600868, 0.177743, 0.500394], - [0.607238, 0.179779, 0.499492], - [0.613617, 0.181811, 0.498536], - [0.620005, 0.18384, 0.497524], - [0.626401, 0.185867, 0.496456], - [0.632805, 0.187893, 0.495332], - [0.639216, 0.189921, 0.49415], - [0.645633, 0.191952, 0.49291], - [0.652056, 0.193986, 0.491611], - [0.658483, 0.196027, 0.490253], - [0.664915, 0.198075, 0.488836], - [0.671349, 0.200133, 0.487358], - [0.677786, 0.202203, 0.485819], - [0.684224, 0.204286, 0.484219], - [0.690661, 0.206384, 0.482558], - [0.697098, 0.208501, 0.480835], - [0.703532, 0.210638, 0.479049], - [0.709962, 0.212797, 0.477201], - [0.716387, 0.214982, 0.47529], - [0.722805, 0.217194, 0.473316], - [0.729216, 0.219437, 0.471279], - [0.735616, 0.221713, 0.46918], - [0.742004, 0.224025, 0.467018], - [0.748378, 0.226377, 0.464794], - [0.754737, 0.228772, 0.462509], - [0.761077, 0.231214, 0.460162], - [0.767398, 0.233705, 0.457755], - [0.773695, 0.236249, 0.455289], - [0.779968, 0.238851, 0.452765], - [0.786212, 0.241514, 0.450184], - [0.792427, 0.244242, 0.447543], - [0.798608, 0.24704, 0.444848], - [0.804752, 0.249911, 0.442102], - [0.810855, 0.252861, 0.439305], - [0.816914, 0.255895, 0.436461], - [0.822926, 0.259016, 0.433573], - [0.828886, 0.262229, 0.430644], - [0.834791, 0.26554, 0.427671], - [0.840636, 0.268953, 0.424666], - [0.846416, 0.272473, 0.421631], - [0.852126, 0.276106, 0.418573], - [0.857763, 0.279857, 0.415496], - [0.86332, 0.283729, 0.412403], - [0.868793, 0.287728, 0.409303], - [0.874176, 0.291859, 0.406205], - [0.879464, 0.296125, 0.403118], - [0.884651, 0.30053, 0.400047], - [0.889731, 0.305079, 0.397002], - [0.8947, 0.309773, 0.393995], - [0.899552, 0.314616, 0.391037], - [0.904281, 0.31961, 0.388137], - [0.908884, 0.324755, 0.385308], - [0.913354, 0.330052, 0.382563], - [0.917689, 0.3355, 0.379915], - [0.921884, 0.341098, 0.377376], - [0.925937, 0.346844, 0.374959], - [0.929845, 0.352734, 0.372677], - [0.933606, 0.358764, 0.370541], - [0.937221, 0.364929, 0.368567], - [0.940687, 0.371224, 0.366762], - [0.944006, 0.377643, 0.365136], - [0.94718, 0.384178, 0.363701], - [0.95021, 0.39082, 0.362468], - [0.953099, 0.397563, 0.361438], - [0.955849, 0.4044, 0.360619], - [0.958464, 0.411324, 0.360014], - [0.960949, 0.418323, 0.35963], - [0.96331, 0.42539, 0.359469], - [0.965549, 0.432519, 0.359529], - [0.967671, 0.439703, 0.35981], - [0.96968, 0.446936, 0.360311], - [0.971582, 0.45421, 0.36103], - [0.973381, 0.46152, 0.361965], - [0.975082, 0.468861, 0.363111], - [0.97669, 0.476226, 0.364466], - [0.97821, 0.483612, 0.366025], - [0.979645, 0.491014, 0.367783], - [0.981, 0.498428, 0.369734], - [0.982279, 0.505851, 0.371874], - [0.983485, 0.51328, 0.374198], - [0.984622, 0.520713, 0.376698], - [0.985693, 0.528148, 0.379371], - [0.9867, 0.535582, 0.38221], - [0.987646, 0.543015, 0.38521], - [0.988533, 0.550446, 0.388365], - [0.989363, 0.557873, 0.391671], - [0.990138, 0.565296, 0.395122], - [0.990871, 0.572706, 0.398714], - [0.991558, 0.580107, 0.402441], - [0.992196, 0.587502, 0.406299], - [0.992785, 0.594891, 0.410283], - [0.993326, 0.602275, 0.41439], - [0.993834, 0.609644, 0.418613], - [0.994309, 0.616999, 0.42295], - [0.994738, 0.62435, 0.427397], - [0.995122, 0.631696, 0.431951], - [0.99548, 0.639027, 0.436607], - [0.99581, 0.646344, 0.441361], - [0.996096, 0.653659, 0.446213], - [0.996341, 0.660969, 0.45116], - [0.99658, 0.668256, 0.456192], - [0.996775, 0.675541, 0.461314], - [0.996925, 0.682828, 0.466526], - [0.997077, 0.690088, 0.471811], - [0.997186, 0.697349, 0.477182], - [0.997254, 0.704611, 0.482635], - [0.997325, 0.711848, 0.488154], - [0.997351, 0.719089, 0.493755], - [0.997351, 0.726324, 0.499428], - [0.997341, 0.733545, 0.505167], - [0.997285, 0.740772, 0.510983], - [0.997228, 0.747981, 0.516859], - [0.997138, 0.75519, 0.522806], - [0.997019, 0.762398, 0.528821], - [0.996898, 0.769591, 0.534892], - [0.996727, 0.776795, 0.541039], - [0.996571, 0.783977, 0.547233], - [0.996369, 0.791167, 0.553499], - [0.996162, 0.798348, 0.55982], - [0.995932, 0.805527, 0.566202], - [0.99568, 0.812706, 0.572645], - [0.995424, 0.819875, 0.57914], - [0.995131, 0.827052, 0.585701], - [0.994851, 0.834213, 0.592307], - [0.994524, 0.841387, 0.598983], - [0.994222, 0.84854, 0.605696], - [0.993866, 0.855711, 0.612482], - [0.993545, 0.862859, 0.619299], - [0.99317, 0.870024, 0.626189], - [0.992831, 0.877168, 0.633109], - [0.99244, 0.88433, 0.640099], - [0.992089, 0.89147, 0.647116], - [0.991688, 0.898627, 0.654202], - [0.991332, 0.905763, 0.661309], - [0.99093, 0.912915, 0.668481], - [0.99057, 0.920049, 0.675675], - [0.990175, 0.927196, 0.682926], - [0.989815, 0.934329, 0.690198], - [0.989434, 0.94147, 0.697519], - [0.989077, 0.948604, 0.704863], - [0.988717, 0.955742, 0.712242], - [0.988367, 0.962878, 0.719649], - [0.988033, 0.970012, 0.727077], - [0.987691, 0.977154, 0.734536], - [0.987387, 0.984288, 0.742002], - [0.987053, 0.991438, 0.749504], -]; - -export const colormap_inferno_data: Array<[number, number, number]> = [ - [0.001462, 0.000466, 0.013866], - [0.002267, 0.00127, 0.01857], - [0.003299, 0.002249, 0.024239], - [0.004547, 0.003392, 0.030909], - [0.006006, 0.004692, 0.038558], - [0.007676, 0.006136, 0.046836], - [0.009561, 0.007713, 0.055143], - [0.011663, 0.009417, 0.06346], - [0.013995, 0.011225, 0.071862], - [0.016561, 0.013136, 0.080282], - [0.019373, 0.015133, 0.088767], - [0.022447, 0.017199, 0.097327], - [0.025793, 0.019331, 0.10593], - [0.029432, 0.021503, 0.114621], - [0.033385, 0.023702, 0.123397], - [0.037668, 0.025921, 0.132232], - [0.042253, 0.028139, 0.141141], - [0.046915, 0.030324, 0.150164], - [0.051644, 0.032474, 0.159254], - [0.056449, 0.034569, 0.168414], - [0.06134, 0.03659, 0.177642], - [0.066331, 0.038504, 0.186962], - [0.071429, 0.040294, 0.196354], - [0.076637, 0.041905, 0.205799], - [0.081962, 0.043328, 0.215289], - [0.087411, 0.044556, 0.224813], - [0.09299, 0.045583, 0.234358], - [0.098702, 0.046402, 0.243904], - [0.104551, 0.047008, 0.25343], - [0.110536, 0.047399, 0.262912], - [0.116656, 0.047574, 0.272321], - [0.122908, 0.047536, 0.281624], - [0.129285, 0.047293, 0.290788], - [0.135778, 0.046856, 0.299776], - [0.142378, 0.046242, 0.308553], - [0.149073, 0.045468, 0.317085], - [0.15585, 0.044559, 0.325338], - [0.162689, 0.043554, 0.333277], - [0.169575, 0.042489, 0.340874], - [0.176493, 0.041402, 0.348111], - [0.183429, 0.040329, 0.354971], - [0.190367, 0.039309, 0.361447], - [0.197297, 0.0384, 0.367535], - [0.204209, 0.037632, 0.373238], - [0.211095, 0.03703, 0.378563], - [0.217949, 0.036615, 0.383522], - [0.224763, 0.036405, 0.388129], - [0.231538, 0.036405, 0.3924], - [0.238273, 0.036621, 0.396353], - [0.244967, 0.037055, 0.400007], - [0.25162, 0.037705, 0.403378], - [0.258234, 0.038571, 0.406485], - [0.26481, 0.039647, 0.409345], - [0.271347, 0.040922, 0.411976], - [0.27785, 0.042353, 0.414392], - [0.284321, 0.043933, 0.416608], - [0.290763, 0.045644, 0.418637], - [0.297178, 0.04747, 0.420491], - [0.303568, 0.049396, 0.422182], - [0.309935, 0.051407, 0.423721], - [0.316282, 0.05349, 0.425116], - [0.32261, 0.055634, 0.426377], - [0.328921, 0.057827, 0.427511], - [0.335217, 0.06006, 0.428524], - [0.3415, 0.062325, 0.429425], - [0.347771, 0.064616, 0.430217], - [0.354032, 0.066925, 0.430906], - [0.360284, 0.069247, 0.431497], - [0.366529, 0.071579, 0.431994], - [0.372768, 0.073915, 0.4324], - [0.379001, 0.076253, 0.432719], - [0.385228, 0.078591, 0.432955], - [0.391453, 0.080927, 0.433109], - [0.397674, 0.083257, 0.433183], - [0.403894, 0.08558, 0.433179], - [0.410113, 0.087896, 0.433098], - [0.416331, 0.090203, 0.432943], - [0.422549, 0.092501, 0.432714], - [0.428768, 0.09479, 0.432412], - [0.434987, 0.097069, 0.432039], - [0.441207, 0.099338, 0.431594], - [0.447428, 0.101597, 0.43108], - [0.453651, 0.103848, 0.430498], - [0.459875, 0.106089, 0.429846], - [0.4661, 0.108322, 0.429125], - [0.472328, 0.110547, 0.428334], - [0.478558, 0.112764, 0.427475], - [0.484789, 0.114974, 0.426548], - [0.491022, 0.117179, 0.425552], - [0.497257, 0.119379, 0.424488], - [0.503493, 0.121575, 0.423356], - [0.50973, 0.123769, 0.422156], - [0.515967, 0.12596, 0.420887], - [0.522206, 0.12815, 0.419549], - [0.528444, 0.130341, 0.418142], - [0.534683, 0.132534, 0.416667], - [0.54092, 0.134729, 0.415123], - [0.547157, 0.136929, 0.413511], - [0.553392, 0.139134, 0.411829], - [0.559624, 0.141346, 0.410078], - [0.565854, 0.143567, 0.408258], - [0.572081, 0.145797, 0.406369], - [0.578304, 0.148039, 0.404411], - [0.584521, 0.150294, 0.402385], - [0.590734, 0.152563, 0.40029], - [0.59694, 0.154848, 0.398125], - [0.603139, 0.157151, 0.395891], - [0.60933, 0.159474, 0.393589], - [0.615513, 0.161817, 0.391219], - [0.621685, 0.164184, 0.388781], - [0.627847, 0.166575, 0.386276], - [0.633998, 0.168992, 0.383704], - [0.640135, 0.171438, 0.381065], - [0.64626, 0.173914, 0.378359], - [0.652369, 0.176421, 0.375586], - [0.658463, 0.178962, 0.372748], - [0.66454, 0.181539, 0.369846], - [0.670599, 0.184153, 0.366879], - [0.676638, 0.186807, 0.363849], - [0.682656, 0.189501, 0.360757], - [0.688653, 0.192239, 0.357603], - [0.694627, 0.195021, 0.354388], - [0.700576, 0.197851, 0.351113], - [0.7065, 0.200728, 0.347777], - [0.712396, 0.203656, 0.344383], - [0.718264, 0.206636, 0.340931], - [0.724103, 0.20967, 0.337424], - [0.729909, 0.212759, 0.333861], - [0.735683, 0.215906, 0.330245], - [0.741423, 0.219112, 0.326576], - [0.747127, 0.222378, 0.322856], - [0.752794, 0.225706, 0.319085], - [0.758422, 0.229097, 0.315266], - [0.76401, 0.232554, 0.311399], - [0.769556, 0.236077, 0.307485], - [0.775059, 0.239667, 0.303526], - [0.780517, 0.243327, 0.299523], - [0.785929, 0.247056, 0.295477], - [0.791293, 0.250856, 0.29139], - [0.796607, 0.254728, 0.287264], - [0.801871, 0.258674, 0.283099], - [0.807082, 0.262692, 0.278898], - [0.812239, 0.266786, 0.274661], - [0.817341, 0.270954, 0.27039], - [0.822386, 0.275197, 0.266085], - [0.827372, 0.279517, 0.26175], - [0.832299, 0.283913, 0.257383], - [0.837165, 0.288385, 0.252988], - [0.841969, 0.292933, 0.248564], - [0.846709, 0.297559, 0.244113], - [0.851384, 0.30226, 0.239636], - [0.855992, 0.307038, 0.235133], - [0.860533, 0.311892, 0.230606], - [0.865006, 0.316822, 0.226055], - [0.869409, 0.321827, 0.221482], - [0.873741, 0.326906, 0.216886], - [0.878001, 0.33206, 0.212268], - [0.882188, 0.337287, 0.207628], - [0.886302, 0.342586, 0.202968], - [0.890341, 0.347957, 0.198286], - [0.894305, 0.353399, 0.193584], - [0.898192, 0.358911, 0.18886], - [0.902003, 0.364492, 0.184116], - [0.905735, 0.37014, 0.17935], - [0.90939, 0.375856, 0.174563], - [0.912966, 0.381636, 0.169755], - [0.916462, 0.387481, 0.164924], - [0.919879, 0.393389, 0.16007], - [0.923215, 0.399359, 0.155193], - [0.92647, 0.405389, 0.150292], - [0.929644, 0.411479, 0.145367], - [0.932737, 0.417627, 0.140417], - [0.935747, 0.423831, 0.13544], - [0.938675, 0.430091, 0.130438], - [0.941521, 0.436405, 0.125409], - [0.944285, 0.442772, 0.120354], - [0.946965, 0.449191, 0.115272], - [0.949562, 0.45566, 0.110164], - [0.952075, 0.462178, 0.105031], - [0.954506, 0.468744, 0.099874], - [0.956852, 0.475356, 0.094695], - [0.959114, 0.482014, 0.089499], - [0.961293, 0.488716, 0.084289], - [0.963387, 0.495462, 0.079073], - [0.965397, 0.502249, 0.073859], - [0.967322, 0.509078, 0.068659], - [0.969163, 0.515946, 0.063488], - [0.970919, 0.522853, 0.058367], - [0.97259, 0.529798, 0.053324], - [0.974176, 0.53678, 0.048392], - [0.975677, 0.543798, 0.043618], - [0.977092, 0.55085, 0.03905], - [0.978422, 0.557937, 0.034931], - [0.979666, 0.565057, 0.031409], - [0.980824, 0.572209, 0.028508], - [0.981895, 0.579392, 0.02625], - [0.982881, 0.586606, 0.024661], - [0.983779, 0.593849, 0.02377], - [0.984591, 0.601122, 0.023606], - [0.985315, 0.608422, 0.024202], - [0.985952, 0.61575, 0.025592], - [0.986502, 0.623105, 0.027814], - [0.986964, 0.630485, 0.030908], - [0.987337, 0.63789, 0.034916], - [0.987622, 0.64532, 0.039886], - [0.987819, 0.652773, 0.045581], - [0.987926, 0.66025, 0.05175], - [0.987945, 0.667748, 0.058329], - [0.987874, 0.675267, 0.065257], - [0.987714, 0.682807, 0.072489], - [0.987464, 0.690366, 0.07999], - [0.987124, 0.697944, 0.087731], - [0.986694, 0.70554, 0.095694], - [0.986175, 0.713153, 0.103863], - [0.985566, 0.720782, 0.112229], - [0.984865, 0.728427, 0.120785], - [0.984075, 0.736087, 0.129527], - [0.983196, 0.743758, 0.138453], - [0.982228, 0.751442, 0.147565], - [0.981173, 0.759135, 0.156863], - [0.980032, 0.766837, 0.166353], - [0.978806, 0.774545, 0.176037], - [0.977497, 0.782258, 0.185923], - [0.976108, 0.789974, 0.196018], - [0.974638, 0.797692, 0.206332], - [0.973088, 0.805409, 0.216877], - [0.971468, 0.813122, 0.227658], - [0.969783, 0.820825, 0.238686], - [0.968041, 0.828515, 0.249972], - [0.966243, 0.836191, 0.261534], - [0.964394, 0.843848, 0.273391], - [0.962517, 0.851476, 0.285546], - [0.960626, 0.859069, 0.29801], - [0.95872, 0.866624, 0.31082], - [0.956834, 0.874129, 0.323974], - [0.954997, 0.881569, 0.337475], - [0.953215, 0.888942, 0.351369], - [0.951546, 0.896226, 0.365627], - [0.950018, 0.903409, 0.380271], - [0.948683, 0.910473, 0.395289], - [0.947594, 0.917399, 0.410665], - [0.946809, 0.924168, 0.426373], - [0.946392, 0.930761, 0.442367], - [0.946403, 0.937159, 0.458592], - [0.946903, 0.943348, 0.47497], - [0.947937, 0.949318, 0.491426], - [0.949545, 0.955063, 0.50786], - [0.95174, 0.960587, 0.524203], - [0.954529, 0.965896, 0.540361], - [0.957896, 0.971003, 0.556275], - [0.961812, 0.975924, 0.571925], - [0.966249, 0.980678, 0.587206], - [0.971162, 0.985282, 0.602154], - [0.976511, 0.989753, 0.61676], - [0.982257, 0.994109, 0.631017], - [0.988362, 0.998364, 0.644924], -]; - -export const colormap_plasma_data: Array<[number, number, number]> = [ - [0.050383, 0.029803, 0.527975], - [0.063536, 0.028426, 0.533124], - [0.075353, 0.027206, 0.538007], - [0.086222, 0.026125, 0.542658], - [0.096379, 0.025165, 0.547103], - [0.10598, 0.024309, 0.551368], - [0.115124, 0.023556, 0.555468], - [0.123903, 0.022878, 0.559423], - [0.132381, 0.022258, 0.56325], - [0.140603, 0.021687, 0.566959], - [0.148607, 0.021154, 0.570562], - [0.156421, 0.020651, 0.574065], - [0.16407, 0.020171, 0.577478], - [0.171574, 0.019706, 0.580806], - [0.17895, 0.019252, 0.584054], - [0.186213, 0.018803, 0.587228], - [0.193374, 0.018354, 0.59033], - [0.200445, 0.017902, 0.593364], - [0.207435, 0.017442, 0.596333], - [0.21435, 0.016973, 0.599239], - [0.221197, 0.016497, 0.602083], - [0.227983, 0.016007, 0.604867], - [0.234715, 0.015502, 0.607592], - [0.241396, 0.014979, 0.610259], - [0.248032, 0.014439, 0.612868], - [0.254627, 0.013882, 0.615419], - [0.261183, 0.013308, 0.617911], - [0.267703, 0.012716, 0.620346], - [0.274191, 0.012109, 0.622722], - [0.280648, 0.011488, 0.625038], - [0.287076, 0.010855, 0.627295], - [0.293478, 0.010213, 0.62949], - [0.299855, 0.009561, 0.631624], - [0.30621, 0.008902, 0.633694], - [0.312543, 0.008239, 0.6357], - [0.318856, 0.007576, 0.63764], - [0.32515, 0.006915, 0.639512], - [0.331426, 0.006261, 0.641316], - [0.337683, 0.005618, 0.643049], - [0.343925, 0.004991, 0.64471], - [0.35015, 0.004382, 0.646298], - [0.356359, 0.003798, 0.64781], - [0.362553, 0.003243, 0.649245], - [0.368733, 0.002724, 0.650601], - [0.374897, 0.002245, 0.651876], - [0.381047, 0.001814, 0.653068], - [0.387183, 0.001434, 0.654177], - [0.393304, 0.001114, 0.655199], - [0.399411, 0.000859, 0.656133], - [0.405503, 0.000678, 0.656977], - [0.41158, 0.000577, 0.65773], - [0.417642, 0.000564, 0.65839], - [0.423689, 0.000646, 0.658956], - [0.429719, 0.000831, 0.659425], - [0.435734, 0.001127, 0.659797], - [0.441732, 0.00154, 0.660069], - [0.447714, 0.00208, 0.66024], - [0.453677, 0.002755, 0.66031], - [0.459623, 0.003574, 0.660277], - [0.46555, 0.004545, 0.660139], - [0.471457, 0.005678, 0.659897], - [0.477344, 0.00698, 0.659549], - [0.48321, 0.00846, 0.659095], - [0.489055, 0.010127, 0.658534], - [0.494877, 0.01199, 0.657865], - [0.500678, 0.014055, 0.657088], - [0.506454, 0.016333, 0.656202], - [0.512206, 0.018833, 0.655209], - [0.517933, 0.021563, 0.654109], - [0.523633, 0.024532, 0.652901], - [0.529306, 0.027747, 0.651586], - [0.534952, 0.031217, 0.650165], - [0.54057, 0.03495, 0.64864], - [0.546157, 0.038954, 0.64701], - [0.551715, 0.043136, 0.645277], - [0.557243, 0.047331, 0.643443], - [0.562738, 0.051545, 0.641509], - [0.568201, 0.055778, 0.639477], - [0.573632, 0.060028, 0.637349], - [0.579029, 0.064296, 0.635126], - [0.584391, 0.068579, 0.632812], - [0.589719, 0.072878, 0.630408], - [0.595011, 0.07719, 0.627917], - [0.600266, 0.081516, 0.625342], - [0.605485, 0.085854, 0.622686], - [0.610667, 0.090204, 0.619951], - [0.615812, 0.094564, 0.61714], - [0.620919, 0.098934, 0.614257], - [0.625987, 0.103312, 0.611305], - [0.631017, 0.107699, 0.608287], - [0.636008, 0.112092, 0.605205], - [0.640959, 0.116492, 0.602065], - [0.645872, 0.120898, 0.598867], - [0.650746, 0.125309, 0.595617], - [0.65558, 0.129725, 0.592317], - [0.660374, 0.134144, 0.588971], - [0.665129, 0.138566, 0.585582], - [0.669845, 0.142992, 0.582154], - [0.674522, 0.147419, 0.578688], - [0.67916, 0.151848, 0.575189], - [0.683758, 0.156278, 0.57166], - [0.688318, 0.160709, 0.568103], - [0.69284, 0.165141, 0.564522], - [0.697324, 0.169573, 0.560919], - [0.701769, 0.174005, 0.557296], - [0.706178, 0.178437, 0.553657], - [0.710549, 0.182868, 0.550004], - [0.714883, 0.187299, 0.546338], - [0.719181, 0.191729, 0.542663], - [0.723444, 0.196158, 0.538981], - [0.72767, 0.200586, 0.535293], - [0.731862, 0.205013, 0.531601], - [0.736019, 0.209439, 0.527908], - [0.740143, 0.213864, 0.524216], - [0.744232, 0.218288, 0.520524], - [0.748289, 0.222711, 0.516834], - [0.752312, 0.227133, 0.513149], - [0.756304, 0.231555, 0.509468], - [0.760264, 0.235976, 0.505794], - [0.764193, 0.240396, 0.502126], - [0.76809, 0.244817, 0.498465], - [0.771958, 0.249237, 0.494813], - [0.775796, 0.253658, 0.491171], - [0.779604, 0.258078, 0.487539], - [0.783383, 0.2625, 0.483918], - [0.787133, 0.266922, 0.480307], - [0.790855, 0.271345, 0.476706], - [0.794549, 0.27577, 0.473117], - [0.798216, 0.280197, 0.469538], - [0.801855, 0.284626, 0.465971], - [0.805467, 0.289057, 0.462415], - [0.809052, 0.293491, 0.45887], - [0.812612, 0.297928, 0.455338], - [0.816144, 0.302368, 0.451816], - [0.819651, 0.306812, 0.448306], - [0.823132, 0.311261, 0.444806], - [0.826588, 0.315714, 0.441316], - [0.830018, 0.320172, 0.437836], - [0.833422, 0.324635, 0.434366], - [0.836801, 0.329105, 0.430905], - [0.840155, 0.33358, 0.427455], - [0.843484, 0.338062, 0.424013], - [0.846788, 0.342551, 0.420579], - [0.850066, 0.347048, 0.417153], - [0.853319, 0.351553, 0.413734], - [0.856547, 0.356066, 0.410322], - [0.85975, 0.360588, 0.406917], - [0.862927, 0.365119, 0.403519], - [0.866078, 0.36966, 0.400126], - [0.869203, 0.374212, 0.396738], - [0.872303, 0.378774, 0.393355], - [0.875376, 0.383347, 0.389976], - [0.878423, 0.387932, 0.3866], - [0.881443, 0.392529, 0.383229], - [0.884436, 0.397139, 0.37986], - [0.887402, 0.401762, 0.376494], - [0.89034, 0.406398, 0.37313], - [0.89325, 0.411048, 0.369768], - [0.896131, 0.415712, 0.366407], - [0.898984, 0.420392, 0.363047], - [0.901807, 0.425087, 0.359688], - [0.904601, 0.429797, 0.356329], - [0.907365, 0.434524, 0.35297], - [0.910098, 0.439268, 0.34961], - [0.9128, 0.444029, 0.346251], - [0.915471, 0.448807, 0.34289], - [0.918109, 0.453603, 0.339529], - [0.920714, 0.458417, 0.336166], - [0.923287, 0.463251, 0.332801], - [0.925825, 0.468103, 0.329435], - [0.928329, 0.472975, 0.326067], - [0.930798, 0.477867, 0.322697], - [0.933232, 0.48278, 0.319325], - [0.93563, 0.487712, 0.315952], - [0.93799, 0.492667, 0.312575], - [0.940313, 0.497642, 0.309197], - [0.942598, 0.502639, 0.305816], - [0.944844, 0.507658, 0.302433], - [0.947051, 0.512699, 0.299049], - [0.949217, 0.517763, 0.295662], - [0.951344, 0.52285, 0.292275], - [0.953428, 0.52796, 0.288883], - [0.95547, 0.533093, 0.28549], - [0.957469, 0.53825, 0.282096], - [0.959424, 0.543431, 0.278701], - [0.961336, 0.548636, 0.275305], - [0.963203, 0.553865, 0.271909], - [0.965024, 0.559118, 0.268513], - [0.966798, 0.564396, 0.265118], - [0.968526, 0.5697, 0.261721], - [0.970205, 0.575028, 0.258325], - [0.971835, 0.580382, 0.254931], - [0.973416, 0.585761, 0.25154], - [0.974947, 0.591165, 0.248151], - [0.976428, 0.596595, 0.244767], - [0.977856, 0.602051, 0.241387], - [0.979233, 0.607532, 0.238013], - [0.980556, 0.613039, 0.234646], - [0.981826, 0.618572, 0.231287], - [0.983041, 0.624131, 0.227937], - [0.984199, 0.629718, 0.224595], - [0.985301, 0.63533, 0.221265], - [0.986345, 0.640969, 0.217948], - [0.987332, 0.646633, 0.214648], - [0.98826, 0.652325, 0.211364], - [0.989128, 0.658043, 0.2081], - [0.989935, 0.663787, 0.204859], - [0.990681, 0.669558, 0.201642], - [0.991365, 0.675355, 0.198453], - [0.991985, 0.681179, 0.195295], - [0.992541, 0.68703, 0.19217], - [0.993032, 0.692907, 0.189084], - [0.993456, 0.69881, 0.186041], - [0.993814, 0.704741, 0.183043], - [0.994103, 0.710698, 0.180097], - [0.994324, 0.716681, 0.177208], - [0.994474, 0.722691, 0.174381], - [0.994553, 0.728728, 0.171622], - [0.994561, 0.734791, 0.168938], - [0.994495, 0.74088, 0.166335], - [0.994355, 0.746995, 0.163821], - [0.994141, 0.753137, 0.161404], - [0.993851, 0.759304, 0.159092], - [0.993482, 0.765499, 0.156891], - [0.993033, 0.77172, 0.154808], - [0.992505, 0.777967, 0.152855], - [0.991897, 0.784239, 0.151042], - [0.991209, 0.790537, 0.149377], - [0.990439, 0.796859, 0.14787], - [0.989587, 0.803205, 0.146529], - [0.988648, 0.809579, 0.145357], - [0.987621, 0.815978, 0.144363], - [0.986509, 0.822401, 0.143557], - [0.985314, 0.828846, 0.142945], - [0.984031, 0.835315, 0.142528], - [0.982653, 0.841812, 0.142303], - [0.98119, 0.848329, 0.142279], - [0.979644, 0.854866, 0.142453], - [0.977995, 0.861432, 0.142808], - [0.976265, 0.868016, 0.143351], - [0.974443, 0.874622, 0.144061], - [0.97253, 0.88125, 0.144923], - [0.970533, 0.887896, 0.145919], - [0.968443, 0.894564, 0.147014], - [0.966271, 0.901249, 0.14818], - [0.964021, 0.90795, 0.14937], - [0.961681, 0.914672, 0.15052], - [0.959276, 0.921407, 0.151566], - [0.956808, 0.928152, 0.152409], - [0.954287, 0.934908, 0.152921], - [0.951726, 0.941671, 0.152925], - [0.949151, 0.948435, 0.152178], - [0.946602, 0.95519, 0.150328], - [0.944152, 0.961916, 0.146861], - [0.941896, 0.96859, 0.140956], - [0.940015, 0.975158, 0.131326], -]; - -export const colormap_viridis_data: Array<[number, number, number]> = [ - [0.267004, 0.004874, 0.329415], - [0.26851, 0.009605, 0.335427], - [0.269944, 0.014625, 0.341379], - [0.271305, 0.019942, 0.347269], - [0.272594, 0.025563, 0.353093], - [0.273809, 0.031497, 0.358853], - [0.274952, 0.037752, 0.364543], - [0.276022, 0.044167, 0.370164], - [0.277018, 0.050344, 0.375715], - [0.277941, 0.056324, 0.381191], - [0.278791, 0.062145, 0.386592], - [0.279566, 0.067836, 0.391917], - [0.280267, 0.073417, 0.397163], - [0.280894, 0.078907, 0.402329], - [0.281446, 0.08432, 0.407414], - [0.281924, 0.089666, 0.412415], - [0.282327, 0.094955, 0.417331], - [0.282656, 0.100196, 0.42216], - [0.28291, 0.105393, 0.426902], - [0.283091, 0.110553, 0.431554], - [0.283197, 0.11568, 0.436115], - [0.283229, 0.120777, 0.440584], - [0.283187, 0.125848, 0.44496], - [0.283072, 0.130895, 0.449241], - [0.282884, 0.13592, 0.453427], - [0.282623, 0.140926, 0.457517], - [0.28229, 0.145912, 0.46151], - [0.281887, 0.150881, 0.465405], - [0.281412, 0.155834, 0.469201], - [0.280868, 0.160771, 0.472899], - [0.280255, 0.165693, 0.476498], - [0.279574, 0.170599, 0.479997], - [0.278826, 0.17549, 0.483397], - [0.278012, 0.180367, 0.486697], - [0.277134, 0.185228, 0.489898], - [0.276194, 0.190074, 0.493001], - [0.275191, 0.194905, 0.496005], - [0.274128, 0.199721, 0.498911], - [0.273006, 0.20452, 0.501721], - [0.271828, 0.209303, 0.504434], - [0.270595, 0.214069, 0.507052], - [0.269308, 0.218818, 0.509577], - [0.267968, 0.223549, 0.512008], - [0.26658, 0.228262, 0.514349], - [0.265145, 0.232956, 0.516599], - [0.263663, 0.237631, 0.518762], - [0.262138, 0.242286, 0.520837], - [0.260571, 0.246922, 0.522828], - [0.258965, 0.251537, 0.524736], - [0.257322, 0.25613, 0.526563], - [0.255645, 0.260703, 0.528312], - [0.253935, 0.265254, 0.529983], - [0.252194, 0.269783, 0.531579], - [0.250425, 0.27429, 0.533103], - [0.248629, 0.278775, 0.534556], - [0.246811, 0.283237, 0.535941], - [0.244972, 0.287675, 0.53726], - [0.243113, 0.292092, 0.538516], - [0.241237, 0.296485, 0.539709], - [0.239346, 0.300855, 0.540844], - [0.237441, 0.305202, 0.541921], - [0.235526, 0.309527, 0.542944], - [0.233603, 0.313828, 0.543914], - [0.231674, 0.318106, 0.544834], - [0.229739, 0.322361, 0.545706], - [0.227802, 0.326594, 0.546532], - [0.225863, 0.330805, 0.547314], - [0.223925, 0.334994, 0.548053], - [0.221989, 0.339161, 0.548752], - [0.220057, 0.343307, 0.549413], - [0.21813, 0.347432, 0.550038], - [0.21621, 0.351535, 0.550627], - [0.214298, 0.355619, 0.551184], - [0.212395, 0.359683, 0.55171], - [0.210503, 0.363727, 0.552206], - [0.208623, 0.367752, 0.552675], - [0.206756, 0.371758, 0.553117], - [0.204903, 0.375746, 0.553533], - [0.203063, 0.379716, 0.553925], - [0.201239, 0.38367, 0.554294], - [0.19943, 0.387607, 0.554642], - [0.197636, 0.391528, 0.554969], - [0.19586, 0.395433, 0.555276], - [0.1941, 0.399323, 0.555565], - [0.192357, 0.403199, 0.555836], - [0.190631, 0.407061, 0.556089], - [0.188923, 0.41091, 0.556326], - [0.187231, 0.414746, 0.556547], - [0.185556, 0.41857, 0.556753], - [0.183898, 0.422383, 0.556944], - [0.182256, 0.426184, 0.55712], - [0.180629, 0.429975, 0.557282], - [0.179019, 0.433756, 0.55743], - [0.177423, 0.437527, 0.557565], - [0.175841, 0.44129, 0.557685], - [0.174274, 0.445044, 0.557792], - [0.172719, 0.448791, 0.557885], - [0.171176, 0.45253, 0.557965], - [0.169646, 0.456262, 0.55803], - [0.168126, 0.459988, 0.558082], - [0.166617, 0.463708, 0.558119], - [0.165117, 0.467423, 0.558141], - [0.163625, 0.471133, 0.558148], - [0.162142, 0.474838, 0.55814], - [0.160665, 0.47854, 0.558115], - [0.159194, 0.482237, 0.558073], - [0.157729, 0.485932, 0.558013], - [0.15627, 0.489624, 0.557936], - [0.154815, 0.493313, 0.55784], - [0.153364, 0.497, 0.557724], - [0.151918, 0.500685, 0.557587], - [0.150476, 0.504369, 0.55743], - [0.149039, 0.508051, 0.55725], - [0.147607, 0.511733, 0.557049], - [0.14618, 0.515413, 0.556823], - [0.144759, 0.519093, 0.556572], - [0.143343, 0.522773, 0.556295], - [0.141935, 0.526453, 0.555991], - [0.140536, 0.530132, 0.555659], - [0.139147, 0.533812, 0.555298], - [0.13777, 0.537492, 0.554906], - [0.136408, 0.541173, 0.554483], - [0.135066, 0.544853, 0.554029], - [0.133743, 0.548535, 0.553541], - [0.132444, 0.552216, 0.553018], - [0.131172, 0.555899, 0.552459], - [0.129933, 0.559582, 0.551864], - [0.128729, 0.563265, 0.551229], - [0.127568, 0.566949, 0.550556], - [0.126453, 0.570633, 0.549841], - [0.125394, 0.574318, 0.549086], - [0.124395, 0.578002, 0.548287], - [0.123463, 0.581687, 0.547445], - [0.122606, 0.585371, 0.546557], - [0.121831, 0.589055, 0.545623], - [0.121148, 0.592739, 0.544641], - [0.120565, 0.596422, 0.543611], - [0.120092, 0.600104, 0.54253], - [0.119738, 0.603785, 0.5414], - [0.119512, 0.607464, 0.540218], - [0.119423, 0.611141, 0.538982], - [0.119483, 0.614817, 0.537692], - [0.119699, 0.61849, 0.536347], - [0.120081, 0.622161, 0.534946], - [0.120638, 0.625828, 0.533488], - [0.12138, 0.629492, 0.531973], - [0.122312, 0.633153, 0.530398], - [0.123444, 0.636809, 0.528763], - [0.12478, 0.640461, 0.527068], - [0.126326, 0.644107, 0.525311], - [0.128087, 0.647749, 0.523491], - [0.130067, 0.651384, 0.521608], - [0.132268, 0.655014, 0.519661], - [0.134692, 0.658636, 0.517649], - [0.137339, 0.662252, 0.515571], - [0.14021, 0.665859, 0.513427], - [0.143303, 0.669459, 0.511215], - [0.146616, 0.67305, 0.508936], - [0.150148, 0.676631, 0.506589], - [0.153894, 0.680203, 0.504172], - [0.157851, 0.683765, 0.501686], - [0.162016, 0.687316, 0.499129], - [0.166383, 0.690856, 0.496502], - [0.170948, 0.694384, 0.493803], - [0.175707, 0.6979, 0.491033], - [0.180653, 0.701402, 0.488189], - [0.185783, 0.704891, 0.485273], - [0.19109, 0.708366, 0.482284], - [0.196571, 0.711827, 0.479221], - [0.202219, 0.715272, 0.476084], - [0.20803, 0.718701, 0.472873], - [0.214, 0.722114, 0.469588], - [0.220124, 0.725509, 0.466226], - [0.226397, 0.728888, 0.462789], - [0.232815, 0.732247, 0.459277], - [0.239374, 0.735588, 0.455688], - [0.24607, 0.73891, 0.452024], - [0.252899, 0.742211, 0.448284], - [0.259857, 0.745492, 0.444467], - [0.266941, 0.748751, 0.440573], - [0.274149, 0.751988, 0.436601], - [0.281477, 0.755203, 0.432552], - [0.288921, 0.758394, 0.428426], - [0.296479, 0.761561, 0.424223], - [0.304148, 0.764704, 0.419943], - [0.311925, 0.767822, 0.415586], - [0.319809, 0.770914, 0.411152], - [0.327796, 0.77398, 0.40664], - [0.335885, 0.777018, 0.402049], - [0.344074, 0.780029, 0.397381], - [0.35236, 0.783011, 0.392636], - [0.360741, 0.785964, 0.387814], - [0.369214, 0.788888, 0.382914], - [0.377779, 0.791781, 0.377939], - [0.386433, 0.794644, 0.372886], - [0.395174, 0.797475, 0.367757], - [0.404001, 0.800275, 0.362552], - [0.412913, 0.803041, 0.357269], - [0.421908, 0.805774, 0.35191], - [0.430983, 0.808473, 0.346476], - [0.440137, 0.811138, 0.340967], - [0.449368, 0.813768, 0.335384], - [0.458674, 0.816363, 0.329727], - [0.468053, 0.818921, 0.323998], - [0.477504, 0.821444, 0.318195], - [0.487026, 0.823929, 0.312321], - [0.496615, 0.826376, 0.306377], - [0.506271, 0.828786, 0.300362], - [0.515992, 0.831158, 0.294279], - [0.525776, 0.833491, 0.288127], - [0.535621, 0.835785, 0.281908], - [0.545524, 0.838039, 0.275626], - [0.555484, 0.840254, 0.269281], - [0.565498, 0.84243, 0.262877], - [0.575563, 0.844566, 0.256415], - [0.585678, 0.846661, 0.249897], - [0.595839, 0.848717, 0.243329], - [0.606045, 0.850733, 0.236712], - [0.616293, 0.852709, 0.230052], - [0.626579, 0.854645, 0.223353], - [0.636902, 0.856542, 0.21662], - [0.647257, 0.8584, 0.209861], - [0.657642, 0.860219, 0.203082], - [0.668054, 0.861999, 0.196293], - [0.678489, 0.863742, 0.189503], - [0.688944, 0.865448, 0.182725], - [0.699415, 0.867117, 0.175971], - [0.709898, 0.868751, 0.169257], - [0.720391, 0.87035, 0.162603], - [0.730889, 0.871916, 0.156029], - [0.741388, 0.873449, 0.149561], - [0.751884, 0.874951, 0.143228], - [0.762373, 0.876424, 0.137064], - [0.772852, 0.877868, 0.131109], - [0.783315, 0.879285, 0.125405], - [0.79376, 0.880678, 0.120005], - [0.804182, 0.882046, 0.114965], - [0.814576, 0.883393, 0.110347], - [0.82494, 0.88472, 0.106217], - [0.83527, 0.886029, 0.102646], - [0.845561, 0.887322, 0.099702], - [0.85581, 0.888601, 0.097452], - [0.866013, 0.889868, 0.095953], - [0.876168, 0.891125, 0.09525], - [0.886271, 0.892374, 0.095374], - [0.89632, 0.893616, 0.096335], - [0.906311, 0.894855, 0.098125], - [0.916242, 0.896091, 0.100717], - [0.926106, 0.89733, 0.104071], - [0.935904, 0.89857, 0.108131], - [0.945636, 0.899815, 0.112838], - [0.9553, 0.901065, 0.118128], - [0.964894, 0.902323, 0.123941], - [0.974417, 0.90359, 0.130215], - [0.983868, 0.904867, 0.136897], - [0.993248, 0.906157, 0.143936], -]; diff --git a/projects/wave-core/src/lib/colors/colormaps/scientific-colormaps/scientific-colormap.license b/projects/wave-core/src/lib/colors/colormaps/scientific-colormaps/scientific-colormap.license deleted file mode 100644 index cb10f7b8..00000000 --- a/projects/wave-core/src/lib/colors/colormaps/scientific-colormaps/scientific-colormap.license +++ /dev/null @@ -1,21 +0,0 @@ -The Scientific Colour Maps are licensed under a MIT License - -Copyright (c) 2020, Fabio Crameri - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation -files (the ”Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell copies of the -Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ”AS IS”, WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE diff --git a/projects/wave-core/src/lib/colors/colormaps/scientific-colormaps/scientific-colormaps.ts b/projects/wave-core/src/lib/colors/colormaps/scientific-colormaps/scientific-colormaps.ts deleted file mode 100644 index a26d8b62..00000000 --- a/projects/wave-core/src/lib/colors/colormaps/scientific-colormaps/scientific-colormaps.ts +++ /dev/null @@ -1,7328 +0,0 @@ -/** - * The colormaps in this file are derived from 'The Scientific Colour Maps' by Fabio Crameri: - * @See(http://www.fabiocrameri.ch/colourmaps.php) - * Crameri, F. (2018). Scientific colour-maps. Zenodo. - * Crameri, F. (2018), Geodynamic diagnostics, scientific visualisation and StagLab 3.0, - * Geosci. Model Dev., 11, 2541-2562, doi:10.5194/gmd-11-2541-2018 - * - * See 'The Scientific Colour Maps' MIT license and copyright in scientific-colormaps.license - */ - -/** - * The color map names. - */ -export type ScientificColormapName = - | 'ARCON' - | 'BAMAKO' - | 'BATLOW' - | 'BERLIN' - | 'BILBAO' - | 'BROC' - | 'BROCO' - | 'BUDA' - | 'CORC' - | 'CORCO' - | 'DAVOS' - | 'DEVON' - | 'GRAYC' - | 'HAWAII' - | 'IMOLA' - | 'LAJOLLA' - | 'LAPAZ' - | 'LISBON' - | 'NUUK' - | 'OLERON' - | 'OSLO' - | 'ROMA' - | 'ROMAO' - | 'TOFINO' - | 'TOKYO' - | 'TURKU' - | 'VIK' - | 'VIKO'; - -/** - * The list of available color map names. - */ -export const SCIENTIFIC_COLORMAP_NAMES: Array = [ - 'ARCON', - 'BAMAKO', - 'BATLOW', - 'BERLIN', - 'BILBAO', - 'BROC', - 'BROCO', - 'BUDA', - 'CORC', - 'CORCO', - 'DAVOS', - 'DEVON', - 'GRAYC', - 'HAWAII', - 'IMOLA', - 'LAJOLLA', - 'LAPAZ', - 'LISBON', - 'NUUK', - 'OLERON', - 'OSLO', - 'ROMA', - 'ROMAO', - 'TOFINO', - 'TOKYO', - 'TURKU', - 'VIK', - 'VIKO', -]; - -export const colormap_batlow_data: Array<[number, number, number]> = [ - [0.0051932, 0.098238, 0.34984], - [0.0090652, 0.10449, 0.35093], - [0.012963, 0.11078, 0.35199], - [0.01653, 0.11691, 0.35307], - [0.019936, 0.12298, 0.35412], - [0.023189, 0.12904, 0.35518], - [0.026291, 0.13504, 0.35621], - [0.029245, 0.14096, 0.35724], - [0.032053, 0.14677, 0.35824], - [0.034853, 0.15256, 0.35923], - [0.037449, 0.15831, 0.36022], - [0.039845, 0.16398, 0.36119], - [0.042104, 0.16956, 0.36215], - [0.044069, 0.17505, 0.36308], - [0.045905, 0.18046, 0.36401], - [0.047665, 0.18584, 0.36491], - [0.049378, 0.19108, 0.36581], - [0.050795, 0.19627, 0.36668], - [0.052164, 0.20132, 0.36752], - [0.053471, 0.20636, 0.36837], - [0.054721, 0.21123, 0.36918], - [0.055928, 0.21605, 0.36997], - [0.057033, 0.22075, 0.37075], - [0.058032, 0.22534, 0.37151], - [0.059164, 0.22984, 0.37225], - [0.060167, 0.2343, 0.37298], - [0.061052, 0.23862, 0.37369], - [0.06206, 0.24289, 0.37439], - [0.063071, 0.24709, 0.37505], - [0.063982, 0.25121, 0.37571], - [0.064936, 0.25526, 0.37636], - [0.065903, 0.25926, 0.37699], - [0.066899, 0.26319, 0.37759], - [0.067921, 0.26706, 0.37819], - [0.069002, 0.27092, 0.37877], - [0.070001, 0.27471, 0.37934], - [0.071115, 0.2785, 0.37989], - [0.072192, 0.28225, 0.38043], - [0.07344, 0.28594, 0.38096], - [0.074595, 0.28965, 0.38145], - [0.075833, 0.29332, 0.38192], - [0.077136, 0.297, 0.38238], - [0.078517, 0.30062, 0.38281], - [0.079984, 0.30425, 0.38322], - [0.081553, 0.30786, 0.3836], - [0.083082, 0.31146, 0.38394], - [0.084778, 0.31504, 0.38424], - [0.086503, 0.31862, 0.38451], - [0.088353, 0.32217, 0.38473], - [0.090281, 0.32569, 0.38491], - [0.092304, 0.32922, 0.38504], - [0.094462, 0.33271, 0.38512], - [0.096618, 0.33616, 0.38513], - [0.099015, 0.33962, 0.38509], - [0.10148, 0.34304, 0.38498], - [0.10408, 0.34641, 0.3848], - [0.10684, 0.34977, 0.38455], - [0.1097, 0.3531, 0.38422], - [0.11265, 0.35639, 0.38381], - [0.11575, 0.35964, 0.38331], - [0.11899, 0.36285, 0.38271], - [0.12232, 0.36603, 0.38203], - [0.12589, 0.36916, 0.38126], - [0.12952, 0.37224, 0.38038], - [0.1333, 0.37528, 0.3794], - [0.13721, 0.37828, 0.37831], - [0.14126, 0.38124, 0.37713], - [0.14543, 0.38413, 0.37584], - [0.14971, 0.38698, 0.37445], - [0.15407, 0.38978, 0.37293], - [0.15862, 0.39253, 0.37132], - [0.16325, 0.39524, 0.36961], - [0.16795, 0.39789, 0.36778], - [0.17279, 0.4005, 0.36587], - [0.17775, 0.40304, 0.36383], - [0.18273, 0.40555, 0.36171], - [0.18789, 0.408, 0.35948], - [0.19305, 0.41043, 0.35718], - [0.19831, 0.4128, 0.35477], - [0.20368, 0.41512, 0.35225], - [0.20908, 0.41741, 0.34968], - [0.21455, 0.41966, 0.34702], - [0.22011, 0.42186, 0.34426], - [0.22571, 0.42405, 0.34146], - [0.23136, 0.4262, 0.33857], - [0.23707, 0.42832, 0.33563], - [0.24279, 0.43042, 0.33263], - [0.24862, 0.43249, 0.32957], - [0.25445, 0.43453, 0.32643], - [0.26032, 0.43656, 0.32329], - [0.26624, 0.43856, 0.32009], - [0.27217, 0.44054, 0.31683], - [0.27817, 0.44252, 0.31355], - [0.28417, 0.44448, 0.31024], - [0.29021, 0.44642, 0.30689], - [0.29629, 0.44836, 0.30351], - [0.30238, 0.45028, 0.30012], - [0.30852, 0.4522, 0.29672], - [0.31465, 0.45411, 0.29328], - [0.32083, 0.45601, 0.28984], - [0.32701, 0.4579, 0.28638], - [0.33323, 0.45979, 0.28294], - [0.33947, 0.46168, 0.27947], - [0.3457, 0.46356, 0.276], - [0.35198, 0.46544, 0.27249], - [0.35828, 0.46733, 0.26904], - [0.36459, 0.46921, 0.26554], - [0.37092, 0.47109, 0.26206], - [0.37729, 0.47295, 0.25859], - [0.38368, 0.47484, 0.25513], - [0.39007, 0.47671, 0.25166], - [0.3965, 0.47859, 0.24821], - [0.40297, 0.48047, 0.24473], - [0.40945, 0.48235, 0.24131], - [0.41597, 0.48423, 0.23789], - [0.42251, 0.48611, 0.23449], - [0.42909, 0.48801, 0.2311], - [0.43571, 0.48989, 0.22773], - [0.44237, 0.4918, 0.22435], - [0.44905, 0.49368, 0.22107], - [0.45577, 0.49558, 0.21777], - [0.46254, 0.4975, 0.21452], - [0.46937, 0.49939, 0.21132], - [0.47622, 0.50131, 0.20815], - [0.48312, 0.50322, 0.20504], - [0.49008, 0.50514, 0.20198], - [0.49709, 0.50706, 0.19899], - [0.50415, 0.50898, 0.19612], - [0.51125, 0.5109, 0.1933], - [0.51842, 0.51282, 0.19057], - [0.52564, 0.51475, 0.18799], - [0.53291, 0.51666, 0.1855], - [0.54023, 0.51858, 0.1831], - [0.5476, 0.52049, 0.18088], - [0.55502, 0.52239, 0.17885], - [0.56251, 0.52429, 0.17696], - [0.57002, 0.52619, 0.17527], - [0.57758, 0.52806, 0.17377], - [0.5852, 0.52993, 0.17249], - [0.59285, 0.53178, 0.17145], - [0.60052, 0.5336, 0.17065], - [0.60824, 0.53542, 0.1701], - [0.61597, 0.53723, 0.16983], - [0.62374, 0.539, 0.16981], - [0.63151, 0.54075, 0.17007], - [0.6393, 0.54248, 0.17062], - [0.6471, 0.54418, 0.17146], - [0.65489, 0.54586, 0.1726], - [0.66269, 0.5475, 0.17404], - [0.67048, 0.54913, 0.17575], - [0.67824, 0.55071, 0.1778], - [0.686, 0.55227, 0.18006], - [0.69372, 0.5538, 0.18261], - [0.70142, 0.55529, 0.18548], - [0.7091, 0.55677, 0.18855], - [0.71673, 0.5582, 0.19185], - [0.72432, 0.55963, 0.19541], - [0.73188, 0.56101, 0.19917], - [0.73939, 0.56239, 0.20318], - [0.74685, 0.56373, 0.20737], - [0.75427, 0.56503, 0.21176], - [0.76163, 0.56634, 0.21632], - [0.76894, 0.56763, 0.22105], - [0.77621, 0.5689, 0.22593], - [0.78342, 0.57016, 0.23096], - [0.79057, 0.57142, 0.23616], - [0.79767, 0.57268, 0.24149], - [0.80471, 0.57393, 0.24696], - [0.81169, 0.57519, 0.25257], - [0.81861, 0.57646, 0.2583], - [0.82547, 0.57773, 0.2642], - [0.83227, 0.57903, 0.27021], - [0.839, 0.58034, 0.27635], - [0.84566, 0.58167, 0.28263], - [0.85225, 0.58304, 0.28904], - [0.85875, 0.58444, 0.29557], - [0.86517, 0.58588, 0.30225], - [0.87151, 0.58735, 0.30911], - [0.87774, 0.58887, 0.31608], - [0.88388, 0.59045, 0.32319], - [0.8899, 0.59209, 0.33045], - [0.89581, 0.59377, 0.33787], - [0.90159, 0.59551, 0.34543], - [0.90724, 0.59732, 0.35314], - [0.91275, 0.59919, 0.36099], - [0.9181, 0.60113, 0.369], - [0.9233, 0.60314, 0.37714], - [0.92832, 0.60521, 0.3854], - [0.93318, 0.60737, 0.39382], - [0.93785, 0.60958, 0.40235], - [0.94233, 0.61187, 0.41101], - [0.94661, 0.61422, 0.41977], - [0.9507, 0.61665, 0.42862], - [0.95457, 0.61914, 0.43758], - [0.95824, 0.62167, 0.4466], - [0.9617, 0.62428, 0.4557], - [0.96494, 0.62693, 0.46486], - [0.96798, 0.62964, 0.47406], - [0.9708, 0.63239, 0.48329], - [0.97342, 0.63518, 0.49255], - [0.97584, 0.63801, 0.50183], - [0.97805, 0.64087, 0.51109], - [0.98008, 0.64375, 0.52035], - [0.98192, 0.64666, 0.5296], - [0.98357, 0.64959, 0.53882], - [0.98507, 0.65252, 0.548], - [0.98639, 0.65547, 0.55714], - [0.98757, 0.65842, 0.56623], - [0.9886, 0.66138, 0.57526], - [0.9895, 0.66433, 0.58425], - [0.99027, 0.66728, 0.59317], - [0.99093, 0.67023, 0.60203], - [0.99148, 0.67316, 0.61084], - [0.99194, 0.67609, 0.61958], - [0.9923, 0.67901, 0.62825], - [0.99259, 0.68191, 0.63687], - [0.99281, 0.68482, 0.64542], - [0.99297, 0.68771, 0.65393], - [0.99306, 0.69058, 0.6624], - [0.99311, 0.69345, 0.67081], - [0.99311, 0.69631, 0.67918], - [0.99307, 0.69916, 0.68752], - [0.993, 0.70201, 0.69583], - [0.9929, 0.70485, 0.70411], - [0.99277, 0.70769, 0.71238], - [0.99262, 0.71053, 0.72064], - [0.99245, 0.71337, 0.72889], - [0.99226, 0.71621, 0.73715], - [0.99205, 0.71905, 0.7454], - [0.99184, 0.72189, 0.75367], - [0.99161, 0.72475, 0.76196], - [0.99137, 0.72761, 0.77027], - [0.99112, 0.73049, 0.77861], - [0.99086, 0.73337, 0.78698], - [0.99059, 0.73626, 0.79537], - [0.99031, 0.73918, 0.80381], - [0.99002, 0.7421, 0.81229], - [0.98972, 0.74504, 0.8208], - [0.98941, 0.748, 0.82937], - [0.98909, 0.75097, 0.83798], - [0.98875, 0.75395, 0.84663], - [0.98841, 0.75695, 0.85533], - [0.98805, 0.75996, 0.86408], - [0.98767, 0.763, 0.87286], - [0.98728, 0.76605, 0.8817], - [0.98687, 0.7691, 0.89057], - [0.98643, 0.77218, 0.89949], - [0.98598, 0.77527, 0.90845], - [0.9855, 0.77838, 0.91744], - [0.985, 0.7815, 0.92647], - [0.98447, 0.78462, 0.93553], - [0.98391, 0.78776, 0.94463], - [0.98332, 0.79091, 0.95375], - [0.9827, 0.79407, 0.9629], - [0.98205, 0.79723, 0.97207], - [0.98135, 0.80041, 0.98127], -]; - -export const colormap_arcon_data: Array<[number, number, number]> = [ - [0.18063, 0.12992, 0.30024], - [0.18461, 0.13336, 0.30378], - [0.18859, 0.13683, 0.30733], - [0.19255, 0.14032, 0.3109], - [0.19655, 0.14383, 0.31444], - [0.20049, 0.14734, 0.31801], - [0.20451, 0.15085, 0.32158], - [0.20849, 0.15437, 0.32515], - [0.2125, 0.15792, 0.32875], - [0.21652, 0.16149, 0.33235], - [0.22054, 0.165, 0.33593], - [0.22453, 0.16858, 0.33954], - [0.2286, 0.17214, 0.34314], - [0.23263, 0.17571, 0.34675], - [0.2367, 0.17931, 0.35037], - [0.24074, 0.18289, 0.35398], - [0.24481, 0.1865, 0.35762], - [0.24893, 0.1901, 0.36124], - [0.25303, 0.19373, 0.36487], - [0.25715, 0.19734, 0.36852], - [0.26128, 0.20094, 0.37216], - [0.26543, 0.20461, 0.37581], - [0.2696, 0.20823, 0.37946], - [0.27378, 0.21188, 0.38312], - [0.27798, 0.2155, 0.38677], - [0.2822, 0.21915, 0.39043], - [0.28642, 0.22281, 0.3941], - [0.29069, 0.22646, 0.39777], - [0.29496, 0.23008, 0.40143], - [0.29928, 0.23373, 0.40509], - [0.30359, 0.23742, 0.40876], - [0.30794, 0.24104, 0.41244], - [0.31231, 0.24467, 0.41609], - [0.31673, 0.24835, 0.41976], - [0.32115, 0.25198, 0.4234], - [0.3256, 0.25561, 0.42707], - [0.3301, 0.25925, 0.43071], - [0.33462, 0.26286, 0.43435], - [0.33916, 0.26647, 0.43799], - [0.34371, 0.27008, 0.44162], - [0.34832, 0.27367, 0.44523], - [0.35296, 0.27725, 0.44884], - [0.35764, 0.28079, 0.45243], - [0.36233, 0.28434, 0.45599], - [0.36706, 0.28787, 0.45956], - [0.37182, 0.29139, 0.46309], - [0.37663, 0.29486, 0.46662], - [0.38146, 0.29832, 0.47012], - [0.38631, 0.30175, 0.47358], - [0.39123, 0.30517, 0.47703], - [0.39615, 0.30855, 0.48045], - [0.40112, 0.31187, 0.48384], - [0.40611, 0.31519, 0.4872], - [0.41112, 0.31845, 0.49052], - [0.41617, 0.32167, 0.4938], - [0.42124, 0.32485, 0.49704], - [0.42634, 0.32799, 0.50023], - [0.43147, 0.33107, 0.50338], - [0.43661, 0.33412, 0.50649], - [0.44178, 0.3371, 0.50955], - [0.44695, 0.34002, 0.51254], - [0.45215, 0.34289, 0.51548], - [0.45735, 0.34567, 0.51838], - [0.46256, 0.34842, 0.5212], - [0.46779, 0.35109, 0.52396], - [0.47301, 0.35368, 0.52667], - [0.47824, 0.35622, 0.5293], - [0.48346, 0.35866, 0.53186], - [0.48868, 0.36105, 0.53435], - [0.49389, 0.36336, 0.53678], - [0.49909, 0.36559, 0.53912], - [0.50428, 0.36773, 0.54138], - [0.50944, 0.36981, 0.54359], - [0.5146, 0.37179, 0.54572], - [0.51971, 0.37371, 0.54776], - [0.52482, 0.37553, 0.54973], - [0.52989, 0.37729, 0.55162], - [0.53494, 0.37895, 0.55343], - [0.53995, 0.38054, 0.55517], - [0.54493, 0.38204, 0.55684], - [0.54988, 0.38348, 0.55842], - [0.55479, 0.38482, 0.55995], - [0.55967, 0.38609, 0.56139], - [0.5645, 0.38729, 0.56277], - [0.56929, 0.38842, 0.56407], - [0.57405, 0.38948, 0.56529], - [0.57878, 0.39046, 0.56647], - [0.58346, 0.39139, 0.56758], - [0.5881, 0.39224, 0.56862], - [0.59272, 0.39303, 0.56961], - [0.59728, 0.39377, 0.57054], - [0.60181, 0.39446, 0.57142], - [0.60631, 0.39509, 0.57225], - [0.61079, 0.39568, 0.57304], - [0.61522, 0.39621, 0.57377], - [0.61963, 0.3967, 0.57446], - [0.62402, 0.39717, 0.57513], - [0.62837, 0.39761, 0.57577], - [0.63271, 0.39801, 0.57637], - [0.63703, 0.39839, 0.57694], - [0.64132, 0.39875, 0.57749], - [0.64562, 0.39909, 0.57803], - [0.64991, 0.39943, 0.57856], - [0.65419, 0.39978, 0.57909], - [0.65846, 0.40013, 0.57961], - [0.66275, 0.4005, 0.58013], - [0.66704, 0.40088, 0.58066], - [0.67134, 0.40128, 0.58121], - [0.67566, 0.40171, 0.58178], - [0.67999, 0.40218, 0.58238], - [0.68435, 0.40272, 0.58301], - [0.68875, 0.40332, 0.58369], - [0.69317, 0.40397, 0.58441], - [0.69762, 0.4047, 0.58519], - [0.70211, 0.40553, 0.58603], - [0.70665, 0.40645, 0.58693], - [0.71122, 0.40747, 0.58792], - [0.71583, 0.40861, 0.58898], - [0.72047, 0.40989, 0.59014], - [0.72516, 0.41129, 0.59141], - [0.72988, 0.41285, 0.59277], - [0.73462, 0.41455, 0.59423], - [0.73939, 0.41642, 0.59581], - [0.74417, 0.41844, 0.59751], - [0.74895, 0.42065, 0.59933], - [0.75373, 0.42302, 0.60126], - [0.75848, 0.42558, 0.60332], - [0.7632, 0.4283, 0.60549], - [0.76786, 0.4312, 0.60779], - [0.77246, 0.43425, 0.61018], - [0.77698, 0.43747, 0.61269], - [0.78138, 0.44082, 0.6153], - [0.78567, 0.44434, 0.61799], - [0.78982, 0.44795, 0.62078], - [0.79382, 0.4517, 0.62362], - [0.79765, 0.45553, 0.62652], - [0.8013, 0.45945, 0.62948], - [0.80476, 0.46342, 0.63248], - [0.80802, 0.46745, 0.6355], - [0.81107, 0.47152, 0.63854], - [0.81391, 0.47561, 0.64158], - [0.81654, 0.4797, 0.64462], - [0.81895, 0.48377, 0.64766], - [0.82115, 0.48786, 0.65067], - [0.82315, 0.4919, 0.65366], - [0.82494, 0.4959, 0.65662], - [0.82655, 0.49987, 0.65954], - [0.82796, 0.5038, 0.66243], - [0.8292, 0.50768, 0.66527], - [0.83027, 0.5115, 0.66808], - [0.83119, 0.51528, 0.67085], - [0.83196, 0.51901, 0.67357], - [0.8326, 0.52267, 0.67625], - [0.83311, 0.5263, 0.67889], - [0.83351, 0.52987, 0.68149], - [0.83381, 0.53339, 0.68406], - [0.83402, 0.53689, 0.6866], - [0.83415, 0.54032, 0.68911], - [0.8342, 0.54373, 0.69158], - [0.83418, 0.54711, 0.69403], - [0.83411, 0.55045, 0.69646], - [0.83399, 0.55377, 0.69886], - [0.83382, 0.55707, 0.70125], - [0.83362, 0.56035, 0.70362], - [0.83339, 0.56361, 0.70598], - [0.83314, 0.56685, 0.70832], - [0.83287, 0.57008, 0.71065], - [0.83258, 0.57331, 0.71297], - [0.83229, 0.57653, 0.7153], - [0.83199, 0.57975, 0.71761], - [0.83169, 0.58295, 0.71992], - [0.83139, 0.58617, 0.72222], - [0.83109, 0.58938, 0.72453], - [0.83081, 0.59261, 0.72684], - [0.83053, 0.59583, 0.72915], - [0.83027, 0.59907, 0.73146], - [0.83003, 0.6023, 0.73378], - [0.82981, 0.60555, 0.7361], - [0.8296, 0.60882, 0.73843], - [0.82942, 0.61209, 0.74076], - [0.82927, 0.61537, 0.74311], - [0.82914, 0.61868, 0.74545], - [0.82904, 0.62198, 0.74781], - [0.82896, 0.62531, 0.75017], - [0.82892, 0.62865, 0.75254], - [0.82891, 0.63201, 0.75493], - [0.82893, 0.63538, 0.75732], - [0.82898, 0.63877, 0.75971], - [0.82907, 0.64218, 0.76212], - [0.82919, 0.6456, 0.76455], - [0.82935, 0.64904, 0.76697], - [0.82954, 0.6525, 0.76941], - [0.82977, 0.65598, 0.77186], - [0.83003, 0.65947, 0.77432], - [0.83034, 0.66298, 0.77679], - [0.83068, 0.6665, 0.77927], - [0.83106, 0.67005, 0.78176], - [0.83147, 0.67361, 0.78426], - [0.83193, 0.6772, 0.78677], - [0.83241, 0.68078, 0.78929], - [0.83294, 0.6844, 0.79181], - [0.83351, 0.68803, 0.79435], - [0.83411, 0.69168, 0.79689], - [0.83474, 0.69534, 0.79945], - [0.83542, 0.69901, 0.80201], - [0.83613, 0.70271, 0.80459], - [0.83687, 0.70642, 0.80717], - [0.83765, 0.71014, 0.80975], - [0.83846, 0.71388, 0.81235], - [0.83931, 0.71764, 0.81495], - [0.84019, 0.7214, 0.81757], - [0.8411, 0.72519, 0.82018], - [0.84205, 0.72897, 0.82282], - [0.84302, 0.73278, 0.82545], - [0.84402, 0.7366, 0.82809], - [0.84505, 0.74043, 0.83074], - [0.84611, 0.74427, 0.83339], - [0.8472, 0.74813, 0.83605], - [0.84831, 0.75199, 0.83871], - [0.84946, 0.75587, 0.84139], - [0.85062, 0.75975, 0.84406], - [0.85181, 0.76365, 0.84674], - [0.85302, 0.76755, 0.84943], - [0.85425, 0.77147, 0.85212], - [0.85551, 0.77539, 0.85482], - [0.85678, 0.77932, 0.85752], - [0.85807, 0.78327, 0.86023], - [0.85939, 0.78722, 0.86294], - [0.86072, 0.79117, 0.86565], - [0.86207, 0.79514, 0.86837], - [0.86343, 0.79911, 0.87109], - [0.8648, 0.80309, 0.87381], - [0.8662, 0.80708, 0.87654], - [0.8676, 0.81107, 0.87927], - [0.86903, 0.81506, 0.88201], - [0.87045, 0.81906, 0.88475], - [0.8719, 0.82308, 0.88749], - [0.87334, 0.8271, 0.89023], - [0.87481, 0.83112, 0.89298], - [0.87628, 0.83514, 0.89573], - [0.87776, 0.83917, 0.89848], - [0.87924, 0.84321, 0.90124], - [0.88073, 0.84725, 0.904], - [0.88223, 0.85129, 0.90676], - [0.88374, 0.85535, 0.90952], - [0.88524, 0.8594, 0.91229], - [0.88676, 0.86346, 0.91505], - [0.88827, 0.86752, 0.91783], - [0.88979, 0.87158, 0.92059], - [0.89132, 0.87565, 0.92337], - [0.89284, 0.87972, 0.92614], - [0.89437, 0.8838, 0.92892], - [0.89589, 0.88787, 0.9317], - [0.89742, 0.89195, 0.93448], - [0.89895, 0.89604, 0.93727], - [0.90047, 0.90012, 0.94005], -]; - -export const colormap_bamako_data: Array<[number, number, number]> = [ - [0.0011753, 0.25004, 0.3], - [0.0039003, 0.25157, 0.29861], - [0.006602, 0.25305, 0.29722], - [0.0092914, 0.25456, 0.29581], - [0.012175, 0.25604, 0.2944], - [0.014801, 0.25755, 0.293], - [0.01745, 0.25907, 0.29161], - [0.020096, 0.26057, 0.29018], - [0.022743, 0.26208, 0.28878], - [0.025398, 0.26361, 0.28735], - [0.028064, 0.26511, 0.28592], - [0.030746, 0.26664, 0.2845], - [0.033437, 0.26816, 0.28309], - [0.036369, 0.26971, 0.28165], - [0.039136, 0.27124, 0.28021], - [0.041941, 0.27278, 0.27878], - [0.044597, 0.27432, 0.27734], - [0.047216, 0.27589, 0.27591], - [0.049816, 0.27743, 0.27443], - [0.052305, 0.279, 0.27298], - [0.054846, 0.28053, 0.27151], - [0.057331, 0.28213, 0.27007], - [0.059903, 0.28369, 0.2686], - [0.062324, 0.28526, 0.2671], - [0.064737, 0.28684, 0.26564], - [0.067177, 0.28844, 0.26416], - [0.069647, 0.29003, 0.26267], - [0.072007, 0.29165, 0.26118], - [0.074435, 0.29324, 0.25969], - [0.076803, 0.29484, 0.25817], - [0.079232, 0.29647, 0.25667], - [0.081738, 0.29808, 0.25518], - [0.084163, 0.29972, 0.25365], - [0.086556, 0.30134, 0.25213], - [0.089008, 0.30298, 0.25059], - [0.091487, 0.30463, 0.24907], - [0.093906, 0.3063, 0.24754], - [0.096327, 0.30793, 0.24598], - [0.098845, 0.30961, 0.24443], - [0.10132, 0.31127, 0.24288], - [0.10384, 0.31294, 0.24134], - [0.10637, 0.31461, 0.23978], - [0.10884, 0.31632, 0.23821], - [0.1114, 0.318, 0.23666], - [0.11391, 0.3197, 0.23509], - [0.11648, 0.32139, 0.23347], - [0.11904, 0.32311, 0.23191], - [0.12156, 0.32481, 0.2303], - [0.12416, 0.32653, 0.22873], - [0.12676, 0.32826, 0.22712], - [0.12938, 0.33, 0.22551], - [0.132, 0.33173, 0.22389], - [0.13465, 0.33348, 0.22228], - [0.13728, 0.33524, 0.22068], - [0.13988, 0.33699, 0.21904], - [0.14258, 0.33874, 0.21741], - [0.14528, 0.34051, 0.21578], - [0.14793, 0.34229, 0.21413], - [0.15062, 0.34406, 0.21248], - [0.15331, 0.34584, 0.21083], - [0.15607, 0.34765, 0.20917], - [0.15879, 0.34944, 0.20751], - [0.16154, 0.35125, 0.20585], - [0.16429, 0.35306, 0.20419], - [0.16705, 0.35489, 0.20248], - [0.16983, 0.35671, 0.20078], - [0.17259, 0.35853, 0.1991], - [0.1754, 0.36036, 0.19742], - [0.17824, 0.36222, 0.19572], - [0.18102, 0.36406, 0.19403], - [0.18387, 0.36593, 0.1923], - [0.18672, 0.36779, 0.19058], - [0.18959, 0.36966, 0.18887], - [0.19246, 0.37154, 0.18714], - [0.19535, 0.37344, 0.18542], - [0.19825, 0.37533, 0.18364], - [0.20116, 0.37724, 0.18189], - [0.20413, 0.37915, 0.18014], - [0.20706, 0.38108, 0.17841], - [0.21001, 0.383, 0.1766], - [0.21297, 0.38493, 0.17486], - [0.21599, 0.38688, 0.17306], - [0.21898, 0.38884, 0.17127], - [0.22199, 0.39081, 0.1695], - [0.22501, 0.39277, 0.16768], - [0.22809, 0.39476, 0.16585], - [0.23115, 0.39674, 0.16407], - [0.23423, 0.39875, 0.16224], - [0.23735, 0.40078, 0.16037], - [0.24043, 0.40279, 0.15857], - [0.24357, 0.40482, 0.15671], - [0.24673, 0.40687, 0.15484], - [0.24989, 0.40893, 0.15296], - [0.2531, 0.411, 0.15109], - [0.25629, 0.41308, 0.14922], - [0.25954, 0.41517, 0.14733], - [0.26278, 0.41728, 0.14546], - [0.26606, 0.41939, 0.14352], - [0.26935, 0.42151, 0.14161], - [0.27265, 0.42366, 0.13963], - [0.276, 0.42581, 0.13775], - [0.27935, 0.42799, 0.13575], - [0.28274, 0.43017, 0.13382], - [0.28611, 0.43238, 0.13185], - [0.28956, 0.43459, 0.12989], - [0.293, 0.43682, 0.12788], - [0.29648, 0.43906, 0.12588], - [0.29998, 0.44132, 0.12382], - [0.3035, 0.44361, 0.12179], - [0.30706, 0.44589, 0.11977], - [0.31066, 0.44821, 0.11773], - [0.31426, 0.45054, 0.11568], - [0.3179, 0.45289, 0.11362], - [0.32156, 0.45525, 0.11153], - [0.32526, 0.45763, 0.10944], - [0.32901, 0.46003, 0.10731], - [0.33277, 0.46245, 0.10513], - [0.33654, 0.4649, 0.10304], - [0.34037, 0.46736, 0.10085], - [0.34422, 0.46984, 0.098693], - [0.34812, 0.47233, 0.096453], - [0.35204, 0.47486, 0.094325], - [0.35601, 0.47738, 0.092102], - [0.36, 0.47994, 0.089849], - [0.36403, 0.48251, 0.087617], - [0.36811, 0.4851, 0.085276], - [0.37221, 0.48772, 0.082993], - [0.37638, 0.49034, 0.080686], - [0.38057, 0.49296, 0.078304], - [0.3848, 0.49562, 0.075955], - [0.38909, 0.49829, 0.073656], - [0.39341, 0.50095, 0.071224], - [0.39779, 0.50362, 0.068802], - [0.4022, 0.5063, 0.066264], - [0.40668, 0.50898, 0.063774], - [0.4112, 0.51164, 0.061172], - [0.41578, 0.51431, 0.058651], - [0.4204, 0.51695, 0.05607], - [0.42509, 0.51956, 0.053359], - [0.42981, 0.52214, 0.050712], - [0.4346, 0.5247, 0.047969], - [0.43943, 0.52722, 0.045272], - [0.44432, 0.52967, 0.042483], - [0.44924, 0.53207, 0.039697], - [0.45421, 0.5344, 0.036906], - [0.45922, 0.53666, 0.034001], - [0.46428, 0.53884, 0.031435], - [0.46935, 0.54092, 0.028957], - [0.47444, 0.54291, 0.026597], - [0.47956, 0.5448, 0.024363], - [0.48468, 0.54659, 0.022265], - [0.48982, 0.54827, 0.020312], - [0.49497, 0.54985, 0.018512], - [0.5001, 0.55132, 0.016876], - [0.50524, 0.55269, 0.015412], - [0.51038, 0.55397, 0.014132], - [0.5155, 0.55517, 0.013033], - [0.52063, 0.55628, 0.01218], - [0.52575, 0.55735, 0.011416], - [0.53088, 0.55835, 0.010839], - [0.53601, 0.55933, 0.010585], - [0.54115, 0.5603, 0.010612], - [0.54633, 0.56126, 0.010945], - [0.55153, 0.56225, 0.011649], - [0.55677, 0.56328, 0.012516], - [0.56207, 0.56438, 0.01365], - [0.56742, 0.56555, 0.015118], - [0.57285, 0.56684, 0.016927], - [0.57835, 0.56824, 0.019098], - [0.58394, 0.56978, 0.021653], - [0.58963, 0.57149, 0.024617], - [0.59541, 0.57336, 0.028014], - [0.60129, 0.5754, 0.03187], - [0.60728, 0.57763, 0.036408], - [0.61335, 0.58006, 0.041287], - [0.61954, 0.58268, 0.046299], - [0.62581, 0.58551, 0.051565], - [0.63218, 0.58853, 0.057023], - [0.63862, 0.59176, 0.062625], - [0.64514, 0.59517, 0.068288], - [0.65173, 0.59876, 0.074092], - [0.65837, 0.60254, 0.079969], - [0.66506, 0.60647, 0.085984], - [0.6718, 0.61057, 0.0922], - [0.67856, 0.6148, 0.098456], - [0.68534, 0.61918, 0.10476], - [0.69213, 0.62366, 0.11129], - [0.69891, 0.62825, 0.11783], - [0.70569, 0.63293, 0.12447], - [0.71245, 0.63769, 0.13125], - [0.71918, 0.64252, 0.1381], - [0.72588, 0.6474, 0.14503], - [0.73253, 0.65232, 0.15201], - [0.73912, 0.65728, 0.15912], - [0.74564, 0.66226, 0.16629], - [0.7521, 0.66724, 0.17352], - [0.75847, 0.67223, 0.18082], - [0.76475, 0.67721, 0.18823], - [0.77094, 0.68215, 0.19562], - [0.77702, 0.68709, 0.20308], - [0.78299, 0.69199, 0.21059], - [0.78886, 0.69684, 0.21813], - [0.79459, 0.70164, 0.2257], - [0.80021, 0.7064, 0.23325], - [0.8057, 0.7111, 0.24084], - [0.81106, 0.71574, 0.24845], - [0.81631, 0.72031, 0.25601], - [0.82142, 0.72482, 0.26361], - [0.8264, 0.72926, 0.27115], - [0.83127, 0.73364, 0.2787], - [0.83602, 0.73795, 0.28619], - [0.84066, 0.74221, 0.29369], - [0.84519, 0.74639, 0.30114], - [0.84961, 0.75052, 0.30859], - [0.85394, 0.75459, 0.31598], - [0.85818, 0.7586, 0.32333], - [0.86234, 0.76255, 0.33065], - [0.86641, 0.76646, 0.33794], - [0.87042, 0.77032, 0.3452], - [0.87436, 0.77414, 0.35241], - [0.87824, 0.77792, 0.3596], - [0.88207, 0.78167, 0.36676], - [0.88585, 0.78537, 0.37388], - [0.88958, 0.78905, 0.38098], - [0.89328, 0.7927, 0.38804], - [0.89694, 0.79632, 0.39508], - [0.90057, 0.79992, 0.40209], - [0.90417, 0.8035, 0.40909], - [0.90775, 0.80706, 0.41606], - [0.9113, 0.8106, 0.423], - [0.91484, 0.81412, 0.42995], - [0.91835, 0.81764, 0.43686], - [0.92186, 0.82114, 0.44376], - [0.92534, 0.82462, 0.45064], - [0.92882, 0.8281, 0.45751], - [0.93228, 0.83157, 0.46438], - [0.93573, 0.83502, 0.47121], - [0.93918, 0.83847, 0.47804], - [0.94261, 0.84192, 0.48486], - [0.94603, 0.84535, 0.49169], - [0.94945, 0.84878, 0.49849], - [0.95286, 0.85221, 0.50528], - [0.95627, 0.85563, 0.51207], - [0.95966, 0.85904, 0.51886], - [0.96305, 0.86246, 0.52563], - [0.96643, 0.86586, 0.53241], - [0.96981, 0.86927, 0.53917], - [0.97318, 0.87268, 0.54594], - [0.97654, 0.87608, 0.55269], - [0.9799, 0.87948, 0.55945], - [0.98325, 0.88288, 0.5662], - [0.98659, 0.88628, 0.57296], - [0.98993, 0.88968, 0.57971], - [0.99326, 0.89308, 0.58645], - [0.99658, 0.89648, 0.5932], - [0.9999, 0.89988, 0.59995], -]; - -export const colormap_berlin_data: Array<[number, number, number]> = [ - [0.62108, 0.69018, 0.99951], - [0.61216, 0.68923, 0.99537], - [0.6032, 0.68825, 0.99124], - [0.5942, 0.68726, 0.98709], - [0.58517, 0.68625, 0.98292], - [0.57609, 0.68522, 0.97873], - [0.56696, 0.68417, 0.97452], - [0.55779, 0.6831, 0.97029], - [0.54859, 0.68199, 0.96602], - [0.53933, 0.68086, 0.9617], - [0.53003, 0.67969, 0.95735], - [0.52069, 0.67848, 0.95294], - [0.51129, 0.67723, 0.94847], - [0.50186, 0.67591, 0.94392], - [0.49237, 0.67453, 0.9393], - [0.48283, 0.67308, 0.93457], - [0.47324, 0.67153, 0.92975], - [0.46361, 0.6699, 0.92481], - [0.45393, 0.66815, 0.91974], - [0.44421, 0.66628, 0.91452], - [0.43444, 0.66427, 0.90914], - [0.42465, 0.66212, 0.90359], - [0.41482, 0.65979, 0.89785], - [0.40498, 0.65729, 0.89191], - [0.39514, 0.65458, 0.88575], - [0.3853, 0.65167, 0.87937], - [0.37549, 0.64854, 0.87276], - [0.36574, 0.64516, 0.8659], - [0.35606, 0.64155, 0.8588], - [0.34645, 0.63769, 0.85145], - [0.33698, 0.63357, 0.84386], - [0.32764, 0.62919, 0.83602], - [0.31849, 0.62455, 0.82794], - [0.30954, 0.61966, 0.81963], - [0.30078, 0.6145, 0.81111], - [0.29231, 0.60911, 0.80238], - [0.2841, 0.60348, 0.79347], - [0.27621, 0.59763, 0.78439], - [0.26859, 0.59158, 0.77514], - [0.26131, 0.58534, 0.76578], - [0.25437, 0.57891, 0.7563], - [0.24775, 0.57233, 0.74672], - [0.24146, 0.5656, 0.73707], - [0.23552, 0.55875, 0.72735], - [0.22984, 0.5518, 0.7176], - [0.2245, 0.54475, 0.7078], - [0.21948, 0.53763, 0.698], - [0.21469, 0.53043, 0.68819], - [0.21017, 0.52319, 0.67838], - [0.20589, 0.5159, 0.66858], - [0.20177, 0.5086, 0.65879], - [0.19788, 0.50126, 0.64903], - [0.19417, 0.4939, 0.63929], - [0.19056, 0.48654, 0.62957], - [0.18711, 0.47918, 0.6199], - [0.18375, 0.47183, 0.61024], - [0.1805, 0.46447, 0.60062], - [0.17737, 0.45712, 0.59104], - [0.17426, 0.44979, 0.58148], - [0.17122, 0.44247, 0.57197], - [0.16824, 0.43517, 0.56249], - [0.16529, 0.42788, 0.55302], - [0.16244, 0.42061, 0.5436], - [0.15954, 0.41337, 0.53421], - [0.15674, 0.40615, 0.52486], - [0.15391, 0.39893, 0.51552], - [0.15112, 0.39176, 0.50623], - [0.14835, 0.38459, 0.49697], - [0.14564, 0.37746, 0.48775], - [0.14288, 0.37034, 0.47854], - [0.14014, 0.36326, 0.46939], - [0.13747, 0.3562, 0.46024], - [0.13478, 0.34916, 0.45115], - [0.13208, 0.34215, 0.44209], - [0.1294, 0.33517, 0.43304], - [0.12674, 0.3282, 0.42404], - [0.12409, 0.32126, 0.41507], - [0.12146, 0.31435, 0.40614], - [0.1189, 0.30746, 0.39723], - [0.11632, 0.30061, 0.38838], - [0.11373, 0.29378, 0.37955], - [0.11119, 0.28698, 0.37075], - [0.10861, 0.28022, 0.362], - [0.10616, 0.2735, 0.35328], - [0.10367, 0.26678, 0.34459], - [0.10118, 0.26011, 0.33595], - [0.098776, 0.25347, 0.32734], - [0.096347, 0.24685, 0.31878], - [0.094059, 0.24026, 0.31027], - [0.091788, 0.23373, 0.30176], - [0.089506, 0.22725, 0.29332], - [0.087341, 0.2208, 0.28491], - [0.085142, 0.21436, 0.27658], - [0.083069, 0.20798, 0.26825], - [0.081098, 0.20163, 0.25999], - [0.07913, 0.19536, 0.25178], - [0.077286, 0.18914, 0.24359], - [0.075571, 0.18294, 0.2355], - [0.073993, 0.17683, 0.22743], - [0.07241, 0.17079, 0.21943], - [0.071045, 0.1648, 0.2115], - [0.069767, 0.1589, 0.20363], - [0.068618, 0.15304, 0.19582], - [0.06756, 0.14732, 0.18812], - [0.066665, 0.14167, 0.18045], - [0.065923, 0.13608, 0.17292], - [0.065339, 0.1307, 0.16546], - [0.064911, 0.12535, 0.15817], - [0.064636, 0.12013, 0.15095], - [0.064517, 0.11507, 0.14389], - [0.064554, 0.11022, 0.13696], - [0.064749, 0.10543, 0.13023], - [0.0651, 0.10085, 0.12357], - [0.065383, 0.096469, 0.11717], - [0.065574, 0.092338, 0.11101], - [0.065892, 0.088201, 0.10498], - [0.066388, 0.084134, 0.099288], - [0.067108, 0.080051, 0.093829], - [0.068193, 0.076099, 0.08847], - [0.06972, 0.072283, 0.083025], - [0.071639, 0.068654, 0.077544], - [0.073978, 0.065058, 0.07211], - [0.076596, 0.061657, 0.066651], - [0.079637, 0.05855, 0.061133], - [0.082963, 0.055666, 0.055745], - [0.086537, 0.052997, 0.050336], - [0.090315, 0.050699, 0.04504], - [0.09426, 0.048753, 0.039773], - [0.098319, 0.047041, 0.034683], - [0.10246, 0.045624, 0.030074], - [0.10673, 0.044705, 0.026012], - [0.11099, 0.043972, 0.022379], - [0.11524, 0.043596, 0.01915], - [0.11955, 0.043567, 0.016299], - [0.12381, 0.043861, 0.013797], - [0.1281, 0.044459, 0.011588], - [0.13232, 0.045229, 0.0095315], - [0.13645, 0.046164, 0.0078947], - [0.14063, 0.047374, 0.006502], - [0.14488, 0.048634, 0.0053266], - [0.14923, 0.049836, 0.0043455], - [0.15369, 0.050997, 0.0035374], - [0.15831, 0.05213, 0.0028824], - [0.16301, 0.053218, 0.0023628], - [0.16781, 0.05424, 0.0019629], - [0.17274, 0.055172, 0.001669], - [0.1778, 0.056018, 0.0014692], - [0.18286, 0.05682, 0.0013401], - [0.18806, 0.057574, 0.0012617], - [0.19323, 0.058514, 0.0012261], - [0.19846, 0.05955, 0.0012271], - [0.20378, 0.060501, 0.0012601], - [0.20909, 0.061486, 0.0013221], - [0.21447, 0.06271, 0.0014116], - [0.2199, 0.063823, 0.0015287], - [0.22535, 0.065027, 0.0016748], - [0.23086, 0.066297, 0.0018529], - [0.23642, 0.067645, 0.0020675], - [0.24202, 0.069092, 0.0023247], - [0.24768, 0.070458, 0.0026319], - [0.25339, 0.071986, 0.0029984], - [0.25918, 0.07364, 0.003435], - [0.265, 0.075237, 0.0039545], - [0.27093, 0.076965, 0.004571], - [0.27693, 0.078822, 0.0053006], - [0.28302, 0.080819, 0.0061608], - [0.2892, 0.082879, 0.0071713], - [0.29547, 0.085075, 0.0083494], - [0.30186, 0.08746, 0.0097258], - [0.30839, 0.089912, 0.011455], - [0.31502, 0.09253, 0.013324], - [0.32181, 0.095392, 0.015413], - [0.32874, 0.098396, 0.01778], - [0.3358, 0.10158, 0.020449], - [0.34304, 0.10498, 0.02344], - [0.35041, 0.10864, 0.026771], - [0.35795, 0.11256, 0.030456], - [0.36563, 0.11666, 0.034571], - [0.37347, 0.12097, 0.039115], - [0.38146, 0.12561, 0.043693], - [0.38958, 0.13046, 0.048471], - [0.39785, 0.13547, 0.053136], - [0.40622, 0.1408, 0.057848], - [0.41469, 0.14627, 0.062715], - [0.42323, 0.15198, 0.067685], - [0.43184, 0.15791, 0.073044], - [0.44044, 0.16403, 0.07862], - [0.44909, 0.17027, 0.084644], - [0.4577, 0.17667, 0.090869], - [0.46631, 0.18321, 0.097335], - [0.4749, 0.18989, 0.10406], - [0.48342, 0.19668, 0.11104], - [0.49191, 0.20352, 0.11819], - [0.50032, 0.21043, 0.1255], - [0.50869, 0.21742, 0.13298], - [0.51698, 0.22443, 0.14062], - [0.5252, 0.23154, 0.14835], - [0.53335, 0.23862, 0.15626], - [0.54144, 0.24575, 0.16423], - [0.54948, 0.25292, 0.17226], - [0.55746, 0.26009, 0.1804], - [0.56538, 0.26726, 0.18864], - [0.57327, 0.27446, 0.19692], - [0.58111, 0.28167, 0.20524], - [0.58892, 0.28889, 0.21362], - [0.59672, 0.29611, 0.22205], - [0.60448, 0.30335, 0.23053], - [0.61223, 0.31062, 0.23905], - [0.61998, 0.31787, 0.24762], - [0.62771, 0.32513, 0.25619], - [0.63544, 0.33244, 0.26481], - [0.64317, 0.33975, 0.27349], - [0.65092, 0.34706, 0.28218], - [0.65866, 0.3544, 0.29089], - [0.66642, 0.36175, 0.29964], - [0.67419, 0.36912, 0.30842], - [0.68198, 0.37652, 0.31722], - [0.68978, 0.38392, 0.32604], - [0.6976, 0.39135, 0.33493], - [0.70543, 0.39879, 0.3438], - [0.71329, 0.40627, 0.35272], - [0.72116, 0.41376, 0.36166], - [0.72905, 0.42126, 0.37062], - [0.73697, 0.4288, 0.37962], - [0.7449, 0.43635, 0.38864], - [0.75285, 0.44392, 0.39768], - [0.76083, 0.45151, 0.40675], - [0.76882, 0.45912, 0.41584], - [0.77684, 0.46676, 0.42496], - [0.78488, 0.47441, 0.43409], - [0.79293, 0.48208, 0.44327], - [0.80101, 0.48976, 0.45246], - [0.80911, 0.49749, 0.46167], - [0.81722, 0.50521, 0.47091], - [0.82536, 0.51296, 0.48017], - [0.83352, 0.52073, 0.48945], - [0.84169, 0.52853, 0.49876], - [0.84988, 0.53634, 0.5081], - [0.85809, 0.54416, 0.51745], - [0.86632, 0.55201, 0.52683], - [0.87457, 0.55988, 0.53622], - [0.88283, 0.56776, 0.54564], - [0.89111, 0.57567, 0.55508], - [0.89941, 0.58358, 0.56455], - [0.90772, 0.59153, 0.57404], - [0.91603, 0.59949, 0.58355], - [0.92437, 0.60747, 0.59309], - [0.93271, 0.61546, 0.60265], - [0.94108, 0.62348, 0.61223], - [0.94945, 0.63151, 0.62183], - [0.95783, 0.63956, 0.63147], - [0.96622, 0.64763, 0.64111], - [0.97462, 0.65572, 0.65079], - [0.98303, 0.66382, 0.66049], - [0.99145, 0.67194, 0.67022], - [0.99987, 0.68007, 0.67995], -]; - -export const colormap_bilbao_data: Array<[number, number, number]> = [ - [1, 1, 0.99991], - [0.99488, 0.99486, 0.99473], - [0.98976, 0.98973, 0.98957], - [0.98465, 0.9846, 0.98439], - [0.97954, 0.97948, 0.97922], - [0.97444, 0.97436, 0.97404], - [0.96934, 0.96925, 0.96886], - [0.96426, 0.96414, 0.96368], - [0.95919, 0.95905, 0.95849], - [0.95413, 0.95395, 0.95329], - [0.94907, 0.94887, 0.94808], - [0.94404, 0.94379, 0.94287], - [0.93901, 0.93872, 0.93764], - [0.93399, 0.93366, 0.93239], - [0.929, 0.92861, 0.92713], - [0.92403, 0.92357, 0.92186], - [0.91907, 0.91854, 0.91656], - [0.91414, 0.91353, 0.91124], - [0.90923, 0.90853, 0.9059], - [0.90435, 0.90354, 0.90053], - [0.8995, 0.89857, 0.89514], - [0.89469, 0.89362, 0.88971], - [0.8899, 0.8887, 0.88426], - [0.88516, 0.88381, 0.87878], - [0.88046, 0.87893, 0.87327], - [0.87582, 0.87409, 0.86773], - [0.87122, 0.86929, 0.86216], - [0.86668, 0.86453, 0.85655], - [0.86221, 0.8598, 0.85092], - [0.8578, 0.85513, 0.84526], - [0.85346, 0.8505, 0.83958], - [0.8492, 0.84592, 0.83387], - [0.84501, 0.84141, 0.82813], - [0.84091, 0.83696, 0.82239], - [0.8369, 0.83257, 0.81662], - [0.83298, 0.82826, 0.81084], - [0.82916, 0.82402, 0.80506], - [0.82543, 0.81985, 0.79928], - [0.82181, 0.81578, 0.79349], - [0.81829, 0.81178, 0.7877], - [0.81487, 0.80786, 0.78193], - [0.81157, 0.80403, 0.77616], - [0.80836, 0.80029, 0.77041], - [0.80526, 0.79664, 0.76468], - [0.80227, 0.79308, 0.75897], - [0.79938, 0.7896, 0.75329], - [0.79658, 0.78622, 0.74764], - [0.7939, 0.78291, 0.74201], - [0.7913, 0.77969, 0.73641], - [0.7888, 0.77656, 0.73085], - [0.78639, 0.77349, 0.72533], - [0.78406, 0.77051, 0.71983], - [0.78181, 0.76759, 0.71436], - [0.77963, 0.76475, 0.70894], - [0.77754, 0.76196, 0.70353], - [0.77549, 0.75924, 0.69816], - [0.77352, 0.75658, 0.69284], - [0.77161, 0.75396, 0.68752], - [0.76974, 0.7514, 0.68224], - [0.76792, 0.74887, 0.677], - [0.76616, 0.74638, 0.67176], - [0.76442, 0.74393, 0.66655], - [0.76272, 0.74151, 0.66137], - [0.76106, 0.73912, 0.6562], - [0.75942, 0.73674, 0.65105], - [0.75781, 0.73439, 0.6459], - [0.75622, 0.73205, 0.64078], - [0.75465, 0.72972, 0.63566], - [0.75309, 0.72739, 0.63056], - [0.75155, 0.72508, 0.62545], - [0.75001, 0.72275, 0.62036], - [0.74849, 0.72042, 0.61525], - [0.74696, 0.71808, 0.61016], - [0.74544, 0.71573, 0.60506], - [0.74393, 0.71336, 0.59996], - [0.74241, 0.71097, 0.59485], - [0.74088, 0.70854, 0.58974], - [0.73937, 0.70609, 0.58462], - [0.73783, 0.70359, 0.5795], - [0.73628, 0.70106, 0.57435], - [0.73474, 0.69848, 0.56921], - [0.73318, 0.69585, 0.56406], - [0.73161, 0.69316, 0.55889], - [0.73002, 0.69041, 0.55373], - [0.72842, 0.68759, 0.54857], - [0.72681, 0.68471, 0.54339], - [0.72519, 0.68175, 0.53823], - [0.72354, 0.67872, 0.53307], - [0.72189, 0.67561, 0.52792], - [0.72023, 0.67242, 0.5228], - [0.71855, 0.66915, 0.5177], - [0.71687, 0.6658, 0.51263], - [0.71517, 0.66238, 0.50762], - [0.71347, 0.65887, 0.50265], - [0.71176, 0.65529, 0.49776], - [0.71006, 0.65165, 0.49292], - [0.70836, 0.64793, 0.48819], - [0.70666, 0.64416, 0.48353], - [0.70497, 0.64035, 0.47899], - [0.7033, 0.63649, 0.47457], - [0.70163, 0.63258, 0.47026], - [0.69999, 0.62865, 0.46606], - [0.69837, 0.62469, 0.46202], - [0.69678, 0.62072, 0.45811], - [0.69521, 0.61674, 0.45435], - [0.69366, 0.61275, 0.45072], - [0.69216, 0.60879, 0.44723], - [0.69067, 0.60481, 0.44391], - [0.68923, 0.60086, 0.4407], - [0.68781, 0.59693, 0.43766], - [0.68642, 0.59303, 0.43474], - [0.68507, 0.58913, 0.43195], - [0.68375, 0.58529, 0.42927], - [0.68245, 0.58145, 0.42672], - [0.68119, 0.57766, 0.42428], - [0.67995, 0.57389, 0.42194], - [0.67875, 0.57015, 0.41971], - [0.67757, 0.56645, 0.41755], - [0.6764, 0.56277, 0.41547], - [0.67526, 0.5591, 0.41347], - [0.67413, 0.55547, 0.41153], - [0.67303, 0.55187, 0.40966], - [0.67194, 0.54828, 0.40784], - [0.67087, 0.54471, 0.40607], - [0.66981, 0.54115, 0.40433], - [0.66875, 0.53763, 0.40263], - [0.66771, 0.5341, 0.40098], - [0.66667, 0.5306, 0.39933], - [0.66565, 0.52711, 0.39773], - [0.66463, 0.52362, 0.39614], - [0.66363, 0.52013, 0.39457], - [0.66262, 0.51667, 0.39301], - [0.66162, 0.51321, 0.39148], - [0.66061, 0.50975, 0.38994], - [0.65962, 0.5063, 0.38843], - [0.65862, 0.50285, 0.38691], - [0.65764, 0.49941, 0.3854], - [0.65664, 0.49597, 0.38391], - [0.65565, 0.49253, 0.38241], - [0.65466, 0.48909, 0.38093], - [0.65368, 0.48566, 0.37943], - [0.65269, 0.48223, 0.37795], - [0.65171, 0.4788, 0.37647], - [0.65072, 0.47537, 0.37498], - [0.64973, 0.47194, 0.3735], - [0.64874, 0.4685, 0.37201], - [0.64775, 0.46507, 0.37052], - [0.64676, 0.46164, 0.36905], - [0.64577, 0.4582, 0.36755], - [0.64477, 0.45477, 0.36607], - [0.64377, 0.45132, 0.36457], - [0.64278, 0.44787, 0.36307], - [0.64177, 0.44444, 0.36158], - [0.64076, 0.44098, 0.36007], - [0.63975, 0.43754, 0.35856], - [0.63872, 0.43406, 0.35706], - [0.6377, 0.43061, 0.35554], - [0.63666, 0.42714, 0.35399], - [0.63561, 0.42365, 0.35245], - [0.63455, 0.42016, 0.35091], - [0.63348, 0.41667, 0.34933], - [0.63239, 0.41316, 0.34776], - [0.63128, 0.40964, 0.34615], - [0.63016, 0.40611, 0.34453], - [0.62901, 0.40254, 0.34291], - [0.62784, 0.39898, 0.34125], - [0.62664, 0.3954, 0.33957], - [0.62542, 0.3918, 0.33784], - [0.62416, 0.38817, 0.33609], - [0.62286, 0.38452, 0.33433], - [0.62152, 0.38085, 0.33251], - [0.62015, 0.37715, 0.33064], - [0.61872, 0.37341, 0.32874], - [0.61724, 0.36965, 0.32678], - [0.6157, 0.36586, 0.32478], - [0.6141, 0.36204, 0.32274], - [0.61245, 0.35818, 0.32062], - [0.61073, 0.35427, 0.31843], - [0.60893, 0.35035, 0.31619], - [0.60706, 0.34636, 0.31388], - [0.6051, 0.34235, 0.31148], - [0.60307, 0.33829, 0.30904], - [0.60095, 0.33421, 0.3065], - [0.59874, 0.33007, 0.30386], - [0.59644, 0.32588, 0.30116], - [0.59405, 0.32167, 0.29838], - [0.59156, 0.31742, 0.29552], - [0.58897, 0.31313, 0.29257], - [0.5863, 0.30882, 0.28955], - [0.58352, 0.30445, 0.28641], - [0.58065, 0.30006, 0.28323], - [0.57768, 0.29564, 0.27994], - [0.57462, 0.29121, 0.27658], - [0.57147, 0.28673, 0.27314], - [0.56822, 0.28227, 0.26963], - [0.56489, 0.27776, 0.26603], - [0.56148, 0.27324, 0.26236], - [0.55798, 0.26872, 0.25864], - [0.55441, 0.26418, 0.25486], - [0.55076, 0.25964, 0.251], - [0.54704, 0.2551, 0.24709], - [0.54326, 0.25053, 0.24312], - [0.53941, 0.24598, 0.23913], - [0.5355, 0.24146, 0.2351], - [0.53155, 0.23693, 0.231], - [0.52754, 0.23239, 0.22688], - [0.52349, 0.22787, 0.22273], - [0.5194, 0.22336, 0.21855], - [0.51526, 0.21885, 0.21434], - [0.51109, 0.21436, 0.2101], - [0.50688, 0.20987, 0.20587], - [0.50265, 0.2054, 0.20158], - [0.4984, 0.20092, 0.19733], - [0.49411, 0.19651, 0.19304], - [0.48979, 0.19205, 0.18876], - [0.48546, 0.18765, 0.18446], - [0.4811, 0.18319, 0.18015], - [0.47673, 0.1788, 0.17585], - [0.47234, 0.1744, 0.17157], - [0.46793, 0.17, 0.1673], - [0.4635, 0.16557, 0.16302], - [0.45906, 0.16122, 0.15875], - [0.4546, 0.15682, 0.15447], - [0.45012, 0.15241, 0.15024], - [0.44561, 0.14803, 0.14601], - [0.4411, 0.14364, 0.14178], - [0.43658, 0.13921, 0.1376], - [0.43203, 0.13486, 0.1334], - [0.42746, 0.13045, 0.12923], - [0.42286, 0.12601, 0.1251], - [0.41826, 0.12152, 0.12097], - [0.41364, 0.11708, 0.11692], - [0.409, 0.11265, 0.11291], - [0.40433, 0.1081, 0.10886], - [0.39965, 0.10363, 0.10484], - [0.39496, 0.099059, 0.10092], - [0.39024, 0.094525, 0.096994], - [0.3855, 0.089888, 0.093119], - [0.38077, 0.085202, 0.089344], - [0.376, 0.080518, 0.085505], - [0.3712, 0.075751, 0.081859], - [0.36642, 0.070994, 0.078058], - [0.36162, 0.066081, 0.074313], - [0.35684, 0.061064, 0.070322], - [0.35204, 0.056052, 0.066182], - [0.34729, 0.050813, 0.061797], - [0.34252, 0.045462, 0.057219], - [0.33776, 0.039997, 0.052327], - [0.33304, 0.034289, 0.047198], - [0.32831, 0.028994, 0.041679], - [0.3236, 0.023947, 0.03572], - [0.31891, 0.01913, 0.029528], - [0.31424, 0.014539, 0.023554], - [0.30961, 0.0099596, 0.017575], - [0.30498, 0.0058132, 0.011559], - [0.30038, 0.0018649, 0.005395], -]; - -export const colormap_broc_data: Array<[number, number, number]> = [ - [0.17081, 0.10027, 0.29985], - [0.17075, 0.10634, 0.30558], - [0.17061, 0.11229, 0.3113], - [0.1704, 0.11821, 0.31705], - [0.17013, 0.12404, 0.32282], - [0.16981, 0.12995, 0.3286], - [0.16943, 0.13572, 0.33441], - [0.169, 0.14158, 0.34021], - [0.1685, 0.14739, 0.34603], - [0.16797, 0.15317, 0.35187], - [0.16745, 0.159, 0.35775], - [0.16688, 0.1648, 0.36361], - [0.16626, 0.17063, 0.36951], - [0.16562, 0.17645, 0.37541], - [0.16499, 0.18231, 0.38135], - [0.16438, 0.18822, 0.38728], - [0.16373, 0.19411, 0.39324], - [0.16306, 0.19999, 0.39922], - [0.16241, 0.20596, 0.40522], - [0.16178, 0.21193, 0.41124], - [0.16114, 0.21792, 0.41729], - [0.1605, 0.22393, 0.42333], - [0.15991, 0.22999, 0.42941], - [0.1594, 0.23611, 0.43551], - [0.15895, 0.24223, 0.44162], - [0.15856, 0.24842, 0.44774], - [0.15825, 0.25463, 0.45388], - [0.15805, 0.26087, 0.46004], - [0.15799, 0.26715, 0.4662], - [0.1581, 0.27351, 0.47238], - [0.15841, 0.27989, 0.47855], - [0.15892, 0.28631, 0.48472], - [0.15966, 0.2928, 0.4909], - [0.16075, 0.29934, 0.49703], - [0.16216, 0.30592, 0.50316], - [0.16391, 0.31252, 0.50927], - [0.16599, 0.31919, 0.51534], - [0.16854, 0.32588, 0.52137], - [0.17149, 0.33265, 0.52735], - [0.1749, 0.33942, 0.53327], - [0.17874, 0.3462, 0.53913], - [0.183, 0.35303, 0.54493], - [0.18776, 0.35987, 0.55065], - [0.19288, 0.36673, 0.55629], - [0.19842, 0.37358, 0.56186], - [0.20439, 0.38045, 0.56734], - [0.21065, 0.3873, 0.57274], - [0.21727, 0.39416, 0.57805], - [0.22416, 0.40103, 0.5833], - [0.23136, 0.40786, 0.58847], - [0.23875, 0.4147, 0.59358], - [0.24637, 0.42151, 0.59862], - [0.25418, 0.42834, 0.60361], - [0.26213, 0.43515, 0.60855], - [0.27024, 0.44195, 0.61342], - [0.27844, 0.44874, 0.61828], - [0.28674, 0.45553, 0.6231], - [0.29515, 0.46231, 0.62789], - [0.30363, 0.4691, 0.63266], - [0.31216, 0.47588, 0.63742], - [0.32079, 0.48266, 0.64216], - [0.32944, 0.48945, 0.64689], - [0.33811, 0.49624, 0.65162], - [0.34685, 0.50304, 0.65634], - [0.35562, 0.50985, 0.66106], - [0.3644, 0.51666, 0.66578], - [0.37322, 0.52348, 0.67051], - [0.38206, 0.5303, 0.67522], - [0.39094, 0.53714, 0.67995], - [0.39982, 0.54397, 0.68468], - [0.40874, 0.55082, 0.68943], - [0.41768, 0.55768, 0.69416], - [0.42663, 0.56454, 0.69891], - [0.4356, 0.57141, 0.70367], - [0.44459, 0.57829, 0.70843], - [0.45359, 0.58519, 0.71319], - [0.46261, 0.59209, 0.71796], - [0.47166, 0.59899, 0.72273], - [0.4807, 0.6059, 0.72751], - [0.48977, 0.61282, 0.73231], - [0.49887, 0.61976, 0.7371], - [0.50797, 0.6267, 0.74189], - [0.51709, 0.63365, 0.7467], - [0.52622, 0.6406, 0.75151], - [0.53536, 0.64757, 0.75633], - [0.54452, 0.65454, 0.76115], - [0.55369, 0.66152, 0.76598], - [0.56289, 0.66851, 0.77081], - [0.57208, 0.67551, 0.77565], - [0.5813, 0.68251, 0.7805], - [0.59052, 0.68954, 0.78535], - [0.59977, 0.69656, 0.79021], - [0.60904, 0.70359, 0.79507], - [0.6183, 0.71063, 0.79995], - [0.62758, 0.71768, 0.80482], - [0.63689, 0.72474, 0.8097], - [0.64619, 0.73181, 0.81459], - [0.65552, 0.73889, 0.81948], - [0.66485, 0.74597, 0.82438], - [0.67421, 0.75305, 0.82929], - [0.68357, 0.76016, 0.8342], - [0.69295, 0.76727, 0.83911], - [0.70233, 0.77438, 0.84402], - [0.71174, 0.78151, 0.84894], - [0.72114, 0.78864, 0.85385], - [0.73057, 0.79577, 0.85877], - [0.74, 0.80291, 0.86368], - [0.74943, 0.81005, 0.86857], - [0.75888, 0.81719, 0.87343], - [0.76832, 0.82432, 0.87828], - [0.77776, 0.83145, 0.88308], - [0.7872, 0.83856, 0.88783], - [0.79662, 0.84564, 0.89251], - [0.80602, 0.8527, 0.8971], - [0.81538, 0.85971, 0.90156], - [0.82469, 0.86666, 0.90589], - [0.83394, 0.87352, 0.91001], - [0.84309, 0.88029, 0.91391], - [0.85212, 0.88692, 0.91752], - [0.86097, 0.89338, 0.92078], - [0.86962, 0.89963, 0.92365], - [0.87801, 0.90562, 0.92603], - [0.88606, 0.91129, 0.92785], - [0.8937, 0.91659, 0.92905], - [0.90086, 0.92145, 0.92956], - [0.90746, 0.92581, 0.92931], - [0.9134, 0.9296, 0.92825], - [0.91862, 0.93277, 0.92635], - [0.92307, 0.93528, 0.92359], - [0.92667, 0.9371, 0.91997], - [0.92943, 0.93822, 0.91554], - [0.93133, 0.93863, 0.91034], - [0.93239, 0.93838, 0.90443], - [0.93266, 0.93749, 0.8979], - [0.93219, 0.93601, 0.89081], - [0.93105, 0.93401, 0.88326], - [0.9293, 0.93154, 0.87532], - [0.92702, 0.92866, 0.86706], - [0.9243, 0.92545, 0.85854], - [0.92119, 0.92194, 0.84982], - [0.91776, 0.91818, 0.84094], - [0.91406, 0.91422, 0.83194], - [0.91015, 0.91011, 0.82285], - [0.90606, 0.90586, 0.81368], - [0.90184, 0.90151, 0.80447], - [0.89751, 0.89708, 0.79521], - [0.89309, 0.89259, 0.78594], - [0.88861, 0.88805, 0.77664], - [0.88407, 0.88347, 0.76733], - [0.87949, 0.87886, 0.75803], - [0.87489, 0.87423, 0.74871], - [0.87026, 0.86958, 0.7394], - [0.86561, 0.86491, 0.73009], - [0.86094, 0.86024, 0.72077], - [0.85625, 0.85553, 0.71146], - [0.85153, 0.8508, 0.70213], - [0.84679, 0.84606, 0.69282], - [0.84202, 0.84128, 0.68348], - [0.8372, 0.83645, 0.67414], - [0.83232, 0.83158, 0.66478], - [0.82739, 0.82665, 0.65542], - [0.82238, 0.82164, 0.64602], - [0.81728, 0.81655, 0.63661], - [0.81208, 0.81135, 0.62715], - [0.80676, 0.80603, 0.61766], - [0.80129, 0.80058, 0.60815], - [0.79568, 0.79499, 0.59859], - [0.7899, 0.78922, 0.589], - [0.78394, 0.78328, 0.5794], - [0.77778, 0.77715, 0.56976], - [0.77143, 0.77082, 0.56013], - [0.76486, 0.76428, 0.5505], - [0.75809, 0.75754, 0.54089], - [0.75112, 0.75061, 0.53133], - [0.74395, 0.74348, 0.52183], - [0.73661, 0.73616, 0.51242], - [0.72909, 0.72869, 0.50312], - [0.72143, 0.72106, 0.49397], - [0.71365, 0.71331, 0.48495], - [0.70576, 0.70546, 0.47611], - [0.69778, 0.69751, 0.46744], - [0.68975, 0.68951, 0.45895], - [0.68166, 0.68144, 0.45065], - [0.67355, 0.67336, 0.44254], - [0.66542, 0.66525, 0.4346], - [0.65729, 0.65714, 0.42684], - [0.64917, 0.64903, 0.41924], - [0.64105, 0.64093, 0.41179], - [0.63296, 0.63285, 0.40447], - [0.62488, 0.62478, 0.39727], - [0.61684, 0.61674, 0.39019], - [0.60881, 0.60873, 0.38321], - [0.6008, 0.60072, 0.3763], - [0.59283, 0.59275, 0.36945], - [0.58488, 0.5848, 0.36268], - [0.57695, 0.57687, 0.35596], - [0.56904, 0.56896, 0.34928], - [0.56116, 0.56108, 0.34265], - [0.55329, 0.55322, 0.33604], - [0.54546, 0.54538, 0.32949], - [0.53765, 0.53757, 0.32294], - [0.52985, 0.52977, 0.31642], - [0.52207, 0.52198, 0.30993], - [0.51433, 0.51424, 0.30344], - [0.50659, 0.5065, 0.29701], - [0.49888, 0.49879, 0.29056], - [0.4912, 0.49111, 0.28415], - [0.48352, 0.48342, 0.27777], - [0.47588, 0.47578, 0.27139], - [0.46825, 0.46814, 0.26503], - [0.46064, 0.46053, 0.2587], - [0.45307, 0.45296, 0.25239], - [0.4455, 0.44539, 0.24608], - [0.43798, 0.43786, 0.23981], - [0.43046, 0.43033, 0.23354], - [0.42296, 0.42283, 0.22732], - [0.4155, 0.41537, 0.22111], - [0.40805, 0.40792, 0.21489], - [0.40065, 0.4005, 0.20872], - [0.39323, 0.39309, 0.20257], - [0.38586, 0.38571, 0.19647], - [0.37851, 0.37836, 0.19034], - [0.37118, 0.37103, 0.18426], - [0.36389, 0.36373, 0.17824], - [0.35663, 0.35647, 0.17218], - [0.34937, 0.34922, 0.16619], - [0.34215, 0.342, 0.16021], - [0.33497, 0.33482, 0.1543], - [0.32778, 0.32764, 0.1484], - [0.32065, 0.32052, 0.14258], - [0.31352, 0.31341, 0.13676], - [0.30644, 0.30635, 0.13103], - [0.29937, 0.29931, 0.12531], - [0.29233, 0.2923, 0.11965], - [0.28532, 0.28532, 0.11406], - [0.27836, 0.27841, 0.10854], - [0.2714, 0.27151, 0.10314], - [0.26449, 0.26467, 0.097785], - [0.25761, 0.25787, 0.092474], - [0.25076, 0.25114, 0.087347], - [0.24394, 0.24442, 0.082262], - [0.2372, 0.2378, 0.077192], - [0.23042, 0.2312, 0.072349], - [0.22373, 0.22463, 0.067628], - [0.21709, 0.21818, 0.063025], - [0.21046, 0.21177, 0.058419], - [0.20394, 0.20539, 0.053781], - [0.19749, 0.19907, 0.048969], - [0.19115, 0.19284, 0.043546], - [0.18494, 0.18665, 0.037943], - [0.17882, 0.18051, 0.031907], - [0.1728, 0.17444, 0.026044], - [0.16695, 0.1684, 0.020145], - [0.16119, 0.16243, 0.014202], - [0.15554, 0.15649, 0.0080014], - [0.15005, 0.15056, 0.0019303], -]; - -export const colormap_broco_data: Array<[number, number, number]> = [ - [0.21429, 0.18467, 0.21821], - [0.21369, 0.18469, 0.22245], - [0.21315, 0.18487, 0.22685], - [0.21268, 0.18522, 0.23141], - [0.21227, 0.18574, 0.23612], - [0.21191, 0.1864, 0.24097], - [0.21159, 0.18728, 0.24599], - [0.21131, 0.18833, 0.2512], - [0.21109, 0.18953, 0.25653], - [0.21092, 0.19094, 0.26205], - [0.21081, 0.19255, 0.2677], - [0.21075, 0.19438, 0.27356], - [0.21074, 0.19638, 0.27955], - [0.21078, 0.19855, 0.28568], - [0.21088, 0.20094, 0.292], - [0.21104, 0.20358, 0.29845], - [0.21126, 0.20641, 0.30507], - [0.21155, 0.2094, 0.31181], - [0.2119, 0.21264, 0.31871], - [0.21232, 0.2161, 0.32573], - [0.21279, 0.21973, 0.33291], - [0.21336, 0.22357, 0.34018], - [0.21404, 0.22763, 0.34757], - [0.21477, 0.23189, 0.35506], - [0.21563, 0.23634, 0.36263], - [0.2166, 0.24096, 0.3703], - [0.21764, 0.24579, 0.37804], - [0.21882, 0.25081, 0.38584], - [0.22014, 0.25598, 0.3937], - [0.22156, 0.26135, 0.4016], - [0.22314, 0.26685, 0.40953], - [0.22483, 0.27251, 0.41748], - [0.22674, 0.27834, 0.42543], - [0.22878, 0.28428, 0.43337], - [0.23097, 0.29035, 0.44131], - [0.23333, 0.29656, 0.44923], - [0.23591, 0.30285, 0.45709], - [0.23863, 0.30929, 0.46493], - [0.24157, 0.31579, 0.4727], - [0.24466, 0.32237, 0.48043], - [0.248, 0.32904, 0.48809], - [0.2515, 0.33577, 0.49566], - [0.2552, 0.34257, 0.50316], - [0.25909, 0.34941, 0.51059], - [0.26316, 0.35631, 0.51793], - [0.26741, 0.36324, 0.52517], - [0.27187, 0.37021, 0.53232], - [0.27655, 0.37723, 0.53937], - [0.28136, 0.38425, 0.54634], - [0.28636, 0.3913, 0.5532], - [0.29157, 0.39836, 0.55997], - [0.29692, 0.40544, 0.56664], - [0.30241, 0.41252, 0.57321], - [0.30809, 0.41961, 0.5797], - [0.31393, 0.42669, 0.58608], - [0.3199, 0.43377, 0.59238], - [0.326, 0.44085, 0.59857], - [0.33227, 0.44793, 0.60469], - [0.33864, 0.45502, 0.61072], - [0.34514, 0.46207, 0.61667], - [0.35176, 0.46913, 0.62253], - [0.35849, 0.47617, 0.62832], - [0.36534, 0.4832, 0.63403], - [0.37228, 0.49022, 0.63967], - [0.37933, 0.49723, 0.64523], - [0.38646, 0.50423, 0.65073], - [0.3937, 0.5112, 0.65616], - [0.40102, 0.51817, 0.66152], - [0.4084, 0.52512, 0.66681], - [0.41586, 0.53206, 0.67206], - [0.42339, 0.53898, 0.67724], - [0.43101, 0.54589, 0.68235], - [0.43866, 0.55277, 0.68742], - [0.44639, 0.55965, 0.69243], - [0.45418, 0.56651, 0.69737], - [0.462, 0.57335, 0.70227], - [0.46989, 0.58017, 0.70711], - [0.47781, 0.58697, 0.71189], - [0.48577, 0.59376, 0.71662], - [0.49378, 0.60052, 0.72128], - [0.50183, 0.60728, 0.72589], - [0.50989, 0.61399, 0.73044], - [0.518, 0.6207, 0.73493], - [0.52612, 0.62737, 0.73936], - [0.53426, 0.63403, 0.74372], - [0.54243, 0.64065, 0.74801], - [0.5506, 0.64725, 0.75222], - [0.55878, 0.65382, 0.75637], - [0.56698, 0.66035, 0.76043], - [0.57517, 0.66685, 0.76441], - [0.58335, 0.67331, 0.76829], - [0.59154, 0.67972, 0.77209], - [0.59971, 0.6861, 0.77579], - [0.60786, 0.69243, 0.77938], - [0.61598, 0.6987, 0.78285], - [0.62408, 0.70491, 0.78621], - [0.63214, 0.71107, 0.78944], - [0.64016, 0.71716, 0.79253], - [0.64812, 0.72317, 0.79548], - [0.65605, 0.72911, 0.79828], - [0.66389, 0.73497, 0.80092], - [0.67166, 0.74072, 0.80338], - [0.67935, 0.74639, 0.80566], - [0.68695, 0.75195, 0.80776], - [0.69444, 0.75739, 0.80965], - [0.70182, 0.76271, 0.81133], - [0.70908, 0.7679, 0.81279], - [0.7162, 0.77295, 0.81401], - [0.72317, 0.77786, 0.81499], - [0.72999, 0.7826, 0.81572], - [0.73662, 0.78717, 0.81619], - [0.74307, 0.79156, 0.81637], - [0.74931, 0.79576, 0.81627], - [0.75536, 0.79977, 0.81588], - [0.76116, 0.80355, 0.81518], - [0.76672, 0.80712, 0.81417], - [0.77203, 0.81045, 0.81284], - [0.77708, 0.81354, 0.8112], - [0.78184, 0.81639, 0.80922], - [0.7863, 0.81896, 0.80691], - [0.79045, 0.82127, 0.80426], - [0.79429, 0.8233, 0.80127], - [0.7978, 0.82504, 0.79794], - [0.80098, 0.8265, 0.79428], - [0.8038, 0.82765, 0.79028], - [0.80628, 0.82851, 0.78595], - [0.80839, 0.82906, 0.78129], - [0.81014, 0.82929, 0.77631], - [0.81153, 0.82922, 0.77101], - [0.81253, 0.82883, 0.76541], - [0.81317, 0.82813, 0.7595], - [0.81344, 0.82712, 0.75332], - [0.81334, 0.8258, 0.74687], - [0.81288, 0.82418, 0.74015], - [0.81205, 0.82226, 0.73317], - [0.81087, 0.82004, 0.72597], - [0.80934, 0.81753, 0.71853], - [0.80746, 0.81474, 0.7109], - [0.80524, 0.81167, 0.70307], - [0.80271, 0.80833, 0.69506], - [0.79986, 0.80473, 0.68688], - [0.79669, 0.80088, 0.67856], - [0.79324, 0.79678, 0.6701], - [0.7895, 0.79245, 0.66152], - [0.78548, 0.7879, 0.65283], - [0.78121, 0.78312, 0.64404], - [0.77669, 0.77815, 0.63518], - [0.77192, 0.77297, 0.62625], - [0.76693, 0.76761, 0.61726], - [0.76173, 0.76207, 0.60824], - [0.75633, 0.75636, 0.59917], - [0.75074, 0.7505, 0.59007], - [0.74495, 0.74448, 0.58097], - [0.73902, 0.73832, 0.57187], - [0.73291, 0.73203, 0.56278], - [0.72666, 0.72562, 0.55368], - [0.72027, 0.71908, 0.54462], - [0.71376, 0.71244, 0.53558], - [0.70713, 0.7057, 0.5266], - [0.70038, 0.69887, 0.51764], - [0.69354, 0.69195, 0.50874], - [0.68661, 0.68495, 0.49988], - [0.67959, 0.67789, 0.49111], - [0.67251, 0.67075, 0.48238], - [0.66534, 0.66356, 0.47371], - [0.65813, 0.65631, 0.46513], - [0.65085, 0.64901, 0.45663], - [0.64352, 0.64166, 0.44821], - [0.63617, 0.63429, 0.43988], - [0.62877, 0.62688, 0.43163], - [0.62134, 0.61944, 0.42345], - [0.61388, 0.61197, 0.41538], - [0.60642, 0.6045, 0.40741], - [0.59893, 0.597, 0.39952], - [0.59144, 0.58948, 0.39174], - [0.58394, 0.58196, 0.38405], - [0.57645, 0.57444, 0.37648], - [0.56894, 0.56693, 0.36899], - [0.56146, 0.5594, 0.36161], - [0.55398, 0.55189, 0.35433], - [0.54652, 0.54437, 0.34717], - [0.53906, 0.53688, 0.3401], - [0.53164, 0.52939, 0.33314], - [0.52423, 0.52191, 0.32627], - [0.51686, 0.51447, 0.31955], - [0.50951, 0.50703, 0.31291], - [0.5022, 0.49962, 0.30641], - [0.49493, 0.49224, 0.29999], - [0.48769, 0.48488, 0.29369], - [0.48049, 0.47755, 0.28752], - [0.47333, 0.47026, 0.28147], - [0.46623, 0.46299, 0.27555], - [0.45918, 0.45577, 0.26973], - [0.45218, 0.44859, 0.26404], - [0.44523, 0.44144, 0.25845], - [0.43834, 0.43433, 0.25302], - [0.43152, 0.42729, 0.24771], - [0.42476, 0.42027, 0.24251], - [0.41806, 0.41332, 0.2375], - [0.41144, 0.40641, 0.23256], - [0.40488, 0.39955, 0.2278], - [0.39842, 0.39277, 0.22317], - [0.39203, 0.38603, 0.21868], - [0.38571, 0.37938, 0.21434], - [0.3795, 0.37278, 0.21015], - [0.37337, 0.36627, 0.20613], - [0.36733, 0.35981, 0.20222], - [0.3614, 0.35344, 0.19849], - [0.35557, 0.34715, 0.19495], - [0.34983, 0.34094, 0.19153], - [0.34418, 0.33483, 0.18832], - [0.33867, 0.32879, 0.18525], - [0.33328, 0.32285, 0.18231], - [0.32797, 0.317, 0.17959], - [0.32281, 0.31126, 0.17704], - [0.31775, 0.30563, 0.17466], - [0.31281, 0.30008, 0.17243], - [0.308, 0.29465, 0.1704], - [0.30332, 0.28935, 0.16854], - [0.29879, 0.28414, 0.16687], - [0.29436, 0.27908, 0.16532], - [0.29007, 0.27411, 0.16403], - [0.28591, 0.26928, 0.16286], - [0.28191, 0.26455, 0.16189], - [0.27802, 0.25997, 0.16107], - [0.27426, 0.25551, 0.16039], - [0.27065, 0.25118, 0.15992], - [0.26713, 0.24697, 0.15963], - [0.2638, 0.24289, 0.1595], - [0.26056, 0.23896, 0.15954], - [0.25747, 0.23519, 0.15973], - [0.25451, 0.23152, 0.16009], - [0.25167, 0.22798, 0.16064], - [0.24895, 0.22455, 0.16136], - [0.24634, 0.22132, 0.16219], - [0.24386, 0.2182, 0.16319], - [0.24152, 0.2152, 0.16434], - [0.23927, 0.21237, 0.1656], - [0.23716, 0.20964, 0.1671], - [0.23513, 0.20708, 0.16869], - [0.23318, 0.20464, 0.17044], - [0.23139, 0.20231, 0.17233], - [0.22964, 0.20014, 0.17439], - [0.22805, 0.19812, 0.17655], - [0.22652, 0.19626, 0.17891], - [0.22505, 0.19452, 0.18136], - [0.22371, 0.19288, 0.18399], - [0.22244, 0.1914, 0.18676], - [0.22126, 0.19007, 0.18967], - [0.22015, 0.18889, 0.19273], - [0.21911, 0.18786, 0.19593], - [0.21814, 0.18693, 0.19925], - [0.21724, 0.18619, 0.20275], - [0.21642, 0.1856, 0.20642], - [0.21564, 0.18513, 0.21018], - [0.21492, 0.18482, 0.21413], -]; - -export const colormap_buda_data: Array<[number, number, number]> = [ - [0.70015, 0.0027445, 0.70061], - [0.70019, 0.010833, 0.69719], - [0.70023, 0.019196, 0.69378], - [0.70026, 0.027497, 0.69041], - [0.70028, 0.036129, 0.68707], - [0.7003, 0.044535, 0.68375], - [0.70032, 0.052201, 0.68047], - [0.70033, 0.059479, 0.67723], - [0.70034, 0.066138, 0.67402], - [0.70035, 0.0725, 0.67086], - [0.70035, 0.078557, 0.66775], - [0.70036, 0.084489, 0.66466], - [0.70037, 0.090118, 0.66165], - [0.70038, 0.095602, 0.65866], - [0.70039, 0.10092, 0.65574], - [0.7004, 0.10618, 0.65285], - [0.70042, 0.11127, 0.65003], - [0.70045, 0.11628, 0.64726], - [0.70048, 0.12114, 0.64453], - [0.70052, 0.12603, 0.64186], - [0.70057, 0.13079, 0.63925], - [0.70064, 0.13546, 0.63668], - [0.70073, 0.14008, 0.63417], - [0.70083, 0.14469, 0.6317], - [0.70095, 0.14919, 0.62928], - [0.7011, 0.15364, 0.62692], - [0.70128, 0.15808, 0.62461], - [0.70149, 0.16247, 0.62235], - [0.70173, 0.1668, 0.62015], - [0.70201, 0.17108, 0.61798], - [0.70234, 0.17534, 0.61587], - [0.70271, 0.17955, 0.6138], - [0.70312, 0.18374, 0.61179], - [0.70358, 0.18794, 0.60982], - [0.70409, 0.19203, 0.60791], - [0.70466, 0.19615, 0.60603], - [0.70527, 0.2002, 0.60421], - [0.70595, 0.2043, 0.60242], - [0.70667, 0.20831, 0.60069], - [0.70744, 0.21233, 0.59899], - [0.70826, 0.21633, 0.59734], - [0.70914, 0.2203, 0.59571], - [0.71005, 0.22422, 0.59413], - [0.71101, 0.22819, 0.59259], - [0.71201, 0.2321, 0.59107], - [0.71304, 0.236, 0.58959], - [0.71411, 0.23986, 0.58813], - [0.71521, 0.24372, 0.58671], - [0.71634, 0.24759, 0.58531], - [0.71749, 0.25142, 0.58392], - [0.71864, 0.25523, 0.58256], - [0.71983, 0.25903, 0.58122], - [0.72101, 0.2628, 0.5799], - [0.72221, 0.26656, 0.57858], - [0.72342, 0.27032, 0.57728], - [0.72464, 0.27403, 0.57601], - [0.72586, 0.27775, 0.57472], - [0.72708, 0.28143, 0.57347], - [0.72829, 0.28511, 0.57222], - [0.72952, 0.28879, 0.57097], - [0.73073, 0.29243, 0.56973], - [0.73195, 0.29606, 0.5685], - [0.73316, 0.29969, 0.56729], - [0.73437, 0.30328, 0.56607], - [0.73557, 0.30688, 0.56485], - [0.73677, 0.31047, 0.56366], - [0.73796, 0.31402, 0.56246], - [0.73916, 0.31757, 0.56126], - [0.74035, 0.32111, 0.56008], - [0.74153, 0.32463, 0.55888], - [0.74271, 0.32815, 0.55771], - [0.74389, 0.33165, 0.55653], - [0.74506, 0.33517, 0.55536], - [0.74622, 0.33863, 0.5542], - [0.74739, 0.34211, 0.55303], - [0.74855, 0.34556, 0.55187], - [0.7497, 0.34902, 0.55071], - [0.75087, 0.35247, 0.54956], - [0.75202, 0.35591, 0.54842], - [0.75316, 0.35932, 0.54726], - [0.75431, 0.36274, 0.54612], - [0.75545, 0.36616, 0.54498], - [0.75659, 0.36956, 0.54384], - [0.75773, 0.37295, 0.54271], - [0.75886, 0.37635, 0.54156], - [0.75999, 0.37972, 0.54044], - [0.76112, 0.3831, 0.53931], - [0.76225, 0.38646, 0.53819], - [0.76337, 0.38982, 0.53706], - [0.7645, 0.39318, 0.53593], - [0.76562, 0.39653, 0.53482], - [0.76673, 0.39988, 0.53369], - [0.76785, 0.40323, 0.53259], - [0.76897, 0.40656, 0.53147], - [0.77008, 0.4099, 0.53036], - [0.7712, 0.41322, 0.52925], - [0.7723, 0.41654, 0.52814], - [0.77341, 0.41986, 0.52704], - [0.77451, 0.42317, 0.52593], - [0.77562, 0.42649, 0.52482], - [0.77673, 0.4298, 0.52372], - [0.77783, 0.4331, 0.52262], - [0.77892, 0.43641, 0.52152], - [0.78002, 0.43971, 0.52043], - [0.78111, 0.44302, 0.51934], - [0.7822, 0.44631, 0.51826], - [0.78329, 0.44961, 0.51717], - [0.78437, 0.45291, 0.51608], - [0.78545, 0.4562, 0.51501], - [0.78653, 0.4595, 0.51394], - [0.78759, 0.46279, 0.51286], - [0.78866, 0.4661, 0.5118], - [0.78971, 0.46941, 0.51074], - [0.79076, 0.4727, 0.5097], - [0.79181, 0.47602, 0.50866], - [0.79285, 0.47933, 0.50762], - [0.79388, 0.48264, 0.50659], - [0.79489, 0.48595, 0.50557], - [0.7959, 0.48927, 0.50457], - [0.7969, 0.49259, 0.50356], - [0.79789, 0.49592, 0.50257], - [0.79888, 0.49926, 0.5016], - [0.79985, 0.5026, 0.50062], - [0.80081, 0.50594, 0.49965], - [0.80176, 0.5093, 0.49871], - [0.80271, 0.51265, 0.49778], - [0.80364, 0.516, 0.49683], - [0.80457, 0.51938, 0.49591], - [0.80548, 0.52274, 0.495], - [0.8064, 0.52612, 0.49409], - [0.8073, 0.5295, 0.49318], - [0.80819, 0.53287, 0.49229], - [0.80908, 0.53625, 0.49142], - [0.80996, 0.53963, 0.49053], - [0.81084, 0.54303, 0.48964], - [0.81172, 0.54642, 0.48878], - [0.81258, 0.54981, 0.48792], - [0.81345, 0.5532, 0.48705], - [0.81431, 0.5566, 0.48618], - [0.81518, 0.56, 0.48532], - [0.81604, 0.56341, 0.48446], - [0.8169, 0.56681, 0.4836], - [0.81775, 0.5702, 0.48275], - [0.81861, 0.57361, 0.4819], - [0.81946, 0.57702, 0.48103], - [0.82032, 0.58043, 0.48019], - [0.82118, 0.58383, 0.47934], - [0.82204, 0.58724, 0.47848], - [0.82289, 0.59065, 0.47763], - [0.82374, 0.59407, 0.47677], - [0.8246, 0.59749, 0.47592], - [0.82545, 0.6009, 0.47508], - [0.82631, 0.60433, 0.47421], - [0.82717, 0.60775, 0.47335], - [0.82802, 0.61117, 0.4725], - [0.82888, 0.61459, 0.47165], - [0.82974, 0.61802, 0.4708], - [0.8306, 0.62145, 0.46994], - [0.83146, 0.62489, 0.46909], - [0.83232, 0.62832, 0.46822], - [0.83317, 0.63176, 0.46737], - [0.83404, 0.6352, 0.46651], - [0.8349, 0.63864, 0.46564], - [0.83576, 0.64209, 0.46479], - [0.83662, 0.64553, 0.46393], - [0.83749, 0.64899, 0.46306], - [0.83835, 0.65244, 0.4622], - [0.83921, 0.6559, 0.46134], - [0.84008, 0.65936, 0.46047], - [0.84095, 0.66283, 0.45961], - [0.84182, 0.66629, 0.45875], - [0.84268, 0.66976, 0.45788], - [0.84355, 0.67324, 0.45701], - [0.84442, 0.67671, 0.45615], - [0.84529, 0.68019, 0.45528], - [0.84616, 0.68368, 0.45442], - [0.84703, 0.68717, 0.45354], - [0.84791, 0.69065, 0.45268], - [0.84878, 0.69415, 0.4518], - [0.84966, 0.69765, 0.45092], - [0.85053, 0.70116, 0.45005], - [0.85141, 0.70467, 0.44918], - [0.8523, 0.70818, 0.4483], - [0.85317, 0.7117, 0.44741], - [0.85405, 0.71522, 0.44654], - [0.85494, 0.71874, 0.44566], - [0.85582, 0.72227, 0.44479], - [0.8567, 0.72581, 0.44391], - [0.85758, 0.72935, 0.44302], - [0.85847, 0.73289, 0.44214], - [0.85936, 0.73644, 0.44125], - [0.86025, 0.74, 0.44036], - [0.86114, 0.74355, 0.43947], - [0.86203, 0.74711, 0.43858], - [0.86292, 0.75068, 0.43771], - [0.86382, 0.75426, 0.43681], - [0.86471, 0.75783, 0.43592], - [0.8656, 0.76141, 0.43503], - [0.8665, 0.76501, 0.43412], - [0.8674, 0.76859, 0.43323], - [0.86831, 0.77219, 0.43234], - [0.86921, 0.7758, 0.43144], - [0.8701, 0.77941, 0.43054], - [0.87101, 0.78302, 0.42964], - [0.87192, 0.78665, 0.42873], - [0.87283, 0.79027, 0.42783], - [0.87374, 0.79391, 0.42693], - [0.87466, 0.79754, 0.42602], - [0.87558, 0.80119, 0.42512], - [0.8765, 0.80485, 0.4242], - [0.87744, 0.80851, 0.42329], - [0.87838, 0.81218, 0.42239], - [0.87933, 0.81586, 0.42148], - [0.8803, 0.81954, 0.42058], - [0.88128, 0.82324, 0.41968], - [0.88228, 0.82696, 0.41878], - [0.8833, 0.83068, 0.41788], - [0.88436, 0.83442, 0.41699], - [0.88544, 0.83817, 0.4161], - [0.88657, 0.84195, 0.41522], - [0.88774, 0.84574, 0.41435], - [0.88898, 0.84956, 0.4135], - [0.89027, 0.8534, 0.41266], - [0.89165, 0.85727, 0.41182], - [0.8931, 0.86118, 0.41101], - [0.89465, 0.86511, 0.41022], - [0.8963, 0.86908, 0.40944], - [0.89805, 0.87309, 0.40869], - [0.89994, 0.87713, 0.40798], - [0.90195, 0.88122, 0.40729], - [0.9041, 0.88535, 0.40663], - [0.9064, 0.88953, 0.40601], - [0.90885, 0.89375, 0.40542], - [0.91146, 0.89801, 0.40486], - [0.91422, 0.90232, 0.40435], - [0.91714, 0.90667, 0.40388], - [0.92022, 0.91107, 0.40344], - [0.92346, 0.9155, 0.40303], - [0.92684, 0.91998, 0.40266], - [0.93038, 0.92449, 0.40233], - [0.93405, 0.92904, 0.40204], - [0.93787, 0.93363, 0.40178], - [0.9418, 0.93824, 0.40155], - [0.94585, 0.94289, 0.40136], - [0.95, 0.94756, 0.40118], - [0.95426, 0.95224, 0.40103], - [0.9586, 0.95696, 0.4009], - [0.96301, 0.96169, 0.40079], - [0.9675, 0.96644, 0.40069], - [0.97205, 0.97121, 0.4006], - [0.97664, 0.97598, 0.40052], - [0.98129, 0.98078, 0.40045], - [0.98597, 0.98558, 0.40038], - [0.99068, 0.9904, 0.40032], - [0.99542, 0.99522, 0.40026], - [1, 1, 0.4002], -]; - -export const colormap_corc_data: Array<[number, number, number]> = [ - [0.171, 0.10033, 0.29984], - [0.1711, 0.10619, 0.30533], - [0.17113, 0.11194, 0.31082], - [0.17109, 0.11763, 0.31633], - [0.171, 0.12329, 0.32184], - [0.17084, 0.12895, 0.32738], - [0.17064, 0.13463, 0.33295], - [0.17039, 0.14021, 0.33851], - [0.17009, 0.14585, 0.34409], - [0.16976, 0.15141, 0.34971], - [0.16939, 0.15702, 0.35534], - [0.16898, 0.16264, 0.36096], - [0.16853, 0.16822, 0.36662], - [0.16806, 0.17384, 0.37228], - [0.1676, 0.17947, 0.37797], - [0.16714, 0.18513, 0.38368], - [0.16665, 0.19077, 0.38939], - [0.16614, 0.19648, 0.39513], - [0.16565, 0.20215, 0.40089], - [0.16519, 0.2079, 0.40665], - [0.16478, 0.21365, 0.41243], - [0.16441, 0.21945, 0.41822], - [0.16407, 0.22525, 0.42403], - [0.16377, 0.23111, 0.42986], - [0.16355, 0.23701, 0.4357], - [0.16341, 0.2429, 0.44155], - [0.16337, 0.24888, 0.4474], - [0.16345, 0.25488, 0.45327], - [0.16367, 0.2609, 0.45915], - [0.16404, 0.26697, 0.46502], - [0.16456, 0.2731, 0.47091], - [0.16525, 0.27926, 0.47678], - [0.16622, 0.28544, 0.48265], - [0.16742, 0.29171, 0.48852], - [0.16886, 0.29798, 0.49438], - [0.17055, 0.30431, 0.5002], - [0.17253, 0.31069, 0.50602], - [0.17486, 0.31708, 0.51181], - [0.17748, 0.32352, 0.51758], - [0.1804, 0.33, 0.52331], - [0.18368, 0.33649, 0.529], - [0.18732, 0.34303, 0.53464], - [0.19125, 0.34957, 0.54024], - [0.19555, 0.35615, 0.5458], - [0.20015, 0.36273, 0.5513], - [0.20511, 0.36934, 0.55674], - [0.21036, 0.37595, 0.56213], - [0.21591, 0.38257, 0.56746], - [0.22171, 0.3892, 0.57273], - [0.2278, 0.39583, 0.57793], - [0.23411, 0.40244, 0.58309], - [0.24065, 0.40907, 0.58818], - [0.24742, 0.41569, 0.59323], - [0.25438, 0.42229, 0.59821], - [0.26149, 0.42891, 0.60315], - [0.26878, 0.43552, 0.60805], - [0.2762, 0.44211, 0.61288], - [0.28373, 0.4487, 0.61769], - [0.29141, 0.45527, 0.62245], - [0.29918, 0.46185, 0.62719], - [0.30703, 0.46841, 0.63189], - [0.31496, 0.47499, 0.63657], - [0.32299, 0.48154, 0.64121], - [0.33106, 0.48811, 0.64585], - [0.33922, 0.49467, 0.65047], - [0.34741, 0.50123, 0.65507], - [0.35565, 0.50779, 0.65966], - [0.36392, 0.51435, 0.66424], - [0.37224, 0.52091, 0.66882], - [0.38061, 0.52747, 0.67339], - [0.389, 0.53404, 0.67795], - [0.39741, 0.54062, 0.68251], - [0.40587, 0.54719, 0.68707], - [0.41434, 0.55377, 0.69164], - [0.42283, 0.56037, 0.6962], - [0.43136, 0.56696, 0.70076], - [0.4399, 0.57356, 0.70533], - [0.44846, 0.58017, 0.7099], - [0.45704, 0.58678, 0.71447], - [0.46563, 0.5934, 0.71905], - [0.47426, 0.60003, 0.72363], - [0.48289, 0.60666, 0.72822], - [0.49155, 0.6133, 0.73282], - [0.50021, 0.61996, 0.73741], - [0.5089, 0.62661, 0.74201], - [0.5176, 0.63327, 0.74661], - [0.52632, 0.63994, 0.75123], - [0.53504, 0.64662, 0.75584], - [0.54379, 0.6533, 0.76046], - [0.55255, 0.66, 0.76509], - [0.56132, 0.66669, 0.76971], - [0.5701, 0.6734, 0.77435], - [0.57891, 0.68011, 0.77899], - [0.58771, 0.68684, 0.78364], - [0.59655, 0.69357, 0.78829], - [0.60538, 0.7003, 0.79294], - [0.61423, 0.70705, 0.79759], - [0.6231, 0.7138, 0.80225], - [0.63197, 0.72056, 0.80692], - [0.64085, 0.72732, 0.81158], - [0.64975, 0.73409, 0.81624], - [0.65864, 0.74087, 0.8209], - [0.66755, 0.74765, 0.82555], - [0.67646, 0.75444, 0.8302], - [0.68537, 0.76123, 0.83483], - [0.69427, 0.76801, 0.83945], - [0.70318, 0.77481, 0.84404], - [0.71207, 0.7816, 0.8486], - [0.72094, 0.78839, 0.85313], - [0.72979, 0.79517, 0.85761], - [0.7386, 0.80193, 0.86203], - [0.74737, 0.80869, 0.86637], - [0.75608, 0.81541, 0.87061], - [0.76471, 0.82211, 0.87475], - [0.77323, 0.82877, 0.87874], - [0.78164, 0.83536, 0.88257], - [0.78989, 0.84189, 0.8862], - [0.79795, 0.84833, 0.88958], - [0.80578, 0.85465, 0.89269], - [0.81332, 0.86082, 0.89547], - [0.82051, 0.86681, 0.89787], - [0.82731, 0.87258, 0.89985], - [0.83362, 0.87808, 0.90133], - [0.83938, 0.88326, 0.90228], - [0.8445, 0.88806, 0.90264], - [0.84892, 0.89244, 0.90237], - [0.85255, 0.89633, 0.90142], - [0.85534, 0.89968, 0.89979], - [0.85724, 0.90245, 0.89746], - [0.85821, 0.9046, 0.89443], - [0.85826, 0.90613, 0.89074], - [0.85738, 0.90702, 0.88641], - [0.85562, 0.90728, 0.88151], - [0.85301, 0.90693, 0.87608], - [0.84962, 0.90601, 0.87019], - [0.84552, 0.90455, 0.86392], - [0.84079, 0.90262, 0.8573], - [0.8355, 0.90026, 0.85043], - [0.82974, 0.89751, 0.84333], - [0.82355, 0.89444, 0.83606], - [0.81703, 0.89108, 0.82865], - [0.81021, 0.88747, 0.82114], - [0.80315, 0.88367, 0.81355], - [0.79589, 0.87969, 0.8059], - [0.78847, 0.87557, 0.79821], - [0.78091, 0.87133, 0.79049], - [0.77325, 0.86699, 0.78275], - [0.76551, 0.86258, 0.775], - [0.7577, 0.8581, 0.76724], - [0.74983, 0.85357, 0.75948], - [0.74193, 0.84901, 0.75173], - [0.73401, 0.84442, 0.74397], - [0.72606, 0.8398, 0.73621], - [0.71809, 0.83516, 0.72847], - [0.71012, 0.83052, 0.72073], - [0.70214, 0.82586, 0.71299], - [0.69416, 0.8212, 0.70527], - [0.6862, 0.81654, 0.69756], - [0.67823, 0.81187, 0.68986], - [0.67027, 0.80721, 0.68216], - [0.66231, 0.80254, 0.67447], - [0.65435, 0.79788, 0.66679], - [0.64641, 0.79323, 0.65913], - [0.63848, 0.78858, 0.65148], - [0.63056, 0.78393, 0.64382], - [0.62265, 0.77928, 0.63619], - [0.61474, 0.77464, 0.62855], - [0.60686, 0.77001, 0.62093], - [0.59897, 0.76538, 0.6133], - [0.59109, 0.76075, 0.6057], - [0.58323, 0.75613, 0.5981], - [0.57538, 0.75151, 0.5905], - [0.56753, 0.74689, 0.58292], - [0.5597, 0.74228, 0.57534], - [0.55187, 0.73766, 0.56776], - [0.54405, 0.73306, 0.5602], - [0.53624, 0.72845, 0.55263], - [0.52844, 0.72384, 0.54506], - [0.52064, 0.71923, 0.53751], - [0.51286, 0.71462, 0.52994], - [0.50508, 0.71001, 0.52237], - [0.49731, 0.70539, 0.51482], - [0.48954, 0.70077, 0.50725], - [0.48179, 0.69614, 0.49967], - [0.47404, 0.69149, 0.4921], - [0.46629, 0.68683, 0.4845], - [0.45856, 0.68215, 0.4769], - [0.45084, 0.67746, 0.46929], - [0.44313, 0.67274, 0.46164], - [0.43544, 0.66799, 0.45397], - [0.42775, 0.6632, 0.44627], - [0.42007, 0.65836, 0.43854], - [0.41243, 0.65348, 0.43077], - [0.40479, 0.64854, 0.42295], - [0.3972, 0.64354, 0.41508], - [0.38964, 0.63847, 0.40716], - [0.38212, 0.63332, 0.39917], - [0.37467, 0.62808, 0.39113], - [0.36726, 0.62275, 0.383], - [0.35994, 0.61731, 0.3748], - [0.35271, 0.61176, 0.36654], - [0.34559, 0.60608, 0.35818], - [0.3386, 0.6003, 0.34976], - [0.33175, 0.59439, 0.34127], - [0.32508, 0.58835, 0.33272], - [0.31862, 0.5822, 0.3241], - [0.31236, 0.57594, 0.31546], - [0.30639, 0.56955, 0.30678], - [0.30064, 0.56307, 0.29808], - [0.29522, 0.5565, 0.28942], - [0.29011, 0.54986, 0.28076], - [0.28533, 0.54316, 0.27217], - [0.2809, 0.53642, 0.26369], - [0.27686, 0.52965, 0.25527], - [0.27316, 0.52289, 0.24696], - [0.26983, 0.51612, 0.2388], - [0.26683, 0.50941, 0.2308], - [0.26421, 0.50273, 0.22297], - [0.26191, 0.49611, 0.21528], - [0.25993, 0.48956, 0.20781], - [0.25824, 0.4831, 0.20049], - [0.25684, 0.47672, 0.19341], - [0.25568, 0.47044, 0.18649], - [0.25478, 0.46425, 0.17975], - [0.25405, 0.45813, 0.17319], - [0.25351, 0.45214, 0.16682], - [0.25314, 0.44621, 0.16055], - [0.25291, 0.44039, 0.15448], - [0.25281, 0.43466, 0.14853], - [0.2528, 0.429, 0.14275], - [0.25289, 0.42342, 0.13706], - [0.25306, 0.41793, 0.13148], - [0.25328, 0.41252, 0.12601], - [0.25356, 0.40715, 0.12057], - [0.25388, 0.40185, 0.11527], - [0.25423, 0.39662, 0.11008], - [0.25462, 0.39145, 0.10481], - [0.25501, 0.38631, 0.09971], - [0.25541, 0.38126, 0.09467], - [0.25581, 0.37623, 0.089581], - [0.25622, 0.37124, 0.084565], - [0.25664, 0.36632, 0.079479], - [0.25706, 0.36141, 0.074491], - [0.25746, 0.35656, 0.069524], - [0.25784, 0.35172, 0.064405], - [0.25821, 0.34695, 0.059366], - [0.25858, 0.34218, 0.05412], - [0.25893, 0.33745, 0.049005], - [0.25924, 0.33276, 0.043542], - [0.25953, 0.32806, 0.038204], - [0.25979, 0.32341, 0.032741], - [0.26002, 0.31877, 0.027725], - [0.26021, 0.31415, 0.022967], - [0.26037, 0.30955, 0.01845], - [0.2605, 0.30495, 0.014165], - [0.26058, 0.30036, 0.0098945], -]; - -export const colormap_corco_data: Array<[number, number, number]> = [ - [0.24651, 0.24352, 0.2292], - [0.24607, 0.24243, 0.23232], - [0.24564, 0.24145, 0.23554], - [0.24522, 0.24052, 0.23883], - [0.24481, 0.23974, 0.24225], - [0.24441, 0.23905, 0.24576], - [0.24402, 0.23847, 0.2494], - [0.24365, 0.23802, 0.25316], - [0.24329, 0.23769, 0.25703], - [0.24295, 0.23749, 0.26102], - [0.24264, 0.23741, 0.26513], - [0.24235, 0.23747, 0.2694], - [0.24209, 0.23767, 0.27379], - [0.24185, 0.23802, 0.27831], - [0.24164, 0.23852, 0.28299], - [0.24147, 0.23921, 0.2878], - [0.24133, 0.24005, 0.29278], - [0.24123, 0.24109, 0.29791], - [0.24118, 0.24229, 0.30319], - [0.24118, 0.24368, 0.30866], - [0.24123, 0.24527, 0.31425], - [0.24135, 0.24707, 0.32003], - [0.24152, 0.24906, 0.32594], - [0.24176, 0.25127, 0.33205], - [0.24207, 0.25367, 0.33828], - [0.24246, 0.25627, 0.34469], - [0.24293, 0.25913, 0.35124], - [0.2435, 0.26218, 0.35795], - [0.24417, 0.26544, 0.36478], - [0.24494, 0.26895, 0.37175], - [0.24582, 0.27263, 0.37886], - [0.24683, 0.27657, 0.38607], - [0.24797, 0.28067, 0.39341], - [0.24921, 0.28501, 0.40086], - [0.25059, 0.28956, 0.40836], - [0.25214, 0.29428, 0.41596], - [0.25383, 0.29922, 0.42362], - [0.25567, 0.30432, 0.43135], - [0.25767, 0.30961, 0.43909], - [0.25986, 0.31504, 0.44689], - [0.26221, 0.32066, 0.4547], - [0.26473, 0.32639, 0.46249], - [0.26743, 0.3323, 0.47031], - [0.27036, 0.33831, 0.47809], - [0.27343, 0.34444, 0.48584], - [0.2767, 0.35071, 0.49355], - [0.28015, 0.35705, 0.50123], - [0.2838, 0.36348, 0.50884], - [0.28763, 0.36999, 0.51637], - [0.29167, 0.37659, 0.52384], - [0.29586, 0.38324, 0.53123], - [0.30024, 0.38994, 0.53854], - [0.3048, 0.39669, 0.54575], - [0.30955, 0.40349, 0.55287], - [0.31442, 0.41032, 0.55989], - [0.31949, 0.41717, 0.56681], - [0.32469, 0.42404, 0.57363], - [0.33007, 0.43093, 0.58034], - [0.33558, 0.43784, 0.58695], - [0.34122, 0.44474, 0.59345], - [0.347, 0.45164, 0.59985], - [0.3529, 0.45854, 0.60614], - [0.35891, 0.46544, 0.61233], - [0.36505, 0.47234, 0.61843], - [0.37128, 0.47923, 0.62442], - [0.37763, 0.48609, 0.63031], - [0.38406, 0.49295, 0.6361], - [0.39058, 0.49979, 0.64179], - [0.39718, 0.50662, 0.64739], - [0.40387, 0.51343, 0.65289], - [0.41063, 0.52021, 0.65831], - [0.41745, 0.52699, 0.66363], - [0.42432, 0.53373, 0.66887], - [0.43126, 0.54046, 0.67401], - [0.43824, 0.54716, 0.67907], - [0.44526, 0.55384, 0.68404], - [0.45234, 0.5605, 0.68893], - [0.45943, 0.56714, 0.69372], - [0.46656, 0.57374, 0.69844], - [0.4737, 0.58032, 0.70307], - [0.48087, 0.58686, 0.70761], - [0.48806, 0.59339, 0.71206], - [0.49525, 0.59988, 0.71643], - [0.50243, 0.60634, 0.72069], - [0.50961, 0.61277, 0.72487], - [0.51679, 0.61917, 0.72895], - [0.52394, 0.62553, 0.73294], - [0.53106, 0.63185, 0.73681], - [0.53817, 0.63813, 0.74059], - [0.54522, 0.64436, 0.74425], - [0.55224, 0.65056, 0.74781], - [0.55919, 0.65671, 0.75124], - [0.56609, 0.6628, 0.75455], - [0.57292, 0.66883, 0.75772], - [0.57967, 0.6748, 0.76076], - [0.58632, 0.68071, 0.76366], - [0.59289, 0.68655, 0.76641], - [0.59934, 0.69232, 0.769], - [0.60566, 0.698, 0.77143], - [0.61187, 0.7036, 0.77368], - [0.61793, 0.70911, 0.77576], - [0.62384, 0.7145, 0.77766], - [0.62958, 0.7198, 0.77935], - [0.63514, 0.72498, 0.78084], - [0.64052, 0.73004, 0.78213], - [0.64568, 0.73497, 0.78319], - [0.65064, 0.73976, 0.78403], - [0.65536, 0.74439, 0.78463], - [0.65985, 0.74887, 0.78499], - [0.66407, 0.75319, 0.78511], - [0.66804, 0.75733, 0.78497], - [0.67172, 0.76129, 0.78457], - [0.67512, 0.76506, 0.7839], - [0.67822, 0.76862, 0.78296], - [0.681, 0.77199, 0.78176], - [0.68348, 0.77513, 0.78028], - [0.68563, 0.77806, 0.77853], - [0.68744, 0.78075, 0.7765], - [0.68892, 0.78321, 0.77419], - [0.69005, 0.78543, 0.77162], - [0.69084, 0.7874, 0.76877], - [0.69128, 0.78913, 0.76566], - [0.69138, 0.79061, 0.76228], - [0.69113, 0.79184, 0.75865], - [0.69054, 0.79281, 0.75476], - [0.68962, 0.79354, 0.75063], - [0.68836, 0.79401, 0.74626], - [0.68676, 0.79423, 0.74166], - [0.68485, 0.7942, 0.73685], - [0.68262, 0.79393, 0.73183], - [0.68008, 0.79342, 0.7266], - [0.67727, 0.79267, 0.72118], - [0.67415, 0.79169, 0.71559], - [0.67077, 0.79049, 0.70981], - [0.66712, 0.78907, 0.70387], - [0.66324, 0.78743, 0.69778], - [0.6591, 0.78559, 0.69154], - [0.65474, 0.78355, 0.68517], - [0.65017, 0.78131, 0.67867], - [0.64539, 0.77888, 0.67205], - [0.64043, 0.77628, 0.66532], - [0.63528, 0.7735, 0.65848], - [0.62998, 0.77056, 0.65155], - [0.62451, 0.76745, 0.64451], - [0.61891, 0.76419, 0.6374], - [0.61315, 0.76078, 0.6302], - [0.6073, 0.75722, 0.62293], - [0.60131, 0.75352, 0.61558], - [0.59523, 0.74969, 0.60817], - [0.58904, 0.74573, 0.60069], - [0.58278, 0.74164, 0.59315], - [0.57645, 0.73743, 0.58556], - [0.57002, 0.73311, 0.5779], - [0.56356, 0.72866, 0.5702], - [0.55703, 0.72411, 0.56246], - [0.55045, 0.71944, 0.55465], - [0.54383, 0.71466, 0.54681], - [0.53719, 0.70979, 0.53892], - [0.53051, 0.7048, 0.53099], - [0.52381, 0.69972, 0.52302], - [0.5171, 0.69453, 0.51501], - [0.51038, 0.68926, 0.50697], - [0.50366, 0.68387, 0.4989], - [0.49694, 0.6784, 0.4908], - [0.49024, 0.67284, 0.48266], - [0.48354, 0.66717, 0.47451], - [0.47688, 0.66142, 0.46632], - [0.47024, 0.65557, 0.45813], - [0.46363, 0.64965, 0.44992], - [0.45706, 0.64362, 0.4417], - [0.45054, 0.63752, 0.43346], - [0.44407, 0.63134, 0.42525], - [0.43766, 0.62507, 0.41702], - [0.4313, 0.61874, 0.40881], - [0.42502, 0.61231, 0.40062], - [0.4188, 0.60582, 0.39243], - [0.41269, 0.59928, 0.38429], - [0.40664, 0.59266, 0.3762], - [0.4007, 0.58599, 0.36814], - [0.39484, 0.57926, 0.36013], - [0.3891, 0.57248, 0.35219], - [0.38347, 0.56565, 0.34432], - [0.37794, 0.55879, 0.33653], - [0.37254, 0.55192, 0.32885], - [0.36726, 0.545, 0.32125], - [0.36212, 0.53808, 0.31377], - [0.35711, 0.53113, 0.30642], - [0.35222, 0.52419, 0.29918], - [0.3475, 0.51725, 0.29209], - [0.3429, 0.51032, 0.28513], - [0.33844, 0.50341, 0.27837], - [0.33415, 0.49653, 0.27174], - [0.33, 0.48969, 0.26533], - [0.32598, 0.48289, 0.2591], - [0.32214, 0.47614, 0.25304], - [0.31843, 0.46946, 0.24719], - [0.31487, 0.46281, 0.24156], - [0.31147, 0.45626, 0.23614], - [0.30822, 0.44978, 0.23093], - [0.30511, 0.44338, 0.22597], - [0.30213, 0.43708, 0.22122], - [0.29932, 0.43086, 0.21671], - [0.29663, 0.42474, 0.21242], - [0.29405, 0.41872, 0.20837], - [0.29164, 0.41283, 0.20457], - [0.28934, 0.40702, 0.20097], - [0.28714, 0.40134, 0.19765], - [0.28507, 0.39577, 0.19457], - [0.28314, 0.3903, 0.19167], - [0.28128, 0.38496, 0.18903], - [0.27955, 0.37974, 0.18661], - [0.2779, 0.37465, 0.18441], - [0.27636, 0.36966, 0.18241], - [0.27487, 0.36479, 0.18063], - [0.27351, 0.36004, 0.17908], - [0.27218, 0.35543, 0.17773], - [0.27097, 0.35091, 0.17651], - [0.26982, 0.34649, 0.17553], - [0.26872, 0.34221, 0.17474], - [0.26766, 0.33802, 0.17409], - [0.2667, 0.33396, 0.17361], - [0.26578, 0.32999, 0.1733], - [0.26489, 0.32611, 0.17314], - [0.26408, 0.32237, 0.17313], - [0.26329, 0.3187, 0.17327], - [0.26252, 0.31513, 0.17354], - [0.2618, 0.31165, 0.17394], - [0.26111, 0.30827, 0.17448], - [0.26046, 0.30499, 0.17512], - [0.25983, 0.30177, 0.17584], - [0.25922, 0.29866, 0.17672], - [0.25862, 0.29562, 0.17773], - [0.25804, 0.29267, 0.17879], - [0.25749, 0.28979, 0.17994], - [0.25696, 0.28698, 0.18119], - [0.25642, 0.28427, 0.18254], - [0.2559, 0.28162, 0.184], - [0.25541, 0.27906, 0.18555], - [0.25492, 0.27655, 0.18714], - [0.25442, 0.27411, 0.18883], - [0.25393, 0.27173, 0.19058], - [0.25345, 0.26946, 0.19242], - [0.25297, 0.2672, 0.19437], - [0.2525, 0.26505, 0.19635], - [0.25203, 0.26297, 0.19839], - [0.25156, 0.26095, 0.20052], - [0.25109, 0.259, 0.20275], - [0.25061, 0.25711, 0.20504], - [0.25014, 0.25531, 0.20742], - [0.24968, 0.25356, 0.20985], - [0.24923, 0.2519, 0.21238], - [0.24878, 0.25028, 0.21495], - [0.24833, 0.24879, 0.21765], - [0.24787, 0.24734, 0.22042], - [0.24741, 0.24598, 0.22326], - [0.24696, 0.2447, 0.2262], -]; - -export const colormap_davos_data: Array<[number, number, number]> = [ - [0, 0.019685, 0.29201], - [0, 0.027123, 0.29748], - [0, 0.034324, 0.30295], - [0.00076962, 0.041437, 0.30847], - [0.0023129, 0.047559, 0.314], - [0.0043894, 0.053102, 0.31954], - [0.0066067, 0.058541, 0.32508], - [0.0088746, 0.063928, 0.33063], - [0.011304, 0.069327, 0.33618], - [0.013761, 0.074551, 0.34174], - [0.01619, 0.079806, 0.3473], - [0.01868, 0.085081, 0.35284], - [0.021233, 0.090352, 0.35838], - [0.023852, 0.095588, 0.36391], - [0.02654, 0.10079, 0.36945], - [0.029301, 0.10606, 0.37496], - [0.032137, 0.11127, 0.38047], - [0.035259, 0.11648, 0.38595], - [0.03825, 0.12165, 0.39144], - [0.041347, 0.12687, 0.39688], - [0.044338, 0.13212, 0.40232], - [0.047327, 0.13734, 0.40774], - [0.050291, 0.14254, 0.41314], - [0.053198, 0.14777, 0.4185], - [0.056204, 0.15296, 0.42383], - [0.05913, 0.15821, 0.42915], - [0.06198, 0.16344, 0.43442], - [0.06489, 0.16864, 0.43966], - [0.067805, 0.17386, 0.44487], - [0.070681, 0.17908, 0.45002], - [0.073639, 0.1843, 0.45515], - [0.076446, 0.18952, 0.46021], - [0.07937, 0.19476, 0.46524], - [0.082366, 0.19994, 0.47023], - [0.085246, 0.20517, 0.47517], - [0.088241, 0.21038, 0.48004], - [0.091235, 0.21558, 0.48485], - [0.094218, 0.2208, 0.48961], - [0.097192, 0.22598, 0.49432], - [0.10023, 0.23115, 0.49896], - [0.10333, 0.23632, 0.50353], - [0.10643, 0.24147, 0.50804], - [0.10953, 0.2466, 0.51247], - [0.11265, 0.25175, 0.51684], - [0.1158, 0.25686, 0.52112], - [0.11898, 0.26195, 0.52533], - [0.12214, 0.26702, 0.52947], - [0.12542, 0.27208, 0.53351], - [0.12867, 0.27714, 0.53749], - [0.13198, 0.28216, 0.54136], - [0.1353, 0.28713, 0.54517], - [0.13865, 0.29211, 0.54888], - [0.14202, 0.29706, 0.5525], - [0.14545, 0.30195, 0.55601], - [0.14883, 0.30685, 0.55945], - [0.15228, 0.31168, 0.56279], - [0.15579, 0.31652, 0.56602], - [0.15927, 0.3213, 0.56916], - [0.16281, 0.32604, 0.57221], - [0.16635, 0.33076, 0.57515], - [0.16993, 0.33545, 0.57799], - [0.17351, 0.34008, 0.58073], - [0.17713, 0.34467, 0.58337], - [0.18074, 0.34923, 0.58591], - [0.18441, 0.35374, 0.58833], - [0.1881, 0.35821, 0.59066], - [0.19176, 0.36264, 0.59289], - [0.19546, 0.36702, 0.595], - [0.19916, 0.37135, 0.59702], - [0.20291, 0.37564, 0.59892], - [0.20668, 0.37989, 0.60073], - [0.21041, 0.38408, 0.60243], - [0.21418, 0.38823, 0.60403], - [0.21795, 0.39233, 0.60552], - [0.22173, 0.39638, 0.60692], - [0.22553, 0.40038, 0.60821], - [0.22931, 0.40432, 0.6094], - [0.23311, 0.40823, 0.61049], - [0.23695, 0.41208, 0.61149], - [0.24073, 0.41588, 0.61238], - [0.24454, 0.41964, 0.61318], - [0.24839, 0.42333, 0.61388], - [0.2522, 0.42699, 0.6145], - [0.256, 0.43059, 0.61502], - [0.25984, 0.43414, 0.61546], - [0.26367, 0.43766, 0.61581], - [0.26745, 0.44111, 0.61607], - [0.27128, 0.44454, 0.61624], - [0.2751, 0.44789, 0.61633], - [0.27892, 0.45122, 0.61635], - [0.28273, 0.4545, 0.61628], - [0.2865, 0.45772, 0.61613], - [0.29031, 0.46091, 0.61591], - [0.2941, 0.46407, 0.61562], - [0.29789, 0.46717, 0.61525], - [0.30167, 0.47023, 0.61482], - [0.30547, 0.47324, 0.61432], - [0.30924, 0.47623, 0.61375], - [0.31299, 0.47918, 0.61312], - [0.31676, 0.48209, 0.61244], - [0.32052, 0.48496, 0.6117], - [0.32425, 0.48781, 0.6109], - [0.32799, 0.49062, 0.61003], - [0.33172, 0.49338, 0.60913], - [0.33546, 0.49612, 0.60817], - [0.33918, 0.49885, 0.60716], - [0.3429, 0.50154, 0.6061], - [0.34659, 0.5042, 0.605], - [0.3503, 0.50682, 0.60387], - [0.35399, 0.50943, 0.60268], - [0.3577, 0.51201, 0.60146], - [0.36137, 0.51458, 0.60021], - [0.36505, 0.51712, 0.59892], - [0.36873, 0.51964, 0.5976], - [0.37239, 0.52214, 0.59624], - [0.37607, 0.52463, 0.59486], - [0.37973, 0.5271, 0.59346], - [0.38339, 0.52956, 0.59203], - [0.38704, 0.532, 0.59056], - [0.3907, 0.53443, 0.58908], - [0.39435, 0.53685, 0.58759], - [0.39801, 0.53925, 0.58608], - [0.40165, 0.54165, 0.58455], - [0.40531, 0.54405, 0.583], - [0.40896, 0.54645, 0.58144], - [0.41262, 0.54884, 0.57988], - [0.41627, 0.55121, 0.5783], - [0.41992, 0.55359, 0.57672], - [0.42358, 0.55597, 0.57512], - [0.42725, 0.55835, 0.57353], - [0.43092, 0.56074, 0.57194], - [0.43459, 0.56313, 0.57033], - [0.43828, 0.56552, 0.56874], - [0.44197, 0.56792, 0.56715], - [0.44565, 0.57032, 0.56556], - [0.44937, 0.57275, 0.56398], - [0.45309, 0.57517, 0.56241], - [0.45681, 0.57761, 0.56084], - [0.46055, 0.58007, 0.55929], - [0.46433, 0.58253, 0.55775], - [0.46809, 0.58503, 0.55622], - [0.47189, 0.58752, 0.55473], - [0.4757, 0.59004, 0.55324], - [0.47953, 0.5926, 0.55178], - [0.48338, 0.59516, 0.55034], - [0.48726, 0.59776, 0.54894], - [0.49117, 0.60038, 0.54755], - [0.49509, 0.60303, 0.5462], - [0.49905, 0.60571, 0.54488], - [0.50303, 0.60843, 0.5436], - [0.50706, 0.61118, 0.54236], - [0.51112, 0.61395, 0.54116], - [0.51522, 0.61678, 0.54], - [0.51937, 0.61965, 0.53891], - [0.52355, 0.62255, 0.53786], - [0.52777, 0.62551, 0.53686], - [0.53206, 0.62851, 0.53591], - [0.53639, 0.63156, 0.53503], - [0.54077, 0.63467, 0.53422], - [0.54521, 0.63783, 0.53348], - [0.54971, 0.64104, 0.53282], - [0.55428, 0.64432, 0.53224], - [0.55891, 0.64767, 0.53174], - [0.56362, 0.65108, 0.53132], - [0.56839, 0.65456, 0.531], - [0.57326, 0.65811, 0.53079], - [0.57819, 0.66174, 0.53067], - [0.58321, 0.66544, 0.53067], - [0.58832, 0.66922, 0.53078], - [0.59353, 0.67309, 0.53102], - [0.59882, 0.67705, 0.53139], - [0.60422, 0.68107, 0.53189], - [0.60972, 0.68521, 0.53254], - [0.61531, 0.68944, 0.53332], - [0.62103, 0.69375, 0.53427], - [0.62684, 0.69816, 0.53539], - [0.63277, 0.70268, 0.53668], - [0.63881, 0.70728, 0.53814], - [0.64497, 0.71199, 0.53977], - [0.65125, 0.71681, 0.5416], - [0.65764, 0.72171, 0.54364], - [0.66413, 0.72672, 0.54587], - [0.67075, 0.73183, 0.54832], - [0.67748, 0.73703, 0.55097], - [0.68431, 0.74232, 0.55384], - [0.69125, 0.74771, 0.55694], - [0.6983, 0.75318, 0.56026], - [0.70544, 0.75873, 0.56382], - [0.71266, 0.76436, 0.5676], - [0.71998, 0.77006, 0.57162], - [0.72736, 0.77583, 0.57587], - [0.73481, 0.78165, 0.58035], - [0.74231, 0.78751, 0.58506], - [0.74985, 0.79342, 0.58999], - [0.75743, 0.79936, 0.59516], - [0.76503, 0.80531, 0.60053], - [0.77263, 0.81128, 0.60612], - [0.78022, 0.81724, 0.61191], - [0.7878, 0.82319, 0.61789], - [0.79534, 0.82912, 0.62406], - [0.80283, 0.83501, 0.6304], - [0.81025, 0.84085, 0.63691], - [0.81761, 0.84664, 0.64355], - [0.82487, 0.85237, 0.65035], - [0.83203, 0.85801, 0.65727], - [0.83907, 0.86357, 0.66429], - [0.84598, 0.86903, 0.67142], - [0.85276, 0.87439, 0.67863], - [0.85938, 0.87963, 0.68592], - [0.86585, 0.88476, 0.69326], - [0.87216, 0.88977, 0.70066], - [0.87829, 0.89464, 0.70808], - [0.88424, 0.89938, 0.71554], - [0.89001, 0.90397, 0.72299], - [0.89559, 0.90844, 0.73047], - [0.90099, 0.91275, 0.73792], - [0.90619, 0.91692, 0.74537], - [0.9112, 0.92095, 0.75278], - [0.91602, 0.92483, 0.76018], - [0.92065, 0.92857, 0.76753], - [0.92509, 0.93217, 0.77484], - [0.92935, 0.93564, 0.78211], - [0.93342, 0.93896, 0.78932], - [0.93732, 0.94215, 0.79647], - [0.94103, 0.94521, 0.80357], - [0.94458, 0.94814, 0.81061], - [0.94796, 0.95096, 0.81759], - [0.95118, 0.95365, 0.82451], - [0.95425, 0.95622, 0.83137], - [0.95716, 0.95869, 0.83816], - [0.95993, 0.96104, 0.84489], - [0.96256, 0.9633, 0.85156], - [0.96506, 0.96546, 0.85817], - [0.96743, 0.96753, 0.86472], - [0.96967, 0.9695, 0.87121], - [0.97181, 0.9714, 0.87765], - [0.97382, 0.97321, 0.88403], - [0.97573, 0.97495, 0.89036], - [0.97755, 0.97662, 0.89664], - [0.97927, 0.97822, 0.90287], - [0.98089, 0.97976, 0.90905], - [0.98244, 0.98124, 0.91519], - [0.9839, 0.98267, 0.9213], - [0.98528, 0.98404, 0.92736], - [0.9866, 0.98537, 0.93338], - [0.98784, 0.98665, 0.93938], - [0.98903, 0.98789, 0.94534], - [0.99015, 0.9891, 0.95127], - [0.99123, 0.99027, 0.95718], - [0.99225, 0.99141, 0.96306], - [0.99323, 0.99252, 0.96892], - [0.99415, 0.99361, 0.97476], - [0.99505, 0.99467, 0.98059], - [0.9959, 0.99572, 0.98641], - [0.99673, 0.99675, 0.9922], - [0.99752, 0.99776, 0.99799], -]; - -export const colormap_devon_data: Array<[number, number, number]> = [ - [0.17103, 0.1004, 0.29978], - [0.17087, 0.10414, 0.30337], - [0.17068, 0.10786, 0.30699], - [0.17046, 0.11159, 0.31061], - [0.17023, 0.11524, 0.31422], - [0.16997, 0.11894, 0.31784], - [0.1697, 0.12254, 0.32146], - [0.1694, 0.12624, 0.32509], - [0.16908, 0.12989, 0.32874], - [0.16874, 0.1335, 0.33238], - [0.16837, 0.13713, 0.33601], - [0.16801, 0.14077, 0.33967], - [0.16765, 0.14438, 0.34332], - [0.16728, 0.14799, 0.34698], - [0.16689, 0.1516, 0.35064], - [0.16648, 0.15524, 0.35429], - [0.16605, 0.15887, 0.35797], - [0.16562, 0.16251, 0.36164], - [0.1652, 0.16612, 0.36531], - [0.1648, 0.16979, 0.369], - [0.16439, 0.17341, 0.37268], - [0.16397, 0.17708, 0.37639], - [0.16353, 0.18072, 0.38008], - [0.16308, 0.1844, 0.3838], - [0.16264, 0.1881, 0.3875], - [0.1622, 0.19175, 0.39124], - [0.16176, 0.19545, 0.39496], - [0.16131, 0.19914, 0.3987], - [0.16084, 0.20287, 0.40244], - [0.16036, 0.20662, 0.40621], - [0.15991, 0.21033, 0.40998], - [0.15947, 0.21408, 0.41376], - [0.15904, 0.21784, 0.41755], - [0.1586, 0.2216, 0.42135], - [0.15814, 0.22538, 0.42518], - [0.15768, 0.22918, 0.42901], - [0.15723, 0.23298, 0.43287], - [0.15681, 0.23683, 0.43674], - [0.15639, 0.24063, 0.44063], - [0.15595, 0.24449, 0.44456], - [0.15552, 0.24839, 0.44851], - [0.1551, 0.25226, 0.45249], - [0.15469, 0.25615, 0.45649], - [0.15431, 0.26008, 0.46054], - [0.15394, 0.26403, 0.46464], - [0.1536, 0.26797, 0.46878], - [0.15329, 0.27194, 0.47296], - [0.153, 0.27597, 0.47721], - [0.15276, 0.27998, 0.48152], - [0.15256, 0.28401, 0.48589], - [0.15241, 0.28806, 0.49034], - [0.15232, 0.29214, 0.49486], - [0.1523, 0.29622, 0.49944], - [0.15234, 0.30031, 0.50414], - [0.15246, 0.30441, 0.5089], - [0.15267, 0.30853, 0.51375], - [0.15298, 0.31262, 0.51869], - [0.15339, 0.31673, 0.52371], - [0.15391, 0.32082, 0.52882], - [0.15456, 0.32486, 0.53399], - [0.15532, 0.32892, 0.53926], - [0.15623, 0.33293, 0.5446], - [0.15721, 0.33688, 0.55], - [0.15838, 0.3408, 0.55545], - [0.15962, 0.34465, 0.56096], - [0.16105, 0.34846, 0.56651], - [0.16259, 0.3522, 0.57209], - [0.16426, 0.35588, 0.57769], - [0.166, 0.35947, 0.58331], - [0.1679, 0.36299, 0.58894], - [0.16993, 0.36646, 0.59458], - [0.17202, 0.36982, 0.60021], - [0.17425, 0.37313, 0.60583], - [0.17653, 0.37638, 0.61145], - [0.17895, 0.37954, 0.61705], - [0.1814, 0.38265, 0.62262], - [0.18398, 0.3857, 0.62819], - [0.18662, 0.38871, 0.63374], - [0.18934, 0.39167, 0.63926], - [0.19213, 0.39459, 0.64477], - [0.19503, 0.39748, 0.65028], - [0.19798, 0.40036, 0.65577], - [0.20103, 0.40321, 0.66124], - [0.20423, 0.40606, 0.66671], - [0.20748, 0.40891, 0.67218], - [0.21086, 0.41176, 0.67765], - [0.21438, 0.41463, 0.68311], - [0.21803, 0.41753, 0.68857], - [0.22183, 0.42044, 0.69402], - [0.22582, 0.42338, 0.69948], - [0.22993, 0.42637, 0.70494], - [0.23429, 0.42941, 0.71039], - [0.23881, 0.43249, 0.71584], - [0.24355, 0.43562, 0.72126], - [0.24855, 0.43878, 0.72667], - [0.25373, 0.44203, 0.73207], - [0.25915, 0.4453, 0.73742], - [0.26478, 0.44865, 0.74275], - [0.27068, 0.45204, 0.74803], - [0.27677, 0.45548, 0.75325], - [0.28309, 0.45897, 0.75842], - [0.28962, 0.4625, 0.76352], - [0.29635, 0.46607, 0.76854], - [0.30326, 0.46969, 0.77347], - [0.31037, 0.47331, 0.77832], - [0.3176, 0.47697, 0.78307], - [0.32497, 0.48065, 0.78772], - [0.33249, 0.48433, 0.79227], - [0.34009, 0.48804, 0.7967], - [0.34779, 0.49174, 0.80103], - [0.35555, 0.49542, 0.80525], - [0.36336, 0.49911, 0.80936], - [0.37122, 0.50278, 0.81336], - [0.37911, 0.50644, 0.81727], - [0.38701, 0.51008, 0.82107], - [0.39494, 0.51371, 0.82478], - [0.40285, 0.51731, 0.8284], - [0.41076, 0.52088, 0.83194], - [0.41863, 0.52444, 0.8354], - [0.4265, 0.52797, 0.83878], - [0.43435, 0.53148, 0.84211], - [0.44217, 0.53496, 0.84536], - [0.44995, 0.53844, 0.84856], - [0.45769, 0.54187, 0.85171], - [0.46541, 0.54531, 0.85481], - [0.47308, 0.54872, 0.85786], - [0.48073, 0.55212, 0.86088], - [0.48834, 0.55549, 0.86386], - [0.49589, 0.55887, 0.8668], - [0.50341, 0.56225, 0.8697], - [0.51089, 0.5656, 0.87258], - [0.51834, 0.56896, 0.87542], - [0.52572, 0.57232, 0.87823], - [0.53305, 0.57568, 0.88101], - [0.54033, 0.57904, 0.88375], - [0.54755, 0.58241, 0.88646], - [0.55471, 0.58579, 0.88913], - [0.5618, 0.58917, 0.89176], - [0.56881, 0.59258, 0.89435], - [0.57576, 0.59599, 0.89689], - [0.5826, 0.59942, 0.89939], - [0.58935, 0.60286, 0.90183], - [0.59601, 0.60632, 0.90422], - [0.60256, 0.6098, 0.90655], - [0.60899, 0.61329, 0.90881], - [0.61529, 0.6168, 0.91102], - [0.62146, 0.62032, 0.91315], - [0.62749, 0.62385, 0.91521], - [0.63338, 0.62739, 0.9172], - [0.63911, 0.63094, 0.9191], - [0.64469, 0.63449, 0.92093], - [0.65011, 0.63804, 0.92269], - [0.65537, 0.64159, 0.92436], - [0.66048, 0.64514, 0.92595], - [0.66542, 0.6487, 0.92746], - [0.67022, 0.65223, 0.9289], - [0.67484, 0.65577, 0.93027], - [0.67933, 0.65928, 0.93157], - [0.68368, 0.66279, 0.93279], - [0.68789, 0.66628, 0.93396], - [0.69197, 0.66977, 0.93506], - [0.69594, 0.67324, 0.93611], - [0.69978, 0.67669, 0.93711], - [0.70354, 0.68012, 0.93806], - [0.7072, 0.68355, 0.93896], - [0.71077, 0.68697, 0.93983], - [0.71427, 0.69038, 0.94067], - [0.71771, 0.69377, 0.94147], - [0.72108, 0.69716, 0.94225], - [0.72441, 0.70054, 0.943], - [0.72769, 0.70392, 0.94373], - [0.73094, 0.70728, 0.94445], - [0.73416, 0.71065, 0.94515], - [0.73734, 0.71401, 0.94583], - [0.74051, 0.71738, 0.94651], - [0.74366, 0.72073, 0.94718], - [0.7468, 0.72408, 0.94784], - [0.74992, 0.72744, 0.9485], - [0.75303, 0.7308, 0.94915], - [0.75615, 0.73416, 0.9498], - [0.75925, 0.73752, 0.95045], - [0.76236, 0.74089, 0.9511], - [0.76546, 0.74426, 0.95174], - [0.76856, 0.74763, 0.95238], - [0.77167, 0.75101, 0.95302], - [0.77477, 0.75438, 0.95367], - [0.77788, 0.75776, 0.95431], - [0.78098, 0.76114, 0.95495], - [0.7841, 0.76453, 0.95559], - [0.78721, 0.76791, 0.95623], - [0.79032, 0.77131, 0.95687], - [0.79344, 0.7747, 0.95752], - [0.79656, 0.77811, 0.95816], - [0.79969, 0.78151, 0.95881], - [0.80281, 0.78492, 0.95945], - [0.80595, 0.78833, 0.9601], - [0.80909, 0.79175, 0.96074], - [0.81222, 0.79517, 0.96139], - [0.81537, 0.79859, 0.96203], - [0.81851, 0.80202, 0.96269], - [0.82167, 0.80545, 0.96334], - [0.82482, 0.80889, 0.96398], - [0.82797, 0.81233, 0.96463], - [0.83114, 0.81577, 0.96529], - [0.8343, 0.81921, 0.96594], - [0.83747, 0.82267, 0.96659], - [0.84064, 0.82612, 0.96725], - [0.84381, 0.82958, 0.9679], - [0.84699, 0.83304, 0.96856], - [0.85017, 0.83651, 0.96921], - [0.85336, 0.83998, 0.96987], - [0.85655, 0.84345, 0.97053], - [0.85974, 0.84693, 0.97118], - [0.86294, 0.85041, 0.97184], - [0.86614, 0.85389, 0.97251], - [0.86934, 0.85739, 0.97316], - [0.87255, 0.86088, 0.97382], - [0.87576, 0.86438, 0.97448], - [0.87897, 0.86788, 0.97515], - [0.88219, 0.87138, 0.97581], - [0.88541, 0.87489, 0.97647], - [0.88864, 0.8784, 0.97714], - [0.89186, 0.88192, 0.9778], - [0.8951, 0.88544, 0.97847], - [0.89833, 0.88896, 0.97914], - [0.90157, 0.89249, 0.97981], - [0.90481, 0.89602, 0.98047], - [0.90806, 0.89956, 0.98114], - [0.9113, 0.9031, 0.98181], - [0.91456, 0.90664, 0.98248], - [0.91781, 0.91019, 0.98315], - [0.92107, 0.91374, 0.98382], - [0.92433, 0.91729, 0.9845], - [0.92759, 0.92084, 0.98517], - [0.93087, 0.92441, 0.98584], - [0.93413, 0.92797, 0.98652], - [0.93741, 0.93154, 0.98719], - [0.94069, 0.93511, 0.98786], - [0.94397, 0.93869, 0.98854], - [0.94725, 0.94227, 0.98921], - [0.95053, 0.94585, 0.98989], - [0.95382, 0.94944, 0.99056], - [0.95711, 0.95303, 0.99124], - [0.9604, 0.95662, 0.99191], - [0.96369, 0.96022, 0.99259], - [0.96698, 0.96382, 0.99326], - [0.97027, 0.96742, 0.99393], - [0.97357, 0.97102, 0.9946], - [0.97686, 0.97463, 0.99527], - [0.98016, 0.97824, 0.99594], - [0.98345, 0.98186, 0.99662], - [0.98675, 0.98548, 0.99728], - [0.99004, 0.9891, 0.99795], - [0.99334, 0.99272, 0.99862], - [0.99662, 0.99634, 0.99929], - [0.99992, 0.99997, 0.99995], -]; - -export const colormap_grayc_data: Array<[number, number, number]> = [ - [1, 1, 1], - [0.99554, 0.99554, 0.99554], - [0.99109, 0.99109, 0.99109], - [0.98664, 0.98664, 0.98664], - [0.9822, 0.9822, 0.9822], - [0.97775, 0.97775, 0.97775], - [0.97332, 0.97332, 0.97332], - [0.96888, 0.96888, 0.96888], - [0.96445, 0.96445, 0.96445], - [0.96003, 0.96003, 0.96003], - [0.95561, 0.95561, 0.95561], - [0.95119, 0.95119, 0.95119], - [0.94678, 0.94678, 0.94678], - [0.94237, 0.94237, 0.94237], - [0.93796, 0.93796, 0.93796], - [0.93355, 0.93355, 0.93355], - [0.92916, 0.92916, 0.92916], - [0.92476, 0.92476, 0.92476], - [0.92037, 0.92037, 0.92037], - [0.91598, 0.91598, 0.91598], - [0.9116, 0.9116, 0.9116], - [0.90723, 0.90723, 0.90723], - [0.90285, 0.90285, 0.90285], - [0.89848, 0.89848, 0.89848], - [0.89411, 0.89411, 0.89411], - [0.88975, 0.88975, 0.88975], - [0.88539, 0.88539, 0.88539], - [0.88103, 0.88103, 0.88103], - [0.87668, 0.87668, 0.87668], - [0.87234, 0.87234, 0.87234], - [0.868, 0.868, 0.868], - [0.86366, 0.86366, 0.86366], - [0.85932, 0.85932, 0.85932], - [0.85499, 0.85499, 0.85499], - [0.85066, 0.85066, 0.85066], - [0.84634, 0.84634, 0.84634], - [0.84203, 0.84203, 0.84203], - [0.83771, 0.83771, 0.83771], - [0.8334, 0.8334, 0.8334], - [0.8291, 0.8291, 0.8291], - [0.82479, 0.82479, 0.82479], - [0.82049, 0.82049, 0.82049], - [0.81621, 0.81621, 0.81621], - [0.81192, 0.81192, 0.81192], - [0.80763, 0.80763, 0.80763], - [0.80335, 0.80335, 0.80335], - [0.79908, 0.79908, 0.79908], - [0.7948, 0.7948, 0.7948], - [0.79053, 0.79053, 0.79053], - [0.78628, 0.78628, 0.78628], - [0.78202, 0.78202, 0.78202], - [0.77776, 0.77776, 0.77776], - [0.77351, 0.77351, 0.77351], - [0.76926, 0.76926, 0.76926], - [0.76503, 0.76503, 0.76503], - [0.76079, 0.76079, 0.76079], - [0.75655, 0.75655, 0.75655], - [0.75232, 0.75232, 0.75232], - [0.7481, 0.7481, 0.7481], - [0.74388, 0.74388, 0.74388], - [0.73967, 0.73967, 0.73967], - [0.73546, 0.73546, 0.73546], - [0.73125, 0.73125, 0.73125], - [0.72705, 0.72705, 0.72705], - [0.72285, 0.72285, 0.72285], - [0.71866, 0.71866, 0.71866], - [0.71447, 0.71447, 0.71447], - [0.71029, 0.71029, 0.71029], - [0.70611, 0.70611, 0.70611], - [0.70193, 0.70193, 0.70193], - [0.69776, 0.69776, 0.69776], - [0.6936, 0.6936, 0.6936], - [0.68945, 0.68945, 0.68945], - [0.68529, 0.68529, 0.68529], - [0.68113, 0.68113, 0.68113], - [0.67699, 0.67699, 0.67699], - [0.67285, 0.67285, 0.67285], - [0.66871, 0.66871, 0.66871], - [0.66457, 0.66457, 0.66457], - [0.66045, 0.66045, 0.66045], - [0.65633, 0.65633, 0.65633], - [0.65221, 0.65221, 0.65221], - [0.64809, 0.64809, 0.64809], - [0.64398, 0.64398, 0.64398], - [0.63989, 0.63989, 0.63989], - [0.63579, 0.63579, 0.63579], - [0.63169, 0.63169, 0.63169], - [0.6276, 0.6276, 0.6276], - [0.62352, 0.62352, 0.62352], - [0.61945, 0.61945, 0.61945], - [0.61536, 0.61536, 0.61536], - [0.6113, 0.6113, 0.6113], - [0.60724, 0.60724, 0.60724], - [0.60317, 0.60317, 0.60317], - [0.59912, 0.59912, 0.59912], - [0.59507, 0.59507, 0.59507], - [0.59102, 0.59102, 0.59102], - [0.58698, 0.58698, 0.58698], - [0.58295, 0.58295, 0.58295], - [0.57892, 0.57892, 0.57892], - [0.57489, 0.57489, 0.57489], - [0.57088, 0.57088, 0.57088], - [0.56687, 0.56687, 0.56687], - [0.56286, 0.56286, 0.56286], - [0.55885, 0.55885, 0.55885], - [0.55486, 0.55486, 0.55486], - [0.55087, 0.55087, 0.55087], - [0.54688, 0.54688, 0.54688], - [0.5429, 0.5429, 0.5429], - [0.53892, 0.53892, 0.53892], - [0.53495, 0.53495, 0.53495], - [0.53098, 0.53098, 0.53098], - [0.52703, 0.52703, 0.52703], - [0.52307, 0.52307, 0.52307], - [0.51912, 0.51912, 0.51912], - [0.51517, 0.51517, 0.51517], - [0.51123, 0.51123, 0.51123], - [0.5073, 0.5073, 0.5073], - [0.50336, 0.50336, 0.50336], - [0.49944, 0.49944, 0.49944], - [0.49553, 0.49553, 0.49553], - [0.49162, 0.49162, 0.49162], - [0.48772, 0.48772, 0.48772], - [0.4838, 0.4838, 0.4838], - [0.47992, 0.47992, 0.47992], - [0.47603, 0.47603, 0.47603], - [0.47215, 0.47215, 0.47215], - [0.46826, 0.46826, 0.46826], - [0.4644, 0.4644, 0.4644], - [0.46052, 0.46052, 0.46052], - [0.45666, 0.45666, 0.45666], - [0.45282, 0.45282, 0.45282], - [0.44897, 0.44897, 0.44897], - [0.44512, 0.44512, 0.44512], - [0.44128, 0.44128, 0.44128], - [0.43746, 0.43746, 0.43746], - [0.43362, 0.43362, 0.43362], - [0.42981, 0.42981, 0.42981], - [0.42599, 0.42599, 0.42599], - [0.42218, 0.42218, 0.42218], - [0.41838, 0.41838, 0.41838], - [0.41459, 0.41459, 0.41459], - [0.41081, 0.41081, 0.41081], - [0.40702, 0.40702, 0.40702], - [0.40324, 0.40324, 0.40324], - [0.39946, 0.39946, 0.39946], - [0.39571, 0.39571, 0.39571], - [0.39195, 0.39195, 0.39195], - [0.3882, 0.3882, 0.3882], - [0.38445, 0.38445, 0.38445], - [0.38072, 0.38072, 0.38072], - [0.37699, 0.37699, 0.37699], - [0.37325, 0.37325, 0.37325], - [0.36953, 0.36953, 0.36953], - [0.36583, 0.36583, 0.36583], - [0.36212, 0.36212, 0.36212], - [0.35841, 0.35841, 0.35841], - [0.35474, 0.35474, 0.35474], - [0.35105, 0.35105, 0.35105], - [0.34737, 0.34737, 0.34737], - [0.34368, 0.34368, 0.34368], - [0.34003, 0.34003, 0.34003], - [0.33635, 0.33635, 0.33635], - [0.33272, 0.33272, 0.33272], - [0.32907, 0.32907, 0.32907], - [0.32541, 0.32541, 0.32541], - [0.32179, 0.32179, 0.32179], - [0.31817, 0.31817, 0.31817], - [0.31454, 0.31454, 0.31454], - [0.31095, 0.31095, 0.31095], - [0.30732, 0.30732, 0.30732], - [0.30373, 0.30373, 0.30373], - [0.30014, 0.30014, 0.30014], - [0.29657, 0.29657, 0.29657], - [0.29298, 0.29298, 0.29298], - [0.28943, 0.28943, 0.28943], - [0.28585, 0.28585, 0.28585], - [0.28232, 0.28232, 0.28232], - [0.27877, 0.27877, 0.27877], - [0.27523, 0.27523, 0.27523], - [0.27168, 0.27168, 0.27168], - [0.26816, 0.26816, 0.26816], - [0.26465, 0.26465, 0.26465], - [0.26115, 0.26115, 0.26115], - [0.25764, 0.25764, 0.25764], - [0.25417, 0.25417, 0.25417], - [0.25067, 0.25067, 0.25067], - [0.2472, 0.2472, 0.2472], - [0.24372, 0.24372, 0.24372], - [0.24026, 0.24026, 0.24026], - [0.23684, 0.23684, 0.23684], - [0.23336, 0.23336, 0.23336], - [0.22992, 0.22992, 0.22992], - [0.22652, 0.22652, 0.22652], - [0.22311, 0.22311, 0.22311], - [0.21969, 0.21969, 0.21969], - [0.2163, 0.2163, 0.2163], - [0.21288, 0.21288, 0.21288], - [0.2095, 0.2095, 0.2095], - [0.20615, 0.20615, 0.20615], - [0.20275, 0.20275, 0.20275], - [0.19938, 0.19938, 0.19938], - [0.19606, 0.19606, 0.19606], - [0.19271, 0.19271, 0.19271], - [0.18938, 0.18938, 0.18938], - [0.18607, 0.18607, 0.18607], - [0.18272, 0.18272, 0.18272], - [0.17943, 0.17943, 0.17943], - [0.17611, 0.17611, 0.17611], - [0.17284, 0.17284, 0.17284], - [0.1696, 0.1696, 0.1696], - [0.16631, 0.16631, 0.16631], - [0.16307, 0.16307, 0.16307], - [0.15978, 0.15978, 0.15978], - [0.15658, 0.15658, 0.15658], - [0.15332, 0.15332, 0.15332], - [0.15014, 0.15014, 0.15014], - [0.1469, 0.1469, 0.1469], - [0.14372, 0.14372, 0.14372], - [0.14054, 0.14054, 0.14054], - [0.13737, 0.13737, 0.13737], - [0.1342, 0.1342, 0.1342], - [0.13105, 0.13105, 0.13105], - [0.12789, 0.12789, 0.12789], - [0.12473, 0.12473, 0.12473], - [0.12159, 0.12159, 0.12159], - [0.11854, 0.11854, 0.11854], - [0.1154, 0.1154, 0.1154], - [0.11234, 0.11234, 0.11234], - [0.10927, 0.10927, 0.10927], - [0.1062, 0.1062, 0.1062], - [0.10313, 0.10313, 0.10313], - [0.10006, 0.10006, 0.10006], - [0.097002, 0.097004, 0.097003], - [0.094024, 0.094026, 0.094026], - [0.091021, 0.091024, 0.091023], - [0.087931, 0.087933, 0.087932], - [0.084744, 0.084745, 0.084745], - [0.081468, 0.08147, 0.081469], - [0.077984, 0.077985, 0.077985], - [0.074504, 0.074505, 0.074505], - [0.070845, 0.070846, 0.070846], - [0.067013, 0.067014, 0.067014], - [0.063057, 0.063057, 0.063057], - [0.058816, 0.058816, 0.058816], - [0.054339, 0.054339, 0.054339], - [0.04971, 0.04971, 0.04971], - [0.044716, 0.044716, 0.044716], - [0.03933, 0.039331, 0.03933], - [0.033552, 0.033552, 0.033552], - [0.028009, 0.028009, 0.028009], - [0.022447, 0.022447, 0.022447], - [0.016884, 0.016884, 0.016884], - [0.011219, 0.011219, 0.011219], - [0.0055636, 0.0055636, 0.0055636], - [9.8794e-7, 9.8901e-7, 9.8874e-7], -]; - -export const colormap_hawaii_data: Array<[number, number, number]> = [ - [0.55054, 0.006842, 0.45198], - [0.55149, 0.015367, 0.44797], - [0.55243, 0.023795, 0.444], - [0.55333, 0.032329, 0.44002], - [0.55423, 0.04117, 0.43606], - [0.5551, 0.049286, 0.43213], - [0.55595, 0.056667, 0.42819], - [0.5568, 0.063525, 0.42427], - [0.55762, 0.06997, 0.42038], - [0.55841, 0.076028, 0.41651], - [0.55921, 0.081936, 0.41266], - [0.55999, 0.087507, 0.40882], - [0.56075, 0.092811, 0.40501], - [0.56149, 0.098081, 0.40124], - [0.56224, 0.10313, 0.39747], - [0.56295, 0.108, 0.39374], - [0.56366, 0.11287, 0.39002], - [0.56435, 0.11753, 0.38634], - [0.56503, 0.12212, 0.3827], - [0.56571, 0.12668, 0.37907], - [0.56638, 0.13117, 0.37547], - [0.56704, 0.13554, 0.3719], - [0.56768, 0.13987, 0.36838], - [0.56831, 0.1442, 0.36486], - [0.56894, 0.14842, 0.36138], - [0.56956, 0.15262, 0.35794], - [0.57017, 0.15681, 0.35452], - [0.57078, 0.16093, 0.35113], - [0.57138, 0.16501, 0.34776], - [0.57197, 0.16912, 0.34442], - [0.57256, 0.17313, 0.34112], - [0.57314, 0.17717, 0.33784], - [0.57371, 0.18114, 0.3346], - [0.57428, 0.18515, 0.33136], - [0.57484, 0.18909, 0.32817], - [0.57541, 0.19304, 0.32499], - [0.57597, 0.19698, 0.32185], - [0.57652, 0.20085, 0.31874], - [0.57706, 0.20478, 0.31565], - [0.5776, 0.20866, 0.31256], - [0.57814, 0.21254, 0.30954], - [0.57868, 0.21643, 0.30652], - [0.57921, 0.22029, 0.3035], - [0.57975, 0.22411, 0.30052], - [0.58027, 0.22798, 0.29757], - [0.58079, 0.23182, 0.29462], - [0.58131, 0.23565, 0.29171], - [0.58183, 0.23946, 0.28881], - [0.58235, 0.24327, 0.28591], - [0.58287, 0.2471, 0.28307], - [0.58339, 0.25092, 0.2802], - [0.5839, 0.25474, 0.27738], - [0.58442, 0.25853, 0.27455], - [0.58493, 0.26234, 0.27174], - [0.58544, 0.26616, 0.26898], - [0.58595, 0.26997, 0.2662], - [0.58646, 0.27377, 0.26344], - [0.58696, 0.27758, 0.26068], - [0.58747, 0.28137, 0.25793], - [0.58797, 0.28518, 0.25522], - [0.58848, 0.28901, 0.25249], - [0.58898, 0.29282, 0.24977], - [0.58949, 0.29665, 0.24708], - [0.59, 0.30047, 0.24438], - [0.59051, 0.3043, 0.24172], - [0.59102, 0.30814, 0.23903], - [0.59153, 0.31197, 0.23638], - [0.59204, 0.31585, 0.23369], - [0.59255, 0.3197, 0.23106], - [0.59305, 0.32356, 0.22842], - [0.59356, 0.32743, 0.22577], - [0.59407, 0.33131, 0.22313], - [0.59458, 0.33523, 0.22051], - [0.5951, 0.33913, 0.21787], - [0.59561, 0.34305, 0.21523], - [0.59613, 0.34698, 0.21261], - [0.59664, 0.35092, 0.20999], - [0.59716, 0.35488, 0.20739], - [0.59768, 0.35883, 0.20478], - [0.5982, 0.36282, 0.20215], - [0.59872, 0.36683, 0.19953], - [0.59925, 0.37084, 0.19696], - [0.59977, 0.37488, 0.19437], - [0.60029, 0.37893, 0.19174], - [0.60082, 0.38301, 0.18915], - [0.60135, 0.38709, 0.18655], - [0.60187, 0.39122, 0.18395], - [0.6024, 0.39535, 0.18134], - [0.60293, 0.39949, 0.17878], - [0.60346, 0.40368, 0.17616], - [0.604, 0.40787, 0.17359], - [0.60452, 0.4121, 0.17101], - [0.60504, 0.41635, 0.16844], - [0.60556, 0.42062, 0.16585], - [0.60608, 0.42493, 0.16332], - [0.60661, 0.42925, 0.16073], - [0.60713, 0.4336, 0.1582], - [0.60764, 0.438, 0.15565], - [0.60814, 0.44241, 0.15309], - [0.60864, 0.44685, 0.15058], - [0.60913, 0.45132, 0.14807], - [0.60961, 0.45583, 0.14561], - [0.61008, 0.46036, 0.14312], - [0.61054, 0.46493, 0.14069], - [0.61099, 0.46954, 0.13827], - [0.61142, 0.47417, 0.13583], - [0.61183, 0.47884, 0.13351], - [0.61223, 0.48354, 0.13121], - [0.6126, 0.48829, 0.12892], - [0.61295, 0.49305, 0.12672], - [0.61327, 0.49788, 0.12457], - [0.61357, 0.5027, 0.12249], - [0.61384, 0.50759, 0.12051], - [0.61407, 0.5125, 0.11867], - [0.61426, 0.51746, 0.11685], - [0.61442, 0.52243, 0.11516], - [0.61453, 0.52746, 0.11366], - [0.61459, 0.53251, 0.11227], - [0.61461, 0.53759, 0.11103], - [0.61457, 0.54271, 0.11], - [0.61447, 0.54785, 0.10911], - [0.61431, 0.55302, 0.10842], - [0.61408, 0.55821, 0.10801], - [0.61379, 0.56345, 0.10785], - [0.61342, 0.56868, 0.10794], - [0.61297, 0.57395, 0.10831], - [0.61245, 0.57923, 0.10903], - [0.61184, 0.58452, 0.11004], - [0.61115, 0.58982, 0.11132], - [0.61035, 0.59513, 0.11296], - [0.60947, 0.60044, 0.11486], - [0.60849, 0.60575, 0.11717], - [0.60741, 0.61106, 0.11981], - [0.60622, 0.61635, 0.12276], - [0.60493, 0.62162, 0.12612], - [0.60354, 0.62688, 0.12976], - [0.60203, 0.63211, 0.13369], - [0.60041, 0.63731, 0.13797], - [0.59869, 0.64247, 0.1425], - [0.59686, 0.64759, 0.14733], - [0.59492, 0.65266, 0.15242], - [0.59287, 0.6577, 0.15779], - [0.59071, 0.66267, 0.16342], - [0.58844, 0.66758, 0.16926], - [0.58608, 0.67243, 0.17528], - [0.58361, 0.67721, 0.18151], - [0.58105, 0.68192, 0.18799], - [0.57839, 0.68656, 0.19459], - [0.57565, 0.69112, 0.20131], - [0.57281, 0.69561, 0.20824], - [0.56988, 0.70002, 0.21528], - [0.56689, 0.70435, 0.22247], - [0.56381, 0.7086, 0.22974], - [0.56066, 0.71275, 0.23717], - [0.55746, 0.71684, 0.24462], - [0.55418, 0.72084, 0.25222], - [0.55085, 0.72477, 0.25987], - [0.54747, 0.7286, 0.26757], - [0.54404, 0.73238, 0.27539], - [0.54057, 0.73606, 0.28324], - [0.53707, 0.73968, 0.29114], - [0.53351, 0.74323, 0.29909], - [0.52994, 0.7467, 0.30708], - [0.52633, 0.75011, 0.31511], - [0.5227, 0.75346, 0.32319], - [0.51905, 0.75675, 0.33128], - [0.51537, 0.75998, 0.33944], - [0.51168, 0.76316, 0.3476], - [0.50799, 0.76629, 0.35578], - [0.50428, 0.76937, 0.36398], - [0.50055, 0.77241, 0.37222], - [0.49682, 0.77541, 0.38048], - [0.49309, 0.77836, 0.38876], - [0.48935, 0.78129, 0.39705], - [0.48561, 0.78418, 0.40538], - [0.48188, 0.78704, 0.41371], - [0.47814, 0.78987, 0.42206], - [0.47441, 0.79267, 0.43044], - [0.47068, 0.79546, 0.43882], - [0.46695, 0.79822, 0.44724], - [0.46322, 0.80096, 0.45567], - [0.45952, 0.80369, 0.46412], - [0.45581, 0.80641, 0.47258], - [0.45212, 0.80911, 0.48105], - [0.44844, 0.8118, 0.48955], - [0.44477, 0.81447, 0.49809], - [0.44111, 0.81714, 0.50662], - [0.43749, 0.8198, 0.51517], - [0.43386, 0.82246, 0.52375], - [0.43028, 0.82511, 0.53235], - [0.42672, 0.82776, 0.54096], - [0.42319, 0.8304, 0.5496], - [0.41971, 0.83304, 0.55824], - [0.41626, 0.83567, 0.56692], - [0.41287, 0.83831, 0.57561], - [0.40952, 0.84094, 0.58431], - [0.40624, 0.84356, 0.59304], - [0.40304, 0.84619, 0.60178], - [0.3999, 0.84882, 0.61054], - [0.39687, 0.85144, 0.61932], - [0.39395, 0.85406, 0.6281], - [0.39115, 0.85668, 0.63691], - [0.38847, 0.8593, 0.64571], - [0.38593, 0.86192, 0.65453], - [0.38359, 0.86453, 0.66337], - [0.38141, 0.86713, 0.6722], - [0.37942, 0.86973, 0.68102], - [0.37767, 0.87232, 0.68986], - [0.37617, 0.87491, 0.69869], - [0.37492, 0.87748, 0.70751], - [0.37398, 0.88005, 0.71632], - [0.37334, 0.8826, 0.72511], - [0.37304, 0.88514, 0.73387], - [0.37311, 0.88765, 0.7426], - [0.37357, 0.89016, 0.7513], - [0.37444, 0.89264, 0.75995], - [0.37572, 0.8951, 0.76855], - [0.37747, 0.89752, 0.7771], - [0.37967, 0.89992, 0.78557], - [0.38235, 0.90229, 0.79397], - [0.38553, 0.90462, 0.80228], - [0.38921, 0.90691, 0.8105], - [0.39338, 0.90916, 0.81862], - [0.39807, 0.91137, 0.82663], - [0.40326, 0.91353, 0.83451], - [0.40893, 0.91563, 0.84226], - [0.41508, 0.91769, 0.84986], - [0.4217, 0.91968, 0.85731], - [0.42879, 0.92161, 0.86461], - [0.43631, 0.92349, 0.87173], - [0.44423, 0.92529, 0.87868], - [0.45254, 0.92703, 0.88545], - [0.4612, 0.9287, 0.89204], - [0.47021, 0.93031, 0.89842], - [0.47952, 0.93184, 0.90462], - [0.4891, 0.9333, 0.91062], - [0.49895, 0.93469, 0.91641], - [0.50902, 0.936, 0.92201], - [0.51928, 0.93725, 0.92739], - [0.52972, 0.93842, 0.93259], - [0.54029, 0.93952, 0.93759], - [0.551, 0.94055, 0.9424], - [0.5618, 0.94151, 0.94702], - [0.57269, 0.94241, 0.95146], - [0.58362, 0.94324, 0.95573], - [0.59461, 0.94402, 0.95982], - [0.60561, 0.94473, 0.96377], - [0.61664, 0.94539, 0.96756], - [0.62765, 0.94599, 0.97121], - [0.63865, 0.94654, 0.97474], - [0.64962, 0.94705, 0.97815], - [0.66055, 0.94751, 0.98145], - [0.67144, 0.94793, 0.98465], - [0.68228, 0.94832, 0.98777], - [0.69306, 0.94866, 0.9908], - [0.70378, 0.94898, 0.99377], -]; - -export const colormap_imola_data: Array<[number, number, number]> = [ - [0.10144, 0.20011, 0.70019], - [0.10328, 0.20301, 0.69881], - [0.10496, 0.2059, 0.69742], - [0.10673, 0.20873, 0.69605], - [0.1083, 0.21157, 0.69466], - [0.10998, 0.21437, 0.69329], - [0.11152, 0.21716, 0.69191], - [0.11307, 0.21994, 0.69053], - [0.1145, 0.2227, 0.68917], - [0.11603, 0.22544, 0.6878], - [0.11744, 0.22819, 0.68643], - [0.11891, 0.23089, 0.68508], - [0.12028, 0.23359, 0.68371], - [0.12166, 0.23631, 0.68236], - [0.12304, 0.23898, 0.68101], - [0.12442, 0.24167, 0.67966], - [0.12581, 0.24432, 0.67832], - [0.12711, 0.247, 0.67698], - [0.12847, 0.24964, 0.67564], - [0.12983, 0.2523, 0.67431], - [0.13114, 0.25495, 0.67298], - [0.13245, 0.25757, 0.67165], - [0.13376, 0.2602, 0.67033], - [0.13507, 0.26282, 0.669], - [0.13633, 0.26543, 0.66768], - [0.13768, 0.26803, 0.66636], - [0.13894, 0.27067, 0.66505], - [0.14023, 0.27326, 0.66374], - [0.14154, 0.27587, 0.66243], - [0.14282, 0.27845, 0.66112], - [0.14411, 0.28103, 0.65982], - [0.14542, 0.28363, 0.65851], - [0.14665, 0.2862, 0.65721], - [0.14795, 0.2888, 0.65591], - [0.14923, 0.29139, 0.65461], - [0.1505, 0.29395, 0.65331], - [0.15176, 0.29654, 0.65202], - [0.15303, 0.29912, 0.65072], - [0.15432, 0.30167, 0.64943], - [0.15561, 0.30425, 0.64813], - [0.15688, 0.30683, 0.64684], - [0.15816, 0.30941, 0.64554], - [0.15942, 0.31195, 0.64425], - [0.16069, 0.31453, 0.64296], - [0.162, 0.31711, 0.64166], - [0.16327, 0.31968, 0.64038], - [0.16454, 0.32224, 0.63908], - [0.16579, 0.3248, 0.63778], - [0.16711, 0.32737, 0.63649], - [0.16838, 0.32995, 0.63519], - [0.16969, 0.33252, 0.63389], - [0.17096, 0.33508, 0.63258], - [0.17225, 0.33763, 0.63128], - [0.17355, 0.3402, 0.62996], - [0.17488, 0.34276, 0.62865], - [0.17615, 0.34531, 0.62732], - [0.17752, 0.34788, 0.62599], - [0.17884, 0.35043, 0.62466], - [0.18016, 0.35298, 0.62331], - [0.1815, 0.35554, 0.62195], - [0.18287, 0.35807, 0.62059], - [0.18426, 0.3606, 0.61922], - [0.18569, 0.36314, 0.61782], - [0.18708, 0.36567, 0.61641], - [0.18851, 0.36819, 0.61498], - [0.18994, 0.37069, 0.61354], - [0.19141, 0.3732, 0.61208], - [0.19291, 0.37569, 0.61061], - [0.19445, 0.37818, 0.60911], - [0.19597, 0.38066, 0.60758], - [0.19753, 0.38312, 0.60602], - [0.1991, 0.38556, 0.60446], - [0.20072, 0.388, 0.60285], - [0.20237, 0.39043, 0.60122], - [0.20408, 0.39284, 0.59957], - [0.20577, 0.39524, 0.59788], - [0.2075, 0.39762, 0.59617], - [0.20925, 0.39999, 0.59443], - [0.21105, 0.40234, 0.59266], - [0.21285, 0.40469, 0.59085], - [0.2147, 0.40702, 0.58902], - [0.21659, 0.40934, 0.58717], - [0.21847, 0.41164, 0.5853], - [0.22041, 0.41394, 0.58339], - [0.22233, 0.41622, 0.58145], - [0.22427, 0.41849, 0.57951], - [0.22629, 0.42075, 0.57752], - [0.2283, 0.423, 0.57553], - [0.23029, 0.42526, 0.57351], - [0.23235, 0.42751, 0.57147], - [0.23442, 0.42974, 0.56941], - [0.23649, 0.43198, 0.56735], - [0.23856, 0.43419, 0.56526], - [0.24066, 0.43643, 0.56318], - [0.24278, 0.43865, 0.56106], - [0.24491, 0.44088, 0.55895], - [0.24707, 0.44313, 0.55684], - [0.24923, 0.44536, 0.55471], - [0.25141, 0.44759, 0.55258], - [0.25359, 0.44985, 0.55045], - [0.25578, 0.45212, 0.54832], - [0.25799, 0.45438, 0.54619], - [0.26024, 0.45666, 0.54406], - [0.26249, 0.45896, 0.54194], - [0.26475, 0.46126, 0.53983], - [0.26703, 0.46359, 0.53775], - [0.26936, 0.46593, 0.53565], - [0.27167, 0.4683, 0.53358], - [0.27404, 0.4707, 0.53154], - [0.27644, 0.47311, 0.52952], - [0.27885, 0.47557, 0.52751], - [0.28127, 0.47804, 0.52553], - [0.28375, 0.48054, 0.52358], - [0.28625, 0.48309, 0.52165], - [0.28882, 0.48567, 0.51977], - [0.29141, 0.48829, 0.51792], - [0.29401, 0.49095, 0.5161], - [0.29669, 0.49364, 0.51433], - [0.2994, 0.49638, 0.51259], - [0.30213, 0.49917, 0.5109], - [0.30494, 0.502, 0.50925], - [0.30776, 0.50487, 0.50764], - [0.31067, 0.5078, 0.50607], - [0.31359, 0.51076, 0.50456], - [0.31656, 0.51377, 0.50307], - [0.31958, 0.51683, 0.50165], - [0.32265, 0.51992, 0.50025], - [0.32573, 0.52308, 0.4989], - [0.3289, 0.52626, 0.4976], - [0.33208, 0.52949, 0.49631], - [0.33532, 0.53276, 0.49508], - [0.33856, 0.53606, 0.49387], - [0.34187, 0.5394, 0.49269], - [0.34521, 0.54278, 0.49157], - [0.34858, 0.54619, 0.49045], - [0.35197, 0.54963, 0.48934], - [0.35542, 0.55309, 0.48829], - [0.35885, 0.5566, 0.48724], - [0.36235, 0.56012, 0.4862], - [0.36585, 0.56367, 0.48519], - [0.36938, 0.56724, 0.48419], - [0.37293, 0.57082, 0.4832], - [0.37652, 0.57443, 0.48223], - [0.3801, 0.57806, 0.48125], - [0.38371, 0.58171, 0.4803], - [0.38733, 0.58538, 0.47934], - [0.39098, 0.58905, 0.47839], - [0.39463, 0.59275, 0.47744], - [0.39831, 0.59645, 0.4765], - [0.40198, 0.60017, 0.47556], - [0.40569, 0.60391, 0.47462], - [0.4094, 0.60765, 0.47366], - [0.41313, 0.6114, 0.47272], - [0.41686, 0.61516, 0.47179], - [0.4206, 0.61895, 0.47084], - [0.42436, 0.62273, 0.4699], - [0.42813, 0.62653, 0.46895], - [0.43192, 0.63035, 0.468], - [0.43571, 0.63417, 0.46706], - [0.43951, 0.638, 0.46609], - [0.44332, 0.64184, 0.46514], - [0.44714, 0.64569, 0.4642], - [0.45098, 0.64956, 0.46322], - [0.45484, 0.65343, 0.46226], - [0.45869, 0.65732, 0.46131], - [0.46255, 0.66121, 0.46033], - [0.46643, 0.66511, 0.45937], - [0.47033, 0.66903, 0.4584], - [0.47423, 0.67296, 0.45742], - [0.47814, 0.67689, 0.45645], - [0.48206, 0.68083, 0.45547], - [0.48599, 0.68479, 0.4545], - [0.48994, 0.68877, 0.4535], - [0.4939, 0.69275, 0.45253], - [0.49787, 0.69673, 0.45153], - [0.50185, 0.70073, 0.45054], - [0.50583, 0.70474, 0.44955], - [0.50983, 0.70877, 0.44855], - [0.51385, 0.71279, 0.44754], - [0.51788, 0.71685, 0.44654], - [0.5219, 0.72089, 0.44553], - [0.52596, 0.72497, 0.44454], - [0.53002, 0.72904, 0.44352], - [0.53409, 0.73313, 0.44251], - [0.53819, 0.73723, 0.44149], - [0.54228, 0.74134, 0.44047], - [0.5464, 0.74546, 0.43945], - [0.55052, 0.74959, 0.43843], - [0.55466, 0.75374, 0.43741], - [0.55881, 0.7579, 0.43638], - [0.563, 0.76207, 0.43535], - [0.5672, 0.76625, 0.43431], - [0.57141, 0.77044, 0.43327], - [0.57565, 0.77464, 0.43225], - [0.57992, 0.77886, 0.43121], - [0.5842, 0.78309, 0.43016], - [0.58853, 0.78733, 0.42912], - [0.5929, 0.79158, 0.42808], - [0.5973, 0.79584, 0.42705], - [0.60174, 0.80012, 0.426], - [0.60624, 0.8044, 0.42497], - [0.6108, 0.80869, 0.42393], - [0.61541, 0.81299, 0.42289], - [0.62011, 0.81731, 0.42187], - [0.62487, 0.82163, 0.42085], - [0.62973, 0.82595, 0.41984], - [0.63468, 0.83028, 0.41883], - [0.63974, 0.83461, 0.41784], - [0.6449, 0.83894, 0.41687], - [0.65019, 0.84326, 0.41589], - [0.6556, 0.84759, 0.41494], - [0.66115, 0.8519, 0.41401], - [0.66684, 0.8562, 0.4131], - [0.67269, 0.86048, 0.41221], - [0.67868, 0.86474, 0.41134], - [0.68483, 0.86898, 0.41052], - [0.69114, 0.87318, 0.4097], - [0.69761, 0.87735, 0.40892], - [0.70424, 0.88148, 0.40818], - [0.71102, 0.88557, 0.40747], - [0.71795, 0.8896, 0.4068], - [0.72504, 0.89358, 0.40617], - [0.73226, 0.89751, 0.40557], - [0.73962, 0.90138, 0.40501], - [0.74709, 0.90518, 0.40448], - [0.75469, 0.90892, 0.40401], - [0.76238, 0.9126, 0.40357], - [0.77017, 0.9162, 0.40317], - [0.77806, 0.91975, 0.4028], - [0.78601, 0.92323, 0.40246], - [0.79403, 0.92664, 0.40216], - [0.80211, 0.92999, 0.40189], - [0.81023, 0.93328, 0.40166], - [0.8184, 0.93653, 0.40145], - [0.8266, 0.93971, 0.40127], - [0.83482, 0.94285, 0.40112], - [0.84307, 0.94593, 0.40098], - [0.85132, 0.94898, 0.40086], - [0.8596, 0.95199, 0.40075], - [0.86788, 0.95497, 0.40067], - [0.87616, 0.95791, 0.40059], - [0.88445, 0.96083, 0.40052], - [0.89274, 0.96371, 0.40047], - [0.90102, 0.96658, 0.40042], - [0.9093, 0.96943, 0.40038], - [0.91758, 0.97226, 0.40034], - [0.92584, 0.97507, 0.40031], - [0.93411, 0.97788, 0.40028], - [0.94237, 0.98067, 0.40026], - [0.95062, 0.98345, 0.40023], - [0.95887, 0.98623, 0.40021], - [0.96711, 0.98899, 0.40019], - [0.97534, 0.99175, 0.40017], - [0.98357, 0.9945, 0.40014], - [0.9918, 0.99724, 0.40012], - [1, 0.99999, 0.40009], -]; - -export const colormap_lajolla_data: Array<[number, number, number]> = [ - [0.99983, 0.99974, 0.79991], - [0.99953, 0.99725, 0.79292], - [0.99921, 0.99476, 0.78593], - [0.99887, 0.99226, 0.77894], - [0.99851, 0.98977, 0.77195], - [0.99814, 0.98727, 0.76497], - [0.99775, 0.98476, 0.75798], - [0.99735, 0.98225, 0.75099], - [0.99693, 0.97973, 0.74399], - [0.9965, 0.97721, 0.73699], - [0.99606, 0.97467, 0.73], - [0.9956, 0.97213, 0.72299], - [0.99512, 0.96958, 0.71599], - [0.99464, 0.96701, 0.70898], - [0.99414, 0.96443, 0.70195], - [0.99363, 0.96183, 0.69492], - [0.9931, 0.95921, 0.68789], - [0.99256, 0.95657, 0.68085], - [0.99201, 0.95391, 0.6738], - [0.99145, 0.95123, 0.66674], - [0.99087, 0.94851, 0.65967], - [0.99028, 0.94576, 0.65258], - [0.98967, 0.94298, 0.64549], - [0.98905, 0.94017, 0.63838], - [0.98842, 0.93731, 0.63126], - [0.98777, 0.9344, 0.62413], - [0.98711, 0.93145, 0.61698], - [0.98643, 0.92845, 0.60981], - [0.98573, 0.92539, 0.60264], - [0.98502, 0.92228, 0.59545], - [0.9843, 0.91909, 0.58824], - [0.98354, 0.91584, 0.58103], - [0.98278, 0.91253, 0.57381], - [0.982, 0.90913, 0.56658], - [0.98119, 0.90566, 0.55934], - [0.98036, 0.90211, 0.55211], - [0.97951, 0.89846, 0.54486], - [0.97864, 0.89474, 0.53764], - [0.97775, 0.89091, 0.53041], - [0.97683, 0.887, 0.52321], - [0.97589, 0.88298, 0.51602], - [0.97493, 0.87887, 0.50888], - [0.97394, 0.87466, 0.50176], - [0.97294, 0.87036, 0.4947], - [0.9719, 0.86595, 0.48769], - [0.97084, 0.86145, 0.48073], - [0.96976, 0.85685, 0.47387], - [0.96866, 0.85217, 0.4671], - [0.96754, 0.84738, 0.4604], - [0.96639, 0.84253, 0.45384], - [0.96523, 0.83758, 0.44738], - [0.96405, 0.83256, 0.44107], - [0.96286, 0.82747, 0.4349], - [0.96165, 0.82232, 0.42887], - [0.96044, 0.81711, 0.42301], - [0.95921, 0.81186, 0.41734], - [0.95797, 0.80656, 0.41183], - [0.95673, 0.80123, 0.40651], - [0.95548, 0.79587, 0.40139], - [0.95423, 0.79049, 0.39647], - [0.95298, 0.7851, 0.39176], - [0.95173, 0.7797, 0.38724], - [0.95049, 0.7743, 0.38296], - [0.94925, 0.76891, 0.37886], - [0.94802, 0.76354, 0.37498], - [0.9468, 0.75818, 0.37129], - [0.94558, 0.75284, 0.36782], - [0.94438, 0.74753, 0.36455], - [0.94319, 0.74225, 0.36147], - [0.942, 0.73699, 0.35857], - [0.94083, 0.73178, 0.35587], - [0.93968, 0.72659, 0.35332], - [0.93853, 0.72144, 0.35096], - [0.9374, 0.71634, 0.34874], - [0.93628, 0.71126, 0.34667], - [0.93517, 0.70623, 0.34475], - [0.93407, 0.70122, 0.34297], - [0.93299, 0.69626, 0.3413], - [0.93191, 0.69133, 0.33977], - [0.93086, 0.68644, 0.33832], - [0.9298, 0.68157, 0.33699], - [0.92876, 0.67675, 0.33575], - [0.92773, 0.67194, 0.33461], - [0.9267, 0.66716, 0.33354], - [0.92569, 0.66242, 0.33255], - [0.92468, 0.65769, 0.3316], - [0.92368, 0.65297, 0.33073], - [0.92268, 0.64829, 0.32993], - [0.92169, 0.64362, 0.32917], - [0.92069, 0.63897, 0.32845], - [0.91971, 0.63434, 0.32777], - [0.91872, 0.6297, 0.32713], - [0.91775, 0.62509, 0.32653], - [0.91676, 0.62049, 0.32595], - [0.91577, 0.61589, 0.32541], - [0.9148, 0.61131, 0.32489], - [0.91381, 0.60672, 0.32439], - [0.91282, 0.60214, 0.32391], - [0.91183, 0.59757, 0.32345], - [0.91084, 0.59299, 0.32301], - [0.90983, 0.58841, 0.32257], - [0.90882, 0.58384, 0.32214], - [0.90781, 0.57926, 0.32172], - [0.90677, 0.57467, 0.32131], - [0.90574, 0.57009, 0.32091], - [0.90468, 0.5655, 0.32052], - [0.90361, 0.5609, 0.32013], - [0.90252, 0.5563, 0.31973], - [0.90141, 0.55169, 0.31934], - [0.90028, 0.54706, 0.31895], - [0.89913, 0.54243, 0.31856], - [0.89794, 0.53779, 0.31817], - [0.89674, 0.53312, 0.31778], - [0.89549, 0.52845, 0.31739], - [0.89421, 0.52375, 0.31699], - [0.89288, 0.51905, 0.3166], - [0.89151, 0.51432, 0.3162], - [0.89009, 0.50957, 0.31579], - [0.88862, 0.50481, 0.31537], - [0.88709, 0.50001, 0.31494], - [0.88549, 0.4952, 0.31451], - [0.88383, 0.49037, 0.31408], - [0.88209, 0.4855, 0.31363], - [0.88027, 0.48062, 0.31317], - [0.87836, 0.47572, 0.31269], - [0.87636, 0.47078, 0.31219], - [0.87426, 0.46581, 0.3117], - [0.87206, 0.46083, 0.3112], - [0.86973, 0.45582, 0.31068], - [0.86729, 0.45079, 0.31013], - [0.86473, 0.44572, 0.30956], - [0.86203, 0.44064, 0.30897], - [0.85918, 0.43556, 0.30835], - [0.8562, 0.43044, 0.3077], - [0.85306, 0.42531, 0.30705], - [0.84977, 0.42017, 0.30638], - [0.8463, 0.41502, 0.30567], - [0.84268, 0.40989, 0.30492], - [0.83888, 0.40473, 0.30415], - [0.83492, 0.3996, 0.30334], - [0.83077, 0.3945, 0.30251], - [0.82645, 0.38942, 0.30164], - [0.82195, 0.38436, 0.30075], - [0.81728, 0.37934, 0.29982], - [0.81242, 0.37438, 0.29885], - [0.80741, 0.36945, 0.29783], - [0.80221, 0.36459, 0.2968], - [0.79686, 0.35981, 0.2957], - [0.79135, 0.35512, 0.29457], - [0.78568, 0.35049, 0.29341], - [0.77987, 0.34593, 0.29222], - [0.77392, 0.34151, 0.29098], - [0.76784, 0.33718, 0.28969], - [0.76164, 0.33295, 0.28837], - [0.75533, 0.32883, 0.28699], - [0.74891, 0.32481, 0.28559], - [0.7424, 0.32094, 0.28415], - [0.7358, 0.31716, 0.28268], - [0.72913, 0.31351, 0.28113], - [0.72238, 0.30998, 0.27958], - [0.71559, 0.30656, 0.27796], - [0.70873, 0.30323, 0.27631], - [0.70182, 0.30005, 0.2746], - [0.69488, 0.29697, 0.27286], - [0.68791, 0.29396, 0.27108], - [0.68091, 0.29108, 0.26927], - [0.67389, 0.28828, 0.26736], - [0.66685, 0.28556, 0.26546], - [0.6598, 0.28295, 0.26352], - [0.65273, 0.28037, 0.26149], - [0.64566, 0.27791, 0.25945], - [0.63859, 0.2755, 0.25734], - [0.63151, 0.27312, 0.25521], - [0.62444, 0.27082, 0.253], - [0.61736, 0.26855, 0.25076], - [0.61029, 0.26633, 0.24848], - [0.60322, 0.26415, 0.24612], - [0.59616, 0.26199, 0.24373], - [0.58909, 0.25987, 0.24132], - [0.58204, 0.25775, 0.23883], - [0.575, 0.25567, 0.23633], - [0.56797, 0.2536, 0.23373], - [0.56093, 0.25155, 0.23114], - [0.55391, 0.24948, 0.22849], - [0.5469, 0.24745, 0.22578], - [0.53989, 0.2454, 0.22304], - [0.53291, 0.24336, 0.22025], - [0.52592, 0.24134, 0.21742], - [0.51895, 0.2393, 0.21455], - [0.51198, 0.23728, 0.21167], - [0.50503, 0.23523, 0.20871], - [0.49809, 0.23315, 0.20576], - [0.49117, 0.23112, 0.20274], - [0.48423, 0.22906, 0.1997], - [0.47733, 0.227, 0.19669], - [0.47045, 0.2249, 0.1936], - [0.46356, 0.22286, 0.19048], - [0.4567, 0.22079, 0.18738], - [0.44986, 0.21868, 0.18422], - [0.44303, 0.2166, 0.18105], - [0.43621, 0.21449, 0.17792], - [0.42941, 0.2124, 0.17473], - [0.42262, 0.21028, 0.17151], - [0.41587, 0.20818, 0.16831], - [0.40912, 0.20608, 0.16509], - [0.40239, 0.20397, 0.16193], - [0.39569, 0.20182, 0.15872], - [0.389, 0.1997, 0.1555], - [0.38233, 0.1976, 0.15228], - [0.37568, 0.19547, 0.1491], - [0.36906, 0.19337, 0.14593], - [0.36245, 0.19124, 0.14274], - [0.35588, 0.18913, 0.13954], - [0.34931, 0.18702, 0.13639], - [0.34278, 0.18492, 0.13329], - [0.33625, 0.18278, 0.13021], - [0.32977, 0.18068, 0.12705], - [0.32329, 0.17861, 0.12397], - [0.31684, 0.17648, 0.12091], - [0.31043, 0.17441, 0.11793], - [0.30401, 0.17231, 0.11488], - [0.29764, 0.17023, 0.11196], - [0.2913, 0.16814, 0.109], - [0.28496, 0.16607, 0.1061], - [0.27867, 0.16404, 0.10321], - [0.27237, 0.16197, 0.10032], - [0.26614, 0.15986, 0.09752], - [0.25991, 0.15783, 0.094764], - [0.25371, 0.1558, 0.092001], - [0.24753, 0.15373, 0.08926], - [0.24138, 0.1517, 0.086567], - [0.23526, 0.1497, 0.083951], - [0.22914, 0.14766, 0.081329], - [0.22307, 0.14566, 0.078687], - [0.21702, 0.14362, 0.07612], - [0.211, 0.14161, 0.073581], - [0.20503, 0.13954, 0.070837], - [0.19909, 0.13759, 0.068084], - [0.19322, 0.13553, 0.065213], - [0.1874, 0.13354, 0.062323], - [0.18156, 0.13153, 0.059337], - [0.1758, 0.12951, 0.056198], - [0.17011, 0.12748, 0.052899], - [0.16445, 0.12548, 0.04964], - [0.15883, 0.12342, 0.046062], - [0.15323, 0.12139, 0.042482], - [0.14773, 0.1194, 0.038691], - [0.14225, 0.11735, 0.03474], - [0.13682, 0.11532, 0.030784], - [0.13146, 0.11332, 0.026943], - [0.12616, 0.11125, 0.02311], - [0.12086, 0.1092, 0.019283], - [0.1157, 0.10713, 0.01546], - [0.11058, 0.10499, 0.011622], - [0.10549, 0.10296, 0.0076238], - [0.10023, 0.10091, 0.0037913], -]; - -export const colormap_lapaz_data: Array<[number, number, number]> = [ - [0.10352, 0.047787, 0.39353], - [0.10489, 0.053521, 0.39674], - [0.10638, 0.059148, 0.39996], - [0.10772, 0.064483, 0.40319], - [0.1091, 0.06976, 0.4064], - [0.11045, 0.074827, 0.40961], - [0.11175, 0.079829, 0.41283], - [0.11305, 0.084796, 0.41603], - [0.11424, 0.089643, 0.41924], - [0.11551, 0.094446, 0.42243], - [0.11673, 0.099126, 0.42564], - [0.11793, 0.10381, 0.42883], - [0.11911, 0.10838, 0.43203], - [0.12024, 0.11303, 0.4352], - [0.12136, 0.11751, 0.43837], - [0.12248, 0.12198, 0.44154], - [0.12359, 0.12648, 0.4447], - [0.1247, 0.13094, 0.44784], - [0.12581, 0.13532, 0.45099], - [0.12683, 0.13967, 0.45412], - [0.12791, 0.14407, 0.45724], - [0.12892, 0.14838, 0.46034], - [0.12999, 0.1527, 0.46344], - [0.13099, 0.15701, 0.46653], - [0.13199, 0.16132, 0.46961], - [0.13298, 0.16553, 0.47266], - [0.13398, 0.16983, 0.47572], - [0.13497, 0.17405, 0.47874], - [0.13589, 0.17829, 0.48176], - [0.13689, 0.18246, 0.48476], - [0.13789, 0.18667, 0.48776], - [0.13882, 0.19085, 0.49073], - [0.13975, 0.19504, 0.49367], - [0.14077, 0.19918, 0.4966], - [0.14171, 0.20336, 0.49951], - [0.14266, 0.20751, 0.50242], - [0.14363, 0.21165, 0.50529], - [0.14459, 0.21578, 0.50816], - [0.14558, 0.21989, 0.51099], - [0.1465, 0.22398, 0.51382], - [0.14749, 0.22811, 0.51661], - [0.14844, 0.2322, 0.51939], - [0.14946, 0.23628, 0.52213], - [0.15044, 0.24033, 0.52487], - [0.15142, 0.2444, 0.52758], - [0.15243, 0.24849, 0.53026], - [0.15344, 0.25253, 0.53293], - [0.15448, 0.25657, 0.53556], - [0.15554, 0.26061, 0.53818], - [0.1566, 0.26464, 0.54076], - [0.15765, 0.26868, 0.54333], - [0.15876, 0.27268, 0.54587], - [0.15981, 0.2767, 0.54838], - [0.16096, 0.28068, 0.55086], - [0.16211, 0.28467, 0.55332], - [0.16326, 0.28867, 0.55574], - [0.16443, 0.29264, 0.55815], - [0.16559, 0.29662, 0.56053], - [0.16684, 0.30057, 0.56289], - [0.16805, 0.30453, 0.56519], - [0.16935, 0.30849, 0.5675], - [0.17061, 0.31241, 0.56975], - [0.17192, 0.31636, 0.57199], - [0.17326, 0.32029, 0.57419], - [0.17465, 0.32419, 0.57638], - [0.17601, 0.3281, 0.57851], - [0.17748, 0.33201, 0.58063], - [0.17892, 0.3359, 0.5827], - [0.18039, 0.33979, 0.58476], - [0.18191, 0.34365, 0.58678], - [0.18348, 0.34753, 0.58876], - [0.18509, 0.35138, 0.59073], - [0.1867, 0.35524, 0.59266], - [0.18839, 0.35907, 0.59455], - [0.19007, 0.3629, 0.59641], - [0.19181, 0.36673, 0.59824], - [0.19361, 0.37054, 0.60004], - [0.19542, 0.37436, 0.6018], - [0.1973, 0.37814, 0.60353], - [0.19919, 0.38193, 0.60522], - [0.20114, 0.3857, 0.60689], - [0.20317, 0.38948, 0.60852], - [0.20521, 0.39324, 0.6101], - [0.20732, 0.39698, 0.61166], - [0.20945, 0.40074, 0.61318], - [0.21167, 0.40445, 0.61467], - [0.2139, 0.40817, 0.61612], - [0.21621, 0.41188, 0.61754], - [0.21855, 0.41558, 0.61892], - [0.22096, 0.41927, 0.62026], - [0.22341, 0.42293, 0.62156], - [0.22593, 0.4266, 0.62283], - [0.2285, 0.43025, 0.62407], - [0.23111, 0.43388, 0.62525], - [0.23377, 0.43753, 0.62641], - [0.23654, 0.44113, 0.62752], - [0.23932, 0.44474, 0.6286], - [0.24218, 0.44832, 0.62963], - [0.24508, 0.4519, 0.63064], - [0.24809, 0.45546, 0.63159], - [0.25112, 0.459, 0.6325], - [0.25422, 0.46252, 0.63338], - [0.25738, 0.46604, 0.63421], - [0.2606, 0.46955, 0.635], - [0.2639, 0.47302, 0.63575], - [0.26722, 0.47649, 0.63646], - [0.27066, 0.47994, 0.63712], - [0.27412, 0.48336, 0.63774], - [0.27766, 0.48677, 0.63831], - [0.28125, 0.49016, 0.63885], - [0.28491, 0.49353, 0.63933], - [0.28864, 0.49688, 0.63978], - [0.29243, 0.5002, 0.64018], - [0.29628, 0.50351, 0.64052], - [0.30018, 0.50679, 0.64083], - [0.30415, 0.51005, 0.64108], - [0.30818, 0.51329, 0.6413], - [0.31225, 0.51649, 0.64146], - [0.31642, 0.51968, 0.64158], - [0.32063, 0.52284, 0.64165], - [0.32486, 0.52597, 0.64168], - [0.3292, 0.52907, 0.64166], - [0.33356, 0.53214, 0.64158], - [0.33797, 0.53517, 0.64147], - [0.34246, 0.53819, 0.6413], - [0.34698, 0.54115, 0.64109], - [0.35154, 0.5441, 0.64083], - [0.35617, 0.54701, 0.64052], - [0.36082, 0.54989, 0.64017], - [0.36554, 0.55273, 0.63977], - [0.37029, 0.55553, 0.63932], - [0.37509, 0.5583, 0.63882], - [0.37993, 0.56104, 0.63828], - [0.3848, 0.56374, 0.6377], - [0.38971, 0.56639, 0.63707], - [0.39466, 0.569, 0.6364], - [0.39963, 0.57158, 0.63567], - [0.40464, 0.57411, 0.63491], - [0.4097, 0.57662, 0.63412], - [0.41476, 0.57907, 0.63327], - [0.41986, 0.58148, 0.63238], - [0.42498, 0.58386, 0.63146], - [0.43012, 0.58619, 0.63051], - [0.43529, 0.58847, 0.6295], - [0.44047, 0.59072, 0.62848], - [0.44567, 0.59294, 0.62741], - [0.4509, 0.5951, 0.62631], - [0.45613, 0.59723, 0.62518], - [0.46139, 0.59931, 0.62402], - [0.46666, 0.60135, 0.62283], - [0.47194, 0.60335, 0.62161], - [0.47722, 0.60531, 0.62039], - [0.48252, 0.60725, 0.61913], - [0.48784, 0.60914, 0.61784], - [0.49315, 0.61099, 0.61655], - [0.49849, 0.61279, 0.61523], - [0.50382, 0.61458, 0.6139], - [0.50917, 0.61633, 0.61257], - [0.51452, 0.61805, 0.61123], - [0.51987, 0.61974, 0.60988], - [0.52524, 0.6214, 0.60853], - [0.53062, 0.62303, 0.60718], - [0.536, 0.62464, 0.60582], - [0.54139, 0.62623, 0.60448], - [0.54681, 0.6278, 0.60314], - [0.55222, 0.62935, 0.60182], - [0.55765, 0.63089, 0.60051], - [0.56309, 0.63241, 0.59923], - [0.56854, 0.63393, 0.59796], - [0.57402, 0.63543, 0.59673], - [0.57952, 0.63694, 0.59553], - [0.58503, 0.63844, 0.59436], - [0.59056, 0.63995, 0.59324], - [0.59612, 0.64146, 0.59217], - [0.6017, 0.64299, 0.59114], - [0.60733, 0.64453, 0.59016], - [0.61297, 0.64609, 0.58925], - [0.61866, 0.64767, 0.58841], - [0.62438, 0.64929, 0.58765], - [0.63014, 0.65093, 0.58696], - [0.63594, 0.6526, 0.58636], - [0.64179, 0.65432, 0.58586], - [0.64769, 0.6561, 0.58545], - [0.65365, 0.65791, 0.58514], - [0.65966, 0.65978, 0.58495], - [0.66573, 0.66172, 0.58488], - [0.67185, 0.66373, 0.58495], - [0.67805, 0.6658, 0.58515], - [0.6843, 0.66795, 0.58549], - [0.69062, 0.67019, 0.58599], - [0.69702, 0.67251, 0.58664], - [0.70348, 0.67492, 0.58747], - [0.71002, 0.67743, 0.58847], - [0.71662, 0.68003, 0.58967], - [0.72329, 0.68276, 0.59106], - [0.73003, 0.68559, 0.59265], - [0.73684, 0.68853, 0.59444], - [0.74371, 0.69159, 0.59646], - [0.75064, 0.69476, 0.59869], - [0.75762, 0.69806, 0.60115], - [0.76465, 0.70148, 0.60385], - [0.77173, 0.70503, 0.60677], - [0.77884, 0.70871, 0.60994], - [0.78598, 0.71249, 0.61334], - [0.79313, 0.71641, 0.617], - [0.80029, 0.72043, 0.62089], - [0.80745, 0.72458, 0.62501], - [0.81459, 0.72884, 0.62938], - [0.82171, 0.73321, 0.63398], - [0.82878, 0.73767, 0.6388], - [0.8358, 0.74224, 0.64385], - [0.84275, 0.74689, 0.64912], - [0.84963, 0.75162, 0.65458], - [0.8564, 0.75642, 0.66025], - [0.86308, 0.76129, 0.6661], - [0.86964, 0.76622, 0.67213], - [0.87606, 0.7712, 0.67832], - [0.88235, 0.77622, 0.68466], - [0.88848, 0.78127, 0.69113], - [0.89445, 0.78634, 0.69774], - [0.90025, 0.79142, 0.70446], - [0.90588, 0.79651, 0.71129], - [0.91132, 0.80161, 0.7182], - [0.91657, 0.8067, 0.72519], - [0.92163, 0.81176, 0.73224], - [0.92649, 0.81681, 0.73935], - [0.93115, 0.82184, 0.7465], - [0.93562, 0.82683, 0.75368], - [0.93989, 0.83179, 0.7609], - [0.94396, 0.83671, 0.76812], - [0.94784, 0.84159, 0.77536], - [0.95153, 0.84642, 0.78261], - [0.95503, 0.8512, 0.78985], - [0.95835, 0.85595, 0.79708], - [0.96148, 0.86064, 0.80431], - [0.96444, 0.86528, 0.81152], - [0.96724, 0.86987, 0.8187], - [0.96988, 0.87442, 0.82587], - [0.97236, 0.87892, 0.83302], - [0.97468, 0.88337, 0.84014], - [0.97687, 0.88777, 0.84724], - [0.97893, 0.89214, 0.85431], - [0.98085, 0.89646, 0.86136], - [0.98265, 0.90074, 0.86839], - [0.98434, 0.90498, 0.87538], - [0.98591, 0.90918, 0.88236], - [0.98739, 0.91335, 0.88932], - [0.98876, 0.9175, 0.89625], - [0.99005, 0.92161, 0.90317], - [0.99126, 0.92569, 0.91007], - [0.99239, 0.92975, 0.91695], - [0.99344, 0.93379, 0.92382], - [0.99443, 0.93782, 0.93068], - [0.99536, 0.94182, 0.93753], - [0.99624, 0.94581, 0.94437], - [0.99706, 0.94979, 0.95121], -]; - -export const colormap_lisbon_data: Array<[number, number, number]> = [ - [0.90019, 0.89986, 0.99991], - [0.88957, 0.8921, 0.9936], - [0.87895, 0.88435, 0.9873], - [0.86836, 0.8766, 0.981], - [0.85776, 0.86888, 0.97471], - [0.84718, 0.86115, 0.96843], - [0.83662, 0.85344, 0.96215], - [0.82607, 0.84574, 0.95589], - [0.81553, 0.83806, 0.94962], - [0.80499, 0.83038, 0.94336], - [0.79448, 0.82271, 0.93711], - [0.78398, 0.81505, 0.93086], - [0.77348, 0.8074, 0.92462], - [0.763, 0.79976, 0.91838], - [0.75253, 0.79212, 0.91216], - [0.74208, 0.7845, 0.90593], - [0.73164, 0.77688, 0.89972], - [0.72122, 0.76927, 0.8935], - [0.71081, 0.76167, 0.8873], - [0.70041, 0.75408, 0.8811], - [0.69002, 0.74649, 0.87491], - [0.67965, 0.73892, 0.86872], - [0.6693, 0.73134, 0.86254], - [0.65896, 0.72378, 0.85636], - [0.64863, 0.71623, 0.85019], - [0.63832, 0.70868, 0.84402], - [0.62803, 0.70113, 0.83787], - [0.61774, 0.6936, 0.83171], - [0.60748, 0.68607, 0.82555], - [0.59723, 0.67854, 0.8194], - [0.58699, 0.67103, 0.81326], - [0.57678, 0.66352, 0.80713], - [0.56658, 0.65601, 0.80098], - [0.55639, 0.6485, 0.79485], - [0.54623, 0.641, 0.78872], - [0.53607, 0.63351, 0.78258], - [0.52594, 0.62601, 0.77644], - [0.51581, 0.61852, 0.7703], - [0.50571, 0.61104, 0.76416], - [0.49564, 0.60355, 0.75801], - [0.48558, 0.59606, 0.75185], - [0.47555, 0.58857, 0.74568], - [0.46551, 0.58109, 0.73951], - [0.45552, 0.57361, 0.73331], - [0.44554, 0.56612, 0.7271], - [0.4356, 0.55862, 0.72086], - [0.42566, 0.55113, 0.71459], - [0.41576, 0.54363, 0.70831], - [0.40589, 0.53612, 0.70197], - [0.39604, 0.52861, 0.69561], - [0.38621, 0.52108, 0.6892], - [0.37644, 0.51355, 0.68272], - [0.3667, 0.506, 0.6762], - [0.357, 0.49846, 0.66961], - [0.34734, 0.4909, 0.66295], - [0.33772, 0.48331, 0.65622], - [0.32816, 0.47573, 0.6494], - [0.31867, 0.46812, 0.64248], - [0.30926, 0.46051, 0.63547], - [0.29989, 0.45291, 0.62837], - [0.29062, 0.44528, 0.62115], - [0.28145, 0.43766, 0.61382], - [0.27237, 0.43002, 0.60638], - [0.26344, 0.42238, 0.59882], - [0.25462, 0.41477, 0.59114], - [0.2459, 0.40715, 0.58333], - [0.23739, 0.39954, 0.57541], - [0.22901, 0.39196, 0.56736], - [0.22082, 0.3844, 0.55919], - [0.21278, 0.37688, 0.55092], - [0.20499, 0.36938, 0.54253], - [0.1974, 0.36193, 0.53402], - [0.19002, 0.35453, 0.52543], - [0.18288, 0.34718, 0.51674], - [0.17599, 0.33988, 0.50798], - [0.1694, 0.33265, 0.49912], - [0.16302, 0.32546, 0.49021], - [0.15689, 0.31838, 0.48124], - [0.15103, 0.31136, 0.47222], - [0.14549, 0.30442, 0.46315], - [0.14012, 0.29756, 0.45407], - [0.13509, 0.29078, 0.44496], - [0.1303, 0.28408, 0.43583], - [0.12572, 0.27748, 0.42669], - [0.12135, 0.27096, 0.41756], - [0.11727, 0.2645, 0.40842], - [0.11345, 0.25812, 0.3993], - [0.10981, 0.25186, 0.39021], - [0.10635, 0.24564, 0.38115], - [0.10306, 0.23952, 0.37208], - [0.099941, 0.23345, 0.36307], - [0.097002, 0.2275, 0.35409], - [0.094303, 0.22159, 0.34515], - [0.091713, 0.21576, 0.33624], - [0.08922, 0.20999, 0.32738], - [0.086919, 0.20432, 0.31857], - [0.084717, 0.19867, 0.30982], - [0.082644, 0.19313, 0.30108], - [0.080696, 0.18768, 0.29243], - [0.078849, 0.18223, 0.28382], - [0.077157, 0.17692, 0.27529], - [0.075616, 0.17166, 0.26679], - [0.074219, 0.16651, 0.25838], - [0.072907, 0.16146, 0.25002], - [0.071722, 0.15647, 0.24178], - [0.070637, 0.15156, 0.23358], - [0.069756, 0.14679, 0.22551], - [0.068993, 0.14217, 0.21752], - [0.068301, 0.13767, 0.20963], - [0.067772, 0.13328, 0.20186], - [0.067395, 0.12903, 0.19427], - [0.067165, 0.12499, 0.18675], - [0.067086, 0.1211, 0.17943], - [0.06716, 0.11745, 0.17227], - [0.06739, 0.114, 0.1653], - [0.067779, 0.11082, 0.1586], - [0.068337, 0.10781, 0.15205], - [0.069084, 0.1051, 0.14582], - [0.069909, 0.10272, 0.13976], - [0.070958, 0.10059, 0.13409], - [0.07215, 0.098812, 0.12866], - [0.073639, 0.097347, 0.12356], - [0.075176, 0.096199, 0.11887], - [0.076956, 0.095493, 0.11442], - [0.078977, 0.095119, 0.11047], - [0.081272, 0.095095, 0.10685], - [0.08373, 0.095427, 0.10358], - [0.086376, 0.0961, 0.10069], - [0.089318, 0.097212, 0.098263], - [0.092445, 0.098697, 0.096142], - [0.095823, 0.1005, 0.094539], - [0.099434, 0.1027, 0.093176], - [0.10331, 0.10518, 0.092312], - [0.10736, 0.10803, 0.091807], - [0.11165, 0.11122, 0.091623], - [0.11615, 0.11461, 0.091779], - [0.12079, 0.11839, 0.092234], - [0.12572, 0.1223, 0.092972], - [0.13079, 0.12655, 0.094115], - [0.13596, 0.13101, 0.09548], - [0.14139, 0.13561, 0.097052], - [0.14689, 0.14047, 0.098938], - [0.15255, 0.1455, 0.10101], - [0.15837, 0.15062, 0.10334], - [0.16427, 0.15594, 0.1058], - [0.17026, 0.16138, 0.10841], - [0.17633, 0.16692, 0.11128], - [0.18252, 0.17255, 0.11419], - [0.18882, 0.17834, 0.11728], - [0.19515, 0.18416, 0.12049], - [0.20155, 0.19009, 0.12381], - [0.20805, 0.19611, 0.12723], - [0.21458, 0.20216, 0.13079], - [0.22119, 0.20831, 0.13438], - [0.22783, 0.2145, 0.13805], - [0.23454, 0.22078, 0.14177], - [0.24127, 0.22707, 0.14559], - [0.24807, 0.23339, 0.14942], - [0.2549, 0.2398, 0.1533], - [0.26176, 0.24624, 0.15725], - [0.26868, 0.25273, 0.16129], - [0.27563, 0.25926, 0.16528], - [0.28262, 0.26581, 0.16941], - [0.28963, 0.27238, 0.17349], - [0.29669, 0.27902, 0.17766], - [0.30376, 0.28566, 0.18179], - [0.3109, 0.29236, 0.18603], - [0.31804, 0.29909, 0.19023], - [0.32522, 0.30585, 0.19452], - [0.33245, 0.31261, 0.19876], - [0.3397, 0.31943, 0.20308], - [0.34697, 0.32626, 0.20741], - [0.35426, 0.33314, 0.21177], - [0.3616, 0.34004, 0.21615], - [0.36896, 0.34696, 0.22055], - [0.37635, 0.3539, 0.22493], - [0.38376, 0.36087, 0.22938], - [0.3912, 0.36788, 0.23384], - [0.39866, 0.37491, 0.23833], - [0.40617, 0.38197, 0.24285], - [0.41369, 0.38907, 0.24741], - [0.42124, 0.39618, 0.25198], - [0.42882, 0.40333, 0.25657], - [0.43643, 0.41052, 0.26122], - [0.44408, 0.41772, 0.2659], - [0.45174, 0.42496, 0.27062], - [0.45943, 0.43224, 0.27538], - [0.46716, 0.43954, 0.28017], - [0.47492, 0.44688, 0.28502], - [0.48269, 0.45427, 0.28994], - [0.49051, 0.46168, 0.29492], - [0.49836, 0.46915, 0.29998], - [0.50622, 0.47664, 0.3051], - [0.51414, 0.48418, 0.31031], - [0.52207, 0.49178, 0.3156], - [0.53005, 0.4994, 0.32098], - [0.53805, 0.50709, 0.32645], - [0.54608, 0.51482, 0.33206], - [0.55413, 0.52259, 0.33776], - [0.56223, 0.53042, 0.34359], - [0.57033, 0.5383, 0.34955], - [0.57847, 0.54623, 0.35565], - [0.58663, 0.5542, 0.36188], - [0.59481, 0.56223, 0.36826], - [0.60301, 0.57029, 0.37478], - [0.61122, 0.57841, 0.38147], - [0.61944, 0.58657, 0.38831], - [0.62766, 0.59478, 0.39532], - [0.63589, 0.60302, 0.40247], - [0.64412, 0.6113, 0.40981], - [0.65234, 0.61961, 0.41731], - [0.66055, 0.62795, 0.42496], - [0.66876, 0.63632, 0.43277], - [0.67694, 0.6447, 0.44072], - [0.6851, 0.6531, 0.44885], - [0.69323, 0.66153, 0.45711], - [0.70133, 0.66997, 0.46551], - [0.70942, 0.67841, 0.47407], - [0.71746, 0.68685, 0.48274], - [0.72547, 0.6953, 0.49156], - [0.73343, 0.70375, 0.50046], - [0.74136, 0.7122, 0.5095], - [0.74926, 0.72065, 0.51864], - [0.75712, 0.72909, 0.52786], - [0.76495, 0.73752, 0.53719], - [0.77273, 0.74596, 0.5466], - [0.78049, 0.75439, 0.55608], - [0.78821, 0.7628, 0.56564], - [0.7959, 0.77122, 0.57527], - [0.80357, 0.77962, 0.58497], - [0.81121, 0.78803, 0.59472], - [0.81882, 0.79643, 0.60453], - [0.82642, 0.80483, 0.61437], - [0.834, 0.81323, 0.62428], - [0.84156, 0.82163, 0.63423], - [0.84911, 0.83004, 0.64421], - [0.85665, 0.83844, 0.65423], - [0.86419, 0.84685, 0.66429], - [0.87171, 0.85527, 0.67438], - [0.87923, 0.8637, 0.6845], - [0.88675, 0.87213, 0.69466], - [0.89427, 0.88056, 0.70484], - [0.90179, 0.88902, 0.71505], - [0.90931, 0.89748, 0.7253], - [0.91683, 0.90595, 0.73555], - [0.92435, 0.91443, 0.74584], - [0.93188, 0.92293, 0.75615], - [0.93942, 0.93143, 0.76649], - [0.94696, 0.93996, 0.77685], - [0.9545, 0.94849, 0.78723], - [0.96204, 0.95704, 0.79763], - [0.9696, 0.9656, 0.80806], - [0.97716, 0.97418, 0.81851], - [0.98473, 0.98277, 0.82899], - [0.9923, 0.99138, 0.83948], - [0.99987, 1, 0.84999], -]; - -export const colormap_nuuk_data: Array<[number, number, number]> = [ - [0.018013, 0.35076, 0.55062], - [0.025926, 0.35177, 0.54917], - [0.033826, 0.35281, 0.54772], - [0.042005, 0.35384, 0.54628], - [0.049338, 0.35491, 0.54484], - [0.056017, 0.35596, 0.54341], - [0.062265, 0.35703, 0.54199], - [0.068128, 0.3581, 0.54059], - [0.073701, 0.35918, 0.5392], - [0.078892, 0.36028, 0.53783], - [0.084046, 0.36141, 0.53646], - [0.088911, 0.36254, 0.53511], - [0.093625, 0.36368, 0.53377], - [0.098277, 0.36485, 0.53247], - [0.10277, 0.36604, 0.53117], - [0.1072, 0.36724, 0.5299], - [0.11153, 0.36847, 0.52866], - [0.1158, 0.36971, 0.52743], - [0.11998, 0.37098, 0.52624], - [0.12415, 0.37227, 0.52507], - [0.12832, 0.3736, 0.52393], - [0.13244, 0.37494, 0.52282], - [0.1365, 0.37633, 0.52173], - [0.14062, 0.37772, 0.52069], - [0.14469, 0.37915, 0.51968], - [0.14872, 0.38062, 0.51871], - [0.15279, 0.3821, 0.51778], - [0.15688, 0.38364, 0.51688], - [0.16097, 0.38519, 0.51602], - [0.16503, 0.38678, 0.51521], - [0.16919, 0.38842, 0.51445], - [0.17328, 0.39007, 0.51373], - [0.17746, 0.39178, 0.51305], - [0.18159, 0.39352, 0.51242], - [0.18583, 0.3953, 0.51185], - [0.19003, 0.3971, 0.51132], - [0.19431, 0.39896, 0.51085], - [0.19855, 0.40087, 0.51043], - [0.20287, 0.40279, 0.51007], - [0.20723, 0.40475, 0.50977], - [0.21161, 0.40677, 0.50952], - [0.21602, 0.40882, 0.50933], - [0.22047, 0.41091, 0.50919], - [0.22491, 0.41305, 0.50912], - [0.22943, 0.41521, 0.50911], - [0.23398, 0.41742, 0.50915], - [0.23855, 0.41967, 0.50926], - [0.24317, 0.42194, 0.50943], - [0.24784, 0.42427, 0.50965], - [0.25252, 0.42664, 0.50994], - [0.25723, 0.42904, 0.51029], - [0.26198, 0.43148, 0.51071], - [0.26676, 0.43393, 0.51118], - [0.27156, 0.43644, 0.51171], - [0.27643, 0.43897, 0.51231], - [0.28128, 0.44155, 0.51296], - [0.28617, 0.44415, 0.51367], - [0.29112, 0.44677, 0.51444], - [0.29607, 0.44943, 0.51526], - [0.30104, 0.45213, 0.51613], - [0.30607, 0.45484, 0.51707], - [0.31108, 0.45757, 0.51805], - [0.31614, 0.46033, 0.51909], - [0.32119, 0.46311, 0.52016], - [0.32627, 0.46592, 0.52129], - [0.33138, 0.46876, 0.52247], - [0.3365, 0.47162, 0.52369], - [0.34165, 0.47448, 0.52495], - [0.3468, 0.47736, 0.52626], - [0.35195, 0.48027, 0.52759], - [0.35714, 0.48318, 0.52897], - [0.36232, 0.48612, 0.53037], - [0.3675, 0.48906, 0.53182], - [0.3727, 0.49202, 0.53328], - [0.37791, 0.49499, 0.53478], - [0.38313, 0.49798, 0.53631], - [0.38834, 0.50096, 0.53786], - [0.39356, 0.50396, 0.53941], - [0.39878, 0.50695, 0.541], - [0.404, 0.50996, 0.5426], - [0.40922, 0.51298, 0.54421], - [0.41443, 0.51599, 0.54584], - [0.41965, 0.51903, 0.54747], - [0.42486, 0.52205, 0.54911], - [0.43006, 0.52509, 0.55075], - [0.43526, 0.52812, 0.5524], - [0.44043, 0.53115, 0.55404], - [0.4456, 0.53418, 0.55567], - [0.45078, 0.53722, 0.55732], - [0.45593, 0.54025, 0.55894], - [0.46106, 0.54328, 0.56056], - [0.46618, 0.54631, 0.56217], - [0.4713, 0.54933, 0.56376], - [0.47638, 0.55235, 0.56532], - [0.48145, 0.55536, 0.56688], - [0.48649, 0.55837, 0.56841], - [0.49153, 0.56138, 0.56991], - [0.49651, 0.56437, 0.57139], - [0.5015, 0.56736, 0.57285], - [0.50643, 0.57033, 0.57426], - [0.51135, 0.57331, 0.57566], - [0.51623, 0.57628, 0.57702], - [0.52109, 0.57922, 0.57833], - [0.52591, 0.58215, 0.57961], - [0.53069, 0.58508, 0.58085], - [0.53543, 0.58798, 0.58204], - [0.54014, 0.59087, 0.58319], - [0.5448, 0.59375, 0.5843], - [0.54942, 0.59662, 0.58536], - [0.55399, 0.59946, 0.58637], - [0.55851, 0.60229, 0.58732], - [0.563, 0.60509, 0.58822], - [0.56743, 0.60789, 0.58908], - [0.5718, 0.61065, 0.58988], - [0.57613, 0.61339, 0.59062], - [0.58039, 0.61612, 0.59131], - [0.5846, 0.61882, 0.59195], - [0.58874, 0.62149, 0.59252], - [0.59285, 0.62415, 0.59303], - [0.59688, 0.62677, 0.59348], - [0.60085, 0.62936, 0.59388], - [0.60476, 0.63194, 0.59421], - [0.60861, 0.63449, 0.59449], - [0.61239, 0.637, 0.5947], - [0.61611, 0.63949, 0.59486], - [0.61977, 0.64195, 0.59495], - [0.62335, 0.64438, 0.59499], - [0.62687, 0.64679, 0.59496], - [0.63033, 0.64916, 0.59488], - [0.63372, 0.65151, 0.59474], - [0.63704, 0.65382, 0.59454], - [0.6403, 0.65611, 0.59429], - [0.64349, 0.65836, 0.59398], - [0.64662, 0.66058, 0.59361], - [0.64969, 0.66278, 0.5932], - [0.65268, 0.66494, 0.59273], - [0.65562, 0.66708, 0.5922], - [0.6585, 0.66919, 0.59162], - [0.66131, 0.67127, 0.59099], - [0.66407, 0.67332, 0.59031], - [0.66676, 0.67535, 0.58959], - [0.66941, 0.67735, 0.58882], - [0.67199, 0.67932, 0.58801], - [0.67452, 0.68126, 0.58716], - [0.677, 0.68319, 0.58627], - [0.67941, 0.68509, 0.58534], - [0.68178, 0.68696, 0.58436], - [0.68411, 0.68881, 0.58334], - [0.68639, 0.69063, 0.58229], - [0.68862, 0.69245, 0.58121], - [0.6908, 0.69423, 0.5801], - [0.69296, 0.696, 0.57894], - [0.69506, 0.69774, 0.57776], - [0.69712, 0.69947, 0.57656], - [0.69915, 0.70119, 0.57532], - [0.70115, 0.70289, 0.57405], - [0.70311, 0.70457, 0.57277], - [0.70504, 0.70624, 0.57145], - [0.70694, 0.70789, 0.57012], - [0.70881, 0.70953, 0.56877], - [0.71065, 0.71116, 0.5674], - [0.71247, 0.71278, 0.566], - [0.71426, 0.71439, 0.56459], - [0.71604, 0.716, 0.56318], - [0.7178, 0.71759, 0.56174], - [0.71953, 0.71917, 0.56028], - [0.72124, 0.72075, 0.55881], - [0.72295, 0.72233, 0.55735], - [0.72464, 0.7239, 0.55585], - [0.72632, 0.72548, 0.55437], - [0.72799, 0.72705, 0.55288], - [0.72965, 0.72862, 0.55138], - [0.7313, 0.7302, 0.54988], - [0.73296, 0.73177, 0.54838], - [0.73461, 0.73335, 0.54687], - [0.73625, 0.73494, 0.54537], - [0.73789, 0.73652, 0.54387], - [0.73955, 0.73812, 0.54238], - [0.7412, 0.73974, 0.54089], - [0.74286, 0.74135, 0.53941], - [0.74453, 0.743, 0.53795], - [0.74621, 0.74464, 0.5365], - [0.7479, 0.74631, 0.53506], - [0.7496, 0.748, 0.53363], - [0.75133, 0.7497, 0.53225], - [0.75307, 0.75144, 0.53087], - [0.75484, 0.75318, 0.52952], - [0.75662, 0.75497, 0.5282], - [0.75844, 0.75678, 0.52692], - [0.76028, 0.75863, 0.52567], - [0.76216, 0.76051, 0.52445], - [0.76407, 0.76242, 0.52329], - [0.76603, 0.76438, 0.52216], - [0.76802, 0.76638, 0.52109], - [0.77006, 0.76843, 0.52008], - [0.77215, 0.77053, 0.51913], - [0.77428, 0.77269, 0.51825], - [0.77648, 0.77489, 0.51743], - [0.77873, 0.77717, 0.51669], - [0.78104, 0.7795, 0.51602], - [0.78342, 0.7819, 0.51545], - [0.78587, 0.78437, 0.51498], - [0.78839, 0.78691, 0.51461], - [0.79099, 0.78953, 0.51434], - [0.79367, 0.79223, 0.51418], - [0.79642, 0.79501, 0.51415], - [0.79927, 0.79787, 0.51424], - [0.80219, 0.80083, 0.51446], - [0.80521, 0.80388, 0.51482], - [0.80833, 0.80702, 0.51533], - [0.81154, 0.81024, 0.51599], - [0.81483, 0.81357, 0.51683], - [0.81823, 0.81699, 0.51782], - [0.82173, 0.8205, 0.51899], - [0.82531, 0.82411, 0.52032], - [0.829, 0.82782, 0.52184], - [0.83277, 0.83162, 0.52356], - [0.83664, 0.8355, 0.52546], - [0.8406, 0.83947, 0.52754], - [0.84463, 0.84352, 0.52983], - [0.84875, 0.84765, 0.53231], - [0.85294, 0.85185, 0.53497], - [0.85719, 0.85612, 0.53784], - [0.86151, 0.86045, 0.54089], - [0.86589, 0.86483, 0.54413], - [0.87031, 0.86927, 0.54755], - [0.87477, 0.87373, 0.55115], - [0.87927, 0.87824, 0.55492], - [0.88379, 0.88276, 0.55886], - [0.88833, 0.88731, 0.56296], - [0.89287, 0.89186, 0.56721], - [0.89743, 0.89642, 0.5716], - [0.90197, 0.90097, 0.57613], - [0.9065, 0.90551, 0.58077], - [0.91101, 0.91004, 0.58554], - [0.9155, 0.91453, 0.5904], - [0.91996, 0.919, 0.59537], - [0.92438, 0.92344, 0.60043], - [0.92876, 0.92784, 0.60556], - [0.9331, 0.9322, 0.61078], - [0.9374, 0.93652, 0.61605], - [0.94164, 0.94079, 0.62138], - [0.94584, 0.94502, 0.62676], - [0.94999, 0.9492, 0.63218], - [0.95409, 0.95334, 0.63764], - [0.95813, 0.95742, 0.64313], - [0.96213, 0.96146, 0.64864], - [0.96608, 0.96546, 0.65418], - [0.96998, 0.96942, 0.65974], - [0.97384, 0.97334, 0.66532], - [0.97766, 0.97722, 0.67091], - [0.98144, 0.98106, 0.67651], - [0.98519, 0.98488, 0.68211], - [0.9889, 0.98867, 0.68773], - [0.99259, 0.99243, 0.69335], - [0.99624, 0.99617, 0.69898], -]; - -export const colormap_oleron_data: Array<[number, number, number]> = [ - [0.10105, 0.15003, 0.35027], - [0.10721, 0.15579, 0.35609], - [0.11329, 0.16159, 0.36192], - [0.11927, 0.16739, 0.36777], - [0.12525, 0.17322, 0.37365], - [0.13122, 0.17911, 0.37954], - [0.13717, 0.18502, 0.38546], - [0.1431, 0.19093, 0.39141], - [0.14904, 0.19692, 0.39737], - [0.15498, 0.20288, 0.40336], - [0.16095, 0.20889, 0.40937], - [0.16694, 0.21492, 0.4154], - [0.17291, 0.22102, 0.42146], - [0.17894, 0.22709, 0.42756], - [0.18498, 0.23318, 0.43365], - [0.19102, 0.23934, 0.43979], - [0.19712, 0.24548, 0.44594], - [0.20322, 0.25169, 0.45213], - [0.20936, 0.25788, 0.45832], - [0.21553, 0.26413, 0.46456], - [0.22171, 0.27039, 0.4708], - [0.22794, 0.27666, 0.47706], - [0.23417, 0.28297, 0.48335], - [0.24042, 0.28929, 0.48967], - [0.24672, 0.29562, 0.496], - [0.25305, 0.30198, 0.50237], - [0.25939, 0.30838, 0.50876], - [0.26575, 0.31478, 0.51515], - [0.27212, 0.32122, 0.52157], - [0.27855, 0.32766, 0.52802], - [0.28496, 0.33415, 0.53448], - [0.29144, 0.34064, 0.54097], - [0.2979, 0.34716, 0.54747], - [0.3044, 0.35367, 0.554], - [0.31094, 0.36022, 0.56055], - [0.31747, 0.36681, 0.56712], - [0.32403, 0.37339, 0.5737], - [0.33061, 0.38, 0.58031], - [0.33723, 0.38662, 0.58693], - [0.34384, 0.39328, 0.59357], - [0.3505, 0.39994, 0.60023], - [0.35717, 0.40664, 0.60692], - [0.36384, 0.41334, 0.61361], - [0.37054, 0.42006, 0.62034], - [0.37727, 0.42681, 0.62707], - [0.38401, 0.43356, 0.63383], - [0.39077, 0.44034, 0.6406], - [0.39755, 0.44713, 0.64739], - [0.40434, 0.45395, 0.6542], - [0.41116, 0.46078, 0.66102], - [0.41799, 0.46763, 0.66787], - [0.42485, 0.4745, 0.67472], - [0.43173, 0.48137, 0.6816], - [0.4386, 0.48828, 0.6885], - [0.4455, 0.49519, 0.69541], - [0.45244, 0.50212, 0.70234], - [0.45937, 0.50908, 0.70929], - [0.46632, 0.51603, 0.71625], - [0.47329, 0.52302, 0.72322], - [0.48029, 0.53002, 0.73022], - [0.4873, 0.53704, 0.73723], - [0.49432, 0.54406, 0.74425], - [0.50136, 0.55111, 0.7513], - [0.50841, 0.55817, 0.75835], - [0.51547, 0.56524, 0.76542], - [0.52256, 0.57235, 0.7725], - [0.52967, 0.57946, 0.7796], - [0.53679, 0.58658, 0.78671], - [0.54392, 0.59372, 0.79382], - [0.55107, 0.60087, 0.80094], - [0.55822, 0.60804, 0.80806], - [0.5654, 0.61521, 0.81518], - [0.5726, 0.62241, 0.8223], - [0.57981, 0.62961, 0.8294], - [0.58702, 0.63684, 0.83647], - [0.59424, 0.64405, 0.84351], - [0.60147, 0.65129, 0.85051], - [0.60872, 0.65852, 0.85745], - [0.61595, 0.66575, 0.86431], - [0.62318, 0.67298, 0.87109], - [0.6304, 0.68018, 0.87775], - [0.6376, 0.68737, 0.88428], - [0.64477, 0.69453, 0.89065], - [0.65191, 0.70165, 0.89685], - [0.659, 0.70873, 0.90284], - [0.66603, 0.71575, 0.90861], - [0.673, 0.72268, 0.91414], - [0.67987, 0.72954, 0.9194], - [0.68666, 0.7363, 0.92438], - [0.69334, 0.74297, 0.92907], - [0.69991, 0.74951, 0.93347], - [0.70637, 0.75595, 0.93757], - [0.71269, 0.76226, 0.94137], - [0.7189, 0.76845, 0.94489], - [0.72499, 0.77451, 0.94812], - [0.73094, 0.78046, 0.9511], - [0.73679, 0.78631, 0.95383], - [0.74254, 0.79203, 0.95633], - [0.74818, 0.79766, 0.95864], - [0.75373, 0.80321, 0.96077], - [0.7592, 0.80868, 0.96274], - [0.76461, 0.81408, 0.96457], - [0.76995, 0.81943, 0.9663], - [0.77525, 0.82473, 0.96793], - [0.78052, 0.83, 0.96948], - [0.78575, 0.83524, 0.97097], - [0.79096, 0.84045, 0.97241], - [0.79615, 0.84564, 0.97381], - [0.80133, 0.85083, 0.97518], - [0.80651, 0.85602, 0.97653], - [0.81168, 0.86119, 0.97787], - [0.81685, 0.86637, 0.97919], - [0.82203, 0.87155, 0.9805], - [0.8272, 0.87673, 0.98181], - [0.83238, 0.88193, 0.98311], - [0.83757, 0.88712, 0.98442], - [0.84276, 0.89233, 0.98572], - [0.84795, 0.89753, 0.98702], - [0.85315, 0.90275, 0.98831], - [0.85836, 0.90797, 0.98962], - [0.86357, 0.9132, 0.99091], - [0.86879, 0.91844, 0.99221], - [0.874, 0.92368, 0.99351], - [0.87922, 0.92893, 0.9948], - [0.88444, 0.93418, 0.9961], - [0.88967, 0.93945, 0.99739], - [0.89489, 0.94472, 0.99869], - [0.90011, 0.94999, 0.99997], - [0.10024, 0.29901, 0.00015511], - [0.11206, 0.30199, 0.00022614], - [0.12317, 0.30497, 0.00025664], - [0.1339, 0.3079, 0.00024737], - [0.14418, 0.31082, 0.00020433], - [0.15412, 0.31369, 0.00016131], - [0.16383, 0.31653, 0.00012503], - [0.17323, 0.31932, 9.6573e-5], - [0.18245, 0.32208, 7.7354e-5], - [0.19152, 0.3248, 6.932e-5], - [0.2004, 0.32749, 7.5132e-5], - [0.20919, 0.33016, 9.8417e-5], - [0.21784, 0.33279, 0.00014406], - [0.2264, 0.3354, 0.00021853], - [0.23486, 0.33797, 0.00033026], - [0.24321, 0.34055, 0.00049005], - [0.25156, 0.34313, 0.00071147], - [0.25983, 0.34569, 0.0010113], - [0.26806, 0.3483, 0.0014102], - [0.27631, 0.35093, 0.0019325], - [0.28451, 0.35358, 0.0026075], - [0.29274, 0.35632, 0.0034694], - [0.30099, 0.3591, 0.0045572], - [0.3093, 0.36199, 0.005916], - [0.31763, 0.36496, 0.0075965], - [0.32602, 0.36806, 0.009658], - [0.33451, 0.37128, 0.012367], - [0.34305, 0.37466, 0.015348], - [0.35167, 0.37818, 0.01893], - [0.36038, 0.38186, 0.023166], - [0.36919, 0.38571, 0.028136], - [0.37806, 0.38973, 0.033895], - [0.38702, 0.39393, 0.0408], - [0.39605, 0.39829, 0.047888], - [0.40512, 0.4028, 0.055327], - [0.41425, 0.40747, 0.06302], - [0.42339, 0.41228, 0.070789], - [0.43257, 0.41721, 0.078726], - [0.44174, 0.42223, 0.086949], - [0.45088, 0.42738, 0.095228], - [0.46, 0.43259, 0.10362], - [0.4691, 0.43785, 0.11211], - [0.47812, 0.44317, 0.12065], - [0.4871, 0.44852, 0.12932], - [0.49601, 0.45389, 0.13805], - [0.50487, 0.45928, 0.14676], - [0.51366, 0.46468, 0.15555], - [0.52237, 0.47008, 0.16436], - [0.53104, 0.47548, 0.17315], - [0.53964, 0.48087, 0.18196], - [0.5482, 0.48628, 0.1908], - [0.5567, 0.4917, 0.19962], - [0.56516, 0.49712, 0.20847], - [0.57361, 0.50256, 0.21731], - [0.58203, 0.50804, 0.22616], - [0.59044, 0.51354, 0.235], - [0.59885, 0.51909, 0.24381], - [0.60727, 0.52468, 0.25267], - [0.61569, 0.53033, 0.26152], - [0.62414, 0.53605, 0.27039], - [0.63261, 0.54183, 0.27926], - [0.64111, 0.54769, 0.28812], - [0.64966, 0.55363, 0.29703], - [0.65823, 0.55966, 0.30594], - [0.66685, 0.56576, 0.31483], - [0.67551, 0.57195, 0.32377], - [0.6842, 0.57822, 0.33273], - [0.69296, 0.58458, 0.34168], - [0.70173, 0.591, 0.35066], - [0.71056, 0.59751, 0.35964], - [0.71941, 0.60408, 0.36865], - [0.7283, 0.61071, 0.37767], - [0.73722, 0.6174, 0.3867], - [0.74616, 0.62415, 0.39577], - [0.75513, 0.63095, 0.40484], - [0.76411, 0.63778, 0.41394], - [0.77309, 0.64467, 0.42306], - [0.78209, 0.6516, 0.43223], - [0.79107, 0.65857, 0.44141], - [0.80005, 0.66558, 0.45063], - [0.809, 0.67262, 0.45989], - [0.81789, 0.6797, 0.46922], - [0.82674, 0.68682, 0.47857], - [0.83551, 0.69397, 0.48799], - [0.84419, 0.70116, 0.49746], - [0.85274, 0.70839, 0.50699], - [0.86114, 0.71565, 0.51658], - [0.86936, 0.72293, 0.52624], - [0.87737, 0.73025, 0.53595], - [0.88513, 0.73757, 0.54572], - [0.89262, 0.74491, 0.55551], - [0.89981, 0.75225, 0.56535], - [0.90665, 0.75957, 0.57522], - [0.91313, 0.76687, 0.58508], - [0.91921, 0.77413, 0.59493], - [0.92491, 0.78136, 0.60476], - [0.9302, 0.78851, 0.61454], - [0.93507, 0.7956, 0.62429], - [0.93954, 0.80262, 0.63396], - [0.94361, 0.80956, 0.64355], - [0.94731, 0.81641, 0.65307], - [0.95066, 0.82318, 0.66252], - [0.95369, 0.82988, 0.67188], - [0.95641, 0.8365, 0.68116], - [0.95888, 0.84305, 0.69039], - [0.96112, 0.84954, 0.69955], - [0.96316, 0.85598, 0.70866], - [0.96502, 0.86239, 0.71773], - [0.96675, 0.86875, 0.72676], - [0.96835, 0.87509, 0.73578], - [0.96986, 0.88142, 0.74478], - [0.9713, 0.88773, 0.75378], - [0.97268, 0.89405, 0.76277], - [0.974, 0.90036, 0.77179], - [0.97529, 0.90668, 0.78081], - [0.97655, 0.91301, 0.78985], - [0.97779, 0.91936, 0.79891], - [0.97902, 0.92572, 0.80799], - [0.98023, 0.93209, 0.8171], - [0.98143, 0.93848, 0.82624], - [0.98261, 0.94489, 0.8354], - [0.98378, 0.95132, 0.84459], - [0.98495, 0.95776, 0.8538], - [0.98609, 0.96422, 0.86304], - [0.98722, 0.97069, 0.87231], - [0.98833, 0.97718, 0.88159], - [0.98942, 0.98369, 0.8909], - [0.99049, 0.9902, 0.90023], -]; - -export const colormap_oslo_data: Array<[number, number, number]> = [ - [0.0036704, 0.0050824, 0.0024536], - [0.0056626, 0.0093944, 0.010695], - [0.0076737, 0.0139, 0.019154], - [0.0097079, 0.018228, 0.027418], - [0.011981, 0.022573, 0.035904], - [0.01404, 0.026935, 0.043975], - [0.01615, 0.031315, 0.05138], - [0.018294, 0.035927, 0.058123], - [0.020473, 0.040333, 0.064433], - [0.022689, 0.044608, 0.070257], - [0.024947, 0.048672, 0.075728], - [0.027247, 0.052453, 0.080952], - [0.029592, 0.05624, 0.085837], - [0.031984, 0.059842, 0.090619], - [0.034477, 0.063258, 0.095163], - [0.037057, 0.066553, 0.09953], - [0.039346, 0.06983, 0.104], - [0.041492, 0.072993, 0.10848], - [0.043238, 0.076022, 0.1131], - [0.045051, 0.079044, 0.11765], - [0.046508, 0.082102, 0.12227], - [0.047784, 0.084964, 0.12697], - [0.049035, 0.087853, 0.13174], - [0.049925, 0.09066, 0.13649], - [0.050671, 0.093388, 0.14135], - [0.051245, 0.096126, 0.14619], - [0.051698, 0.098921, 0.15108], - [0.05216, 0.10171, 0.15603], - [0.052632, 0.10451, 0.16098], - [0.053115, 0.10741, 0.16595], - [0.053612, 0.11032, 0.17099], - [0.054125, 0.11324, 0.17602], - [0.054655, 0.11618, 0.18112], - [0.055201, 0.11913, 0.18627], - [0.055777, 0.12209, 0.1914], - [0.056384, 0.12516, 0.19661], - [0.056955, 0.12823, 0.20178], - [0.057498, 0.13131, 0.20704], - [0.058136, 0.13444, 0.2123], - [0.058867, 0.13757, 0.21759], - [0.059601, 0.14073, 0.22291], - [0.060281, 0.14391, 0.22826], - [0.060943, 0.14711, 0.2336], - [0.061699, 0.15035, 0.23901], - [0.062585, 0.15358, 0.24441], - [0.063381, 0.15688, 0.24986], - [0.064199, 0.16015, 0.25535], - [0.065067, 0.16352, 0.26083], - [0.065965, 0.16686, 0.26635], - [0.066906, 0.1702, 0.27186], - [0.06788, 0.17357, 0.27744], - [0.068913, 0.17697, 0.28302], - [0.069887, 0.18038, 0.28861], - [0.070924, 0.18381, 0.29422], - [0.071974, 0.18728, 0.29987], - [0.073118, 0.19072, 0.30554], - [0.074222, 0.19423, 0.31121], - [0.075341, 0.1977, 0.31691], - [0.076503, 0.20119, 0.32264], - [0.077709, 0.20473, 0.32836], - [0.078959, 0.20826, 0.33412], - [0.080255, 0.21181, 0.33989], - [0.081609, 0.21535, 0.34567], - [0.082887, 0.21892, 0.35147], - [0.084299, 0.22249, 0.35731], - [0.085598, 0.22609, 0.36313], - [0.087109, 0.22965, 0.36899], - [0.088529, 0.23325, 0.37486], - [0.090015, 0.2369, 0.38075], - [0.091564, 0.24048, 0.38663], - [0.093033, 0.2441, 0.39255], - [0.094704, 0.24776, 0.39848], - [0.096248, 0.2514, 0.40442], - [0.097979, 0.25504, 0.41039], - [0.099642, 0.25867, 0.41635], - [0.10138, 0.26232, 0.42232], - [0.1032, 0.26598, 0.42833], - [0.10497, 0.26965, 0.43433], - [0.10692, 0.27331, 0.44035], - [0.10879, 0.27697, 0.44639], - [0.1108, 0.28062, 0.45244], - [0.11283, 0.28431, 0.45849], - [0.11484, 0.28799, 0.46456], - [0.11699, 0.29169, 0.47064], - [0.11919, 0.29536, 0.47672], - [0.1214, 0.29907, 0.48282], - [0.12371, 0.30275, 0.48893], - [0.12613, 0.30647, 0.49506], - [0.12854, 0.31018, 0.50119], - [0.13107, 0.31389, 0.50733], - [0.13364, 0.31762, 0.51348], - [0.13625, 0.32135, 0.51964], - [0.139, 0.32509, 0.52582], - [0.14184, 0.32887, 0.532], - [0.14474, 0.33265, 0.5382], - [0.14772, 0.33642, 0.5444], - [0.15079, 0.34023, 0.55062], - [0.15395, 0.34405, 0.55685], - [0.15723, 0.34791, 0.56308], - [0.16061, 0.35178, 0.56932], - [0.16413, 0.3557, 0.57558], - [0.16771, 0.35962, 0.58184], - [0.17142, 0.36359, 0.58811], - [0.17526, 0.36759, 0.59439], - [0.17923, 0.37163, 0.60067], - [0.1833, 0.37572, 0.60697], - [0.18756, 0.37985, 0.61324], - [0.19189, 0.38402, 0.61953], - [0.19642, 0.38824, 0.6258], - [0.20102, 0.39251, 0.63207], - [0.20583, 0.39683, 0.63832], - [0.21074, 0.40122, 0.64454], - [0.21582, 0.40565, 0.65075], - [0.22103, 0.41013, 0.65692], - [0.22637, 0.41465, 0.66304], - [0.23185, 0.41923, 0.6691], - [0.23747, 0.42385, 0.67511], - [0.24318, 0.42853, 0.68103], - [0.24906, 0.43324, 0.68689], - [0.25504, 0.438, 0.69265], - [0.26109, 0.44277, 0.6983], - [0.26724, 0.44756, 0.70383], - [0.27351, 0.4524, 0.70924], - [0.27982, 0.45722, 0.7145], - [0.28617, 0.46205, 0.71962], - [0.29259, 0.46688, 0.72457], - [0.29905, 0.47169, 0.72935], - [0.30552, 0.47648, 0.73395], - [0.31196, 0.48123, 0.73836], - [0.31844, 0.48596, 0.74258], - [0.32488, 0.49065, 0.74659], - [0.33129, 0.49527, 0.7504], - [0.33767, 0.49983, 0.75401], - [0.34399, 0.50435, 0.75741], - [0.35027, 0.50878, 0.7606], - [0.35647, 0.51314, 0.76358], - [0.3626, 0.51744, 0.76637], - [0.36866, 0.52164, 0.76895], - [0.37464, 0.52578, 0.77135], - [0.38054, 0.52984, 0.77355], - [0.38634, 0.53381, 0.77557], - [0.39208, 0.53772, 0.77743], - [0.39773, 0.54152, 0.77911], - [0.4033, 0.54528, 0.78064], - [0.40879, 0.54895, 0.78202], - [0.4142, 0.55255, 0.78326], - [0.41955, 0.55607, 0.78438], - [0.42482, 0.55955, 0.78536], - [0.43003, 0.56296, 0.78624], - [0.43518, 0.56631, 0.78702], - [0.44025, 0.56961, 0.78769], - [0.44529, 0.57287, 0.78828], - [0.45027, 0.57608, 0.78879], - [0.45521, 0.57923, 0.78922], - [0.4601, 0.58235, 0.78958], - [0.46496, 0.58545, 0.78988], - [0.46979, 0.5885, 0.79013], - [0.47458, 0.59153, 0.79033], - [0.47934, 0.59453, 0.79049], - [0.48408, 0.59752, 0.7906], - [0.4888, 0.60047, 0.79068], - [0.4935, 0.60342, 0.79073], - [0.4982, 0.60634, 0.79076], - [0.50285, 0.60926, 0.79075], - [0.50752, 0.61215, 0.79073], - [0.51216, 0.61504, 0.79069], - [0.51681, 0.61793, 0.79063], - [0.52144, 0.62081, 0.79057], - [0.52608, 0.62368, 0.79049], - [0.5307, 0.62654, 0.7904], - [0.53532, 0.6294, 0.79031], - [0.53994, 0.63227, 0.79021], - [0.54457, 0.63513, 0.79011], - [0.5492, 0.638, 0.79001], - [0.55382, 0.64086, 0.78991], - [0.55845, 0.64373, 0.78981], - [0.5631, 0.64661, 0.78972], - [0.56773, 0.64949, 0.78964], - [0.57238, 0.65238, 0.78956], - [0.57704, 0.65527, 0.7895], - [0.58169, 0.65818, 0.78944], - [0.58637, 0.66109, 0.7894], - [0.59105, 0.66403, 0.78938], - [0.59574, 0.66696, 0.78937], - [0.60044, 0.66993, 0.78938], - [0.60516, 0.6729, 0.78942], - [0.60989, 0.67589, 0.78948], - [0.61464, 0.67891, 0.78957], - [0.61941, 0.68194, 0.78969], - [0.62419, 0.68501, 0.78985], - [0.62899, 0.6881, 0.79004], - [0.63382, 0.69121, 0.79027], - [0.63866, 0.69435, 0.79055], - [0.64352, 0.69754, 0.79087], - [0.64842, 0.70076, 0.79124], - [0.65334, 0.70401, 0.79167], - [0.65829, 0.70731, 0.79216], - [0.66327, 0.71065, 0.79272], - [0.66828, 0.71403, 0.79334], - [0.67332, 0.71747, 0.79403], - [0.6784, 0.72094, 0.79479], - [0.68351, 0.72448, 0.79564], - [0.68866, 0.72807, 0.79657], - [0.69384, 0.73173, 0.79759], - [0.69907, 0.73544, 0.79871], - [0.70433, 0.73922, 0.79993], - [0.70964, 0.74305, 0.80124], - [0.71499, 0.74695, 0.80266], - [0.72038, 0.75093, 0.8042], - [0.72581, 0.75497, 0.80584], - [0.73128, 0.75908, 0.80761], - [0.73679, 0.76326, 0.80949], - [0.74235, 0.76752, 0.8115], - [0.74795, 0.77185, 0.81362], - [0.75358, 0.77626, 0.81589], - [0.75926, 0.78073, 0.81827], - [0.76498, 0.78528, 0.8208], - [0.77073, 0.7899, 0.82345], - [0.77651, 0.7946, 0.82624], - [0.78233, 0.79936, 0.82916], - [0.78818, 0.80419, 0.83221], - [0.79406, 0.8091, 0.83539], - [0.79997, 0.81406, 0.8387], - [0.8059, 0.81908, 0.84215], - [0.81186, 0.82418, 0.84572], - [0.81783, 0.82933, 0.84942], - [0.82383, 0.83454, 0.85323], - [0.82985, 0.8398, 0.85717], - [0.83587, 0.84511, 0.86123], - [0.84192, 0.85047, 0.8654], - [0.84796, 0.85588, 0.86968], - [0.85402, 0.86133, 0.87406], - [0.8601, 0.86682, 0.87855], - [0.86617, 0.87236, 0.88313], - [0.87225, 0.87793, 0.88781], - [0.87832, 0.88353, 0.89257], - [0.88441, 0.88917, 0.89742], - [0.89049, 0.89484, 0.90235], - [0.89657, 0.90052, 0.90736], - [0.90265, 0.90624, 0.91243], - [0.90873, 0.91198, 0.91758], - [0.91481, 0.91775, 0.92278], - [0.92088, 0.92353, 0.92804], - [0.92695, 0.92933, 0.93336], - [0.93302, 0.93515, 0.93873], - [0.9391, 0.94098, 0.94414], - [0.94517, 0.94683, 0.94959], - [0.95123, 0.9527, 0.95509], - [0.9573, 0.95858, 0.96061], - [0.96337, 0.96446, 0.96617], - [0.96943, 0.97036, 0.97175], - [0.9755, 0.97627, 0.97736], - [0.98157, 0.9822, 0.98298], - [0.98765, 0.98813, 0.98863], - [0.99372, 0.99407, 0.99429], - [0.9998, 1, 0.99996], -]; - -export const colormap_roma_data: Array<[number, number, number]> = [ - [0.49684, 0.099626, 0], - [0.50141, 0.11159, 0.0038271], - [0.50595, 0.12281, 0.0075362], - [0.51049, 0.13362, 0.011176], - [0.51502, 0.14397, 0.014691], - [0.51953, 0.15397, 0.017936], - [0.52403, 0.16373, 0.02102], - [0.52851, 0.17319, 0.023941], - [0.53298, 0.18247, 0.026768], - [0.53742, 0.19159, 0.02974], - [0.54181, 0.20053, 0.032886], - [0.5462, 0.20938, 0.036371], - [0.55055, 0.2181, 0.03985], - [0.55486, 0.22671, 0.043275], - [0.55915, 0.23522, 0.046908], - [0.56342, 0.24362, 0.050381], - [0.56764, 0.25199, 0.053844], - [0.57184, 0.26026, 0.057332], - [0.57601, 0.26848, 0.06081], - [0.58015, 0.27665, 0.064287], - [0.58425, 0.28474, 0.067738], - [0.58833, 0.29281, 0.071178], - [0.59239, 0.30083, 0.074547], - [0.59641, 0.30883, 0.077891], - [0.60041, 0.31677, 0.081344], - [0.60439, 0.32468, 0.084709], - [0.60834, 0.33258, 0.088059], - [0.61225, 0.34043, 0.091425], - [0.61616, 0.34827, 0.094762], - [0.62004, 0.35608, 0.098071], - [0.6239, 0.36387, 0.10135], - [0.62774, 0.37164, 0.10462], - [0.63157, 0.37941, 0.10794], - [0.63537, 0.38716, 0.11129], - [0.63916, 0.3949, 0.11452], - [0.64294, 0.40263, 0.11786], - [0.64671, 0.41037, 0.12112], - [0.65046, 0.41807, 0.12443], - [0.65421, 0.42579, 0.12776], - [0.65795, 0.43351, 0.13108], - [0.66169, 0.44123, 0.13442], - [0.66541, 0.44896, 0.13776], - [0.66914, 0.45668, 0.14112], - [0.67287, 0.46443, 0.1445], - [0.6766, 0.47218, 0.1479], - [0.68033, 0.47994, 0.15134], - [0.68407, 0.48772, 0.15484], - [0.68783, 0.49551, 0.1584], - [0.69159, 0.50332, 0.162], - [0.69537, 0.51117, 0.1656], - [0.69916, 0.51905, 0.16938], - [0.70298, 0.52695, 0.17315], - [0.70681, 0.53488, 0.17706], - [0.71067, 0.54285, 0.18103], - [0.71456, 0.55087, 0.18517], - [0.71848, 0.55892, 0.18939], - [0.72244, 0.56704, 0.19377], - [0.72644, 0.57519, 0.19826], - [0.73049, 0.5834, 0.20295], - [0.73457, 0.59168, 0.20781], - [0.7387, 0.60002, 0.21285], - [0.74289, 0.60842, 0.21813], - [0.74712, 0.61688, 0.22361], - [0.75142, 0.6254, 0.22933], - [0.75576, 0.634, 0.23533], - [0.76016, 0.64265, 0.24156], - [0.76463, 0.65137, 0.24809], - [0.76914, 0.66014, 0.2549], - [0.77371, 0.66897, 0.262], - [0.77833, 0.67784, 0.26943], - [0.783, 0.68674, 0.27716], - [0.78771, 0.69568, 0.2852], - [0.79246, 0.70462, 0.29358], - [0.79722, 0.71357, 0.30227], - [0.80201, 0.72249, 0.31128], - [0.80681, 0.73138, 0.32059], - [0.81159, 0.74021, 0.33017], - [0.81635, 0.74896, 0.34004], - [0.82108, 0.75761, 0.35015], - [0.82576, 0.76614, 0.36047], - [0.83037, 0.77452, 0.37103], - [0.8349, 0.78274, 0.38176], - [0.83934, 0.79077, 0.39264], - [0.84366, 0.7986, 0.40365], - [0.84785, 0.80619, 0.41475], - [0.8519, 0.81354, 0.42591], - [0.8558, 0.82064, 0.43711], - [0.85953, 0.82748, 0.44831], - [0.86308, 0.83404, 0.4595], - [0.86643, 0.84031, 0.47065], - [0.86958, 0.84629, 0.48173], - [0.87253, 0.85199, 0.49272], - [0.87526, 0.8574, 0.50362], - [0.87777, 0.86254, 0.51441], - [0.88004, 0.86739, 0.52506], - [0.88209, 0.87197, 0.53557], - [0.8839, 0.87629, 0.54595], - [0.88546, 0.88035, 0.55615], - [0.88677, 0.88417, 0.56622], - [0.88783, 0.88775, 0.57613], - [0.88864, 0.89111, 0.58587], - [0.88918, 0.89426, 0.59544], - [0.88946, 0.8972, 0.60485], - [0.88947, 0.89994, 0.61409], - [0.88921, 0.9025, 0.62319], - [0.88867, 0.90488, 0.6321], - [0.88785, 0.90709, 0.64085], - [0.88674, 0.90914, 0.64945], - [0.88534, 0.91104, 0.65787], - [0.88364, 0.91279, 0.66612], - [0.88165, 0.9144, 0.67421], - [0.87934, 0.91587, 0.68212], - [0.87673, 0.91722, 0.68988], - [0.87381, 0.91842, 0.69745], - [0.87058, 0.9195, 0.70485], - [0.86703, 0.92046, 0.71207], - [0.86316, 0.92129, 0.71912], - [0.85897, 0.92201, 0.72598], - [0.85447, 0.9226, 0.73266], - [0.84965, 0.92307, 0.73915], - [0.84452, 0.92342, 0.74544], - [0.83906, 0.92365, 0.75155], - [0.8333, 0.92375, 0.75746], - [0.82723, 0.92373, 0.76318], - [0.82086, 0.92358, 0.7687], - [0.81418, 0.9233, 0.77403], - [0.80722, 0.92289, 0.77916], - [0.79997, 0.92234, 0.7841], - [0.79243, 0.92166, 0.78883], - [0.78462, 0.92082, 0.79337], - [0.77654, 0.91986, 0.79771], - [0.7682, 0.91873, 0.80185], - [0.7596, 0.91747, 0.80581], - [0.75077, 0.91603, 0.80957], - [0.74169, 0.91444, 0.81313], - [0.7324, 0.91268, 0.81651], - [0.72287, 0.91075, 0.8197], - [0.71314, 0.90865, 0.8227], - [0.70322, 0.90636, 0.82551], - [0.69311, 0.90389, 0.82814], - [0.68283, 0.90124, 0.83059], - [0.67239, 0.89839, 0.83284], - [0.6618, 0.89535, 0.83492], - [0.65107, 0.89211, 0.83682], - [0.64024, 0.88868, 0.83853], - [0.6293, 0.88504, 0.84006], - [0.61828, 0.8812, 0.84141], - [0.60721, 0.87716, 0.84258], - [0.59608, 0.87292, 0.84357], - [0.58494, 0.86849, 0.84438], - [0.57379, 0.86386, 0.84502], - [0.56267, 0.85903, 0.84548], - [0.55159, 0.85402, 0.84576], - [0.54058, 0.84884, 0.84588], - [0.52966, 0.84347, 0.84582], - [0.51886, 0.83795, 0.8456], - [0.50819, 0.83227, 0.84522], - [0.49767, 0.82643, 0.84467], - [0.48733, 0.82046, 0.84397], - [0.47718, 0.81436, 0.84312], - [0.46725, 0.80814, 0.84213], - [0.45755, 0.8018, 0.84099], - [0.44809, 0.79537, 0.83973], - [0.43889, 0.78885, 0.83833], - [0.42997, 0.78225, 0.83681], - [0.42131, 0.77557, 0.83517], - [0.41296, 0.76883, 0.83343], - [0.40486, 0.76204, 0.83159], - [0.39707, 0.75521, 0.82964], - [0.38957, 0.74833, 0.82761], - [0.38235, 0.74142, 0.82549], - [0.37542, 0.7345, 0.8233], - [0.36877, 0.72754, 0.82104], - [0.36238, 0.72058, 0.8187], - [0.35627, 0.71361, 0.81632], - [0.3504, 0.70664, 0.81387], - [0.34477, 0.69966, 0.81138], - [0.33939, 0.69269, 0.80884], - [0.33422, 0.68572, 0.80626], - [0.32926, 0.67875, 0.80364], - [0.32448, 0.67181, 0.801], - [0.31992, 0.66486, 0.79832], - [0.31551, 0.65795, 0.79562], - [0.31127, 0.65104, 0.7929], - [0.30718, 0.64414, 0.79015], - [0.30322, 0.63727, 0.78739], - [0.29942, 0.63042, 0.78462], - [0.29571, 0.62358, 0.78184], - [0.29213, 0.61676, 0.77904], - [0.28864, 0.60995, 0.77624], - [0.28523, 0.60318, 0.77343], - [0.28193, 0.59642, 0.77063], - [0.2787, 0.58967, 0.76781], - [0.27554, 0.58296, 0.765], - [0.27241, 0.57628, 0.76218], - [0.26939, 0.56959, 0.75937], - [0.26638, 0.56295, 0.75656], - [0.26345, 0.5563, 0.75375], - [0.26053, 0.5497, 0.75095], - [0.25766, 0.54311, 0.74814], - [0.25486, 0.53655, 0.74534], - [0.25205, 0.53, 0.74255], - [0.24928, 0.52347, 0.73977], - [0.24654, 0.51697, 0.73698], - [0.24382, 0.51048, 0.73421], - [0.24114, 0.50402, 0.73143], - [0.23846, 0.49758, 0.72867], - [0.23583, 0.49117, 0.72592], - [0.23317, 0.48475, 0.72317], - [0.23056, 0.47838, 0.72043], - [0.22798, 0.47202, 0.7177], - [0.22538, 0.46567, 0.71496], - [0.22282, 0.45936, 0.71224], - [0.22026, 0.45306, 0.70953], - [0.2177, 0.44678, 0.70682], - [0.21514, 0.44051, 0.70412], - [0.21262, 0.43427, 0.70142], - [0.21009, 0.42806, 0.69874], - [0.20758, 0.42184, 0.69606], - [0.20507, 0.41566, 0.69339], - [0.20256, 0.4095, 0.69071], - [0.20005, 0.40335, 0.68806], - [0.19757, 0.3972, 0.6854], - [0.19509, 0.3911, 0.68275], - [0.19259, 0.38498, 0.6801], - [0.1901, 0.3789, 0.67748], - [0.18765, 0.37283, 0.67484], - [0.18515, 0.36678, 0.67222], - [0.18262, 0.36073, 0.66959], - [0.18013, 0.35472, 0.66697], - [0.17766, 0.3487, 0.66436], - [0.17513, 0.34271, 0.66176], - [0.17259, 0.33671, 0.65915], - [0.17007, 0.33072, 0.65656], - [0.16752, 0.32475, 0.65396], - [0.16494, 0.3188, 0.65137], - [0.16238, 0.31285, 0.64878], - [0.15974, 0.30691, 0.64619], - [0.15712, 0.30097, 0.64361], - [0.15446, 0.29504, 0.64103], - [0.15176, 0.28914, 0.63846], - [0.14904, 0.28322, 0.63589], - [0.14627, 0.2773, 0.63331], - [0.14346, 0.27138, 0.63075], - [0.1406, 0.26547, 0.62818], - [0.13769, 0.25957, 0.62561], - [0.1347, 0.25365, 0.62305], - [0.13163, 0.24774, 0.62049], - [0.12849, 0.24182, 0.61792], - [0.12528, 0.2359, 0.61535], - [0.12194, 0.22993, 0.61279], - [0.11859, 0.22399, 0.61023], - [0.11502, 0.21805, 0.60768], - [0.11142, 0.21209, 0.60511], - [0.10761, 0.20611, 0.60255], - [0.1037, 0.20006, 0.59999], -]; - -export const colormap_romao_data: Array<[number, number, number]> = [ - [0.45137, 0.22346, 0.34187], - [0.45418, 0.22244, 0.3361], - [0.45696, 0.22158, 0.33043], - [0.45975, 0.2209, 0.32483], - [0.46251, 0.22035, 0.31935], - [0.46527, 0.21994, 0.31394], - [0.46803, 0.21968, 0.30862], - [0.47078, 0.21958, 0.30337], - [0.47352, 0.21962, 0.29822], - [0.47628, 0.21982, 0.29316], - [0.47902, 0.22017, 0.28818], - [0.48178, 0.22067, 0.2833], - [0.48453, 0.2213, 0.2785], - [0.48731, 0.22208, 0.27379], - [0.49008, 0.22304, 0.26917], - [0.49286, 0.22411, 0.26461], - [0.49567, 0.22536, 0.26016], - [0.4985, 0.22677, 0.25579], - [0.50134, 0.22833, 0.25153], - [0.50419, 0.22999, 0.24733], - [0.50707, 0.23188, 0.24322], - [0.50997, 0.23387, 0.23923], - [0.5129, 0.23605, 0.23533], - [0.51584, 0.23835, 0.23151], - [0.51884, 0.24082, 0.22779], - [0.52184, 0.24345, 0.22414], - [0.52489, 0.24625, 0.22065], - [0.52797, 0.2492, 0.2172], - [0.53108, 0.25231, 0.21387], - [0.53423, 0.25556, 0.21064], - [0.53742, 0.25899, 0.20753], - [0.54063, 0.26255, 0.20452], - [0.54389, 0.26628, 0.20158], - [0.54718, 0.27017, 0.19879], - [0.55051, 0.27419, 0.19613], - [0.55389, 0.27839, 0.19356], - [0.55731, 0.28273, 0.19109], - [0.56075, 0.2872, 0.18877], - [0.56424, 0.29186, 0.18655], - [0.56777, 0.29665, 0.18446], - [0.57134, 0.30157, 0.18248], - [0.57495, 0.30666, 0.18065], - [0.5786, 0.31186, 0.17898], - [0.58228, 0.31724, 0.17743], - [0.58602, 0.32275, 0.17597], - [0.58977, 0.32838, 0.17473], - [0.59358, 0.33415, 0.17358], - [0.59742, 0.34005, 0.17261], - [0.60129, 0.34606, 0.17179], - [0.60519, 0.35223, 0.17114], - [0.60915, 0.35851, 0.17065], - [0.61311, 0.36491, 0.17034], - [0.61713, 0.37143, 0.1702], - [0.62118, 0.37808, 0.17023], - [0.62526, 0.38483, 0.17046], - [0.62937, 0.39171, 0.17087], - [0.63352, 0.39869, 0.17148], - [0.63769, 0.40579, 0.17229], - [0.6419, 0.41299, 0.17332], - [0.64613, 0.42029, 0.17458], - [0.65041, 0.42771, 0.176], - [0.6547, 0.43522, 0.17774], - [0.65904, 0.44283, 0.17962], - [0.66341, 0.45054, 0.18175], - [0.6678, 0.45834, 0.18416], - [0.67222, 0.46625, 0.1868], - [0.67667, 0.47425, 0.18968], - [0.68114, 0.48233, 0.19283], - [0.68566, 0.49051, 0.19624], - [0.69019, 0.49878, 0.19987], - [0.69474, 0.50712, 0.20384], - [0.69933, 0.51554, 0.20803], - [0.70394, 0.52406, 0.21251], - [0.70858, 0.53265, 0.21726], - [0.71322, 0.5413, 0.22229], - [0.7179, 0.55003, 0.22761], - [0.72257, 0.55881, 0.23318], - [0.72727, 0.56767, 0.23907], - [0.73197, 0.57658, 0.24521], - [0.73666, 0.58553, 0.25168], - [0.74136, 0.59451, 0.25837], - [0.74605, 0.60354, 0.26537], - [0.75073, 0.61259, 0.27263], - [0.75538, 0.62166, 0.28017], - [0.76001, 0.63075, 0.28796], - [0.7646, 0.63982, 0.29602], - [0.76914, 0.64889, 0.30433], - [0.77363, 0.65793, 0.31287], - [0.77806, 0.66694, 0.32165], - [0.78242, 0.6759, 0.33066], - [0.78669, 0.68481, 0.33988], - [0.79087, 0.69365, 0.34929], - [0.79494, 0.7024, 0.35888], - [0.7989, 0.71106, 0.36867], - [0.80273, 0.71961, 0.37859], - [0.80642, 0.72803, 0.38866], - [0.80996, 0.73631, 0.39885], - [0.81334, 0.74446, 0.40916], - [0.81655, 0.75244, 0.41957], - [0.81956, 0.76025, 0.43004], - [0.82239, 0.76787, 0.44057], - [0.82501, 0.7753, 0.45115], - [0.82742, 0.78252, 0.46174], - [0.8296, 0.78953, 0.47235], - [0.83155, 0.79631, 0.48293], - [0.83326, 0.80287, 0.49349], - [0.83472, 0.80919, 0.50402], - [0.83592, 0.81526, 0.51449], - [0.83686, 0.82109, 0.52487], - [0.83753, 0.82666, 0.53517], - [0.83793, 0.83198, 0.54537], - [0.83805, 0.83703, 0.55546], - [0.83788, 0.84182, 0.56542], - [0.83744, 0.84635, 0.57525], - [0.8367, 0.85061, 0.58493], - [0.83567, 0.85462, 0.59446], - [0.83435, 0.85835, 0.60382], - [0.83274, 0.86183, 0.61301], - [0.83084, 0.86504, 0.62202], - [0.82864, 0.868, 0.63085], - [0.82615, 0.87068, 0.63949], - [0.82337, 0.87312, 0.64792], - [0.8203, 0.87531, 0.65617], - [0.81695, 0.87724, 0.6642], - [0.81331, 0.87892, 0.67203], - [0.80939, 0.88036, 0.67964], - [0.80518, 0.88156, 0.68705], - [0.80071, 0.8825, 0.69424], - [0.79595, 0.88322, 0.70121], - [0.79094, 0.8837, 0.70797], - [0.78566, 0.88395, 0.7145], - [0.78012, 0.88396, 0.72082], - [0.77433, 0.88375, 0.72692], - [0.7683, 0.88331, 0.73279], - [0.76203, 0.88264, 0.73844], - [0.75553, 0.88177, 0.74387], - [0.74879, 0.88066, 0.74908], - [0.74184, 0.87934, 0.75407], - [0.73468, 0.87781, 0.75884], - [0.72731, 0.87607, 0.76339], - [0.71976, 0.87411, 0.76772], - [0.71201, 0.87195, 0.77184], - [0.70408, 0.86958, 0.77573], - [0.69599, 0.86701, 0.77941], - [0.68774, 0.86425, 0.78288], - [0.67934, 0.86127, 0.78614], - [0.67081, 0.85811, 0.78919], - [0.66215, 0.85476, 0.79202], - [0.65336, 0.8512, 0.79465], - [0.64448, 0.84747, 0.79707], - [0.6355, 0.84356, 0.7993], - [0.62645, 0.83947, 0.80131], - [0.61732, 0.83519, 0.80313], - [0.60814, 0.83075, 0.80476], - [0.59891, 0.82614, 0.80619], - [0.58965, 0.82137, 0.80743], - [0.58037, 0.81644, 0.80848], - [0.57108, 0.81135, 0.80935], - [0.56181, 0.80612, 0.81004], - [0.55255, 0.80074, 0.81055], - [0.54332, 0.79522, 0.81088], - [0.53412, 0.78958, 0.81105], - [0.525, 0.7838, 0.81105], - [0.51593, 0.77791, 0.81088], - [0.50695, 0.77189, 0.81055], - [0.49808, 0.76577, 0.81007], - [0.48928, 0.75954, 0.80944], - [0.48061, 0.75321, 0.80866], - [0.47207, 0.7468, 0.80773], - [0.46365, 0.74029, 0.80667], - [0.45539, 0.7337, 0.80546], - [0.44728, 0.72703, 0.80413], - [0.43934, 0.7203, 0.80266], - [0.43158, 0.7135, 0.80107], - [0.42398, 0.70664, 0.79936], - [0.41658, 0.69971, 0.79752], - [0.40938, 0.69275, 0.79557], - [0.40237, 0.68572, 0.79351], - [0.3956, 0.67865, 0.79133], - [0.38903, 0.67155, 0.78905], - [0.38267, 0.66441, 0.78666], - [0.37656, 0.65724, 0.78416], - [0.37066, 0.65003, 0.78155], - [0.36502, 0.64279, 0.77884], - [0.35961, 0.63552, 0.77604], - [0.35446, 0.62824, 0.77312], - [0.34955, 0.62094, 0.77011], - [0.3449, 0.6136, 0.767], - [0.34051, 0.60625, 0.76378], - [0.33637, 0.59889, 0.76047], - [0.33253, 0.59151, 0.75704], - [0.32893, 0.58412, 0.75351], - [0.32559, 0.57671, 0.74987], - [0.32256, 0.56928, 0.74613], - [0.31978, 0.56186, 0.74228], - [0.31727, 0.55441, 0.7383], - [0.31505, 0.54695, 0.73422], - [0.31311, 0.53948, 0.73002], - [0.31144, 0.53201, 0.72569], - [0.31007, 0.52453, 0.72124], - [0.30897, 0.51704, 0.71667], - [0.30811, 0.50955, 0.71197], - [0.30755, 0.50205, 0.70713], - [0.30726, 0.49456, 0.70216], - [0.30723, 0.48707, 0.69706], - [0.30746, 0.47958, 0.69182], - [0.30795, 0.4721, 0.68643], - [0.3087, 0.46463, 0.6809], - [0.30968, 0.45716, 0.67525], - [0.31088, 0.44973, 0.66944], - [0.31228, 0.44232, 0.6635], - [0.31393, 0.43493, 0.65741], - [0.31578, 0.42758, 0.65118], - [0.3178, 0.42025, 0.64482], - [0.32001, 0.41299, 0.63833], - [0.32238, 0.40577, 0.6317], - [0.32489, 0.39861, 0.62495], - [0.32755, 0.39152, 0.61809], - [0.33035, 0.38448, 0.61111], - [0.33327, 0.37755, 0.60402], - [0.33627, 0.37068, 0.59684], - [0.33939, 0.36392, 0.58955], - [0.34257, 0.35728, 0.58219], - [0.3458, 0.35073, 0.57476], - [0.34912, 0.34428, 0.56727], - [0.35247, 0.33797, 0.55971], - [0.35587, 0.33179, 0.55212], - [0.35927, 0.32574, 0.54448], - [0.36271, 0.31986, 0.53684], - [0.36617, 0.31411, 0.52917], - [0.36961, 0.30852, 0.52148], - [0.37306, 0.30306, 0.51382], - [0.37652, 0.2978, 0.50615], - [0.37994, 0.29269, 0.49854], - [0.38336, 0.28775, 0.49094], - [0.38674, 0.28301, 0.48337], - [0.39011, 0.27842, 0.47586], - [0.39346, 0.27401, 0.4684], - [0.39677, 0.26978, 0.461], - [0.40006, 0.26573, 0.45366], - [0.40333, 0.26185, 0.4464], - [0.40655, 0.25815, 0.43921], - [0.40974, 0.25466, 0.43212], - [0.4129, 0.25132, 0.42509], - [0.41602, 0.24817, 0.41813], - [0.41912, 0.24515, 0.41128], - [0.42218, 0.24235, 0.40451], - [0.42522, 0.23972, 0.39784], - [0.42823, 0.23728, 0.39126], - [0.43121, 0.23498, 0.38475], - [0.43415, 0.23282, 0.37836], - [0.43708, 0.23086, 0.37204], - [0.43998, 0.22907, 0.36583], - [0.44286, 0.22743, 0.3597], - [0.44571, 0.22596, 0.35366], - [0.44855, 0.2246, 0.34773], -]; - -export const colormap_tofino_data: Array<[number, number, number]> = [ - [0.87044, 0.84978, 0.99992], - [0.85983, 0.84232, 0.99532], - [0.84923, 0.83488, 0.99073], - [0.83862, 0.82744, 0.98614], - [0.82803, 0.82001, 0.98155], - [0.81744, 0.8126, 0.97696], - [0.80685, 0.80519, 0.97238], - [0.79627, 0.7978, 0.96779], - [0.7857, 0.79041, 0.9632], - [0.77513, 0.78303, 0.95862], - [0.76458, 0.77566, 0.95404], - [0.75403, 0.76829, 0.94946], - [0.74349, 0.76094, 0.94489], - [0.73296, 0.75358, 0.94031], - [0.72244, 0.74624, 0.93573], - [0.71193, 0.73891, 0.93116], - [0.70143, 0.73157, 0.92659], - [0.69094, 0.72424, 0.92202], - [0.68047, 0.71693, 0.91745], - [0.67001, 0.70961, 0.91288], - [0.65956, 0.70229, 0.90831], - [0.64912, 0.69498, 0.90373], - [0.63869, 0.68767, 0.89915], - [0.62827, 0.68036, 0.89457], - [0.61786, 0.67306, 0.88996], - [0.60747, 0.66575, 0.88535], - [0.59708, 0.65844, 0.88072], - [0.58669, 0.65113, 0.87608], - [0.57633, 0.6438, 0.8714], - [0.56595, 0.63648, 0.86669], - [0.55558, 0.62912, 0.86194], - [0.54523, 0.62176, 0.85713], - [0.53488, 0.61438, 0.85228], - [0.52453, 0.60699, 0.84735], - [0.51419, 0.59956, 0.84234], - [0.50383, 0.5921, 0.83724], - [0.49349, 0.58461, 0.83202], - [0.48315, 0.57708, 0.82669], - [0.47281, 0.5695, 0.82121], - [0.46249, 0.5619, 0.81559], - [0.4522, 0.55424, 0.80979], - [0.44191, 0.54653, 0.80381], - [0.43166, 0.53878, 0.79763], - [0.42143, 0.53097, 0.79123], - [0.41127, 0.52313, 0.78461], - [0.40119, 0.51523, 0.77775], - [0.39118, 0.5073, 0.77064], - [0.38127, 0.49933, 0.76327], - [0.37146, 0.49137, 0.75565], - [0.36183, 0.48335, 0.74777], - [0.35233, 0.47535, 0.73963], - [0.34304, 0.46735, 0.73123], - [0.33394, 0.45936, 0.72259], - [0.32504, 0.4514, 0.71373], - [0.31641, 0.44349, 0.70464], - [0.30802, 0.43563, 0.69535], - [0.29991, 0.42782, 0.68588], - [0.29207, 0.42009, 0.67624], - [0.28451, 0.41245, 0.66646], - [0.27726, 0.40487, 0.65655], - [0.27029, 0.39741, 0.64654], - [0.26359, 0.39004, 0.63644], - [0.25716, 0.38279, 0.62626], - [0.25101, 0.37562, 0.61604], - [0.24508, 0.36857, 0.60577], - [0.23943, 0.36161, 0.5955], - [0.23398, 0.35476, 0.58521], - [0.22876, 0.34798, 0.57491], - [0.22369, 0.34131, 0.56463], - [0.21881, 0.33473, 0.55436], - [0.21409, 0.3282, 0.54411], - [0.20949, 0.32177, 0.53389], - [0.20502, 0.31541, 0.52371], - [0.20064, 0.30912, 0.51356], - [0.19641, 0.30285, 0.50343], - [0.19221, 0.29668, 0.49335], - [0.18813, 0.29053, 0.48331], - [0.18406, 0.28444, 0.47331], - [0.18006, 0.27841, 0.46335], - [0.17611, 0.27238, 0.45343], - [0.17224, 0.26643, 0.44356], - [0.16839, 0.2605, 0.43371], - [0.16459, 0.25462, 0.42392], - [0.1608, 0.24876, 0.41418], - [0.15705, 0.2429, 0.40446], - [0.15332, 0.23714, 0.3948], - [0.14967, 0.23137, 0.38518], - [0.14601, 0.22564, 0.37561], - [0.14238, 0.21994, 0.36609], - [0.13878, 0.21428, 0.3566], - [0.13523, 0.20865, 0.34717], - [0.13171, 0.20306, 0.33777], - [0.12823, 0.19751, 0.32844], - [0.12476, 0.192, 0.31915], - [0.12134, 0.18655, 0.30992], - [0.11804, 0.18112, 0.30072], - [0.11468, 0.17575, 0.29162], - [0.11149, 0.17047, 0.28256], - [0.10825, 0.16519, 0.27356], - [0.10512, 0.16001, 0.26461], - [0.10208, 0.15492, 0.25575], - [0.099092, 0.14991, 0.24696], - [0.096147, 0.14496, 0.23825], - [0.093305, 0.14005, 0.22961], - [0.090594, 0.13531, 0.22111], - [0.087928, 0.13068, 0.21266], - [0.085292, 0.12614, 0.20436], - [0.082823, 0.12168, 0.19614], - [0.080421, 0.11744, 0.18808], - [0.078086, 0.11339, 0.18011], - [0.075905, 0.10947, 0.17234], - [0.073885, 0.10569, 0.16474], - [0.07186, 0.10213, 0.1573], - [0.069982, 0.098819, 0.15012], - [0.068226, 0.095733, 0.14311], - [0.066537, 0.092861, 0.13632], - [0.064955, 0.090276, 0.12989], - [0.063267, 0.087897, 0.12362], - [0.061329, 0.085713, 0.11774], - [0.059549, 0.084005, 0.11217], - [0.057509, 0.082538, 0.10693], - [0.055684, 0.081475, 0.10197], - [0.05386, 0.080759, 0.097418], - [0.05223, 0.080481, 0.093171], - [0.050913, 0.080625, 0.089271], - [0.049943, 0.081198, 0.085513], - [0.049353, 0.08218, 0.082189], - [0.049079, 0.083464, 0.079009], - [0.049155, 0.085141, 0.076274], - [0.049556, 0.087226, 0.074], - [0.050267, 0.089512, 0.072019], - [0.051322, 0.092107, 0.0705], - [0.052671, 0.094931, 0.069496], - [0.054312, 0.097914, 0.068834], - [0.05624, 0.10103, 0.068579], - [0.058195, 0.10432, 0.068741], - [0.06029, 0.10787, 0.06926], - [0.062176, 0.11172, 0.07], - [0.063928, 0.11578, 0.071095], - [0.065475, 0.12005, 0.072347], - [0.066838, 0.12459, 0.073908], - [0.068268, 0.1293, 0.075503], - [0.069792, 0.13418, 0.077268], - [0.071436, 0.13913, 0.079173], - [0.073206, 0.14428, 0.081195], - [0.075035, 0.14952, 0.083188], - [0.076994, 0.15483, 0.085288], - [0.079073, 0.16025, 0.087584], - [0.081282, 0.16579, 0.089893], - [0.083484, 0.17143, 0.09232], - [0.085728, 0.17716, 0.094882], - [0.088156, 0.18292, 0.097452], - [0.090584, 0.1888, 0.10012], - [0.093019, 0.19475, 0.1029], - [0.095617, 0.2007, 0.10572], - [0.098237, 0.20681, 0.10858], - [0.10086, 0.21289, 0.11157], - [0.1036, 0.21908, 0.11451], - [0.10636, 0.2253, 0.11758], - [0.10914, 0.2316, 0.12066], - [0.11197, 0.23791, 0.1238], - [0.11479, 0.24426, 0.12698], - [0.11773, 0.25069, 0.13025], - [0.12064, 0.25715, 0.13347], - [0.1236, 0.26366, 0.13674], - [0.12662, 0.27019, 0.14004], - [0.12966, 0.27675, 0.14341], - [0.13269, 0.28335, 0.14675], - [0.13572, 0.28998, 0.15017], - [0.13883, 0.29667, 0.15355], - [0.14195, 0.30336, 0.157], - [0.14509, 0.31012, 0.16044], - [0.1482, 0.31687, 0.16397], - [0.15136, 0.32367, 0.16745], - [0.15455, 0.33049, 0.17095], - [0.15775, 0.33736, 0.1745], - [0.16098, 0.34423, 0.17807], - [0.16424, 0.35115, 0.18159], - [0.16749, 0.35809, 0.18522], - [0.17077, 0.36506, 0.18882], - [0.17409, 0.37206, 0.19244], - [0.17746, 0.37909, 0.1961], - [0.18081, 0.38615, 0.19975], - [0.18425, 0.39325, 0.20347], - [0.18776, 0.4004, 0.20721], - [0.19125, 0.40756, 0.21096], - [0.19487, 0.41476, 0.21474], - [0.19852, 0.422, 0.21859], - [0.20228, 0.4293, 0.22246], - [0.20618, 0.43663, 0.22639], - [0.21013, 0.44402, 0.23034], - [0.21425, 0.45145, 0.23439], - [0.21851, 0.45893, 0.23847], - [0.22294, 0.46647, 0.24264], - [0.22756, 0.47407, 0.24689], - [0.23238, 0.48173, 0.25124], - [0.23745, 0.48944, 0.25565], - [0.24273, 0.49723, 0.26018], - [0.24834, 0.50507, 0.26479], - [0.25421, 0.51297, 0.26955], - [0.26039, 0.52093, 0.27439], - [0.26689, 0.52894, 0.27938], - [0.27376, 0.537, 0.28445], - [0.28094, 0.54509, 0.28968], - [0.28851, 0.55322, 0.29502], - [0.29643, 0.56137, 0.30049], - [0.30471, 0.56954, 0.3061], - [0.31334, 0.5777, 0.31178], - [0.32232, 0.58587, 0.31761], - [0.33161, 0.594, 0.32353], - [0.34124, 0.6021, 0.32956], - [0.35116, 0.61015, 0.33565], - [0.36134, 0.61814, 0.34183], - [0.37178, 0.62607, 0.34807], - [0.38245, 0.63392, 0.35437], - [0.39332, 0.64167, 0.3607], - [0.40437, 0.64934, 0.36709], - [0.41558, 0.6569, 0.37349], - [0.42692, 0.66435, 0.37991], - [0.43837, 0.67171, 0.38633], - [0.4499, 0.67896, 0.39277], - [0.46151, 0.68612, 0.39919], - [0.47317, 0.69317, 0.40562], - [0.48488, 0.70011, 0.41201], - [0.49662, 0.70698, 0.41839], - [0.50839, 0.71375, 0.42477], - [0.52015, 0.72044, 0.43112], - [0.53193, 0.72705, 0.43744], - [0.54371, 0.7336, 0.44374], - [0.55548, 0.74009, 0.45002], - [0.56726, 0.74651, 0.45628], - [0.57902, 0.75288, 0.46252], - [0.59077, 0.75922, 0.46875], - [0.60252, 0.76551, 0.47496], - [0.61425, 0.77177, 0.48113], - [0.62598, 0.778, 0.48732], - [0.63771, 0.7842, 0.49347], - [0.64942, 0.79038, 0.49962], - [0.66112, 0.79653, 0.50576], - [0.67283, 0.80268, 0.5119], - [0.68452, 0.80881, 0.51803], - [0.69622, 0.81492, 0.52415], - [0.7079, 0.82103, 0.53026], - [0.71959, 0.82713, 0.53638], - [0.73128, 0.83322, 0.54248], - [0.74297, 0.83931, 0.5486], - [0.75466, 0.84539, 0.5547], - [0.76635, 0.85147, 0.5608], - [0.77804, 0.85754, 0.56691], - [0.78974, 0.86362, 0.57302], - [0.80144, 0.86969, 0.57914], - [0.81315, 0.87576, 0.58525], - [0.82486, 0.88183, 0.59137], - [0.83658, 0.88789, 0.5975], - [0.8483, 0.89396, 0.60363], - [0.86003, 0.90003, 0.60976], -]; - -export const colormap_tokyo_data: Array<[number, number, number]> = [ - [0.10387, 0.056805, 0.20243], - [0.10975, 0.059104, 0.20564], - [0.11566, 0.061046, 0.20884], - [0.1216, 0.063055, 0.21209], - [0.12757, 0.064935, 0.21531], - [0.13351, 0.066895, 0.21858], - [0.13939, 0.068939, 0.22184], - [0.14535, 0.070894, 0.22512], - [0.15119, 0.072938, 0.22845], - [0.15708, 0.07497, 0.23177], - [0.16298, 0.077038, 0.23511], - [0.16886, 0.079188, 0.23844], - [0.17475, 0.081435, 0.24182], - [0.18061, 0.083639, 0.24519], - [0.18652, 0.085843, 0.24863], - [0.19242, 0.088221, 0.25206], - [0.19833, 0.090586, 0.2555], - [0.20429, 0.092949, 0.25898], - [0.21021, 0.095479, 0.26246], - [0.21619, 0.098018, 0.26598], - [0.22212, 0.10056, 0.26951], - [0.22812, 0.10325, 0.27306], - [0.2341, 0.10596, 0.27664], - [0.24009, 0.10871, 0.28021], - [0.2461, 0.11159, 0.28383], - [0.25214, 0.11445, 0.28745], - [0.25815, 0.11746, 0.29112], - [0.26421, 0.12052, 0.29477], - [0.27026, 0.12365, 0.29845], - [0.27631, 0.12687, 0.30215], - [0.28236, 0.13021, 0.30588], - [0.28839, 0.13354, 0.3096], - [0.29442, 0.13697, 0.31333], - [0.30046, 0.14049, 0.31707], - [0.30651, 0.14408, 0.32083], - [0.3125, 0.14775, 0.32457], - [0.3185, 0.15147, 0.32834], - [0.32447, 0.15529, 0.33211], - [0.33042, 0.15918, 0.33586], - [0.33634, 0.16315, 0.33963], - [0.34223, 0.16717, 0.34337], - [0.34808, 0.17124, 0.34711], - [0.35387, 0.1754, 0.35084], - [0.35963, 0.17962, 0.35455], - [0.36533, 0.18389, 0.35824], - [0.37097, 0.18825, 0.36192], - [0.37657, 0.19261, 0.36557], - [0.38208, 0.19706, 0.3692], - [0.38753, 0.2015, 0.37279], - [0.3929, 0.20606, 0.37638], - [0.3982, 0.21059, 0.3799], - [0.40342, 0.21518, 0.3834], - [0.40854, 0.21982, 0.38685], - [0.41357, 0.22443, 0.39027], - [0.41851, 0.22913, 0.39364], - [0.42335, 0.2338, 0.39696], - [0.42811, 0.2385, 0.40025], - [0.43275, 0.24322, 0.40348], - [0.43729, 0.24796, 0.40666], - [0.44172, 0.25267, 0.40979], - [0.44603, 0.25739, 0.41286], - [0.45026, 0.26211, 0.41587], - [0.45436, 0.26682, 0.41882], - [0.45835, 0.27152, 0.42172], - [0.46223, 0.27624, 0.42457], - [0.466, 0.28088, 0.42737], - [0.46968, 0.28555, 0.43009], - [0.47321, 0.29019, 0.43276], - [0.47666, 0.29481, 0.43537], - [0.48, 0.29942, 0.43793], - [0.48321, 0.30398, 0.44041], - [0.48633, 0.30854, 0.44286], - [0.48934, 0.31305, 0.44524], - [0.49226, 0.31754, 0.44756], - [0.49507, 0.322, 0.44984], - [0.49779, 0.32642, 0.45206], - [0.5004, 0.33082, 0.45422], - [0.50292, 0.33521, 0.45633], - [0.50535, 0.33954, 0.45839], - [0.50771, 0.34383, 0.4604], - [0.50996, 0.34812, 0.46237], - [0.51213, 0.35236, 0.46431], - [0.51424, 0.35658, 0.46617], - [0.51624, 0.36075, 0.468], - [0.51819, 0.36491, 0.4698], - [0.52005, 0.36904, 0.47155], - [0.52185, 0.37313, 0.47324], - [0.52359, 0.37721, 0.47493], - [0.52526, 0.38125, 0.47656], - [0.52687, 0.38525, 0.47815], - [0.52841, 0.38925, 0.47973], - [0.5299, 0.39321, 0.48125], - [0.53134, 0.39714, 0.48276], - [0.53273, 0.40107, 0.48423], - [0.53406, 0.40495, 0.48567], - [0.53535, 0.40883, 0.4871], - [0.53661, 0.41269, 0.48849], - [0.53781, 0.41652, 0.48985], - [0.53897, 0.42033, 0.49121], - [0.54009, 0.42412, 0.49252], - [0.54118, 0.42791, 0.49383], - [0.54224, 0.43167, 0.49511], - [0.54326, 0.43542, 0.49637], - [0.54425, 0.43914, 0.49763], - [0.54522, 0.44286, 0.49885], - [0.54616, 0.44657, 0.50006], - [0.54706, 0.45026, 0.50126], - [0.54795, 0.45394, 0.50244], - [0.54882, 0.45761, 0.50361], - [0.54965, 0.46127, 0.50477], - [0.55048, 0.46492, 0.50591], - [0.55128, 0.46856, 0.50705], - [0.55207, 0.4722, 0.50818], - [0.55283, 0.47583, 0.50929], - [0.55358, 0.47945, 0.51039], - [0.55433, 0.48306, 0.51148], - [0.55505, 0.48667, 0.51257], - [0.55576, 0.49027, 0.51365], - [0.55646, 0.49387, 0.51472], - [0.55716, 0.49747, 0.51578], - [0.55783, 0.50106, 0.51684], - [0.5585, 0.50465, 0.5179], - [0.55917, 0.50823, 0.51895], - [0.55983, 0.5118, 0.51997], - [0.56047, 0.51538, 0.52102], - [0.56111, 0.51897, 0.52204], - [0.56175, 0.52253, 0.52308], - [0.56239, 0.52611, 0.5241], - [0.56301, 0.52969, 0.52511], - [0.56363, 0.53325, 0.52613], - [0.56425, 0.53684, 0.52714], - [0.56485, 0.5404, 0.52815], - [0.56546, 0.54398, 0.52916], - [0.56608, 0.54755, 0.53016], - [0.56669, 0.55112, 0.53116], - [0.56729, 0.5547, 0.53216], - [0.56789, 0.55827, 0.53315], - [0.5685, 0.56186, 0.53414], - [0.5691, 0.56543, 0.53513], - [0.5697, 0.56901, 0.53612], - [0.57031, 0.57261, 0.53711], - [0.57092, 0.5762, 0.5381], - [0.57153, 0.57978, 0.53908], - [0.57214, 0.58337, 0.54006], - [0.57276, 0.58696, 0.54104], - [0.57337, 0.59056, 0.54202], - [0.57399, 0.59417, 0.54301], - [0.57461, 0.59778, 0.54399], - [0.57524, 0.60139, 0.54497], - [0.57589, 0.60501, 0.54596], - [0.57653, 0.60864, 0.54694], - [0.57717, 0.61225, 0.54792], - [0.57782, 0.61589, 0.54891], - [0.57849, 0.61954, 0.54989], - [0.57918, 0.62318, 0.55087], - [0.57987, 0.62683, 0.55187], - [0.58056, 0.6305, 0.55286], - [0.58127, 0.63417, 0.55385], - [0.582, 0.63785, 0.55485], - [0.58274, 0.64153, 0.55585], - [0.5835, 0.64523, 0.55687], - [0.58428, 0.64895, 0.55789], - [0.58508, 0.65267, 0.55891], - [0.5859, 0.65641, 0.55995], - [0.58674, 0.66015, 0.56098], - [0.5876, 0.66392, 0.56204], - [0.5885, 0.6677, 0.5631], - [0.58942, 0.67149, 0.56418], - [0.59039, 0.67531, 0.56526], - [0.59139, 0.67914, 0.56637], - [0.59242, 0.683, 0.56749], - [0.59349, 0.68688, 0.56863], - [0.59461, 0.69078, 0.56979], - [0.59578, 0.6947, 0.57097], - [0.597, 0.69866, 0.57219], - [0.59826, 0.70264, 0.57342], - [0.5996, 0.70666, 0.57468], - [0.60099, 0.7107, 0.57599], - [0.60246, 0.71478, 0.57731], - [0.604, 0.7189, 0.57868], - [0.6056, 0.72305, 0.5801], - [0.60731, 0.72725, 0.58155], - [0.60909, 0.73148, 0.58305], - [0.61097, 0.73576, 0.5846], - [0.61294, 0.7401, 0.58621], - [0.61503, 0.74447, 0.58787], - [0.61723, 0.7489, 0.58959], - [0.61955, 0.75338, 0.59139], - [0.62198, 0.75792, 0.59325], - [0.62456, 0.76251, 0.59518], - [0.62727, 0.76716, 0.5972], - [0.63013, 0.77187, 0.5993], - [0.63314, 0.77664, 0.60148], - [0.6363, 0.78146, 0.60376], - [0.63963, 0.78635, 0.60611], - [0.64313, 0.79129, 0.60859], - [0.64681, 0.79629, 0.61116], - [0.65067, 0.80136, 0.61382], - [0.6547, 0.80648, 0.61662], - [0.65894, 0.81164, 0.61951], - [0.66337, 0.81686, 0.62251], - [0.66798, 0.82213, 0.62564], - [0.6728, 0.82743, 0.62888], - [0.6778, 0.83276, 0.63223], - [0.683, 0.83813, 0.6357], - [0.68839, 0.84351, 0.63929], - [0.69397, 0.84891, 0.64299], - [0.69973, 0.85431, 0.64681], - [0.70567, 0.85972, 0.65072], - [0.71178, 0.86509, 0.65474], - [0.71804, 0.87045, 0.65887], - [0.72445, 0.87578, 0.66309], - [0.731, 0.88106, 0.66739], - [0.73768, 0.88628, 0.67178], - [0.74447, 0.89143, 0.67624], - [0.75136, 0.89651, 0.68075], - [0.75833, 0.9015, 0.68534], - [0.76537, 0.90639, 0.68996], - [0.77246, 0.91117, 0.69462], - [0.77959, 0.91583, 0.69932], - [0.78675, 0.92037, 0.70404], - [0.79392, 0.92477, 0.70878], - [0.80108, 0.92904, 0.71351], - [0.80822, 0.93317, 0.71825], - [0.81534, 0.93716, 0.72297], - [0.82241, 0.94098, 0.72768], - [0.82944, 0.94466, 0.73237], - [0.8364, 0.94818, 0.73701], - [0.84329, 0.95154, 0.74163], - [0.8501, 0.95476, 0.74621], - [0.85683, 0.95782, 0.75075], - [0.86348, 0.96072, 0.75524], - [0.87002, 0.96348, 0.75967], - [0.87648, 0.96609, 0.76406], - [0.88284, 0.96857, 0.76839], - [0.8891, 0.9709, 0.77268], - [0.89526, 0.97311, 0.77691], - [0.90133, 0.97518, 0.78108], - [0.90729, 0.97714, 0.7852], - [0.91316, 0.97898, 0.78927], - [0.91894, 0.98071, 0.79329], - [0.92463, 0.98234, 0.79725], - [0.93023, 0.98386, 0.80117], - [0.93575, 0.9853, 0.80504], - [0.94119, 0.98664, 0.80888], - [0.94656, 0.98791, 0.81266], - [0.95185, 0.9891, 0.81642], - [0.95708, 0.99022, 0.82012], - [0.96225, 0.99128, 0.82381], - [0.96736, 0.99228, 0.82746], - [0.97242, 0.99323, 0.83108], - [0.97743, 0.99412, 0.83468], - [0.9824, 0.99498, 0.83825], - [0.98733, 0.99579, 0.84181], - [0.99222, 0.99658, 0.84535], - [0.99708, 0.99733, 0.84887], -]; - -export const colormap_turku_data: Array<[number, number, number]> = [ - [6.3216e-5, 5.1671e-6, 3.583e-5], - [0.0072897, 0.0072041, 0.006548], - [0.01471, 0.014597, 0.013245], - [0.021935, 0.021794, 0.019755], - [0.029159, 0.028991, 0.026252], - [0.03657, 0.036375, 0.032748], - [0.043586, 0.043359, 0.039417], - [0.050168, 0.049959, 0.045556], - [0.056203, 0.055961, 0.051274], - [0.061712, 0.061463, 0.056643], - [0.066992, 0.066746, 0.061506], - [0.071921, 0.071694, 0.066226], - [0.076552, 0.076296, 0.070642], - [0.081056, 0.080777, 0.074828], - [0.085276, 0.085021, 0.078791], - [0.089398, 0.08911, 0.08266], - [0.093274, 0.092973, 0.086288], - [0.09712, 0.096859, 0.089825], - [0.10104, 0.10079, 0.093141], - [0.10494, 0.10467, 0.096482], - [0.10893, 0.10862, 0.099864], - [0.11292, 0.11262, 0.10324], - [0.11686, 0.11656, 0.10659], - [0.12082, 0.1205, 0.10991], - [0.12484, 0.12448, 0.11321], - [0.12884, 0.1285, 0.11649], - [0.13289, 0.13251, 0.11975], - [0.13692, 0.1365, 0.123], - [0.14099, 0.14056, 0.1263], - [0.14505, 0.1446, 0.12953], - [0.14908, 0.14861, 0.13275], - [0.15314, 0.15267, 0.13591], - [0.15722, 0.15676, 0.1391], - [0.16135, 0.16081, 0.14228], - [0.16539, 0.16488, 0.14544], - [0.16953, 0.16899, 0.1485], - [0.17361, 0.17304, 0.15159], - [0.17774, 0.17714, 0.15466], - [0.18181, 0.18121, 0.15769], - [0.18596, 0.18534, 0.1607], - [0.19005, 0.18941, 0.16371], - [0.19419, 0.19352, 0.16664], - [0.19828, 0.19761, 0.16957], - [0.20239, 0.20169, 0.17243], - [0.20655, 0.20582, 0.1753], - [0.21064, 0.2099, 0.17815], - [0.21475, 0.21401, 0.18091], - [0.21887, 0.2181, 0.18368], - [0.22299, 0.22219, 0.18642], - [0.22709, 0.2263, 0.18912], - [0.2312, 0.23036, 0.19178], - [0.23531, 0.23447, 0.19445], - [0.23939, 0.23853, 0.19704], - [0.24347, 0.24261, 0.19958], - [0.24758, 0.24669, 0.20213], - [0.25167, 0.25076, 0.20466], - [0.25574, 0.25485, 0.20713], - [0.25982, 0.2589, 0.20956], - [0.2639, 0.26295, 0.21199], - [0.26794, 0.26699, 0.21436], - [0.272, 0.27106, 0.21672], - [0.27609, 0.2751, 0.21904], - [0.28012, 0.27914, 0.22133], - [0.28416, 0.28317, 0.22359], - [0.28821, 0.28719, 0.22583], - [0.29225, 0.29123, 0.22804], - [0.29629, 0.29524, 0.23019], - [0.30031, 0.29927, 0.23237], - [0.30434, 0.30327, 0.2345], - [0.30837, 0.30728, 0.23661], - [0.31238, 0.3113, 0.23866], - [0.31642, 0.3153, 0.24072], - [0.32044, 0.3193, 0.24276], - [0.32444, 0.3233, 0.24476], - [0.32846, 0.32729, 0.24677], - [0.33249, 0.33128, 0.24876], - [0.33649, 0.3353, 0.2507], - [0.34051, 0.33929, 0.25265], - [0.34452, 0.34327, 0.25458], - [0.34855, 0.34726, 0.25647], - [0.35257, 0.35125, 0.25836], - [0.35661, 0.35525, 0.26025], - [0.36062, 0.35922, 0.26211], - [0.36467, 0.36321, 0.26398], - [0.36872, 0.3672, 0.26582], - [0.37276, 0.3712, 0.26764], - [0.37684, 0.37519, 0.2695], - [0.38091, 0.3792, 0.2713], - [0.38497, 0.38321, 0.27313], - [0.38908, 0.3872, 0.27493], - [0.39318, 0.39122, 0.27675], - [0.3973, 0.39524, 0.27856], - [0.40144, 0.39924, 0.28035], - [0.4056, 0.40328, 0.28218], - [0.40977, 0.4073, 0.28397], - [0.41396, 0.41134, 0.28577], - [0.41817, 0.41538, 0.28759], - [0.42241, 0.41944, 0.28942], - [0.42668, 0.42348, 0.29125], - [0.43097, 0.42756, 0.29307], - [0.4353, 0.43163, 0.29491], - [0.43964, 0.4357, 0.29678], - [0.44402, 0.43979, 0.29864], - [0.44844, 0.44388, 0.30051], - [0.45289, 0.44797, 0.3024], - [0.45737, 0.4521, 0.30432], - [0.4619, 0.45621, 0.30627], - [0.46647, 0.46033, 0.3082], - [0.47109, 0.46448, 0.31018], - [0.47576, 0.46861, 0.31215], - [0.48046, 0.47276, 0.31418], - [0.48521, 0.47692, 0.31623], - [0.49003, 0.48108, 0.31829], - [0.4949, 0.48525, 0.3204], - [0.49981, 0.48942, 0.32252], - [0.5048, 0.49361, 0.32466], - [0.50984, 0.4978, 0.32685], - [0.51494, 0.50198, 0.32909], - [0.5201, 0.50615, 0.33133], - [0.52533, 0.51034, 0.33364], - [0.53062, 0.51453, 0.33596], - [0.53597, 0.5187, 0.33833], - [0.54139, 0.52287, 0.34075], - [0.54688, 0.52703, 0.3432], - [0.55243, 0.53117, 0.34568], - [0.55804, 0.53529, 0.34822], - [0.56373, 0.5394, 0.3508], - [0.56946, 0.54349, 0.3534], - [0.57527, 0.54755, 0.35606], - [0.58113, 0.55159, 0.35875], - [0.58704, 0.55558, 0.36149], - [0.59302, 0.55954, 0.36426], - [0.59904, 0.56346, 0.36708], - [0.6051, 0.56733, 0.36993], - [0.6112, 0.57114, 0.37282], - [0.61734, 0.5749, 0.37575], - [0.62351, 0.5786, 0.37871], - [0.6297, 0.58224, 0.3817], - [0.63592, 0.58581, 0.38472], - [0.64215, 0.58928, 0.38776], - [0.64837, 0.59271, 0.39084], - [0.65461, 0.59602, 0.39392], - [0.66083, 0.59926, 0.39703], - [0.66705, 0.6024, 0.40016], - [0.67324, 0.60545, 0.4033], - [0.6794, 0.60841, 0.40645], - [0.68554, 0.61126, 0.40961], - [0.69163, 0.614, 0.41278], - [0.69767, 0.61665, 0.41594], - [0.70367, 0.61918, 0.41911], - [0.7096, 0.6216, 0.42226], - [0.71548, 0.62393, 0.42543], - [0.72128, 0.62613, 0.42859], - [0.72702, 0.62824, 0.43175], - [0.73268, 0.63023, 0.43489], - [0.73826, 0.63212, 0.43802], - [0.74377, 0.63391, 0.44114], - [0.74919, 0.63559, 0.44426], - [0.75454, 0.63718, 0.44735], - [0.75979, 0.63867, 0.45046], - [0.76496, 0.64007, 0.45354], - [0.77004, 0.64138, 0.45662], - [0.77504, 0.64261, 0.4597], - [0.77996, 0.64375, 0.46277], - [0.7848, 0.64482, 0.46584], - [0.78955, 0.64583, 0.46892], - [0.79423, 0.64677, 0.472], - [0.79883, 0.64765, 0.47508], - [0.80335, 0.64847, 0.47816], - [0.80781, 0.64925, 0.48126], - [0.8122, 0.64999, 0.48437], - [0.81652, 0.65069, 0.48753], - [0.82078, 0.65136, 0.49069], - [0.82499, 0.652, 0.49388], - [0.82914, 0.65263, 0.49711], - [0.83324, 0.65324, 0.50037], - [0.83729, 0.65386, 0.50368], - [0.8413, 0.65448, 0.50704], - [0.84526, 0.6551, 0.51045], - [0.84919, 0.65575, 0.51393], - [0.85308, 0.65642, 0.51746], - [0.85694, 0.65711, 0.52105], - [0.86077, 0.65784, 0.52472], - [0.86458, 0.65861, 0.52847], - [0.86836, 0.65943, 0.5323], - [0.87211, 0.6603, 0.53622], - [0.87584, 0.66124, 0.54022], - [0.87955, 0.66225, 0.54432], - [0.88325, 0.66333, 0.54853], - [0.88692, 0.66449, 0.55281], - [0.89057, 0.66573, 0.55722], - [0.8942, 0.66707, 0.56172], - [0.89781, 0.6685, 0.56633], - [0.90139, 0.67004, 0.57104], - [0.90496, 0.67167, 0.57587], - [0.90849, 0.67342, 0.58079], - [0.912, 0.67527, 0.58583], - [0.91547, 0.67725, 0.59096], - [0.91891, 0.67933, 0.59619], - [0.92231, 0.68154, 0.60153], - [0.92567, 0.68387, 0.60696], - [0.92898, 0.68632, 0.61246], - [0.93224, 0.68889, 0.61806], - [0.93545, 0.69156, 0.62374], - [0.9386, 0.69436, 0.62947], - [0.94168, 0.69728, 0.63527], - [0.9447, 0.70031, 0.64113], - [0.94765, 0.70344, 0.64704], - [0.95052, 0.70669, 0.65298], - [0.95331, 0.71003, 0.65896], - [0.95602, 0.71346, 0.66497], - [0.95865, 0.717, 0.67099], - [0.96119, 0.7206, 0.67702], - [0.96363, 0.7243, 0.68304], - [0.96599, 0.72807, 0.68907], - [0.96826, 0.73191, 0.69507], - [0.97043, 0.73581, 0.70105], - [0.97251, 0.73978, 0.70702], - [0.97448, 0.74378, 0.71294], - [0.97637, 0.74785, 0.71883], - [0.97816, 0.75195, 0.72468], - [0.97987, 0.75608, 0.73048], - [0.98148, 0.76025, 0.73623], - [0.983, 0.76445, 0.74194], - [0.98444, 0.76867, 0.74759], - [0.98578, 0.77292, 0.75318], - [0.98705, 0.77719, 0.75873], - [0.98823, 0.78146, 0.76421], - [0.98935, 0.78575, 0.76963], - [0.99038, 0.79004, 0.775], - [0.99134, 0.79435, 0.78032], - [0.99224, 0.79865, 0.78558], - [0.99307, 0.80296, 0.79078], - [0.99383, 0.80727, 0.79594], - [0.99453, 0.81158, 0.80104], - [0.99518, 0.8159, 0.8061], - [0.99577, 0.8202, 0.81111], - [0.99632, 0.82451, 0.81608], - [0.99681, 0.82882, 0.821], - [0.99726, 0.83312, 0.82588], - [0.99767, 0.83743, 0.83074], - [0.99804, 0.84173, 0.83555], - [0.99837, 0.84602, 0.84033], - [0.99866, 0.85032, 0.84508], - [0.99892, 0.85461, 0.84981], - [0.99915, 0.8589, 0.85451], - [0.99934, 0.86319, 0.85919], - [0.99951, 0.86747, 0.86385], - [0.99965, 0.87176, 0.86849], - [0.99977, 0.87604, 0.87312], - [0.99986, 0.88032, 0.87773], - [0.99994, 0.88461, 0.88233], - [0.99999, 0.88889, 0.88693], - [1, 0.89317, 0.89151], - [1, 0.89746, 0.89609], - [1, 0.90174, 0.90067], -]; - -export const colormap_vik_data: Array<[number, number, number]> = [ - [0.0013282, 0.069836, 0.37953], - [0.0023664, 0.076475, 0.38352], - [0.0033042, 0.083083, 0.38749], - [0.0041459, 0.08959, 0.39148], - [0.0048968, 0.095948, 0.39545], - [0.0055632, 0.10227, 0.39941], - [0.0061512, 0.1085, 0.40339], - [0.0066676, 0.11469, 0.40734], - [0.0071192, 0.12085, 0.41129], - [0.0075116, 0.12696, 0.41523], - [0.0078503, 0.13307, 0.41917], - [0.0081413, 0.13909, 0.42308], - [0.0083912, 0.14517, 0.42701], - [0.0086057, 0.15114, 0.43091], - [0.0087895, 0.15714, 0.43481], - [0.0089466, 0.16315, 0.43869], - [0.0090802, 0.16914, 0.44259], - [0.0091935, 0.1751, 0.44646], - [0.0092897, 0.18105, 0.45034], - [0.0093719, 0.18705, 0.45421], - [0.0094431, 0.19303, 0.45808], - [0.0095061, 0.199, 0.46195], - [0.0095639, 0.20501, 0.46582], - [0.0096192, 0.21102, 0.46971], - [0.0096751, 0.21705, 0.47357], - [0.0097347, 0.22308, 0.47746], - [0.0098019, 0.22912, 0.48135], - [0.0098809, 0.23521, 0.48525], - [0.0099771, 0.24128, 0.48916], - [0.010098, 0.24739, 0.49308], - [0.010254, 0.25352, 0.49702], - [0.010463, 0.25968, 0.50097], - [0.010755, 0.26585, 0.50494], - [0.011176, 0.27204, 0.50893], - [0.011716, 0.2783, 0.51292], - [0.012286, 0.28455, 0.51695], - [0.012934, 0.29087, 0.521], - [0.01379, 0.29721, 0.52507], - [0.014838, 0.30358, 0.52918], - [0.016131, 0.31002, 0.53331], - [0.017711, 0.31647, 0.53748], - [0.01963, 0.32299, 0.54168], - [0.021948, 0.32955, 0.54593], - [0.02473, 0.33614, 0.55021], - [0.028047, 0.34283, 0.55454], - [0.03198, 0.34954, 0.55891], - [0.036812, 0.35633, 0.56334], - [0.042229, 0.36317, 0.56781], - [0.048008, 0.37009, 0.57235], - [0.054292, 0.37708, 0.57693], - [0.060963, 0.38413, 0.58157], - [0.068081, 0.39126, 0.58628], - [0.075457, 0.39846, 0.59104], - [0.083246, 0.40574, 0.59587], - [0.091425, 0.41309, 0.60075], - [0.099832, 0.4205, 0.6057], - [0.10859, 0.428, 0.61071], - [0.11769, 0.43557, 0.61577], - [0.12704, 0.44319, 0.6209], - [0.1367, 0.45089, 0.62606], - [0.14661, 0.45864, 0.63129], - [0.15679, 0.46646, 0.63656], - [0.16719, 0.47432, 0.64187], - [0.17781, 0.48224, 0.64722], - [0.18861, 0.49019, 0.6526], - [0.19958, 0.49819, 0.65802], - [0.21078, 0.5062, 0.66346], - [0.22212, 0.51426, 0.66892], - [0.2336, 0.52232, 0.6744], - [0.24523, 0.53041, 0.67989], - [0.257, 0.53852, 0.68541], - [0.26887, 0.54662, 0.69091], - [0.2808, 0.55472, 0.69643], - [0.29285, 0.56282, 0.70193], - [0.30498, 0.57091, 0.70745], - [0.31717, 0.579, 0.71295], - [0.32944, 0.58706, 0.71845], - [0.34173, 0.59512, 0.72393], - [0.35407, 0.60316, 0.72941], - [0.36646, 0.61119, 0.73488], - [0.37886, 0.61919, 0.74032], - [0.39131, 0.62716, 0.74576], - [0.40376, 0.63511, 0.75118], - [0.41623, 0.64305, 0.75658], - [0.42871, 0.65096, 0.76197], - [0.4412, 0.65884, 0.76734], - [0.4537, 0.6667, 0.7727], - [0.4662, 0.67454, 0.77804], - [0.4787, 0.68235, 0.78337], - [0.49121, 0.69014, 0.78868], - [0.50369, 0.69791, 0.79398], - [0.51618, 0.70566, 0.79926], - [0.52868, 0.71339, 0.80452], - [0.54115, 0.72109, 0.80977], - [0.55362, 0.72878, 0.81501], - [0.5661, 0.73644, 0.82023], - [0.57856, 0.74409, 0.82544], - [0.59101, 0.75172, 0.83063], - [0.60347, 0.75931, 0.83579], - [0.61591, 0.7669, 0.84094], - [0.62835, 0.77445, 0.84606], - [0.64078, 0.78199, 0.85115], - [0.6532, 0.78949, 0.85621], - [0.66563, 0.79694, 0.86121], - [0.67805, 0.80437, 0.86617], - [0.69046, 0.81174, 0.87106], - [0.70287, 0.81905, 0.87587], - [0.71526, 0.82629, 0.88057], - [0.72765, 0.83344, 0.88515], - [0.74002, 0.84048, 0.88957], - [0.75235, 0.84738, 0.89381], - [0.76466, 0.85413, 0.89782], - [0.77692, 0.86068, 0.90156], - [0.7891, 0.86699, 0.90499], - [0.80117, 0.87303, 0.90804], - [0.81311, 0.87874, 0.91065], - [0.82487, 0.88406, 0.91276], - [0.8364, 0.88893, 0.9143], - [0.84762, 0.89329, 0.9152], - [0.85847, 0.89707, 0.91539], - [0.86887, 0.90021, 0.91481], - [0.87873, 0.90264, 0.91342], - [0.88797, 0.9043, 0.91116], - [0.8965, 0.90518, 0.90803], - [0.90424, 0.90522, 0.90401], - [0.91115, 0.90442, 0.89913], - [0.91718, 0.9028, 0.89341], - [0.92229, 0.90037, 0.88691], - [0.92648, 0.89717, 0.87969], - [0.92979, 0.89326, 0.87183], - [0.93224, 0.8887, 0.8634], - [0.93388, 0.88355, 0.85448], - [0.93478, 0.87789, 0.84515], - [0.93501, 0.8718, 0.83549], - [0.93464, 0.86531, 0.82556], - [0.93375, 0.85852, 0.81542], - [0.93241, 0.85147, 0.80511], - [0.93068, 0.84421, 0.79468], - [0.92862, 0.83678, 0.78417], - [0.9263, 0.82921, 0.77358], - [0.92375, 0.82154, 0.76296], - [0.92102, 0.8138, 0.75231], - [0.91815, 0.806, 0.74166], - [0.91516, 0.79816, 0.73101], - [0.91208, 0.79029, 0.72037], - [0.90893, 0.78242, 0.70975], - [0.90574, 0.77454, 0.69915], - [0.90251, 0.76667, 0.68859], - [0.89925, 0.75881, 0.67805], - [0.89597, 0.75097, 0.66755], - [0.89269, 0.74315, 0.65709], - [0.8894, 0.73535, 0.64666], - [0.88612, 0.72757, 0.63627], - [0.88283, 0.71983, 0.62592], - [0.87956, 0.71211, 0.61562], - [0.87629, 0.70442, 0.60536], - [0.87303, 0.69676, 0.59514], - [0.86978, 0.68914, 0.58497], - [0.86655, 0.68154, 0.57483], - [0.86333, 0.67398, 0.56475], - [0.86012, 0.66645, 0.55471], - [0.85692, 0.65896, 0.54471], - [0.85373, 0.6515, 0.53475], - [0.85056, 0.64406, 0.52484], - [0.8474, 0.63667, 0.51497], - [0.84426, 0.6293, 0.50515], - [0.84113, 0.62196, 0.49537], - [0.838, 0.61465, 0.48563], - [0.83489, 0.60739, 0.47594], - [0.8318, 0.60014, 0.46628], - [0.82872, 0.59294, 0.45668], - [0.82564, 0.58576, 0.44711], - [0.82258, 0.5786, 0.43759], - [0.81953, 0.57148, 0.42811], - [0.8165, 0.56439, 0.41866], - [0.81346, 0.55733, 0.40926], - [0.81045, 0.55028, 0.39989], - [0.80744, 0.54327, 0.39058], - [0.80445, 0.53629, 0.3813], - [0.80145, 0.52933, 0.37204], - [0.79847, 0.52238, 0.36284], - [0.7955, 0.51546, 0.35366], - [0.79253, 0.50857, 0.34452], - [0.78957, 0.50169, 0.33544], - [0.78662, 0.49483, 0.32634], - [0.78366, 0.48798, 0.31731], - [0.7807, 0.48112, 0.3083], - [0.77774, 0.4743, 0.29933], - [0.77476, 0.46746, 0.29035], - [0.77179, 0.46062, 0.28142], - [0.76879, 0.45378, 0.27251], - [0.76578, 0.44693, 0.26364], - [0.76272, 0.44005, 0.25476], - [0.75964, 0.43315, 0.24587], - [0.75651, 0.4262, 0.23705], - [0.75332, 0.41922, 0.22819], - [0.75005, 0.41216, 0.21933], - [0.7467, 0.40503, 0.21047], - [0.74324, 0.39782, 0.20159], - [0.73965, 0.39049, 0.19274], - [0.7359, 0.38306, 0.18385], - [0.73199, 0.37547, 0.17498], - [0.72786, 0.36774, 0.16605], - [0.72352, 0.35985, 0.15713], - [0.71891, 0.35177, 0.14821], - [0.71403, 0.3435, 0.13928], - [0.70884, 0.33505, 0.13046], - [0.70332, 0.32635, 0.12154], - [0.69745, 0.3175, 0.11284], - [0.69123, 0.30846, 0.10413], - [0.68465, 0.29926, 0.095633], - [0.67773, 0.28992, 0.08735], - [0.67048, 0.28048, 0.079197], - [0.6629, 0.27102, 0.07151], - [0.65505, 0.26152, 0.064079], - [0.64697, 0.25208, 0.057104], - [0.63869, 0.24271, 0.050618], - [0.63026, 0.23349, 0.04475], - [0.62172, 0.22445, 0.039414], - [0.61313, 0.21566, 0.034829], - [0.60454, 0.20709, 0.031072], - [0.59595, 0.19874, 0.028212], - [0.5874, 0.1907, 0.026019], - [0.57894, 0.18292, 0.024396], - [0.57054, 0.17542, 0.023257], - [0.56227, 0.16817, 0.022523], - [0.55408, 0.1612, 0.02211], - [0.54601, 0.1544, 0.021861], - [0.53804, 0.14785, 0.021737], - [0.53018, 0.14149, 0.021722], - [0.52242, 0.13528, 0.0218], - [0.51478, 0.12921, 0.021957], - [0.50721, 0.12327, 0.022179], - [0.49973, 0.11749, 0.022455], - [0.49235, 0.11182, 0.022775], - [0.48503, 0.10621, 0.02313], - [0.4778, 0.10061, 0.023513], - [0.47064, 0.095156, 0.023916], - [0.46353, 0.089668, 0.024336], - [0.45649, 0.084258, 0.024766], - [0.44952, 0.078741, 0.025203], - [0.4426, 0.073404, 0.025644], - [0.43574, 0.067904, 0.026084], - [0.42892, 0.062415, 0.026522], - [0.42215, 0.056832, 0.026954], - [0.41544, 0.051116, 0.027378], - [0.40877, 0.045352, 0.02779], - [0.40213, 0.039448, 0.028189], - [0.39556, 0.033385, 0.02857], - [0.38902, 0.027844, 0.028932], - [0.3825, 0.022586, 0.029271], - [0.37603, 0.017608, 0.029583], - [0.36958, 0.01289, 0.029866], - [0.36316, 0.0082428, 0.030115], - [0.35679, 0.0040345, 0.030327], - [0.35042, 6.1141e-5, 0.030499], -]; - -export const colormap_viko_data: Array<[number, number, number]> = [ - [0.30979, 0.1009, 0.23843], - [0.30692, 0.10306, 0.24318], - [0.30406, 0.10526, 0.24805], - [0.30121, 0.10764, 0.25296], - [0.29836, 0.11017, 0.25796], - [0.29551, 0.11276, 0.26307], - [0.29265, 0.11545, 0.26825], - [0.2898, 0.11832, 0.27354], - [0.28692, 0.12122, 0.27891], - [0.28406, 0.12431, 0.28434], - [0.28118, 0.12753, 0.28989], - [0.2783, 0.13089, 0.29552], - [0.27542, 0.13435, 0.30123], - [0.27249, 0.13793, 0.30704], - [0.2696, 0.14163, 0.31293], - [0.26666, 0.14548, 0.3189], - [0.26374, 0.14942, 0.32495], - [0.26079, 0.15348, 0.33107], - [0.25783, 0.15771, 0.33729], - [0.25491, 0.16208, 0.34356], - [0.25194, 0.16655, 0.34991], - [0.24899, 0.17114, 0.35633], - [0.24602, 0.17586, 0.36279], - [0.24308, 0.18073, 0.36931], - [0.24015, 0.18575, 0.37589], - [0.23728, 0.19084, 0.38251], - [0.23439, 0.19609, 0.38918], - [0.23155, 0.20143, 0.39588], - [0.22875, 0.20694, 0.40259], - [0.226, 0.21253, 0.40935], - [0.22331, 0.21825, 0.41612], - [0.22071, 0.22406, 0.42289], - [0.21817, 0.23, 0.42969], - [0.21576, 0.23608, 0.43648], - [0.21343, 0.24222, 0.44326], - [0.21128, 0.24849, 0.45004], - [0.20925, 0.25484, 0.4568], - [0.20741, 0.26127, 0.46354], - [0.20574, 0.26779, 0.47026], - [0.20429, 0.27443, 0.47695], - [0.20303, 0.28113, 0.48361], - [0.20203, 0.28792, 0.49024], - [0.20129, 0.29478, 0.49683], - [0.20083, 0.30171, 0.50338], - [0.20067, 0.30874, 0.50989], - [0.20082, 0.31581, 0.51636], - [0.2013, 0.32294, 0.52278], - [0.20213, 0.33012, 0.52917], - [0.20331, 0.33737, 0.53549], - [0.20484, 0.34466, 0.54177], - [0.20676, 0.35201, 0.54801], - [0.209, 0.35941, 0.5542], - [0.21166, 0.36686, 0.56035], - [0.21466, 0.37435, 0.56644], - [0.21806, 0.38186, 0.57249], - [0.22181, 0.38942, 0.57849], - [0.22595, 0.39701, 0.58446], - [0.2304, 0.40464, 0.59037], - [0.23526, 0.41231, 0.59625], - [0.24039, 0.41999, 0.60208], - [0.24588, 0.42771, 0.60787], - [0.25172, 0.43544, 0.61361], - [0.25782, 0.44319, 0.61933], - [0.26424, 0.45096, 0.62499], - [0.27094, 0.45875, 0.63062], - [0.27791, 0.46655, 0.6362], - [0.28513, 0.47436, 0.64173], - [0.29262, 0.48218, 0.64724], - [0.30034, 0.48999, 0.65269], - [0.30829, 0.49783, 0.65811], - [0.31647, 0.50564, 0.66348], - [0.32484, 0.51347, 0.66879], - [0.33343, 0.52127, 0.67406], - [0.3422, 0.52908, 0.67927], - [0.35115, 0.53686, 0.68443], - [0.36026, 0.54462, 0.68955], - [0.36956, 0.55236, 0.69458], - [0.37901, 0.56007, 0.69956], - [0.38861, 0.56775, 0.70447], - [0.39834, 0.57539, 0.70931], - [0.40821, 0.58298, 0.71406], - [0.4182, 0.59053, 0.71873], - [0.42832, 0.59803, 0.72331], - [0.43853, 0.60546, 0.7278], - [0.44887, 0.61283, 0.73218], - [0.45928, 0.62014, 0.73644], - [0.46979, 0.62734, 0.7406], - [0.48036, 0.63448, 0.74462], - [0.49102, 0.6415, 0.74851], - [0.50172, 0.64843, 0.75226], - [0.51247, 0.65525, 0.75586], - [0.52327, 0.66195, 0.75929], - [0.53409, 0.66852, 0.76256], - [0.54494, 0.67495, 0.76565], - [0.55578, 0.68123, 0.76854], - [0.56664, 0.68736, 0.77124], - [0.57747, 0.69332, 0.77372], - [0.58828, 0.6991, 0.77598], - [0.59905, 0.7047, 0.77802], - [0.60976, 0.7101, 0.77981], - [0.62041, 0.71529, 0.78135], - [0.63096, 0.72026, 0.78263], - [0.64142, 0.72501, 0.78364], - [0.65177, 0.72951, 0.78438], - [0.662, 0.73377, 0.78482], - [0.67207, 0.73776, 0.78496], - [0.68198, 0.74149, 0.78481], - [0.69173, 0.74495, 0.78434], - [0.70129, 0.74812, 0.78356], - [0.71064, 0.751, 0.78246], - [0.71977, 0.75357, 0.78103], - [0.72866, 0.75584, 0.77928], - [0.7373, 0.75781, 0.7772], - [0.74568, 0.75945, 0.77478], - [0.75379, 0.76078, 0.77204], - [0.76161, 0.76178, 0.76897], - [0.76913, 0.76246, 0.76558], - [0.77635, 0.76282, 0.76186], - [0.78325, 0.76286, 0.75783], - [0.78982, 0.76257, 0.75349], - [0.79607, 0.76197, 0.74884], - [0.80198, 0.76105, 0.7439], - [0.80756, 0.75982, 0.73867], - [0.81279, 0.75829, 0.73316], - [0.81768, 0.75645, 0.72738], - [0.82224, 0.75433, 0.72135], - [0.82645, 0.75191, 0.71507], - [0.83032, 0.74922, 0.70856], - [0.83386, 0.74627, 0.70181], - [0.83707, 0.74306, 0.69486], - [0.83996, 0.7396, 0.68771], - [0.84252, 0.73588, 0.68036], - [0.84477, 0.73195, 0.67285], - [0.84672, 0.72779, 0.66516], - [0.84838, 0.72343, 0.65733], - [0.84974, 0.71887, 0.64934], - [0.85082, 0.71411, 0.64122], - [0.85164, 0.70918, 0.63299], - [0.8522, 0.70406, 0.62464], - [0.8525, 0.69879, 0.61619], - [0.85256, 0.69337, 0.60765], - [0.85238, 0.68779, 0.59901], - [0.85198, 0.68208, 0.5903], - [0.85135, 0.67624, 0.58153], - [0.85052, 0.67028, 0.5727], - [0.8495, 0.66419, 0.56381], - [0.84827, 0.65799, 0.55487], - [0.84686, 0.65169, 0.54589], - [0.84527, 0.64528, 0.53688], - [0.8435, 0.63879, 0.52782], - [0.84157, 0.6322, 0.51875], - [0.83948, 0.62552, 0.50965], - [0.83723, 0.61876, 0.50053], - [0.83482, 0.61191, 0.49142], - [0.83226, 0.60499, 0.48228], - [0.82956, 0.59798, 0.47312], - [0.82672, 0.59091, 0.46399], - [0.82372, 0.58376, 0.45485], - [0.8206, 0.57655, 0.4457], - [0.81733, 0.56924, 0.43657], - [0.81392, 0.56189, 0.42746], - [0.81038, 0.55445, 0.41834], - [0.80671, 0.54695, 0.40925], - [0.80289, 0.53937, 0.40018], - [0.79894, 0.53172, 0.39114], - [0.79485, 0.52401, 0.38211], - [0.79062, 0.51622, 0.37312], - [0.78625, 0.50837, 0.36416], - [0.78173, 0.50043, 0.35526], - [0.77707, 0.49243, 0.34637], - [0.77227, 0.48436, 0.33755], - [0.76731, 0.47623, 0.32878], - [0.76221, 0.46802, 0.32008], - [0.75697, 0.45974, 0.31141], - [0.75157, 0.4514, 0.30283], - [0.74602, 0.443, 0.29434], - [0.74032, 0.43452, 0.28593], - [0.73447, 0.42599, 0.27763], - [0.72846, 0.41741, 0.26943], - [0.72231, 0.40876, 0.26133], - [0.71602, 0.40008, 0.25336], - [0.70958, 0.39136, 0.24551], - [0.703, 0.38259, 0.23784], - [0.69628, 0.37381, 0.23028], - [0.68944, 0.36499, 0.22293], - [0.68246, 0.35617, 0.21574], - [0.67538, 0.34735, 0.20873], - [0.66819, 0.33852, 0.20192], - [0.66089, 0.32973, 0.19535], - [0.6535, 0.32095, 0.189], - [0.64604, 0.31219, 0.18286], - [0.6385, 0.30351, 0.177], - [0.63092, 0.29488, 0.17138], - [0.62328, 0.28632, 0.16602], - [0.6156, 0.27787, 0.16097], - [0.60792, 0.2695, 0.15619], - [0.60022, 0.26122, 0.15165], - [0.59253, 0.25308, 0.14746], - [0.58486, 0.24505, 0.14353], - [0.57721, 0.23721, 0.13988], - [0.56961, 0.22946, 0.13656], - [0.56209, 0.2219, 0.13356], - [0.55461, 0.21451, 0.13084], - [0.54721, 0.20731, 0.12838], - [0.5399, 0.20025, 0.12623], - [0.5327, 0.19344, 0.12431], - [0.5256, 0.18679, 0.12269], - [0.51862, 0.18034, 0.12135], - [0.51174, 0.17413, 0.12028], - [0.505, 0.16809, 0.11946], - [0.49839, 0.16231, 0.11889], - [0.49191, 0.15672, 0.11853], - [0.48556, 0.15132, 0.11838], - [0.47937, 0.14618, 0.11844], - [0.47329, 0.14126, 0.1187], - [0.46739, 0.1365, 0.11913], - [0.46161, 0.13203, 0.11974], - [0.45597, 0.12774, 0.12054], - [0.45047, 0.12364, 0.1215], - [0.44511, 0.1198, 0.12263], - [0.43989, 0.1162, 0.12393], - [0.43479, 0.11277, 0.12538], - [0.42983, 0.10956, 0.12692], - [0.425, 0.10654, 0.12863], - [0.42027, 0.10371, 0.13049], - [0.41568, 0.10106, 0.13241], - [0.4112, 0.098655, 0.13449], - [0.40683, 0.096378, 0.13662], - [0.40256, 0.09442, 0.1389], - [0.3984, 0.092523, 0.14132], - [0.39433, 0.090892, 0.14379], - [0.39036, 0.089396, 0.14636], - [0.38647, 0.08809, 0.14904], - [0.38268, 0.086971, 0.1518], - [0.37896, 0.085915, 0.15466], - [0.37531, 0.085142, 0.15761], - [0.37174, 0.084549, 0.16064], - [0.36825, 0.08407, 0.1638], - [0.3648, 0.083717, 0.167], - [0.36142, 0.083521, 0.17027], - [0.3581, 0.083485, 0.17363], - [0.35484, 0.083605, 0.17709], - [0.3516, 0.083878, 0.1806], - [0.34843, 0.084281, 0.18422], - [0.34529, 0.084781, 0.18793], - [0.34219, 0.085387, 0.19167], - [0.33913, 0.086179, 0.19552], - [0.33609, 0.087176, 0.19943], - [0.3331, 0.08819, 0.20346], - [0.33012, 0.089356, 0.20755], - [0.32715, 0.090652, 0.21172], - [0.32422, 0.092078, 0.21597], - [0.32131, 0.093564, 0.22031], - [0.31841, 0.095269, 0.22468], - [0.31553, 0.096976, 0.2292], - [0.31264, 0.098899, 0.23377], -]; diff --git a/projects/wave-core/src/lib/config.service.ts b/projects/wave-core/src/lib/config.service.ts deleted file mode 100644 index d53335b7..00000000 --- a/projects/wave-core/src/lib/config.service.ts +++ /dev/null @@ -1,211 +0,0 @@ -import {of} from 'rxjs'; -import {catchError, tap} from 'rxjs/operators'; -import {Injectable} from '@angular/core'; -import {mergeDeep} from 'immutable'; -import {HttpClient} from '@angular/common/http'; - -type MappingUrlType = string; - -interface Wms { - readonly VERSION: string; - readonly FORMAT: string; -} - -interface Wfs { - readonly VERSION: string; - readonly FORMAT: string; -} - -interface Wcs { - readonly SERVICE: string; - readonly VERSION: string; -} - -interface DebugMode { - readonly WAVE: boolean; - readonly MAPPING: boolean; -} - -interface User { - readonly GUEST: { - readonly NAME: string; - readonly PASSWORD: string; - }; -} - -interface Delays { - readonly LOADING: { - readonly MIN: number; - }; - readonly TOOLTIP: number; - readonly DEBOUNCE: number; - readonly STORAGE_DEBOUNCE: number; - readonly GUEST_LOGIN_HINT: number; -} - -interface Defaults { - readonly PROJECT: { - readonly NAME: string; - readonly TIME: string; - readonly TIMESTEP: '15 minutes' | '1 hour' | '1 day' | '1 month' | '6 months' | '1 year'; - readonly PROJECTION: 'EPSG:3857' | 'EPSG:4326'; - }; -} - -interface Map { - readonly BACKGROUND_LAYER: 'OSM' | 'countries' | 'hosted' | 'XYZ'; - readonly BACKGROUND_LAYER_URL: string; - readonly HOSTED_BACKGROUND_SERVICE: string; - readonly HOSTED_BACKGROUND_LAYER_NAME: string; - readonly HOSTED_BACKGROUND_SERVICE_VERSION: string; - readonly REFRESH_LAYERS_ON_CHANGE: boolean; -} - -interface Time { - readonly ALLOW_RANGES: boolean; -} - -export interface WaveConfigStructure { - readonly DEBUG_MODE: DebugMode; - readonly DEFAULTS: Defaults; - readonly DELAYS: Delays; - readonly MAP: Map; - readonly MAPPING_URL: MappingUrlType; - readonly TIME: Time; - readonly USER: User; - readonly WCS: Wcs; - readonly WFS: Wfs; - readonly WMS: Wms; -} - -export const WAVE_DEFAULT_CONFIG: WaveConfigStructure = { - DEBUG_MODE: { - WAVE: false, - MAPPING: false, - }, - DEFAULTS: { - PROJECT: { - NAME: 'Default', - TIME: '2000-06-06T12:00:00.000Z', - TIMESTEP: '1 month', - PROJECTION: 'EPSG:3857', - }, - }, - DELAYS: { - LOADING: { - MIN: 500, - }, - TOOLTIP: 400, - DEBOUNCE: 400, - STORAGE_DEBOUNCE: 1500, - GUEST_LOGIN_HINT: 5000, - }, - MAP: { - BACKGROUND_LAYER: 'OSM', - BACKGROUND_LAYER_URL: '', - HOSTED_BACKGROUND_SERVICE: '/mapcache/', - HOSTED_BACKGROUND_LAYER_NAME: 'osm', - HOSTED_BACKGROUND_SERVICE_VERSION: '1.1.1', - REFRESH_LAYERS_ON_CHANGE: false, - }, - MAPPING_URL: '/cgi-bin/mapping_cgi', - TIME: { - ALLOW_RANGES: true, - }, - USER: { - GUEST: { - NAME: 'guest', - PASSWORD: 'guest', - }, - }, - WCS: { - SERVICE: 'WCS', - VERSION: '2.0.1', - }, - WFS: { - VERSION: '2.0.0', - FORMAT: 'application/json', - }, - WMS: { - VERSION: '1.3.0', - FORMAT: 'image/png', - }, -}; - -/** - * A service that provides config entries. - * Loads a custom file at startup. - */ -@Injectable() -export class Config { - static readonly CONFIG_FILE = 'assets/config.json'; - - protected config: WaveConfigStructure; - - get MAPPING_URL(): MappingUrlType { - return this.config.MAPPING_URL; - } - - get WMS(): Wms { - return this.config.WMS; - } - - get WFS(): Wfs { - return this.config.WFS; - } - - get WCS(): Wcs { - return this.config.WCS; - } - - get DEBUG_MODE(): DebugMode { - return this.config.DEBUG_MODE; - } - - get USER(): User { - return this.config.USER; - } - - get DELAYS(): Delays { - return this.config.DELAYS; - } - - get DEFAULTS(): Defaults { - return this.config.DEFAULTS; - } - - get MAP(): Map { - return this.config.MAP; - } - - get TIME(): Time { - return this.config.TIME; - } - - constructor(protected http: HttpClient) {} - - // noinspection JSUnusedGlobalSymbols <- function used in parent app - /** - * Initialize the config on app start. - */ - load(defaults?: WaveConfigStructure): Promise { - if (!defaults) { - defaults = WAVE_DEFAULT_CONFIG; - } - return this.http - .get(Config.CONFIG_FILE) - .pipe( - tap( - (appConfig) => { - this.config = mergeDeep(defaults, appConfig); - }, - () => { - // error - this.config = defaults; - }, - ), - catchError(() => of(undefined)), - ) - .toPromise(); - } -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/audio/mediaview.audio.component.html b/projects/wave-core/src/lib/datatable/mediaview/audio/mediaview.audio.component.html deleted file mode 100644 index f2ec0806..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/audio/mediaview.audio.component.html +++ /dev/null @@ -1,17 +0,0 @@ -Audio {{ currentAudio + 1 }} of {{ audioURLs.length }} - -
diff --git a/projects/wave-core/src/lib/datatable/mediaview/audio/mediaview.audio.component.scss b/projects/wave-core/src/lib/datatable/mediaview/audio/mediaview.audio.component.scss deleted file mode 100644 index aaca3cf6..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/audio/mediaview.audio.component.scss +++ /dev/null @@ -1,34 +0,0 @@ -$mat-icon-button-size: 40px !default; // TODO: import when this is possible again - -.audioContainer { - mat-card { - width: calc(100% - 2rem); - margin: 1rem; - padding: 0; - } - - audio { - width: 100%; - margin: 0; - display: block; - } - - .info { - float: left; - width: 100%; - - h3 { - float: left; - margin: 1rem; - width: calc(100% - 4rem - #{$mat-icon-button-size}); - overflow: hidden; - text-overflow: ellipsis; - word-break: keep-all; - } - - .externalLink { - float: right; - margin: 1rem; - } - } -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/audio/mediaview.audio.component.ts b/projects/wave-core/src/lib/datatable/mediaview/audio/mediaview.audio.component.ts deleted file mode 100644 index f159ba6f..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/audio/mediaview.audio.component.ts +++ /dev/null @@ -1,48 +0,0 @@ -import {Component, Input} from '@angular/core'; -import {SidenavHeaderComponent} from '../../../sidenav/sidenav-header/sidenav-header.component'; - -@Component({ - selector: 'wave-mediaview-audio', - templateUrl: './mediaview.audio.component.html', - styleUrls: ['./mediaview.audio.component.scss'], -}) - -/** - * Dialog-Audio-Component - * Is shown as a dialog-popup. - * Displays an audio-player with a playlist. - * The component receives an array of urls to audio-files (audioURLS) and the id of the audio to play first (currentAudio) as inputs. - */ -export class MediaviewAudioComponent { - /** - * Input: An array of audio-urls to display in the dialog - */ - @Input() - public audioURLs: string[]; - - /** - * Input: The index of the audio-file to play first - */ - @Input() - public currentAudio: number; - - public autoPlay: boolean; - - /** - * Plays the audio with given id, skipping the currently playing one - * @param audioID the ID auf the audio-file to play - */ - public goToAudio(audioID: number) { - this.currentAudio = audioID; - this.autoPlay = true; - } - - /** - * Plays the next audio in the list of audio-urls - * If the current file is the last one, plays the first one - * Is called when the current audio has finished playing - */ - public playNext() { - this.goToAudio((this.currentAudio + 1) % this.audioURLs.length); - } -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/filename.pipe.ts b/projects/wave-core/src/lib/datatable/mediaview/filename.pipe.ts deleted file mode 100644 index 253992f7..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/filename.pipe.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {Pipe, PipeTransform} from '@angular/core'; - -@Pipe({ - name: 'fileName', -}) -/** - * FileNamePipe - * Transforms a given string with a file-url to only the filename - */ -export class FileNamePipe implements PipeTransform { - /** - * Transforms a given string with a file-url to only the file-name - * @param value url directing to a file - * @returns {string} only the filename - */ - transform(value: string): string { - let split1 = value.split('/'); - let split2 = split1[split1.length - 1].split('?'); - - return split2[split2.length - 1]; - } -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/image-dialog/mediaview.image-dialog.component.html b/projects/wave-core/src/lib/datatable/mediaview/image-dialog/mediaview.image-dialog.component.html deleted file mode 100644 index b1926c11..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/image-dialog/mediaview.image-dialog.component.html +++ /dev/null @@ -1,38 +0,0 @@ -
- - - - - - - open_in_new - - - - - - - - -
-
- -
-
-
- -
- - - -
-
diff --git a/projects/wave-core/src/lib/datatable/mediaview/image-dialog/mediaview.image-dialog.component.scss b/projects/wave-core/src/lib/datatable/mediaview/image-dialog/mediaview.image-dialog.component.scss deleted file mode 100644 index 03b8329d..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/image-dialog/mediaview.image-dialog.component.scss +++ /dev/null @@ -1,92 +0,0 @@ -$mat-dialog-padding: 24px !default; // TODO: import when this is possible again -$mat-fab-size: 56px !default; // TODO: import when this is possible again - -/*.previous{ - position: absolute; - top: calc(50% - #{$mat-fab-size/2}); - left: #{-$mat-fab-size/2}; -} - -.next{ - position: absolute; - top: calc(50% - #{$mat-fab-size/2}); - right: #{-$mat-fab-size/2}; -}*/ - -.imageContainer { - max-width: calc(100vw - 4rem); - max-height: calc(100vh - 4rem); - display: flex; - flex-direction: column; - margin: #{-$mat-dialog-padding}; - - img { - margin: 0 auto; - display: block; - } - - mat-dialog-content { - padding: 0; - margin: 0; - max-height: inherit; - max-width: inherit; - overflow: auto; - position: relative; - } - - mat-toolbar { - margin: 0; - - /*h3 small{ - overflow: hidden; - text-overflow: ellipsis; - word-break: keep-all; - }*/ - - .separator { - flex-grow: 1; - } - - .externalLink { - margin-right: 2rem; - } - - .closeLink { - } - } - - .loading { - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - background: rgba(#ffffff, 50%); - - .spinner { - position: relative; - top: calc(50% - 100px); - left: calc(50% - 100px); - } - } - - .buttons { - position: fixed; - bottom: 2 * $mat-dialog-padding; - left: 0; - width: 100%; - text-align: center; - - button { - margin: 1rem; - } - - .previous { - margin-right: 2rem; - } - - .next { - margin-left: 2rem; - } - } -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/image-dialog/mediaview.image-dialog.component.ts b/projects/wave-core/src/lib/datatable/mediaview/image-dialog/mediaview.image-dialog.component.ts deleted file mode 100644 index af2de3ac..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/image-dialog/mediaview.image-dialog.component.ts +++ /dev/null @@ -1,76 +0,0 @@ -import {Component, Input} from '@angular/core'; -import {MatDialogRef} from '@angular/material/dialog'; - -@Component({ - selector: 'wave-mediaview-image-dialog', - templateUrl: './mediaview.image-dialog.component.html', - styleUrls: ['./mediaview.image-dialog.component.scss'], -}) - -/** - * Dialog-Image-Component - * Is shown as a dialog-popup. - * Displays an image-gallery. One image is shown at a time with two buttons to the previous and next images in the list. - * The component receives an array of urls to images (imageURLS) and the id of the image to show first (currentImage) as inputs. - */ -export class MediaviewImageDialogComponent { - /** - * Input: An array of image-urls to display in the dialog - */ - @Input() - public imageURLs: string[]; - - /** - * Input: The index of the image to show first - */ - @Input() - public currentImage: number; - - public loading = true; - - // private domNode; - - /** - * Sets up all variables - * @param dialogRef reference to this Dialog-Type - */ - constructor(public dialogRef: MatDialogRef) { - // , @Inject(ElementRef) elementRef: ElementRef - this.loading = true; - - // this.domNode = elementRef.nativeElement; - } - - /** - * Hack to set Dialog's parent's position to absolute - */ - /*ngAfterViewInit() { - // console.log(this.domNode.parentNode); - - //this.domNode.parentNode.parentElement.style.position = 'relative'; - }*/ - - /** - * Shows the next image in the list of image-urls - */ - public nextImage() { - this.currentImage = (this.currentImage + 1) % this.imageURLs.length; - this.loading = true; - } - - /** - * Shows the previous image in the list of image-urls - */ - public previousImage() { - this.currentImage = this.currentImage <= 0 ? this.imageURLs.length - 1 : this.currentImage - 1; - this.loading = true; - } - - /** - * Called when the image has finished loading - * Updates the loading-variable (to hide the loading-spinner) - */ - public imageLoaded() { - this.loading = false; - } -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/image/mediaview.image.component.html b/projects/wave-core/src/lib/datatable/mediaview/image/mediaview.image.component.html deleted file mode 100644 index 863ac354..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/image/mediaview.image.component.html +++ /dev/null @@ -1,35 +0,0 @@ -Image {{ currentImage + 1 }} of {{ imageURLs.length }} - -
- - - - -
-
- -
-
- -
-

{{ imageURLs[currentImage] | fileName }}

- - - open_in_new - -
- -
- - - - - -
-
diff --git a/projects/wave-core/src/lib/datatable/mediaview/image/mediaview.image.component.scss b/projects/wave-core/src/lib/datatable/mediaview/image/mediaview.image.component.scss deleted file mode 100644 index 5cefc85d..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/image/mediaview.image.component.scss +++ /dev/null @@ -1,66 +0,0 @@ -$mat-icon-button-size: 40px !default; // TODO: import when this is possible again -$mat-fab-size: 56px !default; // TODO: import when this is possible again - -.imageContainer { - position: relative; - width: 100%; - height: 100%; - - mat-card { - width: calc(100% - 2rem); - margin: 1rem; - padding: 0; - } - - img { - width: 100%; - height: auto; - display: block; - } - - .loading { - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - background: fade_out(#ffffff, 0.5); - - .spinner { - position: relative; - top: calc(50% - 50px); - left: calc(50% - 50px); - } - } - - .info { - margin-bottom: calc(1rem + #{$mat-fab-size}); - width: 100%; - float: left; - - h3 { - float: left; - margin: 1rem; - width: calc(100% - 4rem - #{$mat-icon-button-size}); - overflow: hidden; - text-overflow: ellipsis; - word-break: keep-all; - } - - .externalLink { - float: right; - margin: 1rem; - } - } - - .buttons { - bottom: 0; - left: 0; - width: 100%; - text-align: center; - - button { - margin: 1rem; - } - } -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/image/mediaview.image.component.ts b/projects/wave-core/src/lib/datatable/mediaview/image/mediaview.image.component.ts deleted file mode 100644 index 969a64c2..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/image/mediaview.image.component.ts +++ /dev/null @@ -1,79 +0,0 @@ -import {Component, Input, ViewContainerRef} from '@angular/core'; -import {MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog'; -import {MediaviewImageDialogComponent} from '../image-dialog/mediaview.image-dialog.component'; - -@Component({ - selector: 'wave-mediaview-image', - templateUrl: './mediaview.image.component.html', - styleUrls: ['./mediaview.image.component.scss'], -}) - -/** - * Dialog-Image-Component - * Is shown as a dialog-popup. - * Displays an image-gallery. One image is shown at a time with two buttons to the previous and next images in the list. - * The component receives an array of urls to images (imageURLS) and the id of the image to show first (currentImage) as inputs. - */ -export class MediaviewImageComponent { - /** - * Input: An array of image-urls to display in the dialog - */ - @Input() - public imageURLs: string[]; - - /** - * Input: The index of the image to show first - */ - @Input() - public currentImage: number; - - public loading = true; - - private dialogRef: MatDialogRef; - - /** - * Sets up all variables - * @param dialog reference to MDDialog - * @param viewContainerRef reference to ViewContainer - */ - constructor(private dialog: MatDialog, private viewContainerRef: ViewContainerRef) {} - - /** - * Shows the next image in the list of image-urls - */ - public nextImage() { - this.currentImage = (this.currentImage + 1) % this.imageURLs.length; - this.loading = true; - } - - /** - * Shows the previous image in the list of image-urls - */ - public previousImage() { - this.currentImage = this.currentImage <= 0 ? this.imageURLs.length - 1 : this.currentImage - 1; - this.loading = true; - } - - /** - * Called when the image has finished loading - * Updates the loading-variable (to hide the loading-spinner) - */ - public imageLoaded() { - this.loading = false; - } - - /** - * Opens a dialog-popup, showing the images in full size - */ - public openImageFullSize() { - let config = new MatDialogConfig(); - config.viewContainerRef = this.viewContainerRef; - - this.dialogRef = this.dialog.open(MediaviewImageDialogComponent, config); - - this.dialogRef.componentInstance.imageURLs = this.imageURLs; - this.dialogRef.componentInstance.currentImage = this.currentImage; - - this.dialogRef.afterClosed().subscribe(() => (this.dialogRef = null)); - } -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/mediaview.component.html b/projects/wave-core/src/lib/datatable/mediaview/mediaview.component.html deleted file mode 100644 index 65f0c3e9..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/mediaview.component.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - image{{ imageUrls.length }} imageimages - - - music_video{{ audioUrls.length }} - audio-fileaudio-files - - - movie{{ videoUrls.length }} videovideos - - - - {{ u }}, - - - diff --git a/projects/wave-core/src/lib/datatable/mediaview/mediaview.component.scss b/projects/wave-core/src/lib/datatable/mediaview/mediaview.component.scss deleted file mode 100644 index 67db6fb1..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/mediaview.component.scss +++ /dev/null @@ -1,5 +0,0 @@ -mat-icon { - vertical-align: text-top; - height: 20px; - line-height: 20px; -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/mediaview.component.ts b/projects/wave-core/src/lib/datatable/mediaview/mediaview.component.ts deleted file mode 100644 index edd9909d..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/mediaview.component.ts +++ /dev/null @@ -1,177 +0,0 @@ -import {Component, Input, OnChanges, ChangeDetectionStrategy} from '@angular/core'; -import {MediaviewImageComponent} from './image/mediaview.image.component'; -import {MediaviewAudioComponent} from './audio/mediaview.audio.component'; -import {MediaviewVideoComponent} from './video/mediaview.video.component'; -import {LayoutService} from '../../layout.service'; - -@Component({ - selector: 'wave-datatable-mediaview', - templateUrl: './mediaview.component.html', - styleUrls: ['./mediaview.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) - -/** - * Dialog-Component - * Checks the file-type of the comma-separated urls given as input-argument and sets up links to open dialogs. - * The dialogs will show the images or play the audios or videos - */ -export class MediaviewComponent implements OnChanges { - private urls: string[]; - public mediaType: string[]; - - public imageUrls: string[]; - public audioUrls: string[]; - public videoUrls: string[]; - public textNoUrls: string[]; - - /** - * Input: A List of comma-separated urls to images, audio-files and videos - */ - @Input() - private url: any; - - /** - * Input: Type of the audio urls (text, media or none) - */ - @Input() - private type: string; - - /** - * Extracts the type (image, audio, video) of a given file-url - * @param value url containing the filename with file-ending - * @returns {string} the type of the file or an empty string if there is no file-ending - */ - public static getType(value: string): string { - let ret: string; - - if (value !== '') { - let dotSplits = value.split('.'); - - if (dotSplits.length > 1) { - let fileEnding = dotSplits[dotSplits.length - 1].toLowerCase(); - - switch (fileEnding) { - // Image - case 'jpg': - case 'jpeg': - case 'gif': - case 'png': - case 'svg': - case 'bmp': - ret = 'image'; - break; - - // Audio - case 'wav': - case 'mp3': - case 'ogg': - case 'aac': - ret = 'audio'; - break; - - // Video - case 'mp4': - case 'webm': - case 'ogv': - ret = 'video'; - break; - - // None - default: - ret = 'text'; - } - } else { - ret = 'text'; - } - } else { - ret = ''; - } - // console.log(ret); - return ret; - } - - /** - * Sets up all variables - * @param layoutService reference to LayoutService - */ - constructor(public layoutService: LayoutService) {} - - /** - * OnChange - * Calculates the file-type of the comma-separated urls given as input-argument - */ - ngOnChanges() { - if (this.type === 'media') { - this.urls = this.url.split(','); - this.mediaType = new Array(this.urls.length); - - this.imageUrls = []; - this.audioUrls = []; - this.videoUrls = []; - this.textNoUrls = []; - - for (let i in this.urls) { - if (this.urls.hasOwnProperty(i)) { - this.mediaType[i] = MediaviewComponent.getType(this.urls[i]); - // console.log(this.mediaType[i]); - - if (this.mediaType[i] !== '') { - this.urls[i] = this.urls[i].trim(); - } - - if (this.mediaType[i] === 'image') { - this.imageUrls.push(this.urls[i]); - } else if (this.mediaType[i] === 'audio') { - this.audioUrls.push(this.urls[i]); - } else if (this.mediaType[i] === 'video') { - this.videoUrls.push(this.urls[i]); - } else { - this.textNoUrls.push(this.urls[i]); - } - } - } - } else { - this.urls = [this.url.toString()]; - this.mediaType = ['']; - - this.imageUrls = []; - this.audioUrls = []; - this.videoUrls = []; - this.textNoUrls = [this.url.toString()]; - } - } - - /** - * Opens the images in the sidenav - * @param imageID the ID of the first image to be shown - */ - public openImageMediaview(imageID: number) { - this.layoutService.setSidenavContentComponent({ - component: MediaviewImageComponent, - config: {imageURLs: this.imageUrls, currentImage: imageID}, - }); - } - - /** - * Opens the audio-files in the sidenav - * @param audioID the ID of the first audio-file to be played - */ - public openAudioMediaview(audioID: number) { - this.layoutService.setSidenavContentComponent({ - component: MediaviewAudioComponent, - config: {audioURLs: this.audioUrls, currentAudio: audioID}, - }); - } - - /** - * Opens the videos in the sidenav - * @param videoID the ID of the first video to be played - */ - public openVideoMediaview(videoID: number) { - this.layoutService.setSidenavContentComponent({ - component: MediaviewVideoComponent, - config: {videoURLs: this.videoUrls, currentVideo: videoID}, - }); - } -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/playlist/mediaview.playlist.component.html b/projects/wave-core/src/lib/datatable/mediaview/playlist/mediaview.playlist.component.html deleted file mode 100644 index c2f98c56..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/playlist/mediaview.playlist.component.html +++ /dev/null @@ -1,18 +0,0 @@ - -

Files

- - - - - radio_button_checked - radio_button_unchecked - -

- {{ u | fileName }} -

- - - open_in_new - -
-
diff --git a/projects/wave-core/src/lib/datatable/mediaview/playlist/mediaview.playlist.component.scss b/projects/wave-core/src/lib/datatable/mediaview/playlist/mediaview.playlist.component.scss deleted file mode 100644 index 93b392b4..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/playlist/mediaview.playlist.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -mat-nav-list { - clear: both; -} - -.playing { - font-weight: bold; -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/playlist/mediaview.playlist.component.ts b/projects/wave-core/src/lib/datatable/mediaview/playlist/mediaview.playlist.component.ts deleted file mode 100644 index 38fe3960..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/playlist/mediaview.playlist.component.ts +++ /dev/null @@ -1,44 +0,0 @@ -import {Component, Input, Output, EventEmitter} from '@angular/core'; - -@Component({ - selector: 'wave-mediaview-playlist', - templateUrl: './mediaview.playlist.component.html', - styleUrls: ['./mediaview.playlist.component.scss'], -}) - -/** - * Playlist-Component - * Is used in the audio- and video-dialog-popups. - * Displays a playlist showing all files in the given list and highlights the file currently playing. - * The component receives an array of urls (tracks) and the id of the one currently playing (currentTrack) as inputs. - * It has an Event-Emitter as Output that is fired when a playlist-item is clicked to be played - */ -export class MediaviewPlaylistComponent { - /** - * Input: An array of urls to show in the playlist - */ - @Input() - public tracks: string[]; - - /** - * Input: The index of the track currently playing - */ - @Input() - public currentTrack: number; - - /** - * Output: Emitted when a link in the playlist is clicked to change the track. The track-id of the track to play is emitted - * @type {EventEmitter} - */ - @Output() - public gotoTrack: EventEmitter = new EventEmitter(); - - /** - * Emits an event, telling the parent component that the track with the given id should be played - * and the currently playing one shall be skipped - * @param trackID the ID of the track to play - */ - public goToTrack(trackID: number) { - this.gotoTrack.emit(trackID); - } -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/video/mediaview.video.component.html b/projects/wave-core/src/lib/datatable/mediaview/video/mediaview.video.component.html deleted file mode 100644 index 2c1fb167..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/video/mediaview.video.component.html +++ /dev/null @@ -1,17 +0,0 @@ -Video {{ currentVideo + 1 }} of {{ videoURLs.length }} - -
- - - - -
-

{{ videoURLs[currentVideo] | fileName }}

- - - open_in_new - -
- - -
diff --git a/projects/wave-core/src/lib/datatable/mediaview/video/mediaview.video.component.scss b/projects/wave-core/src/lib/datatable/mediaview/video/mediaview.video.component.scss deleted file mode 100644 index 8fdc8f81..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/video/mediaview.video.component.scss +++ /dev/null @@ -1,34 +0,0 @@ -$mat-icon-button-size: 40px !default; // TODO: import when this is possible again - -.videoContainer { - mat-card { - width: calc(100% - 2rem); - margin: 1rem; - padding: 0; - } - - video { - width: 100%; - margin: 0; - display: block; - } - - .info { - float: left; - width: 100%; - - h3 { - float: left; - margin: 1rem; - width: calc(100% - 4rem - #{$mat-icon-button-size}); - overflow: hidden; - text-overflow: ellipsis; - word-break: keep-all; - } - - .externalLink { - float: right; - margin: 1rem; - } - } -} diff --git a/projects/wave-core/src/lib/datatable/mediaview/video/mediaview.video.component.ts b/projects/wave-core/src/lib/datatable/mediaview/video/mediaview.video.component.ts deleted file mode 100644 index 0b6d64ff..00000000 --- a/projects/wave-core/src/lib/datatable/mediaview/video/mediaview.video.component.ts +++ /dev/null @@ -1,48 +0,0 @@ -import {Component, Input} from '@angular/core'; -import {SidenavHeaderComponent} from '../../../sidenav/sidenav-header/sidenav-header.component'; - -@Component({ - selector: 'wave-mediaview-video', - templateUrl: './mediaview.video.component.html', - styleUrls: ['./mediaview.video.component.scss'], -}) - -/** - * Dialog-Video-Component - * Is shown as a dialog-popup. - * Displays a video-player with a playlist. - * The component receives an array of urls to video-files (videoURLS) and the id of the video to play first (currentVideo) as inputs. - */ -export class MediaviewVideoComponent { - /** - * Input: An array of video-urls to display in the dialog - */ - @Input() - public videoURLs: string[]; - - /** - * Input: The index of the video to play first - */ - @Input() - public currentVideo: number; - - public autoPlay: boolean; - - /** - * Plays the video with given id, skipping the currently playing one - * @param videoID the ID auf the video-file to play - */ - public goToVideo(videoID: number) { - this.currentVideo = videoID; - this.autoPlay = true; - } - - /** - * Plays the next video in the list of video-urls - * If the current file is the last one, plays the first one - * Is called when the current video has finished playing - */ - public playNext() { - this.goToVideo((this.currentVideo + 1) % this.videoURLs.length); - } -} diff --git a/projects/wave-core/src/lib/datatable/table/table.component.html b/projects/wave-core/src/lib/datatable/table/table.component.html deleted file mode 100644 index 81efc7b2..00000000 --- a/projects/wave-core/src/lib/datatable/table/table.component.html +++ /dev/null @@ -1,80 +0,0 @@ -
- -
-
- -
-
- - - - - - - - - - - - - - - - - {{ dataHeadUnits[j] }} - - - - - - {{ element.properties[t] }} - - - - - - - - - - -
- no layer selected -
-
diff --git a/projects/wave-core/src/lib/datatable/table/table.component.scss b/projects/wave-core/src/lib/datatable/table/table.component.scss deleted file mode 100644 index 7dc1920d..00000000 --- a/projects/wave-core/src/lib/datatable/table/table.component.scss +++ /dev/null @@ -1,121 +0,0 @@ -:host { - font-size: 0.87rem; -} - -.scrollContent { - overflow: auto; - width: 100%; - position: relative; - overflow-anchor: none; -} - -.mat-table { - float: left; -} - -.tableFixed { - position: relative; - background: fade-out(#ffffff, 0.1); -} - -.mat-header-row, -.mat-row { - min-height: 40px; - padding-left: 0; -} - -.mat-header-row.tableFixedHorizontal { - z-index: 11; -} - -.mat-header-cell, -.mat-cell { - height: 36px; - - &:not(.tableFixedVertical) { - overflow: hidden; - word-wrap: break-word; - hyphens: auto; - text-overflow: ellipsis; - padding: 2px 5px; - } - - &.tableFixedVertical { - padding: 2px 14px; - display: flex; - align-items: center; - } -} - -.mat-header-cell.tableFixedVertical { - z-index: 12; -} - -.mat-cell.tableFixedVertical { - z-index: 10; - min-width: 20px; - max-width: 20px; -} - -.mat-cell span { - height: 36px; - display: block; - overflow: hidden; - text-overflow: ellipsis; -} - -.rowSelected { - background: var(--wave-faded-accent-color, grey); - - .tableFixed::before { - content: ' '; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: var(--wave-faded-accent-color, grey); - } -} - -.offsetterTop, -.offsetterBottom { - padding: 0; - border: 0; - min-height: 0; - height: 0; - - .mat-cell { - height: 0; - padding: 0; - } -} - -.no-layer { - display: table; - width: 100%; - height: 100%; - text-align: center; - color: var(--wave-foreground-secondary-text-color, black); - - span { - display: table-cell; - vertical-align: middle; - } -} - -.spinnerContainer { - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - background: fade-out(#ffffff, 0.3); - z-index: 10; - - .spinner { - position: absolute; - top: calc(50% - 50px); - left: calc(50% - 50px); - } -} diff --git a/projects/wave-core/src/lib/datatable/table/table.component.ts b/projects/wave-core/src/lib/datatable/table/table.component.ts deleted file mode 100644 index 1161244d..00000000 --- a/projects/wave-core/src/lib/datatable/table/table.component.ts +++ /dev/null @@ -1,606 +0,0 @@ -import {BehaviorSubject, combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription} from 'rxjs'; -import {map, switchMap} from 'rxjs/operators'; - -import { - AfterViewInit, - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - ElementRef, - Input, - OnChanges, - OnDestroy, - OnInit, - SimpleChanges, - ViewChild, -} from '@angular/core'; -import {DataSource} from '@angular/cdk/collections'; -import {MediaviewComponent} from '../mediaview/mediaview.component'; -import {LayerService} from '../../layers/layer.service'; -import {LoadingState} from '../../project/loading-state.model'; -import {ResultTypes} from '../../operators/result-type.model'; -import {Layer, VectorData, VectorLayer} from '../../layers/layer.model'; -import {AbstractVectorSymbology} from '../../layers/symbology/symbology.model'; -import {FeatureID} from '../../queries/geojson.model'; -import {MapService} from '../../map/map.service'; -import {ProjectService} from '../../project/project.service'; -import {Unit} from '../../operators/unit.model'; -import {Feature as OlFeature} from 'ol/Feature'; -import {Point as OlPoint} from 'ol/geom/Point'; - -/** - * Data-Table-Component - * Displays a Data-Table - */ -@Component({ - selector: 'wave-datatable', - templateUrl: './table.component.html', - styleUrls: ['table.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -/** - * Data-Table-Component - * Displays a Data-Table - */ -export class TableComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit { - public LoadingState = LoadingState; - - @Input() - public height: number; - - // Data and Data-Subsets - public data: Array<{id: string | number; properties: {[key: string]: any}}>; - public tableData: TableDataSource; - public dataHead: Array; - public tableDataHead: Array; - public dataHeadUnits: Array; - - // For row-selection - public selected: boolean[]; - public allSelected: boolean; - public allEqual: boolean; - - // Element-References - @ViewChild('scrollContainer', {static: true}) public container: ElementRef; - - public data$: Observable>; - public state$: Observable; - - public offsetTop$: BehaviorSubject; - public offsetBottom$: BehaviorSubject; - - public avgWidths: number[]; - public colTypes: string[]; - - // For virtual scrolling - public scrollTop = 0; - public scrollLeft = 0; - - public displayItemCount: number; - - public displayItemCounter: number[]; - - public firstDisplay: number; - - private displayOffsetMin = 1; - - private scrolling = false; - - private scrollTopBefore = 0; - - private elementHeight = 41; - private headerHeight = 41; - - private minDisplayItemCount = 6; - - private selectable$: Observable; - private dataSubscription: Subscription; - private featureSubscription: Subscription; - - // For text-width-calculation - private styleString = '16px Roboto, sans-serif'; - private styleStringHead = '12px Roboto, sans-serif'; - private columnMinWidth = 100; - private columnMaxWidth = 400; - private canvas; - - /** - * Returns all the keys of an object as array - * @param object the object containing the keys - * @returns {string[]} a string-array containing all the keys - */ - private static getArrayOfKeys(object: {[key: string]: any}): Array { - return Object.keys(object).filter((x) => !(x.startsWith('___') || x === 'geometry')); - } - - /** - * Checks if the given unit is the default unit. If so returns an empty string, if not returns the unit formated for the header - * @param x the unit to display - * @returns {string} the formated unit-string - */ - private static formatUnits(x: Unit): string { - if (x && x.unit !== Unit.defaultUnit.unit) { - return ' [' + x.unit + ']'; - } else { - return ''; - } - } - - /** - * Sets up all variables - * Extracts the column names from the data input and calculates the average widths of all rows - * @param cdr ChangeDetector Reference - * @param layerService LayerService Reference - * @param mapService MapService Reference - * @param projectService ProjectService Reference - */ - constructor( - private cdr: ChangeDetectorRef, - public layerService: LayerService, - private mapService: MapService, - private projectService: ProjectService, - ) { - this.canvas = document.createElement('canvas'); - - this.displayItemCount = this.minDisplayItemCount; - - this.initDataStream(); - } - - ngOnInit() { - this.dataSubscription = this.data$.subscribe((features: Array) => { - this.dataHead = []; - this.dataHeadUnits = []; - this.tableDataHead = []; - - this.data = features.map((x) => { - return { - id: x.getId(), - properties: x.getProperties(), - }; - }); - - if (this.height / this.elementHeight > this.minDisplayItemCount) { - this.displayItemCount = Math.ceil((1.5 * this.height) / this.elementHeight); - } - - // console.log(this.data); - - // only needs to be called once for each "data" - this.dataInit(); - - this.cdr.markForCheck(); - }); - } - - /** - * Get the height of the container and save it to variable - */ - ngAfterViewInit() { - this.featureSubscription = this.layerService.getSelectedFeaturesStream().subscribe((x) => { - for (let i = 0; i < this.data.length; i++) { - const selectedContainsId = x.selected.contains(this.data[i].id); - if (!this.selected[i] && selectedContainsId) { - this.container.nativeElement.scrollTop = i * this.elementHeight; - } - - this.selected[i] = selectedContainsId; - } - - this.testSelected(); - this.testEqual(); - - this.cdr.markForCheck(); - }); - } - - ngOnChanges(changes: SimpleChanges) { - if (this.height / this.elementHeight > this.minDisplayItemCount) { - this.displayItemCount = Math.ceil((1.5 * this.height) / this.elementHeight); - } - } - - ngOnDestroy() { - this.dataSubscription.unsubscribe(); - this.featureSubscription.unsubscribe(); - } - - private initDataStream(): void { - const dataStream: Observable<{ - data$: Observable; - state$: Observable; - selectable: boolean; - }> = this.layerService.getSelectedLayerStream().pipe( - map((layer) => { - if (layer instanceof Layer) { - switch (layer.operator.resultType) { - case ResultTypes.POINTS: - case ResultTypes.LINES: - case ResultTypes.POLYGONS: - let vectorLayer = layer as VectorLayer; - let vectorLayerData = this.projectService.getLayerDataStream(vectorLayer) as Observable; - - const data = observableCombineLatest(vectorLayerData, this.mapService.getViewportSizeStream()).pipe( - map(([d, v]) => { - return d.data.filter((x) => { - const ve = v.extent; - - // console.log(ve, x.getGeometry(), int); - return (x.getGeometry() as OlPoint).intersectsExtent(ve); // TODO: not only point - }); - }), - ); - return { - data$: data, - dataExtent$: vectorLayerData.pipe(map((x) => x.extent)), - state$: this.projectService.getLayerDataStatusStream(vectorLayer), - selectable: true, - }; - default: - return { - data$: observableOf([]), - state$: observableOf(LoadingState.OK), - selectable: false, - }; - } - } else { - return { - data$: observableOf([]), - state$: observableOf(LoadingState.OK), - selectable: false, - }; - } - }), - ); - - // FIXME: use the correct datatype? - this.data$ = dataStream.pipe(switchMap((stream) => stream.data$)); - this.state$ = dataStream.pipe(switchMap((stream) => stream.state$)); - this.selectable$ = dataStream.pipe(map((stream) => stream.selectable)); - } - - /** - * Called when the input-variable data has changed - * Resets and recalculates all variables needed for displaying data in the table, virtual scrolling and selection - */ - private dataInit(): void { - this.firstDisplay = 0; - - this.tableData = new TableDataSource(this.data, this.firstDisplay, this.displayItemCount); - - this.container.nativeElement.scrollTop = 0; - this.container.nativeElement.scrollLeft = 0; - - this.offsetTop$ = new BehaviorSubject(0); - let offsetBottom = (this.data.length - this.displayItemCount) * this.elementHeight; - if (offsetBottom < 0) { - offsetBottom = 0; - } - this.offsetBottom$ = new BehaviorSubject(offsetBottom); - - // Reset selection - this.selected = []; - for (let i = 0; i < this.data.length; i++) { - this.selected[i] = false; - } - - // Get Header - if (this.data.length > 0 && this.data[0].properties) { - this.dataHead = TableComponent.getArrayOfKeys(this.data[0].properties); - this.tableDataHead = ['selection', ...this.dataHead]; - } - - // console.log(this.dataHead); - if (this.layerService) { - if (this.layerService.getSelectedLayer()) { - let units = this.layerService.getSelectedLayer().operator.units; - - if (units) { - this.dataHeadUnits = []; - - for (let d in this.dataHead) { - if (this.dataHead.hasOwnProperty(d)) { - this.dataHeadUnits.push(this.dataHead[d] + TableComponent.formatUnits(units.get(this.dataHead[d]))); - } - } - } - } - } - - // Reset avg widths - this.avgWidths = []; - for (let i = 0; i < this.data.length; i++) { - this.avgWidths[i] = this.columnMinWidth; - } - - // Calculate Column widths - const testData = this.selectRandomSubData(20); - [this.avgWidths, this.colTypes] = this.calculateColumnProperties(testData, this.dataHead, this.dataHeadUnits); - - /*console.log('--------------------------------'); - console.log(testData); - console.log(this.avgWidths);*/ - - // Recreate displayItemCounter - this.displayItemCounter = []; - let j = 0; - while (this.displayItemCounter.length < this.displayItemCount && this.displayItemCounter.length < this.data.length) { - this.displayItemCounter.push(j); - j++; - } - - // Test for Selections - this.testSelected(); - this.testEqual(); - } - - /** - * Uses canvas.measureText to compute and return the width of the given text of given font in pixels. - * - * @param {String} text The text to be rendered. - * @param {String} font The css font descriptor that text is to be rendered with (e.g. "bold 14px verdana"). - * @returns {number} the calculated width - */ - private getTextWidth(text, font): number { - // re-use canvas object for better performance - let context = this.canvas.getContext('2d'); - context.font = font; - let metrics = context.measureText(text); - // console.log(metrics); - return metrics.width; - } - - /** - * Selects a given number of random rows from the main dataset - * @param number amount of rows to select - * @returns {Array} an array of rows from the dataset - */ - private selectRandomSubData(number): Array { - let testData = []; - - for (let i = 0; i < number; i++) { - let r = Math.floor(Math.random() * this.data.length); - - testData[i] = this.data[r]; - } - - return testData; - } - - /** - * Calculates the average column-text-widths of a given dataset. Also includes the header-texts to make shure they also fit - * Tests for the contents of the sample-data to predict the content type of each column - * @param testData the dataset, to calculate column widths from - * @param dataHead the column names of the given dataset - * @param dataHeadUnits the column names of the given dataset (with units) - * @returns ({Array},{Array}) an array of average-widths and an array with the predicted content types - */ - private calculateColumnProperties(testData, dataHead, dataHeadUnits): [number[], string[]] { - let headCount = dataHead.length; - - let widths = []; - let types = []; - - for (let column = 0; column < headCount; column++) { - let columnWidth = 0; - let columnType; - - // Header Row - columnWidth = this.getTextWidth(dataHeadUnits[column], this.styleStringHead); - - columnType = 'text'; - - for (let row = 0; row < testData.length; row++) { - // Normal Table Rows - let tmp = testData[row].properties[dataHead[column]]; - - // console.log(tmp); - - if (typeof tmp === 'string' && tmp !== '') { - let urls = tmp.split(/(,)/g); - - let mediaCount = [0, 0, 0]; - let nonUrlsString = ''; - - for (let u in urls) { - if (urls.hasOwnProperty(u)) { - let mediaType = MediaviewComponent.getType(urls[u]); - - if (mediaType !== '') { - if (mediaType === 'text') { - nonUrlsString += urls[u] + ' '; - } else { - if (mediaType === 'image') { - mediaCount[0] += 1; - } else if (mediaType === 'audio') { - mediaCount[1] += 1; - } else if (mediaType === 'video') { - mediaCount[2] += 1; - } - - columnType = 'media'; - } - } - } - } - - let mediaString = ''; - - if (mediaCount[0] > 0) { - mediaString += '___ ' + mediaCount[0] + ' images'; - } - if (mediaCount[1] > 0) { - mediaString += '___ ' + mediaCount[1] + ' audio-files'; - } - if (mediaCount[2] > 0) { - mediaString += '___ ' + mediaCount[2] + ' videos'; - } - - mediaString += ' ' + nonUrlsString; - - // console.log(mediaString); - - columnWidth = Math.max(columnWidth, this.getTextWidth(mediaString, this.styleString)); - } - } - - // Widths - if (columnWidth > this.columnMaxWidth) { - columnWidth = this.columnMaxWidth; - } - widths[column] = columnWidth; - - // Types - types[column] = columnType; - } - - return [widths, types]; - } - - /** - * Called on Scrolling the Data-Table - * Updates the auto-scrolling first row and first column and calls the virtual-scroll update functions (top and bottom) - */ - public updateScroll(): void { - this.scrollTopBefore = this.scrollTop; - // this.scrollLeftBefore = this.scrollLeft; - - this.scrollTop = this.container.nativeElement.scrollTop; - this.scrollLeft = this.container.nativeElement.scrollLeft; - // console.log(this.scrollTopBefore+"->"+this.scrollTop); - - if (this.data != null && !this.scrolling) { - this.scrolling = true; - - let numberOfTopRows; - - // Scrolling down - if (this.scrollTop > this.scrollTopBefore) { - if ( - this.scrollTop + this.height > - this.headerHeight + (this.firstDisplay + this.displayItemCount - this.displayOffsetMin) * this.elementHeight - ) { - numberOfTopRows = Math.floor((this.scrollTop - this.headerHeight) / this.elementHeight) - this.displayOffsetMin; - } - } - - // Scrolling up - if (this.scrollTop < this.scrollTopBefore) { - if (this.scrollTop < this.headerHeight + (this.firstDisplay + this.displayOffsetMin) * this.elementHeight) { - numberOfTopRows = - Math.floor((this.scrollTop + this.height) / this.elementHeight) + this.displayOffsetMin - this.displayItemCount; - } - } - - if (typeof numberOfTopRows !== 'undefined') { - if (numberOfTopRows + this.displayItemCount > this.data.length) { - numberOfTopRows = this.data.length - this.displayItemCount; - } - if (numberOfTopRows < 0) { - numberOfTopRows = 0; - } - - if (this.firstDisplay !== numberOfTopRows) { - this.firstDisplay = numberOfTopRows; - this.tableData.update(this.data, this.firstDisplay, this.displayItemCount); - - this.offsetBottom$.next((this.data.length - numberOfTopRows - this.displayItemCount) * this.elementHeight); - this.offsetTop$.next(numberOfTopRows * this.elementHeight); - } - } - - this.scrolling = false; - } - } - - /** - * Row-Selection - * Called on clicking a checkbox to select a row - * toggles the checked-variable for this row and runs the tests to check, whether all rows are selected or unselected - */ - public toggle(index: number): void { - this.selected[index] = !this.selected[index]; - - if (this.selected[index]) { - this.layerService.updateSelectedFeatures([this.data[index].id], []); - } else { - this.layerService.updateSelectedFeatures([], [this.data[index].id]); - } - } - - /** - * Row-Selection - * Called when clicking the select-all-checkbox - * Selects or unselects all rows, depending on whether a row is already selected - */ - public toggleAll(): void { - let toggledList = Array(); - for (let i = 0; i < this.selected.length; i++) { - if (this.allSelected === this.selected[i]) { - toggledList.push(this.data[i].id); - } - - this.selected[i] = !this.allSelected; - } - - if (!this.allSelected) { - this.layerService.updateSelectedFeatures(toggledList, []); - } else { - this.layerService.updateSelectedFeatures([], toggledList); - } - } - - /** - * Row-Selection - * Tests, if all Rows are selected and sets the global allSelected variable - * Also emits the row-selection-event - */ - private testSelected(): void { - this.allSelected = true; - for (let s of this.selected) { - if (!s) { - this.allSelected = false; - break; - } - } - } - - /** - * Row-Selection - * Tests, if all Rows are in equal state (all selected or all unselected) and sets the global allEqual variable - */ - private testEqual(): void { - this.allEqual = true; - for (let s of this.selected) { - if (s !== this.selected[0]) { - this.allEqual = false; - break; - } - } - } -} - -export class TableDataSource extends DataSource { - private dataObs$: BehaviorSubject; - - constructor(data: Array, start: number, length: number) { - super(); - this.dataObs$ = new BehaviorSubject([]); - this.update(data, start, length); - } - - update(data: Array, start: number, length: number): void { - let slice = data.slice(start, start + length); - let dataNew = [undefined, ...slice, undefined]; - // console.log(start, length); - // console.log(this.data); - this.dataObs$.next(dataNew); - } - - /** Connect function called by the table to retrieve one stream containing the data to render. */ - connect(): Observable { - return this.dataObs$.asObservable(); - } - - disconnect() {} -} diff --git a/projects/wave-core/src/lib/dialogs/dialog-header/dialog-header.component.html b/projects/wave-core/src/lib/dialogs/dialog-header/dialog-header.component.html deleted file mode 100644 index f8f5ddf3..00000000 --- a/projects/wave-core/src/lib/dialogs/dialog-header/dialog-header.component.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/projects/wave-core/src/lib/dialogs/dialog-header/dialog-header.component.scss b/projects/wave-core/src/lib/dialogs/dialog-header/dialog-header.component.scss deleted file mode 100644 index 42e4bf5d..00000000 --- a/projects/wave-core/src/lib/dialogs/dialog-header/dialog-header.component.scss +++ /dev/null @@ -1,11 +0,0 @@ -$mat-dialog-padding: 24px !default; // TODO: import when this is possible again - -mat-toolbar.mat-dialog-title { - margin: #{-$mat-dialog-padding} #{-$mat-dialog-padding} 0 #{-$mat-dialog-padding}; - width: calc(100% + #{2 * $mat-dialog-padding}); -} - -mat-toolbar button { - padding: 0; - min-width: 2.25rem; -} diff --git a/projects/wave-core/src/lib/dialogs/dialog-header/dialog-header.component.ts b/projects/wave-core/src/lib/dialogs/dialog-header/dialog-header.component.ts deleted file mode 100644 index 386ef38c..00000000 --- a/projects/wave-core/src/lib/dialogs/dialog-header/dialog-header.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {Component, OnInit} from '@angular/core'; - -@Component({ - selector: 'wave-dialog-header', - templateUrl: './dialog-header.component.html', - styleUrls: ['./dialog-header.component.scss'], -}) -export class DialogHeaderComponent implements OnInit { - constructor() {} - - ngOnInit() {} -} diff --git a/projects/wave-core/src/lib/dialogs/dialog-help/dialog-help.component.html b/projects/wave-core/src/lib/dialogs/dialog-help/dialog-help.component.html deleted file mode 100644 index 811086c7..00000000 --- a/projects/wave-core/src/lib/dialogs/dialog-help/dialog-help.component.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - help -

Help

-
-
-
- -
-
diff --git a/projects/wave-core/src/lib/dialogs/dialog-help/dialog-help.component.scss b/projects/wave-core/src/lib/dialogs/dialog-help/dialog-help.component.scss deleted file mode 100644 index 82c304e9..00000000 --- a/projects/wave-core/src/lib/dialogs/dialog-help/dialog-help.component.scss +++ /dev/null @@ -1,22 +0,0 @@ -:host { - padding: 1rem; -} - -mat-panel-title { - align-items: center; -} - -mat-icon { - flex-grow: 0; -} - -.help-content ::ng-deep { - div, - p { - text-align: justify; - } -} - -.small_caps { - font-variant: small-caps; -} diff --git a/projects/wave-core/src/lib/dialogs/dialog-help/dialog-help.component.ts b/projects/wave-core/src/lib/dialogs/dialog-help/dialog-help.component.ts deleted file mode 100644 index 1ea7f32e..00000000 --- a/projects/wave-core/src/lib/dialogs/dialog-help/dialog-help.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; - -@Component({ - selector: 'wave-dialog-help', - templateUrl: './dialog-help.component.html', - styleUrls: ['./dialog-help.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class DialogHelpComponent implements OnInit { - constructor() {} - - ngOnInit() {} -} diff --git a/projects/wave-core/src/lib/dialogs/dialog-section-heading/dialog-section-heading.component.html b/projects/wave-core/src/lib/dialogs/dialog-section-heading/dialog-section-heading.component.html deleted file mode 100644 index c5b6ff4b..00000000 --- a/projects/wave-core/src/lib/dialogs/dialog-section-heading/dialog-section-heading.component.html +++ /dev/null @@ -1,4 +0,0 @@ -

- {{ title }} - {{ subtitle }} -

diff --git a/projects/wave-core/src/lib/dialogs/dialog-section-heading/dialog-section-heading.component.scss b/projects/wave-core/src/lib/dialogs/dialog-section-heading/dialog-section-heading.component.scss deleted file mode 100644 index 8a50b737..00000000 --- a/projects/wave-core/src/lib/dialogs/dialog-section-heading/dialog-section-heading.component.scss +++ /dev/null @@ -1,12 +0,0 @@ -:host { - display: block; -} - -h3 { - font-size: 1.17rem; - small { - display: block; - font-weight: normal; - } - margin: 1rem 0; -} diff --git a/projects/wave-core/src/lib/dialogs/dialog-section-heading/dialog-section-heading.component.ts b/projects/wave-core/src/lib/dialogs/dialog-section-heading/dialog-section-heading.component.ts deleted file mode 100644 index 42157eac..00000000 --- a/projects/wave-core/src/lib/dialogs/dialog-section-heading/dialog-section-heading.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {Component, Input, ChangeDetectionStrategy} from '@angular/core'; - -@Component({ - selector: 'wave-dialog-section-heading', - templateUrl: './dialog-section-heading.component.html', - styleUrls: ['./dialog-section-heading.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class DialogSectionHeadingComponent { - @Input('title') title: string; - @Input('subtitle') subtitle: string; -} diff --git a/projects/wave-core/src/lib/help/about/help-about.component.css b/projects/wave-core/src/lib/help/about/help-about.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/help/about/help-about.component.html b/projects/wave-core/src/lib/help/about/help-about.component.html deleted file mode 100644 index 34db1cff..00000000 --- a/projects/wave-core/src/lib/help/about/help-about.component.html +++ /dev/null @@ -1,18 +0,0 @@ - - About -

- Vat is developed by the Database Research Group of the University of Marburg (head: Prof. Bernhard Seeger) - in cooperation with the Senckenberg Biodiversity and Climate Research Centre (BiK-F) (head: Prof. Thomas Hickler). You can contact - us at vat@mathematik.uni-marburg.de or visit our - GitHub for further information. -

- - University of Marburg - - - Database Research Group of the University of Marburg - - - Senckenberg Society for Nature Research - -
diff --git a/projects/wave-core/src/lib/help/about/help-about.component.ts b/projects/wave-core/src/lib/help/about/help-about.component.ts deleted file mode 100644 index d0a2b3f7..00000000 --- a/projects/wave-core/src/lib/help/about/help-about.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; - -@Component({ - selector: 'wave-help-about', - templateUrl: './help-about.component.html', - styleUrls: ['./help-about.component.css'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HelpAboutComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} diff --git a/projects/wave-core/src/lib/help/account/help-account.component.css b/projects/wave-core/src/lib/help/account/help-account.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/help/account/help-account.component.html b/projects/wave-core/src/lib/help/account/help-account.component.html deleted file mode 100644 index e2857d5d..00000000 --- a/projects/wave-core/src/lib/help/account/help-account.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - Account / Login -

There is currently no register page for obtaining a Vat account.

-

- If you are interested in obtaining an account please contact us at - vat [at] mathematik.uni-marburg.de. -

-

To log in click the button in the top-right, and select the type of account

-
diff --git a/projects/wave-core/src/lib/help/account/help-account.component.ts b/projects/wave-core/src/lib/help/account/help-account.component.ts deleted file mode 100644 index 08349fee..00000000 --- a/projects/wave-core/src/lib/help/account/help-account.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; - -@Component({ - selector: 'wave-help-account', - templateUrl: './help-account.component.html', - styleUrls: ['./help-account.component.css'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HelpAccountComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} diff --git a/projects/wave-core/src/lib/help/data/help-data.component.css b/projects/wave-core/src/lib/help/data/help-data.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/help/data/help-data.component.html b/projects/wave-core/src/lib/help/data/help-data.component.html deleted file mode 100644 index 13cf7863..00000000 --- a/projects/wave-core/src/lib/help/data/help-data.component.html +++ /dev/null @@ -1,13 +0,0 @@ - - Add Data -

- The Vat system supports two very different types of data: raster and vector data. Rasters consist of many - pixels, and each pixel contains a value for the particular location, e.g. the mean temperature. Vector data are collections of - features with attributes, e.g. a set of occurrences of pumas and the time of the observation -

-

- Under Add Data you can select one of several environmental layers (rasters), occurrence data from - GBIF, data from GFBio archives in ABCD format and your own custom data -

-

Each data set is added to the map as a layer which you can further process with operators.

-
diff --git a/projects/wave-core/src/lib/help/data/help-data.component.ts b/projects/wave-core/src/lib/help/data/help-data.component.ts deleted file mode 100644 index f1aea813..00000000 --- a/projects/wave-core/src/lib/help/data/help-data.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; - -@Component({ - selector: 'wave-help-data', - templateUrl: './help-data.component.html', - styleUrls: ['./help-data.component.css'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HelpDataComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} diff --git a/projects/wave-core/src/lib/help/export/help-export.component.css b/projects/wave-core/src/lib/help/export/help-export.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/help/export/help-export.component.html b/projects/wave-core/src/lib/help/export/help-export.component.html deleted file mode 100644 index 5b23f182..00000000 --- a/projects/wave-core/src/lib/help/export/help-export.component.html +++ /dev/null @@ -1,7 +0,0 @@ - - Data Export -

- The result of computations can be exported by clicking the Export button in a layer's context menu. After selecting the - output format, a ZIP file is generated that bundles the actual data with all citations and the workflow itself -

-
diff --git a/projects/wave-core/src/lib/help/export/help-export.component.ts b/projects/wave-core/src/lib/help/export/help-export.component.ts deleted file mode 100644 index 83f71668..00000000 --- a/projects/wave-core/src/lib/help/export/help-export.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; - -@Component({ - selector: 'wave-help-export', - templateUrl: './help-export.component.html', - styleUrls: ['./help-export.component.css'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HelpExportComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} diff --git a/projects/wave-core/src/lib/help/feedback/help-feedback.component.html b/projects/wave-core/src/lib/help/feedback/help-feedback.component.html deleted file mode 100644 index e199ee33..00000000 --- a/projects/wave-core/src/lib/help/feedback/help-feedback.component.html +++ /dev/null @@ -1,28 +0,0 @@ - - Contact Us / Feedback - - diff --git a/projects/wave-core/src/lib/help/feedback/help-feedback.component.scss b/projects/wave-core/src/lib/help/feedback/help-feedback.component.scss deleted file mode 100644 index 9c86df04..00000000 --- a/projects/wave-core/src/lib/help/feedback/help-feedback.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -.feedback-container { - display: flex; - flex-direction: column; -} - -.feedback-container > * { - width: 100%; -} diff --git a/projects/wave-core/src/lib/help/feedback/help-feedback.component.ts b/projects/wave-core/src/lib/help/feedback/help-feedback.component.ts deleted file mode 100644 index d3d8e4de..00000000 --- a/projects/wave-core/src/lib/help/feedback/help-feedback.component.ts +++ /dev/null @@ -1,41 +0,0 @@ -import {Component, OnInit} from '@angular/core'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; - -/** @title Feedback component */ -@Component({ - selector: 'wave-help-feedback', - templateUrl: 'help-feedback.component.html', - styleUrls: ['help-feedback.component.scss'], -}) -export class HelpFeedbackComponent implements OnInit { - form: FormGroup; - - constructor(private formBuilder: FormBuilder) {} - - ngOnInit() { - this.form = this.formBuilder.group({ - requestType: ['Feedback', Validators.required], - name: ['', [Validators.required, Validators.minLength(1)]], - email: ['', [Validators.required, Validators.email]], - topic: ['', [Validators.required, Validators.minLength(1)]], - text: ['', [Validators.required, Validators.minLength(1)]], - }); - - setTimeout(() => this.form.updateValueAndValidity({emitEvent: true})); - } - - send() { - const mailTo = 'vat@mathematik.uni-marburg.de'; - const subject = `[${this.form.controls['requestType'].value}] ${this.form.controls['topic'].value}`; - const message = ` - Reply To: ${this.form.controls['email'].value} - \n\n - ~~~~~~~~~~ - \n\n - ${this.form.controls['text'].value} - `.trim(); - - // TODO: replace with web service call - window.location.href = `mailto:${mailTo}?subject=${subject}&body=${message}`; - } -} diff --git a/projects/wave-core/src/lib/help/general-information/help-general-information.component.css b/projects/wave-core/src/lib/help/general-information/help-general-information.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/help/general-information/help-general-information.component.html b/projects/wave-core/src/lib/help/general-information/help-general-information.component.html deleted file mode 100644 index 40c97822..00000000 --- a/projects/wave-core/src/lib/help/general-information/help-general-information.component.html +++ /dev/null @@ -1,13 +0,0 @@ - - General Information -

- The Vat system allows users to explore biodiversity data by selecting one of several data sources and - processing them with our built-in operators. -

-

Guest users can already try the system. The main features for registered users are:

-
    -
  • Saving work
  • -
  • Uploading custom data
  • -
  • Soon: Sharing results with other users
  • -
-
diff --git a/projects/wave-core/src/lib/help/general-information/help-general-information.component.ts b/projects/wave-core/src/lib/help/general-information/help-general-information.component.ts deleted file mode 100644 index 69dc960d..00000000 --- a/projects/wave-core/src/lib/help/general-information/help-general-information.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; - -@Component({ - selector: 'wave-help-general-information', - templateUrl: './help-general-information.component.html', - styleUrls: ['./help-general-information.component.css'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HelpGeneralInformationComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} diff --git a/projects/wave-core/src/lib/help/help.component.scss b/projects/wave-core/src/lib/help/help.component.scss deleted file mode 100644 index e9d76ff5..00000000 --- a/projects/wave-core/src/lib/help/help.component.scss +++ /dev/null @@ -1,14 +0,0 @@ -:host ::ng-deep mat-expansion-panel { - p { - text-align: justify; - } - - .vat { - font-variant: small-caps; - } - - img.extern { - height: 40px; - padding-right: 5px; - } -} diff --git a/projects/wave-core/src/lib/help/help.component.ts b/projects/wave-core/src/lib/help/help.component.ts deleted file mode 100644 index d68c9749..00000000 --- a/projects/wave-core/src/lib/help/help.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {Component, ChangeDetectionStrategy, OnInit} from '@angular/core'; - -@Component({ - selector: 'wave-help', - templateUrl: 'help.html', - styleUrls: ['./help.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HelpComponent implements OnInit { - ngOnInit() {} -} diff --git a/projects/wave-core/src/lib/help/help.html b/projects/wave-core/src/lib/help/help.html deleted file mode 100644 index 9cf39119..00000000 --- a/projects/wave-core/src/lib/help/help.html +++ /dev/null @@ -1,14 +0,0 @@ -Help - - - - - - - - - - - - - diff --git a/projects/wave-core/src/lib/help/lineage/help-lineage.component.css b/projects/wave-core/src/lib/help/lineage/help-lineage.component.css deleted file mode 100644 index 66e1654d..00000000 --- a/projects/wave-core/src/lib/help/lineage/help-lineage.component.css +++ /dev/null @@ -1,3 +0,0 @@ -img { - max-width: 100%; -} diff --git a/projects/wave-core/src/lib/help/lineage/help-lineage.component.html b/projects/wave-core/src/lib/help/lineage/help-lineage.component.html deleted file mode 100644 index 30dfdd49..00000000 --- a/projects/wave-core/src/lib/help/lineage/help-lineage.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - Lineage Tracking - Lineage -

- The Vat system's goal is to support interactive data exploration by tracking the data processing - automatically in the background. You can view the complete processing workflow for individual layers by selecting Lineage in - the layer context menu and the lineage for all layers by clicking on the context menu of the layer list in the top left. -

-
diff --git a/projects/wave-core/src/lib/help/lineage/help-lineage.component.ts b/projects/wave-core/src/lib/help/lineage/help-lineage.component.ts deleted file mode 100644 index ce75402c..00000000 --- a/projects/wave-core/src/lib/help/lineage/help-lineage.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; - -@Component({ - selector: 'wave-help-lineage', - templateUrl: './help-lineage.component.html', - styleUrls: ['./help-lineage.component.css'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HelpLineageComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} diff --git a/projects/wave-core/src/lib/help/operators/help-operators.component.css b/projects/wave-core/src/lib/help/operators/help-operators.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/help/operators/help-operators.component.html b/projects/wave-core/src/lib/help/operators/help-operators.component.html deleted file mode 100644 index 006be8e2..00000000 --- a/projects/wave-core/src/lib/help/operators/help-operators.component.html +++ /dev/null @@ -1,59 +0,0 @@ - - Operators -

Operators allow you to process the layers that were previously added to the map. Our current operators are:

-
    -
  • - Mixed -
      -
    • - Raster Value Extraction -
        -
      • - Select a vector layer and one or more raster layers. The raster values at the location of the features are - attached as new attributes. E.g. you can add an elevation attribute to pumas, containing the elevation at - the puma's observed location -
      • -
      -
    • -
    -
  • - -
  • - Plots -
      -
    • Histogram: Plot a histogram of the data distribution of a raster or vector layer.
    • -
    -
  • -
  • - Raster -
      -
    • - Expression -
        -
      • Evaluate an expression on the pixel values of the input rasters
      • -
      -
    • -
    -
  • -
  • - Vectors -
      -
    • - Numeric Attribute Filter -
        -
      • Perform a range filter on a numeric attribute of a feature collection
      • -
      -
    • -
    • - Point in Polygon Filter -
        -
      • - Select a point and a polygon layer and create a new layer containing only those points that are contained in at - least one polygon. -
      • -
      -
    • -
    -
  • -
-
diff --git a/projects/wave-core/src/lib/help/operators/help-operators.component.ts b/projects/wave-core/src/lib/help/operators/help-operators.component.ts deleted file mode 100644 index c51b9bc1..00000000 --- a/projects/wave-core/src/lib/help/operators/help-operators.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; - -@Component({ - selector: 'wave-help-operators', - templateUrl: './help-operators.component.html', - styleUrls: ['./help-operators.component.css'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HelpOperatorsComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} diff --git a/projects/wave-core/src/lib/help/overview/help-overview.component.css b/projects/wave-core/src/lib/help/overview/help-overview.component.css deleted file mode 100644 index b4b5ef32..00000000 --- a/projects/wave-core/src/lib/help/overview/help-overview.component.css +++ /dev/null @@ -1,3 +0,0 @@ -img { - width: 100%; -} diff --git a/projects/wave-core/src/lib/help/overview/help-overview.component.html b/projects/wave-core/src/lib/help/overview/help-overview.component.html deleted file mode 100644 index 809da0d2..00000000 --- a/projects/wave-core/src/lib/help/overview/help-overview.component.html +++ /dev/null @@ -1,68 +0,0 @@ - - Overview of the User Interface - - User Interface Overview -
- Click to enhance -
-

The user interface consists of the following main parts:

-
    -
  • - Map (center) -
      -
    • Here, all data is visualized.
    • -
    -
  • -
  • - Layer list (left) -
      -
    • All layers that were added to the map are listed.
    • -
    • You can change the order of the layers via drag and drop.
    • -
    • Additionally, legends for the layers are shown.
    • -
    • A layer can be selected as active for the data table and feature selection in the map.
    • -
    -
  • -
  • - Data table & Citation (bottom) -
      -
    • Data table: Here, information about individual items in the layer are shown.
    • -
    • Citations: Inspect the citation information of all data sets that were involved in creating the layer.
    • -
    -
  • -
  • - Sidebar (right) -
      -
    • - Here, the core functionality of the system is available. Clicking one of the buttons on the right hand side opens the - sidebar. -
    • -
    • Login: Login to the system to use more advanced features not available to guests.
    • -
    • - Add data: Select data from one of the following categories -
        -
      • Environmental data
      • -
      • Species distribution
      • -
      • Custom (uploaded) data
      • -
      -
    • -
    • Operators: Perform an operation on one or multiple layers previously added to the map.
    • -
    • Time: Select the reference time for the current project (cf. Time)
    • -
    • Plots: Inspect plots like graphs and histograms
    • -
    • - Workspace: Configure your workspace -
        -
      • Load/Save project
      • -
      • Change the currently active projection
      • -
      -
    • -
    • Help: Open this help functionality
    • -
    -
  • -
  • - Time (top) -
      -
    • Step through the time. For more detailed information see time
    • -
    -
  • -
-
diff --git a/projects/wave-core/src/lib/help/overview/help-overview.component.ts b/projects/wave-core/src/lib/help/overview/help-overview.component.ts deleted file mode 100644 index eb138adc..00000000 --- a/projects/wave-core/src/lib/help/overview/help-overview.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; - -@Component({ - selector: 'wave-help-overview', - templateUrl: './help-overview.component.html', - styleUrls: ['./help-overview.component.css'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HelpOverviewComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} diff --git a/projects/wave-core/src/lib/help/quick-demo/help-quick-demo.component.css b/projects/wave-core/src/lib/help/quick-demo/help-quick-demo.component.css deleted file mode 100644 index aecd1361..00000000 --- a/projects/wave-core/src/lib/help/quick-demo/help-quick-demo.component.css +++ /dev/null @@ -1,4 +0,0 @@ -iframe { - width: 100%; - border: none; -} diff --git a/projects/wave-core/src/lib/help/quick-demo/help-quick-demo.component.html b/projects/wave-core/src/lib/help/quick-demo/help-quick-demo.component.html deleted file mode 100644 index 7d6ec2f7..00000000 --- a/projects/wave-core/src/lib/help/quick-demo/help-quick-demo.component.html +++ /dev/null @@ -1,4 +0,0 @@ - - Quick Demo - - diff --git a/projects/wave-core/src/lib/help/quick-demo/help-quick-demo.component.ts b/projects/wave-core/src/lib/help/quick-demo/help-quick-demo.component.ts deleted file mode 100644 index e23ee4de..00000000 --- a/projects/wave-core/src/lib/help/quick-demo/help-quick-demo.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; - -@Component({ - selector: 'wave-help-quick-demo', - templateUrl: './help-quick-demo.component.html', - styleUrls: ['./help-quick-demo.component.css'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HelpQuickDemoComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} diff --git a/projects/wave-core/src/lib/layers/dialogs/layer-export/layer-export.component.html b/projects/wave-core/src/lib/layers/dialogs/layer-export/layer-export.component.html deleted file mode 100644 index b00d1a9c..00000000 --- a/projects/wave-core/src/lib/layers/dialogs/layer-export/layer-export.component.html +++ /dev/null @@ -1,36 +0,0 @@ -Export: {{ layer.name }} -
-
- - - -
-
- - - - - - -
-
- - - {{ type }} - - - - - {{ type }} - - -
-
- - - JSON - - -
- -
diff --git a/projects/wave-core/src/lib/layers/dialogs/layer-export/layer-export.component.scss b/projects/wave-core/src/lib/layers/dialogs/layer-export/layer-export.component.scss deleted file mode 100644 index 3389205f..00000000 --- a/projects/wave-core/src/lib/layers/dialogs/layer-export/layer-export.component.scss +++ /dev/null @@ -1,11 +0,0 @@ -div:first-child { - margin-top: 1rem; -} - -div:not(:first-child) { - margin-bottom: 1rem; -} - -mat-select { - margin-bottom: 1rem; -} diff --git a/projects/wave-core/src/lib/layers/dialogs/layer-export/layer-export.component.ts b/projects/wave-core/src/lib/layers/dialogs/layer-export/layer-export.component.ts deleted file mode 100644 index b9736f58..00000000 --- a/projects/wave-core/src/lib/layers/dialogs/layer-export/layer-export.component.ts +++ /dev/null @@ -1,113 +0,0 @@ -import {first} from 'rxjs/operators'; -import {Subscription} from 'rxjs'; - -import {Component, OnInit, ChangeDetectionStrategy, AfterViewInit, OnDestroy, Inject} from '@angular/core'; -import {WFSOutputFormats} from '../../../queries/output-formats/wfs-output-format.model'; -import {WCSOutputFormats} from '../../../queries/output-formats/wcs-output-format.model'; -import {FormGroup, FormBuilder, Validators} from '@angular/forms'; -import {Layer} from '../../layer.model'; -import {AbstractSymbology} from '../../symbology/symbology.model'; -import {MAT_DIALOG_DATA} from '@angular/material/dialog'; -import {ResultTypes} from '../../../operators/result-type.model'; -import {MappingQueryService} from '../../../queries/mapping-query.service'; -import {ProjectService} from '../../../project/project.service'; - -interface LayerExportComponentConfig { - layer: Layer; -} - -@Component({ - selector: 'wave-layer-export', - templateUrl: './layer-export.component.html', - styleUrls: ['./layer-export.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LayerExportComponent implements OnInit, AfterViewInit, OnDestroy { - // make available - WFSOutputFormats = WFSOutputFormats; - WCSOutputFormats = WCSOutputFormats; - // - - form: FormGroup; - - layer: Layer; - - isRaster: boolean; - isVector: boolean; - - private subscriptions: Array = []; - - constructor( - private formBuilder: FormBuilder, - private mappingQueryService: MappingQueryService, - private projectService: ProjectService, - @Inject(MAT_DIALOG_DATA) private config: LayerExportComponentConfig, - ) {} - - ngOnInit() { - // const config = this.dialogRef.config as LayerExportComponentConfig; - this.layer = this.config.layer; - - this.isRaster = this.layer.operator.resultType === ResultTypes.RASTER; - this.isVector = ResultTypes.VECTOR_TYPES.indexOf(this.layer.operator.resultType) >= 0; - - if (this.isRaster && this.isVector) { - throw Error('The layer must be of type raster OR vector'); - } - - this.form = this.formBuilder.group({ - outputName: [{value: 'export', disabled: true}, Validators.required], - dataOutputFormat: [undefined, Validators.required], - citationFormat: ['json', Validators.required], - rasterResolution: this.formBuilder.group({ - width: [1024, Validators.required], - height: [{value: 1024, disabled: true}, Validators.required], - }), - }); - - this.subscriptions.push( - (this.form.controls['rasterResolution'] as FormGroup).controls['width'].valueChanges.subscribe((width) => { - (this.form.controls['rasterResolution'] as FormGroup).controls['height'].setValue(width); - }), - ); - } - - ngAfterViewInit() { - setTimeout(() => this.form.updateValueAndValidity()); - } - - ngOnDestroy() { - this.subscriptions.forEach((subscription) => subscription.unsubscribe()); - } - - download() { - this.projectService - .getProjectStream() - .pipe(first()) - .subscribe((project) => { - if (this.isVector) { - location.href = this.mappingQueryService.getWFSQueryUrl({ - operator: this.layer.operator, - outputFormat: this.form.controls['dataOutputFormat'].value, - time: project.time, - projection: project.projection, - }); - } - - if (this.isRaster) { - const rasterResolution = this.form.controls['rasterResolution'] as FormGroup; - - location.href = this.mappingQueryService.getWCSQueryUrl({ - operator: this.layer.operator, - outputFormat: this.form.controls['dataOutputFormat'].value, - size: { - x: rasterResolution.controls['width'].value, - y: rasterResolution.controls['height'].value, - }, - time: project.time, - projection: project.projection, - }); - } - }); - } -} diff --git a/projects/wave-core/src/lib/layers/dialogs/layer-share/layer-share.component.html b/projects/wave-core/src/lib/layers/dialogs/layer-share/layer-share.component.html deleted file mode 100644 index 2c08548a..00000000 --- a/projects/wave-core/src/lib/layers/dialogs/layer-share/layer-share.component.html +++ /dev/null @@ -1,10 +0,0 @@ -Share: {{ layer.name }} -

Copy this link to share the selected layer with others.

-
- - - - -
diff --git a/projects/wave-core/src/lib/layers/dialogs/layer-share/layer-share.component.scss b/projects/wave-core/src/lib/layers/dialogs/layer-share/layer-share.component.scss deleted file mode 100644 index 3b0c351d..00000000 --- a/projects/wave-core/src/lib/layers/dialogs/layer-share/layer-share.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -div { - margin-top: 1em; -} - -input { - color: var(--wave-foreground-text-color, black) !important; -} diff --git a/projects/wave-core/src/lib/layers/dialogs/layer-share/layer-share.component.ts b/projects/wave-core/src/lib/layers/dialogs/layer-share/layer-share.component.ts deleted file mode 100644 index 6989268c..00000000 --- a/projects/wave-core/src/lib/layers/dialogs/layer-share/layer-share.component.ts +++ /dev/null @@ -1,43 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy, Inject, ViewChild, ElementRef} from '@angular/core'; -import {Layer} from '../../layer.model'; -import {AbstractSymbology} from '../../symbology/symbology.model'; -import {MAT_DIALOG_DATA} from '@angular/material/dialog'; - -interface LayerShareComponentConfig { - layer: Layer; -} - -@Component({ - selector: 'wave-layer-share-dialog', - templateUrl: './layer-share.component.html', - styleUrls: ['./layer-share.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LayerShareComponent implements OnInit { - layer: Layer; - link: string; - - @ViewChild('linkInput', {static: true}) - private linkInput: ElementRef; - - constructor(@Inject(MAT_DIALOG_DATA) private config: LayerShareComponentConfig) {} - - ngOnInit() { - this.layer = this.config.layer; - - const layerJSON = JSON.stringify(this.layer.toDict()); - - this.link = `${window.location.origin}${window.location.pathname}#/?workflow=${encodeURI(layerJSON)}`; - } - - copyLink() { - const disabled = this.linkInput.nativeElement.disabled; - this.linkInput.nativeElement.disabled = false; - - this.linkInput.nativeElement.focus(); - this.linkInput.nativeElement.select(); - document.execCommand('copy'); - - this.linkInput.nativeElement.disabled = disabled; - } -} diff --git a/projects/wave-core/src/lib/layers/dialogs/rename-layer.component.ts b/projects/wave-core/src/lib/layers/dialogs/rename-layer.component.ts deleted file mode 100644 index 3dcc91b4..00000000 --- a/projects/wave-core/src/lib/layers/dialogs/rename-layer.component.ts +++ /dev/null @@ -1,66 +0,0 @@ -import {Component, ChangeDetectionStrategy, OnInit, Inject} from '@angular/core'; - -import {Layer} from '../layer.model'; -import {AbstractSymbology} from '../symbology/symbology.model'; -import {FormGroup, FormBuilder, Validators} from '@angular/forms'; -import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; -import {ProjectService} from '../../project/project.service'; - -@Component({ - selector: 'wave-rename-layer-dialog', - template: ` - Rename the Current Layer -
- - - - - - - - -
- `, - styles: [ - ` - form { - padding-top: 16px; - } - mat-form-field { - width: 100%; - } - `, - ], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class RenameLayerComponent implements OnInit { - form: FormGroup; - - private layer: Layer; - - constructor( - private projectService: ProjectService, - private formBuilder: FormBuilder, - private dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) private config: {layer?: Layer}, - ) {} - - ngOnInit(): void { - // this.layer = (this.dialogRef.config as {layer?: Layer}).layer; - this.layer = this.config.layer; - this.form = this.formBuilder.group({ - layerName: [this.layer.name, Validators.required], - }); - } - - /** - * Save the layer name and close the dialog. - */ - save(event: any) { - const layerName = this.form.controls['layerName'].value; - if (layerName !== this.layer.name) { - this.projectService.changeLayer(this.layer, {name: layerName}); - } - this.dialogRef.close(); - } -} diff --git a/projects/wave-core/src/lib/layers/layer-icons/line-icon/line-icon.component.scss b/projects/wave-core/src/lib/layers/layer-icons/line-icon/line-icon.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/layers/layer-icons/line-icon/line-icon.component.svg b/projects/wave-core/src/lib/layers/layer-icons/line-icon/line-icon.component.svg deleted file mode 100644 index f9bffd37..00000000 --- a/projects/wave-core/src/lib/layers/layer-icons/line-icon/line-icon.component.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/projects/wave-core/src/lib/layers/layer-icons/line-icon/line-icon.component.ts b/projects/wave-core/src/lib/layers/layer-icons/line-icon/line-icon.component.ts deleted file mode 100644 index 57dad06e..00000000 --- a/projects/wave-core/src/lib/layers/layer-icons/line-icon/line-icon.component.ts +++ /dev/null @@ -1,50 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy, Input, SimpleChanges, OnChanges} from '@angular/core'; -import {StrokeDashStyle} from '../../symbology/symbology.model'; -import {BLACK, Color} from '../../../colors/color'; - -/** - * A simple interface to specify the style of a line icon. - */ -export interface LineIconStyle { - strokeWidth: number; - strokeDashStyle: StrokeDashStyle; - strokeRGBA: Color; -} - -/** - * The line icon component - */ -@Component({ - selector: 'wave-line-icon', - templateUrl: './line-icon.component.svg', - styleUrls: ['./line-icon.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LineIconComponent implements OnInit, OnChanges { - // the style to use for the icon - @Input() - iconStyle: LineIconStyle; - strokeWidth = 2; - strokeDashArray: Array = []; - strokeColor = BLACK.rgbaCssString(); - - constructor() {} - - ngOnInit(): void { - if (this.iconStyle) { - this.updateStyle(); - } - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes) { - this.updateStyle(); - } - } - - private updateStyle() { - this.strokeWidth = this.iconStyle.strokeWidth; - this.strokeDashArray = this.iconStyle.strokeDashStyle ? this.iconStyle.strokeDashStyle : []; - this.strokeColor = this.iconStyle.strokeRGBA.rgbaCssString(); - } -} diff --git a/projects/wave-core/src/lib/layers/layer-icons/point-icon/point-icon.component.scss b/projects/wave-core/src/lib/layers/layer-icons/point-icon/point-icon.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/layers/layer-icons/point-icon/point-icon.component.svg b/projects/wave-core/src/lib/layers/layer-icons/point-icon/point-icon.component.svg deleted file mode 100644 index 19e42c5f..00000000 --- a/projects/wave-core/src/lib/layers/layer-icons/point-icon/point-icon.component.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/projects/wave-core/src/lib/layers/layer-icons/point-icon/point-icon.component.ts b/projects/wave-core/src/lib/layers/layer-icons/point-icon/point-icon.component.ts deleted file mode 100644 index 0943d892..00000000 --- a/projects/wave-core/src/lib/layers/layer-icons/point-icon/point-icon.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy, Input, OnChanges, SimpleChanges} from '@angular/core'; -import {StrokeDashStyle} from '../../symbology/symbology.model'; -import {BLACK, Color, WHITE} from '../../../colors/color'; - -/** - * A simple interface to specify the style of a point icon - */ -export interface PointIconStyle { - strokeWidth: number; - strokeDashStyle: StrokeDashStyle; - strokeRGBA: Color; - fillRGBA: Color; -} - -/** - * The point icon component - */ -@Component({ - selector: 'wave-point-icon', - templateUrl: './point-icon.component.svg', - styleUrls: ['./point-icon.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PointIconComponent implements OnInit, OnChanges { - // the style to use for the icon - @Input() - iconStyle: PointIconStyle; - strokeWidth = 2; - strokeDashArray: Array = []; - strokeColor = BLACK.rgbaCssString(); - fillColor = WHITE.rgbaCssString(); - - constructor() {} - - ngOnInit(): void { - if (this.iconStyle) { - this.updateStyle(); - } - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes) { - this.updateStyle(); - } - } - - private updateStyle() { - this.strokeWidth = this.iconStyle.strokeWidth; - this.strokeDashArray = this.iconStyle.strokeDashStyle ? this.iconStyle.strokeDashStyle : []; - this.strokeColor = this.iconStyle.strokeRGBA.rgbaCssString(); - this.fillColor = this.iconStyle.fillRGBA.rgbaCssString(); - } -} diff --git a/projects/wave-core/src/lib/layers/layer-icons/polygon-icon/polygon-icon.component.scss b/projects/wave-core/src/lib/layers/layer-icons/polygon-icon/polygon-icon.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/layers/layer-icons/polygon-icon/polygon-icon.component.svg b/projects/wave-core/src/lib/layers/layer-icons/polygon-icon/polygon-icon.component.svg deleted file mode 100644 index 426498e4..00000000 --- a/projects/wave-core/src/lib/layers/layer-icons/polygon-icon/polygon-icon.component.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/projects/wave-core/src/lib/layers/layer-icons/polygon-icon/polygon-icon.component.ts b/projects/wave-core/src/lib/layers/layer-icons/polygon-icon/polygon-icon.component.ts deleted file mode 100644 index 133d2dbe..00000000 --- a/projects/wave-core/src/lib/layers/layer-icons/polygon-icon/polygon-icon.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy, Input, SimpleChanges, OnChanges} from '@angular/core'; -import {StrokeDashStyle} from '../../symbology/symbology.model'; -import {BLACK, Color, WHITE} from '../../../colors/color'; - -/** - * A simple interface to specify the style of a polygon icon - */ -export interface PolygonIconStyle { - strokeWidth: number; - strokeDashStyle: StrokeDashStyle; - strokeRGBA: Color; - fillRGBA: Color; -} - -/** - * The polygon icon component - */ -@Component({ - selector: 'wave-polygon-icon', - templateUrl: './polygon-icon.component.svg', - styleUrls: ['./polygon-icon.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PolygonIconComponent implements OnInit, OnChanges { - // the style to use for the icon - @Input() - iconStyle: PolygonIconStyle; - strokeWidth = 2; - strokeDashArray: Array = []; - strokeColor = BLACK.rgbaCssString(); - fillColor = WHITE.rgbaCssString(); - - constructor() {} - - ngOnInit(): void { - if (this.iconStyle) { - this.updateStyle(); - } - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes) { - this.updateStyle(); - } - } - - private updateStyle() { - this.strokeWidth = this.iconStyle.strokeWidth; - this.strokeDashArray = this.iconStyle.strokeDashStyle ? this.iconStyle.strokeDashStyle : []; - this.strokeColor = this.iconStyle.strokeRGBA.rgbaCssString(); - this.fillColor = this.iconStyle.fillRGBA.rgbaCssString(); - } -} diff --git a/projects/wave-core/src/lib/layers/layer-icons/raster-icon/raster-icon.component.scss b/projects/wave-core/src/lib/layers/layer-icons/raster-icon/raster-icon.component.scss deleted file mode 100644 index 6aeb9710..00000000 --- a/projects/wave-core/src/lib/layers/layer-icons/raster-icon/raster-icon.component.scss +++ /dev/null @@ -1,6 +0,0 @@ -svg { - rect { - //stroke: rgba(0,0,0,0.5); - //stroke-width: 1px; - } -} diff --git a/projects/wave-core/src/lib/layers/layer-icons/raster-icon/raster-icon.component.svg b/projects/wave-core/src/lib/layers/layer-icons/raster-icon/raster-icon.component.svg deleted file mode 100644 index dfef2656..00000000 --- a/projects/wave-core/src/lib/layers/layer-icons/raster-icon/raster-icon.component.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/projects/wave-core/src/lib/layers/layer-icons/raster-icon/raster-icon.component.ts b/projects/wave-core/src/lib/layers/layer-icons/raster-icon/raster-icon.component.ts deleted file mode 100644 index 27e8d30b..00000000 --- a/projects/wave-core/src/lib/layers/layer-icons/raster-icon/raster-icon.component.ts +++ /dev/null @@ -1,90 +0,0 @@ -import {ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChange} from '@angular/core'; -import {IColorizerData} from '../../../colors/colorizer-data.model'; -import {Color} from '../../../colors/color'; - -/** - * a simple interface to model a cell in the raster icon - */ -interface Cell { - xStart: number; - yStart: number; - xSize: number; - ySize: number; - colorString: string; -} - -/** - * The raster icon component displays colored cells to visualize the raster style - */ -@Component({ - selector: 'wave-raster-icon', - templateUrl: './raster-icon.component.svg', - styleUrls: ['./raster-icon.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class RasterIconComponent implements OnInit, OnChanges { - // number of cells in x and y direction - @Input() xCells: number; - @Input() yCells: number; - // the raster style used to color the icon - @Input() colorizer: IColorizerData; - - /** - * the array of generated (colored and positioned) cells. - */ - cells: Array; - /** - * This is the number of pixels used for the icon - */ - cellSpace = 24; - - ngOnChanges(changes: {[propertyName: string]: SimpleChange}) { - this.generateCells(this.xCells, this.yCells); - } - - ngOnInit() { - this.generateCells(this.xCells, this.yCells); - } - - /** - * generates an array of cell descriptors which are used by the template - */ - generateCells(xCells: number, yCells: number) { - this.cells = new Array(xCells * yCells); - for (let y = 0; y < this.yCells; y++) { - for (let x = 0; x < this.xCells; x++) { - const idx = this.xCells * y + x; - this.cells[idx] = { - xStart: (x * this.cellSpace) / this.xCells, - yStart: (y * this.cellSpace) / this.yCells, - xSize: this.cellSpace / this.xCells, - ySize: this.cellSpace / this.yCells, - colorString: Color.rgbaToCssString(this.cellColor(x, y)), - }; - } - } - } - - private cellColor(x: number, y: number): Color { - const validSymbology = this.colorizer && this.colorizer.breakpoints && this.colorizer.breakpoints.length > 0; - if (!validSymbology) { - return Color.fromRgbaLike('ff000000'); - } - - const numberOfCells = this.xCells * this.yCells; - const numberOfColors = this.colorizer.breakpoints.length; - const isGradient = this.colorizer.type === 'gradient' || this.colorizer.type === 'logarithmic'; - - const scale = isGradient ? numberOfColors / (this.xCells + this.yCells - 1) : numberOfColors / numberOfCells; - - const idx = y * this.xCells + x; - let colorIdx = 0; - if (numberOfColors === 2) { - colorIdx = y % 2 === 0 ? x % 2 : (x + 1) % 2; - } else { - const uidx = isGradient ? this.xCells - 1 - x + y : idx; - colorIdx = Math.trunc(uidx * scale) % numberOfColors; - } - return Color.fromRgbaLike(this.colorizer.breakpoints[colorIdx].rgba); - } -} diff --git a/projects/wave-core/src/lib/layers/layer-list/layer-list.component.html b/projects/wave-core/src/lib/layers/layer-list/layer-list.component.html deleted file mode 100644 index d0c12183..00000000 --- a/projects/wave-core/src/lib/layers/layer-list/layer-list.component.html +++ /dev/null @@ -1,253 +0,0 @@ -
- - - - - - - - - - -
-
- - - - -
-
- -
-
- -
- -
-
-
- - - - - - - - - - - - - - -
-
- - - - -
- {{ layer.name }} -
- - -
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - -
- - -
-
- -
-
-
diff --git a/projects/wave-core/src/lib/layers/layer-list/layer-list.component.scss b/projects/wave-core/src/lib/layers/layer-list/layer-list.component.scss deleted file mode 100644 index d4d2cbe0..00000000 --- a/projects/wave-core/src/lib/layers/layer-list/layer-list.component.scss +++ /dev/null @@ -1,176 +0,0 @@ -.container { - max-height: inherit; - height: inherit; -} - -.layer-list { - max-height: inherit; - overflow-y: auto; - max-width: 100%; - border: solid 1px #ccc; - min-height: 0; - display: block; - border-radius: 4px; -} - -.layer-list-element { - width: 100%; -} - -.layer-list-box { - font-size: 14px; - padding: 0; - min-height: 40px; - max-width: 100%; - border-bottom: solid 1px #ccc; - color: rgba(0, 0, 0, 0.87); - display: flex; - flex-direction: row; - align-items: flex-start; - justify-content: space-between; - box-sizing: border-box; - background-color: var(--wave-background-color, white); -} - -.cdk-drag-preview { - box-sizing: border-box; - border-radius: 4px; - box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12); -} - -.layer-list-element-custom-placeholder { - background-color: #ccc; - border: dotted 3px #999; - min-height: 40px; - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.cdk-drag-animating { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.layer-list-box:last-child { - border: none; -} - -.layer-list.cdk-drop-list-dragging .layer-list-box:not(.cdk-drag-placeholder) { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.layer-list-item-text { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.list-element-inner-container { - width: 100%; -} - -.no-layer { - width: 100%; -} - -::ng-deep .logo { - text-align: center; - - @media (max-width: 1480px) { - flex: 1; - } - - mat-icon { - vertical-align: sub; - } - - ::ng-deep svg { - border: 1px solid currentColor; - border-radius: 50%; - } - - .title { - font-family: 'Pacifico', cursive; - } - - .subtitle { - font-size: 0.75rem; - } -} - -.only-large { - @media (max-width: 1480px) { - display: none; - } -} - -.geobon-logo { - text-align: center; - - @media (max-width: 1480px) { - flex: 1; - } - - mat-icon { - vertical-align: baseline; - height: 1rem; - width: 80px; - } - - .title { - font-family: 'Pacifico', cursive; - } - - .subtitle { - font-size: 0.75rem; - } - - .up { - vertical-align: text-top; - } -} - -.grabbable { - cursor: grab; -} - -/* (Optional) Apply a "closed-hand" cursor during drag operation. */ -.grabbable:active { - cursor: grabbing; -} - -.small { - font-size: 0.8rem; -} - -.mat-toolbar { - padding: 0 !important; -} - -mat-toolbar div:first-child, -button { - width: 40px; -} - -mat-toolbar ::ng-deep mat-toolbar-row:first-child { - display: none !important; -} - -mat-progress-bar { - width: 100% !important; - height: 1px !important; - margin: 0 !important; - padding: 0 !important; -} - -mat-progress-bar { - height: 2px; -} - -.active-layer { - background-color: var(--wave-faded-accent-color, grey); -} - -.lineThrough { - background: url("data:image/svg+xml;utf8,") - no-repeat center center; - background-size: 100% 100%, auto; -} diff --git a/projects/wave-core/src/lib/layers/layer-list/layer-list.component.ts b/projects/wave-core/src/lib/layers/layer-list/layer-list.component.ts deleted file mode 100644 index 9c63afa2..00000000 --- a/projects/wave-core/src/lib/layers/layer-list/layer-list.component.ts +++ /dev/null @@ -1,141 +0,0 @@ -import {Observable, Subscription} from 'rxjs'; -import {Component, OnDestroy, Input, ChangeDetectionStrategy, ChangeDetectorRef} from '@angular/core'; -import {CdkDragDrop, moveItemInArray} from '@angular/cdk/drag-drop'; -import {MatDialog} from '@angular/material/dialog'; -import {LayoutService, SidenavConfig} from '../../layout.service'; -import {SymbologyType, AbstractSymbology, VectorSymbology} from '../symbology/symbology.model'; -import {RenameLayerComponent} from '../dialogs/rename-layer.component'; -import {LoadingState} from '../../project/loading-state.model'; -import {LayerService} from '../layer.service'; -import {MapService} from '../../map/map.service'; -import {Layer} from '../layer.model'; -import {SourceOperatorListComponent} from '../../operators/dialogs/source-operator-list/source-operator-list.component'; -import {LineageGraphComponent} from '../../provenance/lineage-graph/lineage-graph.component'; -import {LayerExportComponent} from '../dialogs/layer-export/layer-export.component'; -import {ProjectService} from '../../project/project.service'; -import {LayerShareComponent} from '../dialogs/layer-share/layer-share.component'; -import {Config} from '../../config.service'; -import {SymbologyEditorComponent} from '../symbology/symbology-editor/symbology-editor.component'; -import {filter, map, startWith} from 'rxjs/operators'; - -/** - * The layer list component displays active layers, legends and other controlls. - */ -@Component({ - selector: 'wave-layer-list', - templateUrl: './layer-list.component.html', - styleUrls: ['./layer-list.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LayerListComponent implements OnDestroy { - /** - * The desired height of the list - */ - @Input() height: number; - - /** - * The empty list shows a button to trigger the generation of a first layer. - * This sidenav config is called to present a date listing or a similar dialog in the sidenav. - */ - @Input() addAFirstLayerSidenavConfig: SidenavConfig = {component: SourceOperatorListComponent}; - - /** - * sends if the layerlist should be visible - */ - readonly layerListVisibility$: Observable; - - /** - * sends if the map should be a grid (or else a single map) - */ - readonly mapIsGrid$: Observable; - - /** - * The list of layers displayed in the layer list - */ - layerList: Array> = []; - - // make ENUMS and classes visible in the template - readonly LayoutService = LayoutService; - readonly ST = SymbologyType; - readonly LoadingState = LoadingState; - readonly RenameLayerComponent = RenameLayerComponent; - readonly LineageGraphComponent = LineageGraphComponent; - readonly LayerExportComponent = LayerExportComponent; - readonly LayerShareComponent = LayerShareComponent; - readonly SourceOperatorListComponent = SourceOperatorListComponent; - readonly SymbologyEditorComponent = SymbologyEditorComponent; - - // inventory of used subscriptions - private subscriptions: Array = []; - - /** - * The component constructor. It injects angular and wave services. - */ - constructor( - public dialog: MatDialog, - public layoutService: LayoutService, - public projectService: ProjectService, - public layerService: LayerService, - public mapService: MapService, - public config: Config, - public changeDetectorRef: ChangeDetectorRef, - ) { - this.layerListVisibility$ = this.layoutService.getLayerListVisibilityStream(); - - this.subscriptions.push( - this.projectService.getLayerStream().subscribe((layerList) => { - if (layerList !== this.layerList) { - this.layerList = layerList; - } - this.changeDetectorRef.markForCheck(); - }), - ); - - this.mapIsGrid$ = this.mapService.isGrid$; - } - - ngOnDestroy() { - this.subscriptions.forEach((s) => s.unsubscribe()); - } - - /** - * the drop method is used by the dran and drop feature of the list - */ - drop(event: CdkDragDrop) { - moveItemInArray(this.layerList, event.previousIndex, event.currentIndex); - this.projectService.setLayers([...this.layerList]); // send a copy to keep the list private - } - - /** - * select a layer - */ - toggleLayer(layer: Layer) { - this.projectService.toggleSymbology(layer); - } - - /** - * method to get the symbology stream of a layer. This is used by the icons and legend components. - */ - getLayerSymbologyStream(layer: Layer): Observable { - return this.projectService.getLayerChangesStream(layer).pipe( - startWith(layer), - filter((lc) => !!lc.symbology), - map(() => layer.symbology), - ); - } - - /** - * helper method to cast AbstractSymbology to VectorSymbology - */ - vectorLayerCast(layer: Layer): Layer { - return layer as Layer; - } - - showChannelParameterSlider(layer: Layer): boolean { - return ( - layer.operator.operatorType.toString() === 'GDAL Source' && - !!layer.operator.operatorTypeParameterOptions && - layer.operator.operatorTypeParameterOptions.getParameterOption('channelConfig').hasTicks() - ); - } -} diff --git a/projects/wave-core/src/lib/layers/layer.model.ts b/projects/wave-core/src/lib/layers/layer.model.ts deleted file mode 100644 index 89637802..00000000 --- a/projects/wave-core/src/lib/layers/layer.model.ts +++ /dev/null @@ -1,341 +0,0 @@ -import {Observable, Observer} from 'rxjs'; - -import {Operator, OperatorDict} from '../operators/operator.model'; -import { - AbstractSymbology, - AbstractVectorSymbology, - MappingRasterSymbology, - AbstractRasterSymbology, - SymbologyDict, -} from './symbology/symbology.model'; -import {Provenance} from '../provenance/provenance.model'; -import {LoadingState} from '../project/loading-state.model'; -import {GeoJSON as OlFormatGeoJSON} from 'ol/format'; -import {Feature as OlFeature} from 'ol/Feature'; -import {ProjectionLike as OlProjectionLike} from 'ol/proj'; -import {Time, TimePoint} from '../time/time.model'; -import {Projection} from '../operators/projection.model'; - -export abstract class LayerData { - type: LayerType; - _time: Time; - _projection: Projection; - - protected constructor(type: LayerType, time: Time, projection: Projection) { - this.type = type; - this._projection = projection; - this._time = time; - } - - get time(): Time { - return this._time; - } - - get projection(): Projection { - return this._projection; - } - - abstract get data(): D; -} - -export class VectorData extends LayerData> { - _data: Array; - _extent: [number, number, number, number]; - - static olParse( - time: Time, - projection: Projection, - extent: [number, number, number, number], - source: Document | Node | any | string, - opt_options?: {dataProjection: OlProjectionLike; featureProjection: OlProjectionLike}, - ): VectorData { - return new VectorData(time, projection, new OlFormatGeoJSON().readFeatures(source, opt_options), extent); - } - - constructor(time: Time, projection: Projection, data: Array, extent: [number, number, number, number]) { - super('vector', time, projection); - this._data = data; - this._extent = extent; - this.fakeIds(); // FIXME: use real IDs ... - } - - get data(): Array { - return this._data; - } - - get extent(): [number, number, number, number] { - return this._extent; - } - - fakeIds() { - for (let localRowId = 0; localRowId < this.data.length; localRowId++) { - const feature = this.data[localRowId]; - if (feature.getId() === undefined) { - feature.setId(localRowId); - } - } - } -} - -export class RasterData extends LayerData { - _data: string; - - constructor(time: Time, projection: Projection, data: string) { - if (time.getEnd().isAfter(time.getStart())) { - time = new TimePoint(time.getStart()); - } - super('raster', time, projection); - this._data = data; - } - - get data(): string { - return this._data; - } -} - -export interface LayerChanges { - name?: string; - symbology?: S; - editSymbology?: boolean; - visible?: boolean; - expanded?: boolean; - operator?: Operator; -} - -export interface VectorLayerData { - data$: Observable>; - dataExtent$?: Observable<[number, number, number, number]>; - state$: Observable; - reload$: Observer; -} - -export interface LayerProvenance { - provenance$: Observable>; - state$: Observable; - reload$: Observer; -} - -interface LayerConfig { - name: string; - operator: Operator; - symbology: S; - expanded?: boolean; - visible?: boolean; - editSymbology?: boolean; -} - -interface VectorLayerConfig extends LayerConfig { - clustered?: boolean; -} - -interface RasterLayerConfig extends LayerConfig { - // eslint-disable-line @typescript-eslint/no-empty-interface -} - -type LayerType = 'raster' | 'vector'; - -interface LayerTypeOptionsDict { - // eslint-disable-line @typescript-eslint/no-empty-interface -} - -interface VectorLayerTypeOptionsDict extends LayerTypeOptionsDict { - clustered: boolean; -} - -/** - * Dictionary for serialization. - */ -export interface LayerDict { - name: string; - operator: OperatorDict; - symbology: SymbologyDict; - expanded: boolean; - visible: boolean; - editSymbology: boolean; - type: LayerType; - typeOptions?: LayerTypeOptionsDict; -} - -export abstract class Layer { - protected _name: string; - protected _expanded = false; - protected _visible = true; - protected _editSymbology = false; - protected _symbology: S; - protected _operator: Operator; - - /** - * Create the suitable layer type and initialize the callbacks. - */ - static fromDict(dict: LayerDict, operatorMap = new Map()): Layer { - switch (dict.type) { - case 'raster': - return RasterLayer.fromDict(dict, operatorMap); - case 'vector': - return VectorLayer.fromDict(dict, operatorMap); - default: - throw new Error('LayerService.createLayerFromDict: Unknown LayerType ->' + dict); - } - } - - protected constructor(config: LayerConfig) { - this._name = config.name; - this._operator = config.operator; - this._symbology = config.symbology; - if (config.expanded) { - this._expanded = config.expanded; - } - if (config.visible) { - this._visible = config.visible; - } - if (config.editSymbology) { - this._editSymbology = config.editSymbology; - } - } - - /** - * Changes the underlying data - * Do not use this method publically!!! - */ - _changeUnderlyingData(data: LayerChanges): LayerChanges { - const validChanges: LayerChanges = {}; - - if (data.name && data.name !== this._name) { - this._name = data.name; - validChanges.name = this._name; - } - - if (data.symbology !== undefined) { - this._symbology = data.symbology; - validChanges.symbology = this._symbology; - } - - if (data.visible !== undefined && data.visible !== this._visible) { - this._visible = data.visible; - validChanges.visible = this._visible; - } - - if (data.expanded !== undefined && data.expanded !== this._expanded) { - this._expanded = data.expanded; - validChanges.expanded = this._expanded; - } - - if (data.editSymbology !== undefined && data.editSymbology !== this._editSymbology) { - this._editSymbology = data.editSymbology; - validChanges.editSymbology = this._editSymbology; - } - - if (data.operator !== undefined && data.operator !== this.operator) { - this._operator = data.operator; - validChanges.operator = this._operator; - } - - return validChanges; - } - - get operator(): Operator { - return this._operator; - } - - get name(): string { - return this._name; - } - - get symbology(): S { - return this._symbology; - } - - get expanded(): boolean { - return this._expanded; - } - - get visible(): boolean { - return this._visible; - } - - get editSymbology(): boolean { - return this._editSymbology; - } - - abstract getLayerType(): LayerType; - - toDict(): LayerDict { - return { - name: this.name, - operator: this._operator.toDict(), - symbology: this.symbology.toDict(), - expanded: this.expanded, - visible: this.visible, - editSymbology: this.editSymbology, - type: this.getLayerType(), - typeOptions: this.typeOptions, - }; - } - - protected get typeOptions(): LayerTypeOptionsDict { - return {}; - } -} - -export class VectorLayer extends Layer { - clustered = false; - - static fromDict(dict: LayerDict, operatorMap = new Map()): Layer { - const operator = Operator.fromDict(dict.operator, operatorMap); - const typeOptions = dict.typeOptions as VectorLayerTypeOptionsDict; - - const clustered = (typeOptions && typeOptions.clustered && typeOptions.clustered) || false; - - return new VectorLayer({ - name: dict.name, - operator, - symbology: AbstractSymbology.fromDict(dict.symbology) as AbstractVectorSymbology, - visible: dict.visible, - expanded: dict.expanded, - editSymbology: dict.editSymbology, - clustered, - }); - } - - constructor(config: VectorLayerConfig) { - super(config); - this.clustered = !!config.clustered; - } - - getLayerType(): LayerType { - return 'vector'; - } - - protected get typeOptions(): VectorLayerTypeOptionsDict { - return { - clustered: this.clustered, - }; - } -} - -export class RasterLayer extends Layer { - static fromDict(dict: LayerDict, operatorMap = new Map()): Layer { - const operator = Operator.fromDict(dict.operator, operatorMap); - const symbology = AbstractSymbology.fromDict(dict.symbology) as AbstractRasterSymbology | MappingRasterSymbology; - - return new RasterLayer({ - name: dict.name, - operator, - symbology, - visible: dict.visible, - expanded: dict.expanded, - editSymbology: dict.editSymbology, - }); - } - - constructor(config: RasterLayerConfig) { - super(config); - if (!config.symbology.unit) { - config.symbology.unit = config.operator.units.get('value'); - } - } - - getLayerType(): LayerType { - return 'raster'; - } -} diff --git a/projects/wave-core/src/lib/layers/layer.service.ts b/projects/wave-core/src/lib/layers/layer.service.ts deleted file mode 100644 index e698993d..00000000 --- a/projects/wave-core/src/lib/layers/layer.service.ts +++ /dev/null @@ -1,150 +0,0 @@ -import {map} from 'rxjs/operators'; -import {BehaviorSubject, Observable} from 'rxjs'; - -import {Injectable} from '@angular/core'; - -import {Set as ImmutableSet} from 'immutable'; - -import {Layer} from './layer.model'; -import {FeatureID} from '../queries/geojson.model'; -import {AbstractSymbology} from './symbology/symbology.model'; - -export interface SelectedFeatures { - selected: ImmutableSet; - add?: ImmutableSet; - remove?: ImmutableSet; - focus?: FeatureID; -} - -/** - * A service that is responsible for managing the active layer array. - */ -@Injectable() -export class LayerService { - private selectedLayer$: BehaviorSubject> = new BehaviorSubject(undefined); - private selectedFeatures$: BehaviorSubject = new BehaviorSubject({ - selected: ImmutableSet(), - }); - private isAnyLayerSelected$: Observable; - - constructor() { - this.isAnyLayerSelected$ = this.getSelectedLayerStream().pipe(map((layer) => layer !== undefined)); - } - - /** - * Set a new selected layer. - * Does nothing if the layer is not within the list. - * @param layer The layer to select. - */ - setSelectedLayer(layer: Layer) { - if (layer !== this.selectedLayer$.value) { - this.selectedLayer$.next(layer); - this.selectedFeatures$.next({ - selected: ImmutableSet(), - }); - } - } - - /** - * @returns The currently selected layer as stream. - */ - getSelectedLayerStream(): Observable> { - return this.selectedLayer$.asObservable(); - } - - /** - * @returns The currently selected layer. - */ - getSelectedLayer(): Layer { - return this.selectedLayer$.getValue(); - } - - /** - * @returns a stream indicating if any layer is selected. - */ - getIsAnyLayerSelectedStream(): Observable { - return this.isAnyLayerSelected$; - } - - /** - * Create the suitable layer type and initialize the callbacks. - */ - /* - createLayerFromDict( - dict: LayerDict, - operatorMap = new Map() - ): Layer { - switch (dict.type) { - case 'raster': - return RasterLayer.fromDict( - dict, - //operator => this.mappingQueryService.getColorizerStream(operator), - //operator => this.mappingQueryService.getProvenanceStream(operator), - operatorMap - ); - case 'vector': - return VectorLayer.fromDict( - dict, - // (operator, clustered) => - // this.mappingQueryService.getWFSDataStreamAsGeoJsonFeatureCollection({ - // operator, clustered, - // }), - // operator => this.mappingQueryService.getProvenanceStream(operator), - operatorMap - ); - default: - throw 'LayerService.createLayerFromDict: Unknown LayerType ->' + dict; - } - } - */ - - /** - * @returns The currently selected features as stream. - */ - getSelectedFeaturesStream() { - return this.selectedFeatures$.asObservable(); - } - - /** - * @returns The currently selected features. - */ - getSelectedFeatures(): SelectedFeatures { - return this.selectedFeatures$.value; - } - - updateSelectedFeatures(add: Array, remove: Array): void { - const currentSelected = this.selectedFeatures$.value.selected; - const actualRemove = ImmutableSet(remove).intersect(currentSelected); - const actualSelected = currentSelected.subtract(actualRemove); - const actualAdd = ImmutableSet(add).subtract(actualSelected); - if (actualAdd.size > 0 || actualRemove.size > 0) { - let next: SelectedFeatures = { - selected: actualSelected.union(actualAdd), - add: actualAdd, - remove: actualRemove, - }; - if (actualAdd.size > 0) { - next.focus = add[add.length - 1]; - } - - // console.log('featureIds next', next); - this.selectedFeatures$.next(next); - } - } - - setSelectedFeatures(selection: Array): void { - const currentSelected = this.selectedFeatures$.value.selected; - const newSelected = ImmutableSet(selection); - if (newSelected.size > 0) { - let next: SelectedFeatures = { - selected: newSelected, - add: newSelected, - remove: currentSelected, - }; - if (newSelected.size > 0) { - next.focus = selection[selection.length - 1]; - } - this.selectedFeatures$.next(next); - } - } -} diff --git a/projects/wave-core/src/lib/layers/legend/legend-raster/mapping-raster-legend.component.html b/projects/wave-core/src/lib/layers/legend/legend-raster/mapping-raster-legend.component.html deleted file mode 100644 index 7bd0c403..00000000 --- a/projects/wave-core/src/lib/layers/legend/legend-raster/mapping-raster-legend.component.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - Interpolation - {{ interpolationToName(symbology?.unit?.interpolation) }} - - - Measurement - {{ symbology?.unit?.measurement }} - - - Unit - {{ symbology?.unit?.unit }} - - - - - - - - {{ breakpoint.value | number: numberPipeParameters }} - {{ unitToString(symbology?.unit) }} - - - -
- - {{ symbology?.unit?.classes?.get(breakpoint.value) }} -
- -
- diff --git a/projects/wave-core/src/lib/layers/legend/legend-raster/mapping-raster-legend.component.scss b/projects/wave-core/src/lib/layers/legend/legend-raster/mapping-raster-legend.component.scss deleted file mode 100644 index 03912607..00000000 --- a/projects/wave-core/src/lib/layers/legend/legend-raster/mapping-raster-legend.component.scss +++ /dev/null @@ -1,35 +0,0 @@ -:host { - padding-top: 4px; - padding-left: 8px; - padding-right: 0px; - padding-bottom: 8px; -} - -.legend { - display: table; - font-size: 12px; -} -tr { - min-height: 20px; -} - -td { - padding: 2px; -} - -.gradient { - min-width: 20px; - border: #000 solid 1px; -} - -.classes { - vertical-align: top; -} - -.icon { - margin-bottom: 1px !important; - margin-top: 1px !important; - min-height: 20px !important; - min-width: 20px !important; - border: #000 solid 1px; -} diff --git a/projects/wave-core/src/lib/layers/legend/legend-raster/mapping-raster-legend.component.ts b/projects/wave-core/src/lib/layers/legend/legend-raster/mapping-raster-legend.component.ts deleted file mode 100644 index 7781a88b..00000000 --- a/projects/wave-core/src/lib/layers/legend/legend-raster/mapping-raster-legend.component.ts +++ /dev/null @@ -1,56 +0,0 @@ -import {ChangeDetectionStrategy, Component, OnChanges, SimpleChanges} from '@angular/core'; -import {MappingRasterSymbology} from '../../symbology/symbology.model'; -import {RasterLegendComponent} from './raster-legend.component'; -import {Interpolation, interpolationToName, Unit} from '../../../operators/unit.model'; -import {ColorBreakpoint} from '../../../colors/color-breakpoint.model'; - -/** - * The raster legend component. - */ -@Component({ - selector: 'wave-mapping-raster-legend', - templateUrl: 'mapping-raster-legend.component.html', - styleUrls: ['mapping-raster-legend.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class MappingRasterLegendComponent extends RasterLegendComponent implements OnChanges { - /** - * Parameters to use with the number pipe in the template. - */ - numberPipeParameters = '1.0-0'; - - /** - * Get a string representation of a Unit. - */ - unitToString(unit: Unit): string { - if (unit instanceof Unit && unit.unit !== Unit.defaultUnit.unit) { - return unit.unit; - } else { - return ''; - } - } - - /** - * Get the name of an interpolation. - */ - interpolationToName(interpolation: Interpolation): string { - return interpolationToName(interpolation); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes.symbology) { - const symbology = changes.symbology.currentValue as S; - this.numberPipeParameters = MappingRasterLegendComponent.calculateNumberPipeParameters(symbology.colorizer.breakpoints); - } - } - - private static calculateNumberPipeParameters(breakpoints: Array): string { - const firstNumber = (breakpoints[0].value as number).toString(10); - const lastNumber = (breakpoints[breakpoints.length - 1].value as number).toString(10); - const decimalPlacesFirst = firstNumber.indexOf('.') >= 0 ? firstNumber.split('.')[1].length : 0; - const decimalPlacesLast = lastNumber.indexOf('.') >= 0 ? lastNumber.split('.')[1].length : 0; - const maximumDecimalPlaces = Math.max(decimalPlacesFirst, decimalPlacesLast) + 2; - - return `1.0-${maximumDecimalPlaces}`; - } -} diff --git a/projects/wave-core/src/lib/layers/legend/legend-raster/raster-legend.component.ts b/projects/wave-core/src/lib/layers/legend/legend-raster/raster-legend.component.ts deleted file mode 100644 index 77a0f1d1..00000000 --- a/projects/wave-core/src/lib/layers/legend/legend-raster/raster-legend.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {ChangeDetectionStrategy, Component} from '@angular/core'; -import {LegendComponent} from '../legend.component'; -import {AbstractRasterSymbology} from '../../symbology/symbology.model'; - -@Component({ - selector: 'wave-legend-raster', - template: ` This is a generic raster layer `, - styleUrls: [], - // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property - inputs: ['symbology'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class RasterLegendComponent extends LegendComponent {} diff --git a/projects/wave-core/src/lib/layers/legend/legend-vector/vector-legend-component.html b/projects/wave-core/src/lib/layers/legend/legend-vector/vector-legend-component.html deleted file mode 100644 index 537cbd3f..00000000 --- a/projects/wave-core/src/lib/layers/legend/legend-vector/vector-legend-component.html +++ /dev/null @@ -1,40 +0,0 @@ -
-
- - - - - - - - Default color -
-
- - {{fillColorAttribute}} -
-
- - - - - - - - {{iv.value}} -
-
- - {{strokeColorAttribute}} -
-
- - - - - - - - {{iv.value}} -
-
diff --git a/projects/wave-core/src/lib/layers/legend/legend-vector/vector-legend.component.scss b/projects/wave-core/src/lib/layers/legend/legend-vector/vector-legend.component.scss deleted file mode 100644 index 4ec8986e..00000000 --- a/projects/wave-core/src/lib/layers/legend/legend-vector/vector-legend.component.scss +++ /dev/null @@ -1,23 +0,0 @@ -:host { - padding-left: 8px; - padding-right: 0px; -} - -.segment:first-child { - margin-top: 4px; -} - -.segment { - font-size: 12px; - // height: 20px; -} - -.segment_head { - margin-top: 4px; - margin-left: 24px; - font-weight: bold; -} - -.segment:last-child { - margin-bottom: 4px; -} diff --git a/projects/wave-core/src/lib/layers/legend/legend-vector/vector-legend.component.ts b/projects/wave-core/src/lib/layers/legend/legend-vector/vector-legend.component.ts deleted file mode 100644 index 3d88ce52..00000000 --- a/projects/wave-core/src/lib/layers/legend/legend-vector/vector-legend.component.ts +++ /dev/null @@ -1,83 +0,0 @@ -import {ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges} from '@angular/core'; -import {SymbologyType, VectorSymbology} from '../../symbology/symbology.model'; -import {TRANSPARENT} from '../../../colors/color'; - -import {PolygonIconStyle} from '../../layer-icons/polygon-icon/polygon-icon.component'; -import {PointIconStyle} from '../../layer-icons/point-icon/point-icon.component'; -import {LineIconStyle} from '../../layer-icons/line-icon/line-icon.component'; - -interface IconValue { - icon: PointIconStyle | LineIconStyle | PolygonIconStyle; - value: string | number; -} - -@Component({ - selector: 'wave-vector-legend', - templateUrl: 'vector-legend-component.html', - styleUrls: ['vector-legend.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class VectorLegendComponent implements OnChanges { - readonly ST = SymbologyType; - - @Input() - showDefaultStyle = true; - - @Input() - symbology: S; - fillColorAttribute: string | undefined; - fillStyles: Array = []; - strokeColorAttribute: string | undefined; - strokeStyles: Array = []; - - constructor() { - this.updateStyles(); - } - - ngOnChanges(changes: SimpleChanges): void { - this.updateStyles(); - } - - private updateStyles() { - this.fillColorAttribute = this.symbology && this.symbology.fillColorAttribute ? this.symbology.fillColorAttribute : undefined; - this.fillStyles = VectorLegendComponent.fillColorIconValue(this.symbology); - this.strokeColorAttribute = this.symbology && this.symbology.strokeColorAttribute ? this.symbology.strokeColorAttribute : undefined; - this.strokeStyles = VectorLegendComponent.strokeColorIconValue(this.symbology); - } - - static fillColorIconValue(vectorSymbology: VectorSymbology): Array { - if (!vectorSymbology || !vectorSymbology.fillColorizer || !vectorSymbology.fillColorizer.breakpoints) { - return []; - } - - return vectorSymbology.fillColorizer.breakpoints.map((b) => { - return { - icon: { - strokeWidth: vectorSymbology.strokeWidth, - strokeDashStyle: vectorSymbology.strokeDashStyle ? vectorSymbology.strokeDashStyle : [], - strokeRGBA: TRANSPARENT, - fillRGBA: b.rgba, - }, - value: b.value, - }; - }); - } - - static strokeColorIconValue(vectorSymbology: VectorSymbology): Array { - if (!vectorSymbology || !vectorSymbology.strokeColorizer || !vectorSymbology.strokeColorizer.breakpoints) { - return []; - } - - return vectorSymbology.strokeColorizer.breakpoints.map((b) => { - return { - icon: { - strokeWidth: vectorSymbology.strokeWidth, - strokeDashStyle: vectorSymbology.strokeDashStyle ? vectorSymbology.strokeDashStyle : [], - strokeRGBA: b.rgba, - fillRGBA: TRANSPARENT, - }, - value: b.value, - }; - }); - } -} diff --git a/projects/wave-core/src/lib/layers/legend/legend.component.html b/projects/wave-core/src/lib/layers/legend/legend.component.html deleted file mode 100644 index 220c351a..00000000 --- a/projects/wave-core/src/lib/layers/legend/legend.component.html +++ /dev/null @@ -1 +0,0 @@ -LegendTypeId: {{ symbology.symbologyTypeId }} diff --git a/projects/wave-core/src/lib/layers/legend/legend.component.scss b/projects/wave-core/src/lib/layers/legend/legend.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/layers/legend/legend.component.ts b/projects/wave-core/src/lib/layers/legend/legend.component.ts deleted file mode 100644 index 14791d76..00000000 --- a/projects/wave-core/src/lib/layers/legend/legend.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {Component, Input} from '@angular/core'; - -import {AbstractSymbology} from '../symbology/symbology.model'; - -/** - * A simple legend component. - */ -@Component({ - selector: 'wave-legendary', - templateUrl: 'legend.component.html', -}) -export class LegendComponent { - @Input() symbology: S; -} diff --git a/projects/wave-core/src/lib/layers/symbology/stroke-dash-select/stroke-dash-select.component.html b/projects/wave-core/src/lib/layers/symbology/stroke-dash-select/stroke-dash-select.component.html deleted file mode 100644 index ca5ac061..00000000 --- a/projects/wave-core/src/lib/layers/symbology/stroke-dash-select/stroke-dash-select.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - Stroke Dash Select - - - {{ dashStyleName(line) }} - - - - diff --git a/projects/wave-core/src/lib/layers/symbology/stroke-dash-select/stroke-dash-select.component.scss b/projects/wave-core/src/lib/layers/symbology/stroke-dash-select/stroke-dash-select.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/layers/symbology/stroke-dash-select/stroke-dash-select.component.ts b/projects/wave-core/src/lib/layers/symbology/stroke-dash-select/stroke-dash-select.component.ts deleted file mode 100644 index 4dc61922..00000000 --- a/projects/wave-core/src/lib/layers/symbology/stroke-dash-select/stroke-dash-select.component.ts +++ /dev/null @@ -1,108 +0,0 @@ -import {ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, Input, OnChanges, SimpleChanges} from '@angular/core'; -import {DomSanitizer, SafeHtml} from '@angular/platform-browser'; -import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms'; -import {StrokeDashStyle} from '../symbology.model'; - -/** - * @title Basic select - */ -@Component({ - selector: 'wave-stroke-dash-select', - templateUrl: 'stroke-dash-select.component.html', - styleUrls: ['stroke-dash-select.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StrokeDashSelectComponent), multi: true}], -}) -export class StrokeDashSelectComponent implements ControlValueAccessor, OnChanges { - static svgPrefix = ''; - - @Input() lines: StrokeDashStyle[] = [[], [5, 5], [9, 3, 3]]; - - _strokeDashStyle: StrokeDashStyle = []; - onTouched: () => void; - onChange: (_: StrokeDashStyle) => void = undefined; - - get strokeDashStyle(): StrokeDashStyle { - return this._strokeDashStyle; - } - - set strokeDashStyle(strokeDashStyle: StrokeDashStyle) { - if (!strokeDashStyle) { - this._strokeDashStyle = []; - this.notify(); - this.changeDetectorRef.markForCheck(); - } - - if (!!strokeDashStyle && strokeDashStyle !== this._strokeDashStyle) { - this._strokeDashStyle = strokeDashStyle; - this.notify(); - this.changeDetectorRef.markForCheck(); - } - } - - constructor(public domSanitizer: DomSanitizer, private changeDetectorRef: ChangeDetectorRef) {} - - protected generateViewSvgString(dashArray: Array): string { - if (!!dashArray && dashArray.length > 0) { - return ( - StrokeDashSelectComponent.svgPrefix + - StrokeDashSelectComponent.svgDashPrefix + - dashArray.join(',') + - StrokeDashSelectComponent.svgPostfix - ); - } - return StrokeDashSelectComponent.svgPrefix + StrokeDashSelectComponent.svgPostfix; - } - - generateViewImage(dashArray: Array): SafeHtml { - const svgString = this.generateViewSvgString(dashArray); - return this.domSanitizer.bypassSecurityTrustHtml(svgString); - } - - dashStyleName(dashArray: Array): string { - if (!!dashArray && dashArray.length > 1) { - return 'Dashed Line'; - } - return 'Solid Line'; - } - - registerOnChange(fn: (_: StrokeDashStyle) => void): void { - if (fn) { - this.onChange = fn; - this.notify(); - } - } - - registerOnTouched(fn: () => void): void { - if (fn) { - this.onTouched = fn; - } - } - - ngOnChanges(changes: SimpleChanges) { - for (const propName in changes) { - // eslint-disable-line guard-for-in - switch (propName) { - case 'lines': { - this.changeDetectorRef.markForCheck(); - break; - } - default: { - /* DO NOTHING*/ - } - } - } - } - - notify() { - if (this.onChange) { - this.onChange(this.strokeDashStyle); - } - } - - writeValue(strokeDashStyle: StrokeDashStyle): void { - this.strokeDashStyle = strokeDashStyle; - } -} diff --git a/projects/wave-core/src/lib/layers/symbology/symbology-editor/symbology-editor.component.html b/projects/wave-core/src/lib/layers/symbology/symbology-editor/symbology-editor.component.html deleted file mode 100644 index 301180af..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology-editor/symbology-editor.component.html +++ /dev/null @@ -1,87 +0,0 @@ -Symbology Editor - - -

The Symbology Editor enables customization of the style for vector or raster layers. Use the first field to select a layer.

-

- Raster data: -

-

- The Global Layer Properties define the default visualization parameters. The layer Opacity is adjustable in a range - from 0 to 100 %. You can choose a NoData color for pixels with the nodata value. Use the picker tool to select the desired - RGB color and opacity. This also applies to the Overflow color, which indicates the pixels with values without coloring - rules. -

-

- The Color Map section provides an overview of the pixel values with a frequency plot, which also allows to adapt the color - with respect to the raster values. The plot refers to the field of view shown in the map. If Sync map and histogram is - turned on, the histogram updates if the map view changes. To specify the value range of interest, you can set a minimum and maximum - pixel value. You can choose a color ramp from a variety of color schemes (Colormap name) and reverse it, if desired. - Additionally, different functions for the step distribution can be selected (linear, logarithmic, square root function, square - function). Consider that the logarithmic function requires positive values (>0). The number of Color steps is also kept flexible and - can be set to a number between 2 and 16. Click Create color table to apply your adjustments. -

-

- The Color Table section allows fine grained changes to colors. The gradient defines the interpolation between values. You - can dynamically add and remove color steps by clicking the minus and plus symbols or select distinct RGBA values for a specific - color step value. -

-

- Vector data: -

-

- Vector features are shown in the map as points, lines or polygons. The Global Layer Properties define the default - visualization parameters. Points have a global Radius, which is used if no other rules exist. All vector features have a - stroke. You can adapt the stroke width and color. Points and Polygons have a fill color. As all other global settings, this is - overwritten by other style rules. -

-

- If the layer is a clustered point layer, the radius refers to the minimum point radius. You need to zoom in and out (or pan) to see - the effect. -

-
- - - - {{ l.name }} - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - > - - -
diff --git a/projects/wave-core/src/lib/layers/symbology/symbology-editor/symbology-editor.component.scss b/projects/wave-core/src/lib/layers/symbology/symbology-editor/symbology-editor.component.scss deleted file mode 100644 index ca85fb3d..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology-editor/symbology-editor.component.scss +++ /dev/null @@ -1,12 +0,0 @@ -:host { - display: block; - padding: 1rem; -} - -mat-divider { - padding-bottom: 1rem; -} - -mat-form-field { - width: 100%; -} diff --git a/projects/wave-core/src/lib/layers/symbology/symbology-editor/symbology-editor.component.ts b/projects/wave-core/src/lib/layers/symbology/symbology-editor/symbology-editor.component.ts deleted file mode 100644 index 89418a6c..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology-editor/symbology-editor.component.ts +++ /dev/null @@ -1,70 +0,0 @@ -import {ChangeDetectionStrategy, Component, Input, OnDestroy} from '@angular/core'; -import {AbstractSymbology, SymbologyType} from '../symbology.model'; -import {Layer} from '../../layer.model'; -import {ProjectService} from '../../../project/project.service'; -import {Subject, Subscription} from 'rxjs'; -import {debounceTime} from 'rxjs/operators'; -import {Config} from '../../../config.service'; - -/** - * The symbology editor component takes a Layer as input and provides multiple ways to change its symbology. - * Changes are sent to the ProjectService. - */ -@Component({ - selector: 'wave-symbology-editor', - templateUrl: 'symbology-editor.component.html', - styleUrls: ['symbology-editor.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class SymbologyEditorComponent implements OnDestroy { - // make visible in template - /* eslint-disable @typescript-eslint/naming-convention, no-underscore-dangle, id-blacklist, id-match */ - readonly ST = SymbologyType; - /* eslint-enable */ - - /** - * input to hide/show a layer selection - */ - @Input() showLayerSelect = false; - - /** - * input to submit the layer with the symbology to edit - */ - @Input() layer: Layer = undefined; - - // The list with all valid layers, required for the layer selection. - validLayers: Array> = undefined; - private subscriptions: Array = []; - private layerChanges = new Subject<[Layer, AbstractSymbology]>(); - - constructor(private config: Config, public projectService: ProjectService) { - // This subscription updates the valid layer list. - const layerStreamSubscription = this.projectService - .getLayerStream() - .subscribe((projectLayers) => (this.validLayers = projectLayers)); - this.subscriptions.push(layerStreamSubscription); - // This subscription sends layer / symbology changes to the project service. - const layerChangesSubscription = this.layerChanges - .pipe(debounceTime(config.DELAYS.DEBOUNCE)) - .subscribe(([layer, symbology]) => this.projectService.changeLayer(layer, {symbology})); - this.subscriptions.push(layerChangesSubscription); - } - - /** - * Indicates if the current layer is a valid layer - */ - get isValidLayer(): boolean { - return !!this.layer && !!this.layer.symbology && !!this.validLayers.find((x) => x === this.layer); - } - - /** - * Submit a layer and the desired symbology to update the layer accordingly. - */ - update_symbology(layer: Layer, symbology: AbstractSymbology) { - this.layerChanges.next([layer, symbology]); - } - - ngOnDestroy(): void { - this.subscriptions.forEach((x) => x.unsubscribe()); - } -} diff --git a/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster-mapping-colorizer.component.html b/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster-mapping-colorizer.component.html deleted file mode 100644 index 5d2b6450..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster-mapping-colorizer.component.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - map - Global Layer Properties - - - -
- - - - - - -
Opacity - - - {{ slo.displayValue }} %
-
- -
- - - - -
-
-
- - - - - looks - Color Map - - - - -
- - -
-
- - Sync map and histogram - -
- - - - -
-
- - - - - color_lens - Color Table - - - - - - -
diff --git a/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster-mapping-colorizer.component.scss b/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster-mapping-colorizer.component.scss deleted file mode 100644 index d14c3760..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster-mapping-colorizer.component.scss +++ /dev/null @@ -1,46 +0,0 @@ -table { - width: 100%; - font-size: 0.8em; -} - -mat-divider { - padding-bottom: 1rem; -} - -.color_cell { - text-align: center; - min-width: 2rem; - min-height: 2rem; - color: black !important; - text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff !important; -} - -td:first-child, -td:last-child { - width: 1%; - white-space: nowrap; -} - -mat-slider { - min-width: unset; - width: 100%; -} - -.symbology-headers-align .mat-expansion-panel-header-title, -.symbology-headers-align .mat-expansion-panel-header-description { - flex-basis: 0; - align-items: center; -} - -.symbology-headers-align .mat-expansion-panel-header-description { - justify-content: space-between; - align-items: center; -} - -.histogram { - width: 100%; -} - -.histogram .mat-progress-spinner { - margin: 0 auto; -} diff --git a/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster-mapping-colorizer.component.ts b/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster-mapping-colorizer.component.ts deleted file mode 100644 index 0f76df39..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster-mapping-colorizer.component.ts +++ /dev/null @@ -1,256 +0,0 @@ -import { - Component, - Input, - Output, - EventEmitter, - ChangeDetectionStrategy, - OnChanges, - SimpleChanges, - OnDestroy, - AfterViewInit, - OnInit, -} from '@angular/core'; - -import {MappingRasterSymbology} from '../symbology.model'; -import {ColorizerData} from '../../../colors/colorizer-data.model'; -import {ColorBreakpoint} from '../../../colors/color-breakpoint.model'; -import {RasterLayer} from '../../layer.model'; -import {BehaviorSubject, combineLatest as observableCombineLatest, ReplaySubject, Subscription} from 'rxjs'; -import {HistogramData} from '../../../plots/histogram/histogram.component'; -import {ProjectService} from '../../../project/project.service'; -import {Operator} from '../../../operators/operator.model'; -import {HistogramType} from '../../../operators/types/histogram-type.model'; -import {DataType} from '../../../operators/datatype.model'; -import {Unit} from '../../../operators/unit.model'; -import {debounceTime, filter, map, startWith} from 'rxjs/operators'; -import {ResultTypes} from '../../../operators/result-type.model'; -import {MappingQueryService} from '../../../queries/mapping-query.service'; -import {MapService} from '../../../map/map.service'; -import {Config} from '../../../config.service'; -import {MatSliderChange} from '@angular/material/slider'; -import {MatSlideToggleChange} from '@angular/material/slide-toggle'; - -/** - * The symbology editor component for raster data, which is colorized by the mapping backend - */ -@Component({ - selector: 'wave-symbology-raster-mapping-colorizer', - templateUrl: 'symbology-raster-mapping-colorizer.component.html', - styleUrls: ['symbology-raster-mapping-colorizer.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class SymbologyRasterMappingColorizerComponent implements OnChanges, OnDestroy, AfterViewInit, OnInit { - @Input() layer: RasterLayer; - @Output() symbologyChanged: EventEmitter = new EventEmitter(); - - symbology: MappingRasterSymbology; - - // The min value used for color table generation - layerMinValue: number | undefined = undefined; - // The max value used for color table generation - layerMaxValue: number | undefined = undefined; - // A subject with the histogram data of the current layer view - layerHistogramData$: ReplaySubject = new ReplaySubject(1); - // Subject indicating if the histogram is still processing - layerHistogramDataLoading$ = new BehaviorSubject(false); - // Histogram auto reload enabled / disabled - layerHistogramAutoReloadEnabled = true; - private layerHistogramDataSubscription: Subscription = undefined; - - constructor( - public projectService: ProjectService, - public mappingQueryService: MappingQueryService, - public mapService: MapService, - public config: Config, - ) {} - - /** - * Set the max value to use for color table generation - */ - updateLayerMinValue(min: number) { - if (this.layerMinValue !== min) { - this.layerMinValue = min; - } - } - - /** - * Set the max value to use for color table generation - */ - updateLayerMaxValue(max: number) { - if (this.layerMaxValue !== max) { - this.layerMaxValue = max; - } - } - - /** - * Set the opacity value from a slider change event - */ - updateOpacity(event: MatSliderChange) { - this.symbology.opacity = event.value === undefined || event.value === 0 ? 0 : event.value / 100; - this.update(); - } - - /** - * Set the overflow color - */ - updateOverflowColor(colorBreakpoint: ColorBreakpoint) { - if (colorBreakpoint) { - this.symbology.overflowColor = colorBreakpoint; - this.update(); - } - } - - /** - * Set the no data color - */ - updateNoDataColor(colorBreakpoint: ColorBreakpoint) { - if (colorBreakpoint) { - this.symbology.noDataColor = colorBreakpoint; - this.update(); - } - } - - /** - * Set the symbology colorizer - */ - updateColorizer(colorizerData: ColorizerData) { - if (colorizerData) { - this.symbology.colorizer = colorizerData; - this.update(); - } - } - - /** - * Access the current colorizer min value. May be undefined. - */ - get colorizerMinValue(): number | undefined { - return this.symbology.colorizer.firstBreakpoint.value as number; - } - - /** - * Access the current colorizer max value. May be undefined. - */ - get colorizerMaxValue(): number | undefined { - return this.symbology.colorizer.lastBreakpoint.value as number; - } - - /** - * Sets the current (working) symbology to the one of the current layer. - */ - updateSymbologyFromLayer() { - if (!this.layer || !this.layer.symbology || this.layer.symbology.equals(this.symbology)) { - return; - } - this.symbology = this.layer.symbology; - } - - /** - * Sets the layer min/max values from the colorizer. - */ - updateLayerMinMaxFromColorizer() { - this.updateLayerMaxValue(this.colorizerMinValue); - this.updateLayerMaxValue(this.colorizerMaxValue); - } - - /** - * Update the histogram auto reload setting. - * @param event contains a checked: boolean value. - */ - updateHistogramAutoReload(event: MatSlideToggleChange) { - this.layerHistogramAutoReloadEnabled = event.checked; - } - - private update() { - this.symbologyChanged.emit(this.symbology.clone()); - } - - ngOnChanges(changes: SimpleChanges): void { - for (const propName in changes) { - // eslint-disable-line guard-for-in - switch (propName) { - case 'layer': { - if (changes['layer'].firstChange) { - break; - } - this.updateSymbologyFromLayer(); - this.updateLayerMinMaxFromColorizer(); - // this.updateLayerHistogramOperator(); - this.reinitializeLayerHistogramDataSubscription(); - - break; - } - default: // DO NOTHING - } - } - } - - ngOnInit(): void { - this.updateSymbologyFromLayer(); - this.updateLayerMinMaxFromColorizer(); - } - - ngAfterViewInit(): void { - // this.updateLayerHistogramOperator(); - this.reinitializeLayerHistogramDataSubscription(); - } - - ngOnDestroy() { - this.layerHistogramDataSubscription.unsubscribe(); - } - - private reinitializeLayerHistogramDataSubscription() { - if (this.layerHistogramDataSubscription) { - this.layerHistogramDataSubscription.unsubscribe(); - } - - this.layerHistogramData$.next(undefined); - this.layerHistogramDataLoading$.next(true); - - const sub = observableCombineLatest( - observableCombineLatest( - this.projectService.getTimeStream(), - this.projectService.getProjectionStream(), - this.mapService.getViewportSizeStream(), - ).pipe( - filter((_) => this.layerHistogramAutoReloadEnabled), - debounceTime(this.config.DELAYS.DEBOUNCE), - ), - this.projectService.getLayerChangesStream(this.layer).pipe( - startWith({operator: true}), - filter((c) => c.operator !== undefined), - map((_) => this.buildHistogramOperator()), - ), - ).subscribe(([[projectTime, projection, viewport], histogramOperator]) => { - this.layerHistogramData$.next(undefined); - this.layerHistogramDataLoading$.next(true); - - this.mappingQueryService - .getPlotData({ - operator: histogramOperator, - time: projectTime, - extent: viewport.extent, - projection, - }) - .subscribe((data) => { - this.layerHistogramData$.next(data as HistogramData); - this.layerHistogramDataLoading$.next(false); - }); - }); - this.layerHistogramDataSubscription = sub; - } - - private buildHistogramOperator(): Operator { - return new Operator({ - operatorType: new HistogramType({ - attribute: 'value', - range: 'data', - }), - resultType: ResultTypes.PLOT, - projection: this.layer.operator.projection, - attributes: [], - dataTypes: new Map(), - units: new Map(), - rasterSources: [this.layer.operator], - }); - } -} diff --git a/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster.component.html b/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster.component.html deleted file mode 100644 index c53d49e8..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster.component.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - -
Opacity - - - {{ slo.displayValue }} %
diff --git a/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster.component.scss b/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster.component.scss deleted file mode 100644 index b3cd0545..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster.component.scss +++ /dev/null @@ -1,23 +0,0 @@ -table { - width: 100%; - font-size: 0.8em; -} - -.color_cell { - text-align: center; - min-width: 2rem; - min-height: 2rem; - color: black !important; - text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff !important; -} - -td:first-child, -td:last-child { - width: 1%; - white-space: nowrap; -} - -mat-slider { - min-width: unset; - width: 100%; -} diff --git a/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster.component.ts b/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster.component.ts deleted file mode 100644 index 9aff678a..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology-raster/symbology-raster.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import {Component, Input, Output, EventEmitter} from '@angular/core'; - -import {AbstractRasterSymbology} from '../symbology.model'; -import {MatSliderChange} from '@angular/material/slider'; -import {Layer} from '../../layer.model'; - -/** - * A simple raster symbology component. - */ -@Component({ - selector: 'wave-symbology-raster', - templateUrl: 'symbology-raster.component.html', - styleUrls: ['symbology-raster.component.scss'], -}) -export class SymbologyRasterComponent { - @Input() layer: Layer; - @Output() symbologyChanged: EventEmitter = new EventEmitter(); - - updateOpacity(event: MatSliderChange) { - this.layer.symbology.opacity = event.value === undefined || event.value === 0 ? 0 : event.value / 100; - this.update(); - } - - update() { - this.symbologyChanged.emit(this.layer.symbology.clone()); - } -} diff --git a/projects/wave-core/src/lib/layers/symbology/symbology-vectors/symbology-vector.component.html b/projects/wave-core/src/lib/layers/symbology/symbology-vectors/symbology-vector.component.html deleted file mode 100644 index 22f47cf7..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology-vectors/symbology-vector.component.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - map - Global Layer Properties - - - - - - - - - - - - -
- Stroke width - - - - {{ sls.displayValue }} px -
- {{ radiusAttributePlaceholder }} - - - - {{ slr.displayValue }} px -
- - - - -
- - - - -
-
-
- - - - - color_lens - Fill Color By Attribute - - Define an attribute to color mapping to fill elements - - -
- - Enable Fill Color By Attribute - -
-
- - Fill Color Attribute - - {{ attribute.name }} ({{ attribute.type }}) - - - -
- -
- -
-
-
- - - - - color_lens - Stroke Color By Attribute - - Define an attribute to color mapping for the stroke of elements - - -
- - Enable Stroke Color Attribute - -
-
- - Stroke Color Attribute - - {{ attribute.name }} ({{ attribute.type }}) - - - -
- -
- -
-
-
- - - - - looks - Point Radius By Attribute - - Define an attribute to radius mapping for points - - -
- - Enable Radius By Attribute - -
-
- Note: The radius is clipped to the range [{{ minRadius }}, {{ maxRadius }}]. -
-
- - Radius Attribute - - {{ attribute.name }} ({{ attribute.type }}) - - - -
-
- -
-
-
- - - - - looks - Text By Attribute - - Define an attribute to display as text - - -
- - Enable Text By Attribute - -
-
- Note: The text is truncated after {{ maxTextChars }} characters. -
-
- - Text Attribute - - {{ attribute.name }} ({{ attribute.type }}) - - - -
-
- -
-
-
-
diff --git a/projects/wave-core/src/lib/layers/symbology/symbology-vectors/symbology-vector.component.scss b/projects/wave-core/src/lib/layers/symbology/symbology-vectors/symbology-vector.component.scss deleted file mode 100644 index a33735c4..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology-vectors/symbology-vector.component.scss +++ /dev/null @@ -1,28 +0,0 @@ -table { - width: 100%; - font-size: 0.8em; -} - -.color_cell { - cursor: pointer; - text-align: center; - min-width: 2rem; - min-height: 2rem; - color: black !important; - text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff !important; -} - -:host ::ng-deep .color-picker { - position: fixed !important; -} - -.symbology-headers-align .mat-expansion-panel-header-title, -.symbology-headers-align .mat-expansion-panel-header-description { - flex-basis: 0; - align-items: center; -} - -.symbology-headers-align .mat-expansion-panel-header-description { - justify-content: space-between; - align-items: center; -} diff --git a/projects/wave-core/src/lib/layers/symbology/symbology-vectors/symbology-vector.component.ts b/projects/wave-core/src/lib/layers/symbology/symbology-vectors/symbology-vector.component.ts deleted file mode 100644 index d89f0af1..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology-vectors/symbology-vector.component.ts +++ /dev/null @@ -1,352 +0,0 @@ -import {Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges} from '@angular/core'; - -import { - PointSymbology, - VectorSymbology, - StrokeDashStyle, - SymbologyType, - DEFAULT_POINT_CLUSTER_RADIUS_ATTRIBUTE, - MAX_ALLOWED_POINT_RADIUS, - MIN_ALLOWED_POINT_RADIUS, - DEFAULT_POINT_CLUSTER_TEXT_ATTRIBUTE, - MAX_ALLOWED_TEXT_LENGTH, -} from '../symbology.model'; -import {MatSlideToggleChange} from '@angular/material/slide-toggle'; -import {MatSliderChange} from '@angular/material/slider'; -import {ColorBreakpoint} from '../../../colors/color-breakpoint.model'; -import {VectorLayer} from '../../layer.model'; -import {DataTypes} from '../../../operators/datatype.model'; -import {ColorizerData} from '../../../colors/colorizer-data.model'; - -/** - * A simple interface to group attribute names with types - */ -interface Attribute { - name: string; - type: 'number' | 'text'; -} - -/** - * The symbology editor component for vector layers - */ -@Component({ - selector: 'wave-symbology-vector', - templateUrl: `symbology-vector.component.html`, - styleUrls: ['./symbology-vector.component.scss'], -}) -export class SymbologyVectorComponent implements OnChanges, OnInit { - // the min valid stroke width - static minStrokeWidth = 0; - - /** - * The vector layer for which the symbology is currently edited - */ - @Input() layer: VectorLayer | VectorLayer; - /** - * The event emitter propagating the changed symbology - */ - @Output() symbologyChanged = new EventEmitter(); - - // bounds for radius and text - readonly minRadius = MIN_ALLOWED_POINT_RADIUS; - readonly maxRadius = MAX_ALLOWED_POINT_RADIUS; - readonly maxTextChars = MAX_ALLOWED_TEXT_LENGTH; - - /** - * The working copy of the symbology - */ - symbology: VectorSymbology | PointSymbology; - - // enable / disable symbology features and stores for the selected attributes - fillByAttribute = false; - strokeByAttribute = false; - fillColorAttribute: Attribute; - strokeColorAttribute: Attribute; - radiusAttribute: Attribute; - radiusByAttribute: boolean; - textByAttribute: boolean; - textAttribute: Attribute; - attributes: Array; - numericAttributes: Array; - - constructor() {} - - ngOnChanges(changes: SimpleChanges) { - for (const propName in changes) { - // eslint-disable-line guard-for-in - switch (propName) { - case 'layer': - this.updateSymbologyFromLayer(); - break; - default: - // DO NOTHING - } - } - } - - ngOnInit() { - this.updateSymbologyFromLayer(); - } - - /** - * set the symbology fill colorizer attribute from the local (selected) variables - */ - setFillColorizerAttribute() { - if (this.fillByAttribute && this.fillColorAttribute) { - this.symbology.setFillColorAndAttribute(this.fillColorAttribute.name); - this.symbology.fillColorizer.clear(); - this.symbology.fillColorizer.addBreakpoint({ - rgba: this.symbology.fillRGBA, - value: this.fillColorAttribute.type === 'number' ? 0 : '', - }); - } else { - this.symbology.clearFillColorAndAttribute(); - } - } - - /** - * set the radius attribute to the default for clustered points - */ - setRadiusAttributeForClustering() { - const symbology = this.symbology as PointSymbology; - this.radiusByAttribute = false; - symbology.radiusFactor = 1.0; - symbology.clustered = true; - symbology.radiusAttribute = DEFAULT_POINT_CLUSTER_RADIUS_ATTRIBUTE; - this.update(); - } - - /** - * set the text attribute to the default for clustered points - */ - setTextAttributeForClustering() { - this.textByAttribute = false; - this.symbology.textAttribute = DEFAULT_POINT_CLUSTER_TEXT_ATTRIBUTE; - this.update(); - } - - /** - * update the fill colorizer attribute using the slide toggle value - */ - updateFillColorizeByAttribute(event: MatSlideToggleChange) { - this.fillByAttribute = event.checked; - this.setFillColorizerAttribute(); - this.update(); - } - - /** - * set the stroke color attribute using the local (selected) variables - */ - setStrokeColorizerAttribute() { - if (this.strokeByAttribute && this.strokeColorAttribute) { - this.symbology.setStrokeColorAndAttribute(this.strokeColorAttribute.name); - this.symbology.strokeColorizer.clear(); - this.symbology.strokeColorizer.addBreakpoint({ - rgba: this.symbology.strokeRGBA, - value: this.strokeColorAttribute.type === 'number' ? 0 : '', - }); - } else { - this.symbology.clearStrokeColorAndAttribute(); - } - } - - /** - * update the stroke color attribute using the slide togle value - */ - updateStrokeColorizeByAttribute(event: MatSlideToggleChange) { - this.strokeByAttribute = event.checked; - this.setStrokeColorizerAttribute(); - this.update(); - } - - /** - * set the radius attribute using the local (selected) variables - */ - setRadiusAttribute() { - if (this.symbology instanceof PointSymbology) { - if (this.radiusByAttribute && this.radiusAttribute) { - this.symbology.setRadiusAttributeAndFactor(this.radiusAttribute.name); - } else { - this.symbology.clearRadiusAttribute(); - } - this.update(); - } - } - - /** - * update the stroke color attribute using the slide togle value - */ - updateRadiusByAttribute(event: MatSlideToggleChange) { - this.radiusByAttribute = event.checked; - this.setRadiusAttribute(); - } - - /** - * set the text attribute using the (selected) local variables - */ - setTextAttribute() { - if (this.textByAttribute && this.textAttribute) { - this.symbology.textAttribute = this.textAttribute.name; - } else { - this.symbology.clearTextAttribute(); - } - this.update(); - } - - /** - * update the text attribute using the slide togle value - */ - updateTextByAttribute(event: MatSlideToggleChange) { - this.textByAttribute = event.checked; - this.setTextAttribute(); - } - - private updateSymbologyFromLayer() { - if (!this.layer || !this.layer.symbology || this.layer.symbology.equals(this.symbology)) { - return; - } - const symbology = this.layer.symbology; - this.symbology = symbology; - this.fillByAttribute = !!symbology.fillColorAttribute; - this.strokeByAttribute = !!symbology.strokeColorAttribute; - this.gatherAttributes(); - this.fillColorAttribute = this.attributes.find((x) => x.name === symbology.fillColorAttribute); - this.fillByAttribute = !!this.fillColorAttribute; - this.strokeColorAttribute = this.attributes.find((x) => x.name === symbology.strokeColorAttribute); - this.strokeByAttribute = !!this.strokeColorAttribute; - if (symbology instanceof PointSymbology) { - this.radiusAttribute = this.attributes.find((x) => x.name === symbology.radiusAttribute); - this.radiusByAttribute = !!this.radiusAttribute; - } - this.textAttribute = this.attributes.find((x) => x.name === symbology.textAttribute); - this.textByAttribute = !!this.textAttribute; - } - - private gatherAttributes() { - const attributes: Array = []; - const numericAttributes: Array = []; - this.layer.operator.dataTypes.forEach((datatype, attribute) => { - if (DataTypes.ALL_NUMERICS.indexOf(datatype) >= 0) { - numericAttributes.push({ - name: attribute, - type: 'number', - }); - } else { - attributes.push({ - name: attribute, - type: 'text', - }); - } - }); - this.numericAttributes = numericAttributes; - this.attributes = [...numericAttributes, ...attributes]; - } - - /** - * emmit the current working symbology - */ - update() { - // return a clone (immutablility) - this.symbologyChanged.emit(this.symbology.clone()); - } - - /** - * update the stroke width unsing the slider value - */ - updateStrokeWidth(event: MatSliderChange) { - // guard against negative values - if (this.symbology.strokeWidth < SymbologyVectorComponent.minStrokeWidth) { - this.symbology.strokeWidth = SymbologyVectorComponent.minStrokeWidth; - } - - this.symbology.strokeWidth = event.value; - this.update(); - } - - updateStrokeDash(sds: StrokeDashStyle) { - if (!!sds && sds !== this.symbology.strokeDashStyle) { - this.symbology.strokeDashStyle = sds; - this.update(); - } - } - - /** - * update the stroke dash unsing the slider value - */ - updateRadius(event: MatSliderChange) { - if (!(this.symbology instanceof PointSymbology)) { - throw new Error('SymbologyVectorComponent: cant change radius for non point symbology'); - } - this.symbology.radius = event.value; - if (this.symbology.radius < this.minRadius) { - this.symbology.radius = this.minRadius; - } - if (this.symbology.radius > this.maxRadius) { - this.symbology.radius = this.maxRadius; - } - this.update(); - } - - /** - * update the fill with a color breakpoint - */ - updateFill(fill: ColorBreakpoint) { - if (fill && fill !== this.symbology.fillColorBreakpoint) { - this.symbology.fillColorBreakpoint = fill; - this.update(); - } - } - - /** - * update the stroke with a color breakpoint - */ - updateStroke(stroke: ColorBreakpoint) { - if (stroke && stroke !== this.symbology.strokeColorBreakpoint) { - this.symbology.strokeColorBreakpoint = stroke; - this.update(); - } - } - - /** - * update the fill colorizer with colorizer data - */ - updateFillColorizer(event: ColorizerData) { - if (event && this.symbology) { - this.symbology.setOrUpdateFillColorizer(event); - this.update(); - } - } - - /** - * update the stroke colorizer with colorizer data - */ - updateStrokeColorizer(event: ColorizerData) { - if (event && this.symbology) { - this.symbology.setOrUpdateStrokeColorizer(event); - this.update(); - } - } - - get fillColorAttributePlaceholder(): string { - return this.fillByAttribute ? 'Default Fill Color' : 'Fill Color'; - } - - get strokeColorAttributePlaceholder(): string { - return this.strokeByAttribute ? 'Default Stroke Color' : 'Stroke Color'; - } - - get radiusAttributePlaceholder(): string { - return this.radiusByAttribute || this.isClusteredPointSymbology ? 'Default Radius' : 'Radius'; - } - - get isClusteredPointSymbology(): boolean { - if (this.symbology instanceof PointSymbology) { - return this.symbology.clustered; - } - return false; - } - - get isPointSymbology(): boolean { - return this.symbology.getSymbologyType() === SymbologyType.COMPLEX_POINT; - } -} diff --git a/projects/wave-core/src/lib/layers/symbology/symbology.model.ts b/projects/wave-core/src/lib/layers/symbology/symbology.model.ts deleted file mode 100644 index b9ec7ab3..00000000 --- a/projects/wave-core/src/lib/layers/symbology/symbology.model.ts +++ /dev/null @@ -1,710 +0,0 @@ -import {Interpolation, Unit, UnitDict} from '../../operators/unit.model'; -import {Color, RgbaLike, RgbaTuple, TRANSPARENT, WHITE} from '../../colors/color'; -import {ColorizerData, IColorizerData, MappingRasterColorizerDict} from '../../colors/colorizer-data.model'; -import {ColorBreakpoint, ColorBreakpointDict} from '../../colors/color-breakpoint.model'; -import {Colormap} from '../../colors/colormaps/colormap.model'; - -/** - * List of the symbology types used in WAVE - */ -export enum SymbologyType { - RASTER, // UNUSED - SIMPLE_POINT, // DEPRECATED - CLUSTERED_POINT, // DEPRECATED - SIMPLE_LINE, // DEPRECATED - SIMPLE_VECTOR, // DEPRECATED - MAPPING_COLORIZER_RASTER, - ICON_POINT, // RESERVED - COMPLEX_POINT, - COMPLEX_VECTOR, - COMPLEX_LINE, -} - -// List of constants used by layer symbology. -export const DEFAULT_VECTOR_STROKE_COLOR: Color = Color.fromRgbaLike([0, 0, 0, 1]); -export const DEFAULT_VECTOR_FILL_COLOR: Color = Color.fromRgbaLike([255, 0, 0, 1]); -export const DEFAULT_VECTOR_HIGHLIGHT_STROKE_COLOR: Color = Color.fromRgbaLike([255, 255, 255, 1]); -export const DEFAULT_VECTOR_HIGHLIGHT_FILL_COLOR: Color = Color.fromRgbaLike([0, 153, 255, 1]); -export const DEFAULT_VECTOR_HIGHLIGHT_TEXT_COLOR: Color = Color.fromRgbaLike([255, 255, 255, 1]); -export const DEFAULT_POINT_RADIUS = 8; -export const DEFAULT_POINT_CLUSTER_RADIUS_ATTRIBUTE = '___radius'; -export const DEFAULT_POINT_CLUSTER_TEXT_ATTRIBUTE = '___numberOfPoints'; -export const MIN_ALLOWED_POINT_RADIUS = 1; -export const MAX_ALLOWED_POINT_RADIUS = 100; -export const MAX_ALLOWED_TEXT_LENGTH = 25; - -/** - * Serialization interface - */ -export interface SymbologyDict { - symbologyType: string; -} - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface ISymbology {} - -export type StrokeDashStyle = Array; - -/** - * The abstract symbology class with common methods. - */ -export abstract class AbstractSymbology implements ISymbology { - /** - * Deserialization logic to generate any Symbology from SymbologyDict. - */ - static fromDict(dict: SymbologyDict): AbstractSymbology { - switch (dict.symbologyType) { - case SymbologyType[SymbologyType.SIMPLE_POINT]: - case SymbologyType[SymbologyType.COMPLEX_POINT]: - return PointSymbology.createSymbology(dict as PointSymbologyDict); - - case SymbologyType[SymbologyType.CLUSTERED_POINT]: - return PointSymbology.createClusterSymbology(dict as VectorSymbologyDict); - - case SymbologyType[SymbologyType.SIMPLE_LINE]: - case SymbologyType[SymbologyType.COMPLEX_LINE]: - return LineSymbology.createSymbology(dict as VectorSymbologyDict); - - case SymbologyType[SymbologyType.SIMPLE_VECTOR]: - case SymbologyType[SymbologyType.COMPLEX_VECTOR]: - return VectorSymbology.createSymbology(dict as VectorSymbologyDict); - - case SymbologyType[SymbologyType.RASTER]: - case SymbologyType[SymbologyType.MAPPING_COLORIZER_RASTER]: - return MappingRasterSymbology.createSymbology(dict as RasterSymbologyDict); - default: - throw new Error('Unsupported AbstractSymbology'); - } - } - - abstract getSymbologyType(): SymbologyType; - - get symbologyType(): SymbologyType { - return this.getSymbologyType(); - } - - get symbologyTypeId(): string { - return SymbologyType[this.getSymbologyType()]; - } - - abstract clone(): AbstractSymbology; - - abstract toConfig(): ISymbology; - - abstract equals(other: AbstractSymbology): boolean; - - abstract toDict(): SymbologyDict; -} - -/** - * Configuration interface with optional fields for VectorSymbology. - */ -export interface VectorSymbologyConfig extends ISymbology { - fillRGBA?: RgbaLike; - strokeRGBA?: RgbaLike; - strokeWidth?: number; - fillColorizer?: IColorizerData; - fillColorAttribute?: string; - strokeColorizer?: IColorizerData; - strokeColorAttribute?: string; - strokeDashStyle?: StrokeDashStyle; - textAttribute?: string; - textColor?: RgbaLike; - textStrokeWidth?: number; -} - -/** - * Serialzation interface for VectorSymbology. - */ -interface VectorSymbologyDict extends SymbologyDict { - fillRGBA: RgbaTuple; - strokeRGBA: RgbaTuple; - strokeWidth: number; - fillColorizer: IColorizerData; - fillColorAttribute: string; - strokeColorizer: IColorizerData; - strokeColorAttribute: string; - strokeDashStyle: StrokeDashStyle; - textAttribute: string; - textColor: RgbaLike; - textStrokeWidth: number; -} - -/** - * The abstract VectorSymbology class. - */ -export abstract class AbstractVectorSymbology extends AbstractSymbology { - private _fillColorBreakpoint: ColorBreakpoint = new ColorBreakpoint({rgba: DEFAULT_VECTOR_FILL_COLOR, value: 'Default fill color'}); - private _strokeColorBreakpoint: ColorBreakpoint = new ColorBreakpoint({ - rgba: DEFAULT_VECTOR_STROKE_COLOR, - value: 'Default stroke color', - }); - - // common vector symbology fill - fillColorizer: ColorizerData; - fillColorAttribute: string = undefined; - // common vector symbology stroke - strokeWidth = 1; - strokeColorizer: ColorizerData; - strokeColorAttribute: string = undefined; - private _strokeDashStyle: StrokeDashStyle = undefined; - // common vector symbology text attribute - _textAttribute: string = undefined; - textColor: Color = undefined; - textStrokeWidth: number = undefined; - - /** - * Returns true if the symbology describes filled objects. - */ - abstract describesElementFill(): boolean; - - /** - * Returns true if the symbology describes elements with stroke. - */ - abstract describesElementStroke(): boolean; - - /** - * Returns true if the symbology describes points with radius. - */ - abstract describesPointsWithRadius(): boolean; - - set fillColorBreakpoint(colorBreakpoint: ColorBreakpoint) { - this._fillColorBreakpoint = colorBreakpoint; - } - - get fillColorBreakpoint(): ColorBreakpoint { - return this._fillColorBreakpoint; - } - - set strokeColorBreakpoint(colorBreakpoint: ColorBreakpoint) { - this._strokeColorBreakpoint = colorBreakpoint; - } - - get strokeColorBreakpoint(): ColorBreakpoint { - return this._strokeColorBreakpoint; - } - - set fillRGBA(color: Color) { - this._fillColorBreakpoint.setColor(color); - } - - get fillRGBA(): Color { - return this._fillColorBreakpoint.rgba; - } - - set strokeRGBA(color: Color) { - this._strokeColorBreakpoint.setColor(color); - } - - get strokeRGBA(): Color { - return this._strokeColorBreakpoint.rgba; - } - - set textAttribute(textAttribute: string) { - this._textAttribute = textAttribute; - } - - get textAttribute(): string { - return this._textAttribute; - } - - set strokeDashStyle(strokeDashStyle: StrokeDashStyle) { - this._strokeDashStyle = strokeDashStyle; - } - - get strokeDashStyle(): StrokeDashStyle { - return this._strokeDashStyle; - } - - setFillColorAndAttribute(name: string, clr: ColorizerData = ColorizerData.empty()) { - this.fillColorizer = clr; - this.fillColorAttribute = name; - } - - setOrUpdateFillColorizer(clr: ColorizerData): boolean { - if (clr && (!this.fillColorizer || !clr.equals(this.fillColorizer))) { - this.fillColorizer = clr; - return true; - } - return false; - } - - setStrokeColorAndAttribute(name: string, clr: ColorizerData = ColorizerData.empty()) { - this.strokeColorizer = clr; - this.strokeColorAttribute = name; - } - - setOrUpdateStrokeColorizer(clr: ColorizerData): boolean { - if (clr && (!this.strokeColorizer || !clr.equals(this.strokeColorizer))) { - this.strokeColorizer = clr; - return true; - } - return false; - } - - clearFillColorAndAttribute() { - this.fillColorAttribute = undefined; - this.fillColorizer = ColorizerData.empty(); - } - - clearStrokeColorAndAttribute() { - this.strokeColorAttribute = undefined; - this.strokeColorizer = ColorizerData.empty(); - } - - clearStrokeDashStyle() { - this.strokeDashStyle = undefined; - } - - clearTextAttribute() { - this.textAttribute = undefined; - } - - /** - * compare with another AbstractVectorSymbology - */ - equals(other: AbstractVectorSymbology) { - if (other instanceof AbstractVectorSymbology) { - return ( - this.fillColorBreakpoint.equals(other.fillColorBreakpoint) && - this.strokeColorBreakpoint.equals(other.strokeColorBreakpoint) && - this.strokeWidth === other.strokeWidth && - this.describesElementFill() === other.describesElementFill() && - this.describesPointsWithRadius() === other.describesPointsWithRadius() && - this.fillColorizer && - this.fillColorizer.equals(other.fillColorizer) && - this.fillColorAttribute && - other.fillColorAttribute && - this.fillColorAttribute === other.fillColorAttribute && - this.strokeColorizer && - this.strokeColorizer.equals(other.strokeColorizer) && - this.strokeColorAttribute && - other.strokeColorAttribute && - this.strokeColorAttribute === other.strokeColorAttribute && - this.strokeDashStyle && - other.strokeDashStyle && - this.strokeDashStyle === other.strokeDashStyle && - this.textColor && - this.textColor.equals(other.textColor) && - this.textStrokeWidth && - other.textStrokeWidth && - this.textStrokeWidth === other.textStrokeWidth && - this.textAttribute && - other.textAttribute && - this.textAttribute === other.textAttribute - ); - } - return false; - } - - protected constructor(config: VectorSymbologyConfig) { - super(); - if (config.fillRGBA) { - this.fillRGBA = Color.fromRgbaLike(config.fillRGBA); - } - if (config.strokeRGBA) { - this.strokeRGBA = Color.fromRgbaLike(config.strokeRGBA); - } - if (config.strokeWidth) { - this.strokeWidth = config.strokeWidth; - } - - if (config.fillColorAttribute) { - this.fillColorAttribute = config.fillColorAttribute; - } - this.fillColorizer = config.fillColorizer ? ColorizerData.fromDict(config.fillColorizer) : ColorizerData.empty(); - - if (config.strokeColorAttribute) { - this.strokeColorAttribute = config.strokeColorAttribute; - } - this.strokeColorizer = config.strokeColorizer ? ColorizerData.fromDict(config.strokeColorizer) : ColorizerData.empty(); - - if (config.strokeDashStyle) { - this.strokeDashStyle = config.strokeDashStyle; - } - - if (config.textAttribute) { - this.textAttribute = config.textAttribute; - } - this.textColor = config.textColor ? Color.fromRgbaLike(config.textColor) : WHITE; - this.textStrokeWidth = config.textStrokeWidth ? config.textStrokeWidth : Math.ceil(config.strokeWidth * 0.1); - } - - toDict(): VectorSymbologyDict { - return { - symbologyType: SymbologyType[this.getSymbologyType()], - fillRGBA: this.fillRGBA.rgbaTuple(), - strokeRGBA: this.strokeRGBA.rgbaTuple(), - strokeWidth: this.strokeWidth, - fillColorAttribute: this.fillColorAttribute, - fillColorizer: this.fillColorizer ? this.fillColorizer.toDict() : undefined, - strokeColorAttribute: this.strokeColorAttribute, - strokeColorizer: this.strokeColorizer, - strokeDashStyle: this.strokeDashStyle, - textAttribute: this.textAttribute, - textColor: this.textColor.rgbaTuple(), - textStrokeWidth: this.textStrokeWidth, - }; - } -} - -/** - * Configuration interface with optional fields for PointSymbology. - */ -export interface PointSymbologyConfig extends VectorSymbologyConfig { - radius?: number; - radiusAttribute?: string; - radiusFactor?: number; - clustered?: boolean; -} - -/** - * Serialization interface for PointSymbology. - */ -interface PointSymbologyDict extends VectorSymbologyDict { - radius: number; - radiusAttribute: string; - radiusFactor: number; - clustered: boolean; -} - -/** - * A class that contains properties for drawing lines - */ -export class LineSymbology extends AbstractVectorSymbology implements VectorSymbologyConfig { - protected constructor(config: VectorSymbologyConfig) { - super(config); - } - - static createSymbology(config: VectorSymbologyConfig): LineSymbology { - return new LineSymbology(config); - } - - describesElementStroke(): boolean { - return true; - } - - describesElementFill(): boolean { - return false; - } - - describesPointsWithRadius(): boolean { - return false; - } - - getSymbologyType(): SymbologyType { - return SymbologyType.COMPLEX_LINE; - } - - clone(): LineSymbology { - return new LineSymbology(this); - } - - toConfig(): LineSymbology { - return this.clone(); - } -} - -/** - * A class that contains properties for drawing vectors such as polygons - */ -export class VectorSymbology extends AbstractVectorSymbology implements VectorSymbologyConfig { - protected constructor(config: VectorSymbologyConfig) { - super(config); - } - - static createSymbology(config: VectorSymbologyConfig): VectorSymbology { - return new VectorSymbology(config); - } - - describesElementStroke(): boolean { - return true; - } - - describesElementFill(): boolean { - return true; - } - - describesPointsWithRadius(): boolean { - return false; - } - - getSymbologyType(): SymbologyType { - return SymbologyType.COMPLEX_VECTOR; - } - - clone(): VectorSymbology { - return new VectorSymbology(this); - } - - toConfig(): VectorSymbologyConfig { - return this.clone(); - } -} - -/** - * A class that contains properties for drawing points - */ -export class PointSymbology extends AbstractVectorSymbology implements PointSymbologyConfig { - radiusAttribute: string = undefined; - radiusFactor = 1.0; - radius: number = DEFAULT_POINT_RADIUS; - clustered = false; - - protected constructor(config: PointSymbologyConfig) { - super(config); - - if (config.radius) { - this.radius = config.radius; - } - - if (config.radiusAttribute) { - this.radiusAttribute = config.radiusAttribute; - } - this.clustered = config.clustered ? config.clustered : false; - this.radiusFactor = config.radiusFactor ? config.radiusFactor : 1.0; - } - - /** - * Creates a PointSymbology where radiusAttribute and textAttribute are set to the strings returned by Mappings cluster operator - */ - static createClusterSymbology(config: PointSymbologyConfig): PointSymbology { - config.radiusAttribute = DEFAULT_POINT_CLUSTER_RADIUS_ATTRIBUTE; - config.textAttribute = DEFAULT_POINT_CLUSTER_TEXT_ATTRIBUTE; - config.clustered = true; - - return PointSymbology.createSymbology(config); - } - - /** - * Creates a default PointSymbology - */ - static createSymbology(config: PointSymbologyConfig): PointSymbology { - return new PointSymbology(config); - } - - getSymbologyType(): SymbologyType { - return SymbologyType.COMPLEX_POINT; - } - - clone(): PointSymbology { - return new PointSymbology(this); - } - - equals(other: AbstractVectorSymbology) { - if (other instanceof PointSymbology) { - return ( - super.equals(other as AbstractVectorSymbology) && - this.radiusAttribute && - other.radiusAttribute && - this.radiusAttribute === other.radiusAttribute - ); - } - return false; - } - - toConfig(): PointSymbologyConfig { - return this.clone(); - } - - describesElementStroke(): boolean { - return true; - } - - describesElementFill(): boolean { - return true; - } - - describesPointsWithRadius(): boolean { - return true; - } - - setRadiusAttributeAndFactor(name: string, factor = 1.0) { - this.radiusAttribute = name; - this.radiusFactor = factor; - } - - clearRadiusAttribute() { - this.radiusAttribute = undefined; - this.radiusFactor = 1.0; - } - - toDict(): PointSymbologyDict { - return { - symbologyType: SymbologyType[SymbologyType.COMPLEX_POINT], - fillRGBA: this.fillRGBA.rgbaTuple(), - strokeRGBA: this.strokeRGBA.rgbaTuple(), - strokeWidth: this.strokeWidth, - fillColorAttribute: this.fillColorAttribute, - fillColorizer: this.fillColorizer ? this.fillColorizer.toDict() : undefined, - strokeColorAttribute: this.strokeColorAttribute, - strokeColorizer: this.strokeColorizer, - strokeDashStyle: this.strokeDashStyle, - radiusAttribute: this.radiusAttribute, - radiusFactor: this.radiusFactor, - radius: this.radius, - textAttribute: this.textAttribute, - textColor: this.textColor.rgbaTuple(), - textStrokeWidth: this.textStrokeWidth, - clustered: this.clustered, - }; - } -} - -/** - * Configuration interface with optional fields for RasterSymbology. - */ -export interface IRasterSymbology extends ISymbology { - opacity?: number; - unit: Unit | UnitDict; -} - -/** - * Serialization interface for RasterSymbology. - */ -export interface RasterSymbologyDict extends SymbologyDict { - opacity: number; - unit: UnitDict; - colorizer?: IColorizerData; - noDataColor?: ColorBreakpointDict; - overflowColor?: ColorBreakpointDict; -} - -/** - * Configuration interface with optional fields for MappingRasterSymbology. - */ -export interface IColorizerRasterSymbology extends IRasterSymbology { - colorizer?: IColorizerData; - noDataColor?: ColorBreakpointDict; - overflowColor?: ColorBreakpointDict; -} - -/** - * The abstract raster symbology class. - */ -export abstract class AbstractRasterSymbology extends AbstractSymbology implements IRasterSymbology { - opacity = 1; - unit: Unit; - - protected constructor(config: IRasterSymbology) { - super(); - if (config.unit instanceof Unit) { - this.unit = config.unit; - } else { - this.unit = Unit.fromDict(config.unit as UnitDict); - } - - if (config.opacity) { - this.opacity = config.opacity; - } - } - - isContinuous() { - return this.unit.interpolation === Interpolation.Continuous; - } - - isDiscrete() { - return this.unit.interpolation === Interpolation.Discrete; - } - - isUnitUnknown() { - return !this.unit || !this.unit.interpolation || this.unit.interpolation === 0; - } - - abstract getSymbologyType(): SymbologyType; - - abstract toConfig(): IRasterSymbology; - - abstract clone(): AbstractRasterSymbology; - - equals(other: AbstractRasterSymbology) { - return this.opacity === other.opacity && this.unit === other.unit; - } - - abstract toDict(): RasterSymbologyDict; -} - -/** - * The raster symbology class with colorizer information, rendered by the mapping backend. - */ -export class MappingRasterSymbology extends AbstractRasterSymbology implements IColorizerRasterSymbology { - colorizer: ColorizerData; - noDataColor: ColorBreakpoint; - overflowColor: ColorBreakpoint; - - /** - * Create the default symbology, with options from config. - */ - static createSymbology(config: IColorizerRasterSymbology) { - return new MappingRasterSymbology(config); - } - - protected constructor(config: IColorizerRasterSymbology) { - super(config); - // TODO: this default colorizer fails if the unit has `undefined` min and max values - this.colorizer = config.colorizer - ? new ColorizerData(config.colorizer) - : Colormap.createColorizerDataWithName('VIRIDIS', config.unit.min, config.unit.max); - this.noDataColor = config.noDataColor - ? new ColorBreakpoint(config.noDataColor) - : new ColorBreakpoint({rgba: TRANSPARENT, value: 'NoData'}); - this.overflowColor = config.overflowColor - ? new ColorBreakpoint(config.overflowColor) - : new ColorBreakpoint({rgba: TRANSPARENT, value: 'Overflow'}); - } - - getSymbologyType(): SymbologyType { - return SymbologyType.MAPPING_COLORIZER_RASTER; - } - - isUnitUnknown(): boolean { - return super.isUnitUnknown(); - } - - toConfig(): IColorizerRasterSymbology { - return this.clone() as IColorizerRasterSymbology; - } - - clone(): MappingRasterSymbology { - return new MappingRasterSymbology(this); - } - - equals(other: AbstractRasterSymbology) { - if (other instanceof MappingRasterSymbology) { - return ( - super.equals(other as AbstractRasterSymbology) && - this.colorizer && - this.colorizer.equals(other.colorizer) && - this.noDataColor && - this.noDataColor.equals(other.noDataColor) && - this.overflowColor && - this.overflowColor.equals(other.overflowColor) - ); - } - return false; - } - - toDict(): RasterSymbologyDict { - return { - symbologyType: SymbologyType[SymbologyType.MAPPING_COLORIZER_RASTER], - opacity: this.opacity, - unit: this.unit.toDict(), - colorizer: this.colorizer.toDict(), - noDataColor: this.noDataColor.toDict(), - overflowColor: this.overflowColor.toDict(), - }; - } - - /** - * generate a colorizer representation for the mapping backend. - */ - mappingColorizerRequestString(): string { - const mcbs: MappingRasterColorizerDict = { - type: this.colorizer.type, - nodata: this.noDataColor.asMappingRasterColorizerBreakpoint(), - default: this.overflowColor.asMappingRasterColorizerBreakpoint(), - breakpoints: this.colorizer.breakpoints.map((br) => br.asMappingRasterColorizerBreakpoint()), - }; - return JSON.stringify(mcbs); - } -} diff --git a/projects/wave-core/src/lib/layout.service.ts b/projects/wave-core/src/lib/layout.service.ts deleted file mode 100644 index 3397aae0..00000000 --- a/projects/wave-core/src/lib/layout.service.ts +++ /dev/null @@ -1,367 +0,0 @@ -import {fromEvent, combineLatest, BehaviorSubject, Observable, ReplaySubject, Subject} from 'rxjs'; -import {debounceTime, distinctUntilChanged, map} from 'rxjs/operators'; -import {Injectable, Type} from '@angular/core'; -import {Config} from './config.service'; - -/** - * Layout settings serialization format. - */ -export interface LayoutDict { - layerListVisible: boolean; - layerDetailViewVisible: boolean; - layerDetailViewTabIndex: number; - layerDetailViewHeightPercentage: number; -} - -export interface SidenavConfig { - component: Type; - keepParent?: boolean; - parent?: SidenavConfig; - config?: {[key: string]: any}; -} - -/** - * A service that keeps track of app layouting options. - */ -@Injectable() -export class LayoutService { - static readonly remInPx: number = parseFloat(getComputedStyle(document.documentElement).fontSize); - - private static _scrollbarWidthPx: number; - - /** - * Is the layer list visible? - */ - private layerListVisible$: BehaviorSubject = new BehaviorSubject(true); - - /** - * Is the data table visible? - */ - private layerDetailViewVisible$: BehaviorSubject = new BehaviorSubject(true); - - /** - * What is the currently visible tab? - */ - private layerDetailViewTabIndex$: BehaviorSubject = new BehaviorSubject(0); - - /** - * What is the height of the layer detail view as a percentage of the available space. - */ - private layerDetailViewHeightPercentage$: BehaviorSubject = new BehaviorSubject(2 / 5); - - /** - * Sidenav content - */ - private sidenavContentComponent$: Subject = new ReplaySubject(1); - - private sidenavContentMaxWidth$: Subject = new ReplaySubject(1); - - constructor(protected config: Config) { - this.setupSidenavWidthStream(); - } - - static scrollbarWidthPx() { - if (!this._scrollbarWidthPx) { - const outer = document.createElement('div'); - outer.style.visibility = 'hidden'; - outer.style.width = '100px'; - // @ts-ignore - outer.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps - - document.body.appendChild(outer); - - const widthNoScroll = outer.offsetWidth; - // force scrollbars - outer.style.overflow = 'scroll'; - - // add innerdiv - const inner = document.createElement('div'); - inner.style.width = '100%'; - outer.appendChild(inner); - - const widthWithScroll = inner.offsetWidth; - - // remove divs - outer.parentNode.removeChild(outer); - - this._scrollbarWidthPx = widthNoScroll - widthWithScroll; - } - - return this._scrollbarWidthPx; - } - - static getToolbarHeightPx(): number { - const mobileLandscape = window.matchMedia('(max-width: 960px) and (orientation: landscape)').matches; - if (mobileLandscape) { - return 48; - } - - const mobilePortrait = window.matchMedia('(max-width: 600px) and (orientation: portrait)').matches; - if (mobilePortrait) { - return 56; - } - - return 64; - } - - static getLayerDetailViewBarHeightPx(): number { - const mobileLandscape = window.matchMedia('(max-width: 960px) and (orientation: landscape)').matches; - if (mobileLandscape) { - return 2 * LayoutService.remInPx; - } - - const mobilePortrait = window.matchMedia('(max-width: 600px) and (orientation: portrait)').matches; - if (mobilePortrait) { - return 2.5 * LayoutService.remInPx; - } - - const borderSizePx = 1; - - return 3 * LayoutService.remInPx + borderSizePx; - } - - /** - * Calculate the height of the data table. - */ - private static calculateLayerDetailViewHeight(layerDetailViewHeightPercentage: number, totalAvailableHeight: number): number { - return Math.max(Math.ceil(layerDetailViewHeightPercentage * totalAvailableHeight), LayoutService.getLayerDetailViewBarHeightPx()); - } - - /** - * Calculate the height of the map. - */ - private static calculateMapHeight(layerDetailViewHeightPercentage: number, totalAvailableHeight: number): number { - const layerDetailViewHeight = LayoutService.calculateLayerDetailViewHeight(layerDetailViewHeightPercentage, totalAvailableHeight); - return totalAvailableHeight - layerDetailViewHeight; - } - - getSidenavWidthStream(): Observable { - return this.sidenavContentMaxWidth$; - } - - /** - * Which component to show in the sidenav? - */ - getSidenavContentComponentStream(): Observable { - return this.sidenavContentComponent$.pipe(distinctUntilChanged()); - } - - /** - * Set the new Component to show in the sidenav - */ - setSidenavContentComponent(sidenavConfig: SidenavConfig) { - this.sidenavContentComponent$.next(sidenavConfig); - } - - /** - * Is the layer list visible in the component? - */ - getLayerListVisibility(): boolean { - return this.layerListVisible$.value; - } - - /** - * Is the layer list visible in the component? - */ - getLayerListVisibilityStream(): Observable { - return this.layerListVisible$; - } - - /** - * Sets the visibility of the layer list. - */ - setLayerListVisibility(visible: boolean) { - this.layerListVisible$.next(visible); - } - - /** - * Toggles the visibility of the layer list. - */ - toggleLayerListVisibility() { - this.setLayerListVisibility(!this.layerListVisible$.value); - } - - /** - * Is the layer detail view visible? - */ - getLayerDetailViewVisibilityStream(): Observable { - return this.layerDetailViewVisible$; - } - - /** - * Is the layer detail view visible? - */ - getLayerDetailViewVisibility(): boolean { - return this.layerDetailViewVisible$.value; - } - - /** - * Sets the visibility of the layer detail view. - */ - setLayerDetailViewVisibility(visible: boolean) { - this.layerDetailViewVisible$.next(visible); - } - - /** - * Toggles the visibility of the layer detail view. - */ - toggleLayerDetailViewVisibility() { - this.setLayerDetailViewVisibility(!this.layerDetailViewVisible$.value); - } - - /** - * What is the current tab index? - */ - getLayerDetailViewTabIndexStream(): Observable { - return this.layerDetailViewTabIndex$; - } - - /** - * What is the current tab index? - */ - getLayerDetailViewTabIndex(): number { - return this.layerDetailViewTabIndex$.value; - } - - /** - * Set the current tab index. - */ - setLayerDetailViewTabIndex(index: number) { - // ignore call if it is the same index. - if (this.layerDetailViewTabIndex$.value === index) { - return; - } - - if (index < 0) { - index = 0; // repair index - } - - this.layerDetailViewTabIndex$.next(index); - } - - /** - * Sets the percentage of the vertical viewport that the data table covers. - */ - setLayerDetailViewHeightPercentage(percentage: number) { - if (percentage < 0 || percentage > 1) { - throw Error('The data table percentage value must be between 0 and 1.'); - } - - this.layerDetailViewHeightPercentage$.next(percentage); - } - - /** - * Calculate the height of the data table. - */ - getLayerDetailViewHeight(totalAvailableHeight: number): number { - return LayoutService.calculateLayerDetailViewHeight( - this.layerDetailViewVisible$.value ? this.layerDetailViewHeightPercentage$.value : 0, - totalAvailableHeight, - ); - } - - /** - * Calculate the height of the data table. - */ - getLayerDetailViewStream(totalAvailableHeight$: Observable): Observable { - return combineLatest([this.layerDetailViewHeightPercentage$, totalAvailableHeight$, this.layerDetailViewVisible$]).pipe( - map(([layerDetailViewHeightPercentage, totalAvailableHeight, layerDetailViewVisible]): number => { - return LayoutService.calculateLayerDetailViewHeight( - layerDetailViewVisible ? layerDetailViewHeightPercentage : 0, - totalAvailableHeight, - ); - }), - ); - } - - /** - * Calculate the height of the map. - */ - getMapHeight(totalAvailableHeight: number): number { - return LayoutService.calculateMapHeight( - this.layerDetailViewVisible$.value ? this.layerDetailViewHeightPercentage$.value : 0, - totalAvailableHeight, - ); - } - - /** - * Calculate the height of the data table. - */ - getMapHeightStream(totalAvailableHeight$: Observable): Observable { - return combineLatest(this.layerDetailViewHeightPercentage$, totalAvailableHeight$, this.layerDetailViewVisible$).pipe( - map(([layerDetailViewHeightPercentage, totalAvailableHeight, layerDetailViewVisible]): number => { - return LayoutService.calculateMapHeight(layerDetailViewVisible ? layerDetailViewHeightPercentage : 0, totalAvailableHeight); - }), - ); - } - - getLayoutDict(): LayoutDict { - return { - layerListVisible: this.getLayerListVisibility(), - layerDetailViewVisible: this.getLayerDetailViewVisibility(), - layerDetailViewTabIndex: this.getLayerDetailViewTabIndex(), - layerDetailViewHeightPercentage: this.layerDetailViewHeightPercentage$.getValue(), - }; - } - - getLayoutDictStream(): Observable { - return combineLatest([ - this.layerListVisible$, - this.layerDetailViewVisible$, - this.layerDetailViewTabIndex$, - this.layerDetailViewHeightPercentage$, - ]).pipe( - map(([layerListVisible, layerDetailViewVisible, layerDetailViewTabIndex, layerDetailViewHeightPercentage]) => { - return { - layerListVisible, - layerDetailViewVisible, - layerDetailViewTabIndex, - layerDetailViewHeightPercentage, - }; - }), - ); - } - - setLayoutDict(dict: LayoutDict) { - if (typeof dict.layerListVisible === 'boolean') { - this.setLayerListVisibility(dict.layerListVisible); - } - if (typeof dict.layerDetailViewVisible === 'boolean') { - this.setLayerDetailViewVisibility(dict.layerDetailViewVisible); - } - if (typeof dict.layerDetailViewTabIndex === 'number') { - this.setLayerDetailViewTabIndex(dict.layerDetailViewTabIndex); - } - if (typeof dict.layerDetailViewHeightPercentage === 'number') { - this.setLayerDetailViewHeightPercentage(dict.layerDetailViewHeightPercentage); - } - } - - /** - * Initialize and update the sidenav INNER width stream - */ - private setupSidenavWidthStream() { - function getWidth(): number { - const sidenavComponent = document.getElementsByTagName('mat-sidenav')[0]; - const sidenavStyle = window.getComputedStyle(sidenavComponent); - const widthString = sidenavStyle.width; - - if (widthString.indexOf('px') === widthString.length - 2) { - return parseFloat(widthString.substr(0, widthString.length - 2)) - 4 * LayoutService.remInPx; - } else { - throw new Error('sidenav width must be a `px` value'); - } - } - - // this timeout prevents calling the `getWidth` function before the DOM is initialized - setTimeout(() => { - fromEvent(window, 'resize') - .pipe(debounceTime(this.config.DELAYS.DEBOUNCE)) - .subscribe(() => { - this.sidenavContentMaxWidth$.next(getWidth()); - }); - - this.sidenavContentMaxWidth$.next(getWidth()); - }); - } -} diff --git a/projects/wave-core/src/lib/logo.component.ts b/projects/wave-core/src/lib/logo.component.ts deleted file mode 100644 index ae3592d0..00000000 --- a/projects/wave-core/src/lib/logo.component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import {Component} from '@angular/core'; - -@Component({ - selector: 'wave-vat-logo', - template: `

VAT

`, - styles: [ - ` - h1 { - background: #fff; - height: 3rem; - padding: 0.5rem; - border-radius: 3px; - margin: calc((82px - 4rem) / 2) auto; - } - - .blue { - color: #3258a1; - } - - .light-blue { - color: #3cace4; - } - - .green { - color: #8cb74c; - } - `, - ], -}) -export class VatLogoComponent {} diff --git a/projects/wave-core/src/lib/map/map-container/map-container.component.html b/projects/wave-core/src/lib/map/map-container/map-container.component.html deleted file mode 100644 index 88926088..00000000 --- a/projects/wave-core/src/lib/map/map-container/map-container.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/projects/wave-core/src/lib/map/map-container/map-container.component.scss b/projects/wave-core/src/lib/map/map-container/map-container.component.scss deleted file mode 100644 index 97530fe7..00000000 --- a/projects/wave-core/src/lib/map/map-container/map-container.component.scss +++ /dev/null @@ -1,9 +0,0 @@ -.map ::ng-deep figure { - background: black; - overflow: auto; - height: 100%; -} - -mat-grid-list { - height: 100%; -} diff --git a/projects/wave-core/src/lib/map/map-container/map-container.component.ts b/projects/wave-core/src/lib/map/map-container/map-container.component.ts deleted file mode 100644 index 02c7ce98..00000000 --- a/projects/wave-core/src/lib/map/map-container/map-container.component.ts +++ /dev/null @@ -1,654 +0,0 @@ -import {combineLatest, Observable, Subscription} from 'rxjs'; -import {first, map as rxMap} from 'rxjs/operators'; - -import { - AfterViewInit, - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - ContentChildren, - ElementRef, - Input, - OnChanges, - OnDestroy, - QueryList, - SimpleChange, - ViewChild, - ViewChildren, -} from '@angular/core'; - -import OlMap from 'ol/Map'; -import OlView from 'ol/View'; -import OlCollection from 'ol/Collection'; -import OlFeature from 'ol/Feature'; - -import OlLayerImage from 'ol/layer/Image'; -import OlLayer from 'ol/layer/Layer'; -import OlLayerTile from 'ol/layer/Tile'; -import OlLayerVector from 'ol/layer/Vector'; - -import OlSource from 'ol/source/Source'; -import OlSourceOSM from 'ol/source/OSM'; -import OlTileWmsSource from 'ol/source/TileWMS'; -import OlSourceVector from 'ol/source/Vector'; -import XYZ from 'ol/source/XYZ'; -import OlImageStatic from 'ol/source/ImageStatic'; - -import OlGeometryType from 'ol/geom/GeometryType'; -import OlGeomPoint from 'ol/geom/Point'; -import OlFormatGeoJSON from 'ol/format/GeoJSON'; - -import OlStyleFill from 'ol/style/Fill'; -import OlStyleStroke from 'ol/style/Stroke'; -import OlStyleStyle from 'ol/style/Style'; - -import OlInteractionDraw from 'ol/interaction/Draw'; -import OlInteractionSelect from 'ol/interaction/Select'; -import {SelectEvent as OlInteractionSelectEvent} from 'ol/interaction/Select'; - -import {MapLayerComponent} from '../map-layer.component'; - -import {Projection, Projections} from '../../operators/projection.model'; -import {AbstractVectorSymbology, AbstractSymbology} from '../../layers/symbology/symbology.model'; -import {Layer} from '../../layers/layer.model'; -import {LayerService} from '../../layers/layer.service'; -import {ProjectService} from '../../project/project.service'; -import {Extent, MapService} from '../map.service'; -import {Config} from '../../config.service'; -import {StyleCreator} from '../style-creator'; -import {LayoutService} from '../../layout.service'; -import {MatGridList, MatGridTile} from '@angular/material/grid-list'; - -type MapLayer = MapLayerComponent>; - -const DEFAULT_ZOOM_LEVEL = 2; -const MIN_ZOOM_LEVEL = 0; -const MAX_ZOOM_LEVEL = 28; - -/** - * The `wave-map-container` component encapsulates openLayers maps. - * It displays `wave-map-layer` components as child components, i.e., either layers on a single map or a grid of maps. - */ -@Component({ - selector: 'wave-map-container', - templateUrl: 'map-container.component.html', - styleUrls: ['map-container.component.scss'], - queries: { - contentChildren: new ContentChildren(MapLayerComponent), - }, - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class MapContainerComponent implements AfterViewInit, OnChanges, OnDestroy { - /** - * display a grid of maps or all layers on a single map - */ - @Input() grid = true; // TODO: false; - - @ViewChild(MatGridList, {read: ElementRef, static: true}) gridListElement!: ElementRef; - @ViewChildren(MatGridTile, {read: ElementRef}) mapContainers!: QueryList; - - /** - * These are the layers from the layer list (as dom elements in the template) - */ - @ContentChildren(MapLayerComponent) mapLayersRaw!: QueryList; - mapLayers: Array = []; // filtered - - numberOfRows = 1; - numberOfColumns = 1; - rowHeight = 'fit'; - - private projection$: Observable = this.projectService.getProjectionStream(); - - private maps: Array; - private view: OlView; - private backgroundLayerSource: OlSource; - private backgroundLayers: Array = []; - - private selectedOlLayer: OlLayer = undefined; - private userSelect: OlInteractionSelect; - - private drawInteractionSource: OlSourceVector; - private drawType: OlGeometryType; - private drawInteractions: Array = []; - private drawInteractionLayers: Array = []; - - private subscriptions: Array = []; - - /** - * Create the component and inject several dependencies via DI. - */ - constructor( - private config: Config, - private changeDetectorRef: ChangeDetectorRef, - private mapService: MapService, - private layerService: LayerService, - private layoutService: LayoutService, - private projectService: ProjectService, - ) { - // set dummy maps so that they are not uninitialized - this.view = new OlView({ - zoom: DEFAULT_ZOOM_LEVEL, - }); - this.maps = [ - new OlMap({ - view: this.view, - }), - ]; - } - - ngOnDestroy() { - this.subscriptions.forEach((s) => s.unsubscribe()); - } - - ngAfterViewInit() { - this.projection$.pipe(first()).subscribe((projection) => { - this.maps.forEach((map) => map.setTarget(undefined)); // initially reset all DOM bindings - - this.initOpenlayersMap(projection); - - // since all viewports are linked and there will always be the first map, we link the event only to map 0 - this.maps[0].on('moveend', (_event) => this.emitViewportSize()); - - this.initUserSelect(); - - this.subscriptions.push( - combineLatest(this.mapLayersRaw.changes, this.projection$) - .pipe(rxMap(([_changes, newProjection]) => newProjection)) - .subscribe((newProjection: Projection) => { - this.redrawLayers(newProjection); - }), - ); - }); - } - - ngOnChanges(changes: {[propertyName: string]: SimpleChange}) { - for (const propName in changes) { - if (propName === 'grid') { - this.projection$.pipe(first()).subscribe((projection) => this.redrawLayers(projection)); - } - } - } - - /** - * Notify the map that the container has resized. - */ - resize() { - setTimeout(() => this.projection$.pipe(first()).subscribe((projection) => this.redrawLayers(projection))); - } - - /** - * Increases the zoom level if it is not larger than the maximum zoom level - */ - zoomIn() { - if (this.view.getZoom() < MAX_ZOOM_LEVEL) { - this.view.adjustZoom(1); - } - } - - /** - * Decreases the zoom level if it is not smaller than the minimum zoom level - */ - zoomOut() { - if (this.view.getZoom() > MIN_ZOOM_LEVEL) { - this.view.adjustZoom(-1); - } - } - - /** - * Zoom to and focus a bounding box - */ - zoomTo(boundingBox: Extent) { - this.view.fit(boundingBox, { - nearest: true, - maxZoom: MAX_ZOOM_LEVEL, - }); - } - - /** - * Enable user input (hand drawn) for the map - */ - public startDrawInteraction(drawType: OlGeometryType) { - if (this.isDrawInteractionAttached()) { - throw new Error('only one draw interaction can be active!'); - } - - this.drawType = drawType; - this.drawInteractionSource = new OlSourceVector({wrapX: false}); - - this.reattachDrawInteractions(); - } - - /** - * Indicator if the map currently has a source for user input (hand drawn) - */ - public isDrawInteractionAttached(): boolean { - return !!this.drawInteractionSource; - } - - /** - * Disable user input (hand drawn) for the map and return the result - */ - public endDrawInteraction(): OlSourceVector { - if (!this.isDrawInteractionAttached()) { - console.error('no interaction or layer active!'); - return undefined; - } - - const source = this.drawInteractionSource; - - this.drawInteractionSource = undefined; - - this.reattachDrawInteractions(); - - return source; - } - - private createDrawInteractionLayer(): OlLayerVector { - return new OlLayerVector({ - source: this.drawInteractionSource, - }); - } - - private createDrawInteraction(): OlInteractionDraw { - return new OlInteractionDraw({ - source: this.drawInteractionSource, - type: this.drawType, - }); - } - - private reattachDrawInteractions() { - // remove layers - this.drawInteractionLayers.forEach((layer, index) => { - if (index < this.maps.length) { - this.maps[index].removeLayer(layer); - } - layer.setMap(undefined); - }); - this.drawInteractionLayers.length = 0; - - // remove interactions - this.drawInteractions.forEach((interaction, index) => { - if (index < this.maps.length) { - this.maps[index].removeInteraction(interaction); - } - interaction.setMap(undefined); - }); - this.drawInteractions.length = 0; - - // reattach - if (this.isDrawInteractionAttached()) { - this.maps.forEach((map) => { - const drawInteractionLayer = this.createDrawInteractionLayer(); - this.drawInteractionLayers.push(drawInteractionLayer); - map.addLayer(drawInteractionLayer); - - const drawInteraction = this.createDrawInteraction(); - this.drawInteractions.push(drawInteraction); - map.addInteraction(drawInteraction); - }); - } - } - - /** - * Force a redraw for each map layer - */ - public layerForcesRedraw() { - this.projection$.pipe(first()).subscribe((projection) => this.redrawLayers(projection)); - } - - private calculateGrid() { - const numberOfLayers = this.desiredNumberOfMaps(); - - const containerWidth = this.gridListElement.nativeElement.clientWidth; - const containerHeight = this.gridListElement.nativeElement.clientHeight; - const ratio = containerWidth / containerHeight; - - let rows = 1; - let columns = 1; - - // this is a heuristic of calculating the division of rows and columns for displaying the layers - while (rows * columns < numberOfLayers) { - if (columns <= rows * ratio) { - columns += 1; - } else { - rows += 1; - } - } - - while ((columns - 1) * rows >= numberOfLayers) { - // reduce unnecessary columns - columns -= 1; - } - - this.numberOfRows = columns; - this.numberOfColumns = columns; - } - - private initOpenlayersMap(projection: Projection) { - this.maps = [ - new OlMap({ - controls: [], - logo: false, - loadTilesWhileAnimating: true, // TODO: check if moved to layer - loadTilesWhileInteracting: true, // TODO: check if moved to layer - }), - ]; - this.createAndSetView(projection); - } - - private initUserSelect() { - this.userSelect = new OlInteractionSelect({ - layers: (layerCandidate: OlLayer) => layerCandidate === this.selectedOlLayer, - }); - this.userSelect.setActive(false); - - this.subscriptions.push( - this.layerService.getSelectedLayerStream().subscribe((selectedLayer) => { - // reset old selection - this.userSelect.getFeatures().forEach((feature) => feature.setStyle(undefined)); - this.userSelect.getFeatures().clear(); - - const filteredLayers = this.mapLayers.filter((mapLayer) => mapLayer.layer === selectedLayer); - this.selectedOlLayer = filteredLayers.length ? filteredLayers[0].mapLayer : undefined; - this.userSelect.setActive(!!this.selectedOlLayer); - - this.attachUserSelectToMap(); - }), - ); - - this.userSelect.on('select', (selectEvent: OlInteractionSelectEvent) => { - const selectedLayerSymbology = this.layerService.getSelectedLayer().symbology; - - if (selectedLayerSymbology instanceof AbstractVectorSymbology) { - const highlightSymbology = StyleCreator.createHighlightSymbology(selectedLayerSymbology); - const highlightStyle = StyleCreator.fromVectorSymbology(highlightSymbology); - selectEvent.selected.forEach((feature) => feature.setStyle(highlightStyle)); - } - - selectEvent.deselected.forEach((feature) => feature.setStyle(undefined)); - - this.layerService.updateSelectedFeatures( - selectEvent.selected.map((feature) => feature.getId()), - selectEvent.deselected.map((feature) => feature.getId()), - ); - }); - - this.subscriptions.push( - this.layerService.getSelectedFeaturesStream().subscribe((selectedFeatures) => { - const newSelection = new OlCollection(); - this.userSelect.getFeatures().forEach((feature) => { - if (selectedFeatures.remove && selectedFeatures.remove.contains(feature.getId())) { - newSelection.push(feature); - feature.setStyle(undefined); - } - }); - - newSelection.forEach((feature) => this.userSelect.getFeatures().remove(feature)); - - const selectedLayer = this.layerService.getSelectedLayer(); - - if (!selectedLayer || !this.selectedOlLayer) { - return; - } - - if (this.selectedOlLayer instanceof OlLayerVector) { - const highlightSymbology = StyleCreator.createHighlightSymbology(selectedLayer.symbology as AbstractVectorSymbology); - const highlightStyle = StyleCreator.fromVectorSymbology(highlightSymbology); - - this.selectedOlLayer - .getSource() - .getFeatures() - .forEach((feature) => { - if (selectedFeatures.add && selectedFeatures.add.contains(feature.getId())) { - if (this.userSelect.getFeatures().getArray().indexOf(feature) === -1) { - this.userSelect.getFeatures().push(feature); - // todo: add resolution as third parameter - feature.setStyle(highlightStyle); - } - } - }); - } - }), - ); - } - - private attachUserSelectToMap() { - if (!this.userSelect) { - // called too early - return; - } - - let map; - if (!this.selectedOlLayer) { - map = undefined; - } else if (this.maps.length === 1) { - // mono map, no choice - map = this.maps[0]; - } else { - const selectedLayerIndex = this.mapLayers.map((layer) => layer.mapLayer).indexOf(this.selectedOlLayer); - if (selectedLayerIndex >= 0) { - const inverseIndex = this.maps.length - selectedLayerIndex - 1; - map = this.maps[inverseIndex]; - } else { - map = undefined; // actually, something went wrong - } - } - - const oldMap = this.userSelect.getMap(); - if (map !== oldMap) { - if (oldMap) { - oldMap.removeInteraction(this.userSelect); - } - this.userSelect.setMap(map); - if (map) { - map.addInteraction(this.userSelect); - } - } - } - - private redrawLayers(projection: Projection) { - this.mapLayers = this.mapLayersRaw.filter((mapLayer) => mapLayer.layer.visible); - - this.calculateGrid(); - this.changeDetectorRef.detectChanges(); - - if (this.grid && this.mapLayers.length && this.mapContainers.length !== this.mapLayers.length) { - console.error('race condition!'); - } - - while (this.maps.length > this.desiredNumberOfMaps()) { - const removedMap = this.maps.pop(); - removedMap.setTarget(undefined); // remove DOM reference to map - } - while (this.maps.length < this.desiredNumberOfMaps()) { - // enlarge maps if necessary - this.maps.push( - new OlMap({ - controls: [], - logo: false, - view: this.view, - loadTilesWhileAnimating: true, // TODO: check if moved to layer - loadTilesWhileInteracting: true, // TODO: check if moved to layer - }), - ); - } - - this.mapContainers.forEach((mapContainer, i) => { - const mapTarget: HTMLElement = mapContainer.nativeElement.children[0]; - this.maps[i].setTarget(mapTarget); - this.maps[i].updateSize(); - }); - - const oldProjection = this.view ? this.view.getProjection() : undefined; - const projectionChanged = oldProjection !== projection.getOpenlayersProjection(); - - if (projectionChanged) { - this.createAndSetView(projection); - } - - if (projectionChanged || !this.backgroundLayerSource) { - this.backgroundLayerSource = this.createBackgroundLayerSource(projection); - - this.backgroundLayers.length = 0; - } - - if (this.backgroundLayers.length > this.desiredNumberOfMaps()) { - // reduce background layers if necessary - this.backgroundLayers.length = this.desiredNumberOfMaps(); - } - while (this.backgroundLayers.length < this.desiredNumberOfMaps()) { - // create background layers if necessary - this.backgroundLayers.push(this.createBackgroundLayer(projection)); - } - - this.maps.forEach((map, index) => { - map.getLayers().clear(); - map.getLayers().push(this.backgroundLayers[index]); - - if (this.grid) { - if (this.mapLayers.length) { - const inverseIndex = this.mapLayers.length - index - 1; - map.getLayers().push(this.mapLayers[inverseIndex].mapLayer); - } - } else { - this.mapLayers.forEach((layerComponent) => map.addLayer(layerComponent.mapLayer)); - } - }); - - this.reattachDrawInteractions(); - - this.attachUserSelectToMap(); - } - - private desiredNumberOfMaps(): number { - return this.grid ? Math.max(this.mapLayers.length, 1) : 1; - } - - private createAndSetView(projection: Projection) { - const zoomLevel = this.view ? this.view.getZoom() : DEFAULT_ZOOM_LEVEL; - - let newCenterPoint: OlGeomPoint; - if (this.view && this.view.getCenter()) { - const oldCenterPoint = new OlGeomPoint(this.view.getCenter()); - newCenterPoint = oldCenterPoint.transform(this.view.getProjection(), projection.getOpenlayersProjection()) as OlGeomPoint; - } else { - newCenterPoint = new OlGeomPoint([0, 0]); - } - - this.view = new OlView({ - projection: projection.getOpenlayersProjection(), - center: newCenterPoint.getCoordinates(), - minZoom: MIN_ZOOM_LEVEL, - maxZoom: MAX_ZOOM_LEVEL, - zoom: zoomLevel, - enableRotation: false, - constrainResolution: true, // no intermediate zoom levels - multiWorld: true, - }); - this.maps.forEach((map) => map.setView(this.view)); - - this.emitViewportSize(); - - // get resolution changes - this.view.on('change:resolution', () => { - // remove selected features on resolution change - this.layerService.updateSelectedFeatures([], this.layerService.getSelectedFeatures().selected.toArray()); - }); - } - - private emitViewportSize() { - this.mapService.setViewportSize({ - extent: this.view.calculateExtent(this.maps[0].getSize()), - resolution: this.view.getResolution(), - maxExtent: this.view.getProjection().getExtent(), - }); - } - - private createBackgroundLayer(projection: Projection): OlLayerImage { - switch (this.config.MAP.BACKGROUND_LAYER) { - case 'OSM': - if (projection === Projections.WEB_MERCATOR) { - return new OlLayerTile({ - source: this.backgroundLayerSource, - wrapX: false, - }); - } else { - return new OlLayerImage({ - // placeholder image - source: this.backgroundLayerSource, - }); - } - case 'countries': // eslint-disable-line no-fallthrough, , - return new OlLayerVector({ - source: this.backgroundLayerSource, - style: (feature: OlFeature, _resolution: number): OlStyleStyle => { - if (feature.getId() === 'BACKGROUND') { - return new OlStyleStyle({ - fill: new OlStyleFill({ - color: '#ADD8E6', - }), - }); - } else { - return new OlStyleStyle({ - stroke: new OlStyleStroke({ - color: 'rgba(0, 0, 0, 1)', - width: 1, - }), - fill: new OlStyleFill({ - color: 'rgba(210, 180, 140, 1)', - }), - }); - } - }, - }); - case 'hosted': - return new OlLayerTile({ - source: this.backgroundLayerSource, - }); - case 'XYZ': - return new OlLayerTile({ - source: this.backgroundLayerSource, - }); - default: - throw Error('Unknown Background Layer Name'); - } - } - - private createBackgroundLayerSource(projection: Projection): OlSource { - switch (this.config.MAP.BACKGROUND_LAYER) { - case 'OSM': - if (projection === Projections.WEB_MERCATOR) { - return new OlSourceOSM(); - } else { - return new OlImageStatic({ - imageExtent: [0, 0, 0, 0], - }); - } - case 'countries': // eslint-disable-line no-fallthrough - return new OlSourceVector({ - url: 'assets/countries.geo.json', - format: new OlFormatGeoJSON(), - }); - case 'hosted': - return new OlTileWmsSource({ - url: this.config.MAP.HOSTED_BACKGROUND_SERVICE, - params: { - layers: this.config.MAP.HOSTED_BACKGROUND_LAYER_NAME, - projection: projection.getCode(), - version: this.config.MAP.HOSTED_BACKGROUND_SERVICE_VERSION, - }, - wrapX: false, - projection: projection.getCode(), - crossOrigin: 'anonymous', - }); - case 'XYZ': - return new XYZ({ - url: this.config.MAP.BACKGROUND_LAYER_URL, - wrapX: false, - projection: projection.getCode(), - }); - default: - throw Error('Unknown Background Layer Name'); - } - } -} diff --git a/projects/wave-core/src/lib/map/map-layer.component.ts b/projects/wave-core/src/lib/map/map-layer.component.ts deleted file mode 100644 index 501396d1..00000000 --- a/projects/wave-core/src/lib/map/map-layer.component.ts +++ /dev/null @@ -1,330 +0,0 @@ -import {ChangeDetectionStrategy, Component, Directive, EventEmitter, Input, OnDestroy, OnInit, Output} from '@angular/core'; -import {Subscription} from 'rxjs'; - -import {Layer as OlLayer, Tile as OlLayerTile, Vector as OlLayerVector} from 'ol/layer'; -import {Source as OlSource, Tile as OlTileSource, TileWMS as OlTileWmsSource, Vector as OlVectorSource} from 'ol/source'; - -import {AbstractSymbology, AbstractVectorSymbology, MappingRasterSymbology} from '../layers/symbology/symbology.model'; - -import {StyleCreator} from './style-creator'; -import {Layer, LayerChanges, RasterData, RasterLayer, VectorData, VectorLayer} from '../layers/layer.model'; -import {MappingQueryService} from '../queries/mapping-query.service'; -import {Config} from '../config.service'; -import {ProjectService} from '../project/project.service'; -import {LoadingState} from '../project/loading-state.model'; -import {Time} from '../time/time.model'; -import {Projection} from '../operators/projection.model'; - -/** - * The `ol-layer` component represents a single layer object of open layers. - */ -@Directive() -// eslint-disable-next-line @angular-eslint/directive-class-suffix -export abstract class MapLayerComponent
    > { - /** - * A raster or vector layer - */ - @Input() layer: L; - - /** - * Event emitter that forces a redraw of the map. - * Must be connected to the map component. - */ - @Output() mapRedraw = new EventEmitter(); - - protected source: OS; - protected _mapLayer: OL; - - /** - * Setup of DI - */ - protected constructor(protected projectService: ProjectService) {} - - /** - * Return the open layers layer element that displays our layer type - */ - get mapLayer(): OL { - return this._mapLayer; - } - - /** - * Return the extent of the layer in map units - */ - abstract getExtent(): [number, number, number, number]; -} - -/** - * The vector layer abstraction for a map layer - */ -@Directive() -export abstract class OlVectorLayerComponent - extends MapLayerComponent> - implements OnInit, OnDestroy { - private dataSubscription: Subscription; - private layerChangesSubscription: Subscription; - - protected constructor(protected projectService: ProjectService) { - super(projectService); - this.source = new OlVectorSource({wrapX: false}); - this._mapLayer = new OlLayerVector({ - source: this.source, - updateWhileAnimating: true, - }); - } - - ngOnInit() { - this.dataSubscription = this.projectService.getLayerDataStream(this.layer).subscribe((x: VectorData) => { - this.source.clear(); // TODO: check if this is needed always... - if (!(x === null || x === undefined)) { - this.source.addFeatures(x.data); - } - this.updateOlLayer({symbology: this.layer.symbology}); // FIXME: HACK until data is a part of a layer - }); - - this.layerChangesSubscription = this.projectService - .getLayerChangesStream(this.layer) - .subscribe((changes: LayerChanges) => { - this.updateOlLayer(changes); - }); - } - - ngOnDestroy() { - if (this.dataSubscription) { - this.dataSubscription.unsubscribe(); - } - if (this.layerChangesSubscription) { - this.layerChangesSubscription.unsubscribe(); - } - } - - getExtent() { - return this.source.getExtent(); - } - - private updateOlLayer(changes: LayerChanges) { - if (changes.visible !== undefined) { - this.mapLayer.setVisible(this.layer.visible); - this.mapRedraw.emit(); - } - - if (changes.symbology) { - const style = StyleCreator.fromVectorSymbology(this.layer.symbology); - this.mapLayer.setStyle(style); - } - } -} - -/** - * This component reflects a point layer on the map - */ -@Component({ - selector: 'wave-ol-point-layer', - template: '', - providers: [{provide: MapLayerComponent, useExisting: OlPointLayerComponent}], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class OlPointLayerComponent extends OlVectorLayerComponent implements OnInit, OnDestroy { - constructor(protected projectService: ProjectService) { - super(projectService); - } -} - -/** - * This component reflects a point line on the map - */ -@Component({ - selector: 'wave-ol-line-layer', - template: '', - providers: [{provide: MapLayerComponent, useExisting: OlLineLayerComponent}], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class OlLineLayerComponent extends OlVectorLayerComponent implements OnInit, OnDestroy { - constructor(protected projectService: ProjectService) { - super(projectService); - } -} - -/** - * This component reflects a polygon layer on the map - */ -@Component({ - selector: 'wave-ol-polygon-layer', - template: '', - providers: [{provide: MapLayerComponent, useExisting: OlPolygonLayerComponent}], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class OlPolygonLayerComponent extends OlVectorLayerComponent implements OnInit, OnDestroy { - constructor(protected projectService: ProjectService) { - super(projectService); - } -} - -/** - * This component reflects a raster layer on the map - */ -@Component({ - selector: 'wave-ol-raster-layer', - template: '', - providers: [{provide: MapLayerComponent, useExisting: OlRasterLayerComponent}], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class OlRasterLayerComponent - extends MapLayerComponent> - implements OnInit, OnDestroy { - private dataSubscription: Subscription; - private layerChangesSubscription: Subscription; - private timeSubscription: Subscription; - - private projection: Projection; - private time: Time; - - constructor(protected projectService: ProjectService, protected mappingQueryService: MappingQueryService, private config: Config) { - super(projectService); - } - - ngOnInit() { - this.dataSubscription = this.projectService.getLayerDataStream(this.layer).subscribe((rasterData: RasterData) => { - if (!rasterData) { - return; - } - - this.updateTime(rasterData.time); - this.updateProjection(rasterData.projection); - - if (!this.source) { - this.initializeOrReplaceOlSource(); - } - - if (this.config.MAP.REFRESH_LAYERS_ON_CHANGE) { - this.source.refresh(); - } - }); - - this.layerChangesSubscription = this.projectService - .getLayerChangesStream(this.layer) - .subscribe((changes: LayerChanges) => { - this.updateOlLayer(changes); - if (this.config.MAP.REFRESH_LAYERS_ON_CHANGE) { - this.source.refresh(); - } - }); - } - - ngOnDestroy() { - if (this.dataSubscription) { - this.dataSubscription.unsubscribe(); - } - if (this.layerChangesSubscription) { - this.layerChangesSubscription.unsubscribe(); - } - if (this.timeSubscription) { - this.timeSubscription.unsubscribe(); - } - } - - private updateOlLayer(changes: LayerChanges) { - if (this.source === undefined || this._mapLayer === undefined) { - return; - } - - if (changes.visible !== undefined) { - this._mapLayer.setVisible(this.layer.visible); - this.mapRedraw.emit(); - } - if (changes.symbology !== undefined) { - this._mapLayer.setOpacity(this.layer.symbology.opacity); - this.source.updateParams({ - colors: this.layer.symbology.mappingColorizerRequestString(), - }); - } - if (changes.operator !== undefined) { - this.initializeOrReplaceOlSource(); - } - } - - private updateProjection(p: Projection) { - if (!this.projection || this.source.getProjection().getCode() !== this.projection.getCode()) { - this.projection = p; - this.updateOlLayerProjection(); - } - } - - private updateOlLayerProjection() { - // there is no way to change the projection of a layer. // TODO: check newer OL versions for this - this.initializeOrReplaceOlSource(); - } - - private updateOlLayerTime() { - if (this.source) { - this.source.updateParams({ - time: this.time.asRequestString(), - colors: this.layer.symbology.mappingColorizerRequestString(), - }); - } - } - - private updateTime(t: Time) { - if (this.time === undefined || !t.isSame(this.time)) { - this.time = t; - this.updateOlLayerTime(); - } - } - - private initializeOrReplaceOlSource() { - this.source = new OlTileWmsSource({ - url: this.createWmsQueryUrl(), - params: { - time: this.time.asRequestString(), - colors: this.layer.symbology.mappingColorizerRequestString(), - }, - projection: this.projection.getCode(), - wrapX: false, - }); - - this.addStateListenersToOlSource(); - this.initializeOrUpdateOlMapLayer(); - } - - private createWmsQueryUrl(): string { - return this.mappingQueryService.getWMSQueryUrl({ - operator: this.layer.operator, - time: this.time, - projection: this.projection, - }); - } - - private initializeOrUpdateOlMapLayer() { - if (this._mapLayer) { - this._mapLayer.setSource(this.source); - } else { - this._mapLayer = new OlLayerTile({ - source: this.source, - opacity: this.layer.symbology.opacity, - }); - } - } - - private addStateListenersToOlSource() { - // TILE LOADING STATE - let tilesPending = 0; - - this.source.on('tileloadstart', () => { - tilesPending++; - this.projectService.changeRasterLayerDataStatus(this.layer, LoadingState.LOADING); - }); - this.source.on('tileloadend', () => { - tilesPending--; - if (tilesPending <= 0) { - this.projectService.changeRasterLayerDataStatus(this.layer, LoadingState.OK); - } - }); - this.source.on('tileloaderror', () => { - tilesPending--; - this.projectService.changeRasterLayerDataStatus(this.layer, LoadingState.ERROR); - }); - } - - getExtent() { - return this._mapLayer.getExtent(); - } -} diff --git a/projects/wave-core/src/lib/map/map.service.ts b/projects/wave-core/src/lib/map/map.service.ts deleted file mode 100644 index 40806fba..00000000 --- a/projects/wave-core/src/lib/map/map.service.ts +++ /dev/null @@ -1,153 +0,0 @@ -import {distinctUntilChanged} from 'rxjs/operators'; -import {BehaviorSubject, Observable} from 'rxjs'; - -import {Injectable} from '@angular/core'; -import {Extent as OlExtent} from 'ol'; -import {containsExtent as olExtentContainsExtent, getIntersection as olExtentGetIntersection} from 'ol/extent'; -import {GeometryType as OlGeometryType} from 'ol/geom'; -import {Vector as OlSourceVector} from 'ol/source'; - -import {MapContainerComponent} from './map-container/map-container.component'; - -/** - * The viewport combines… - * * the extent in map units, - * * the resolution in pixels per map unit and - * * the (optional) maximum allowed extent - */ -export interface ViewportSize { - extent: Extent; - resolution: number; - maxExtent?: [number, number, number, number]; -} - -/** - * The extent is defined as [min x, min y, max x, max y] map units - */ -export type Extent = [number, number, number, number] | OlExtent; - -/** - * The map service provides means to work with a registered map component. - */ -@Injectable() -export class MapService { - private viewportSize$ = new BehaviorSubject({ - extent: [0, 0, 0, 0], - resolution: 1, - }); - - private mapComponent: MapContainerComponent; - private isGridStream = new BehaviorSubject(false); - - constructor() {} - - /** - * Returns events that indicate if the map is in grid or default mode - */ - public get isGrid$(): Observable { - return this.isGridStream; - } - - /** - * Define if the map is in grid mode (one layer per tile) or if it displays - * all layers on one tile. - */ - public setGrid(isGrid: boolean) { - this.isGridStream.next(isGrid); - } - - /** - * This service only works if a map component is registered here upfront. - */ - public registerMapComponent(mapComponent: MapContainerComponent) { - this.mapComponent = mapComponent; - } - - public startDrawInteraction(drawType: OlGeometryType) { - if (!this.mapComponent) { - throw new Error('no MapComponent registered'); - } - this.mapComponent.startDrawInteraction(drawType); - } - - /** - * Returns whether the map currently has a draw interaction - */ - // TODO: decide to use or loose it - public isDrawInteractionAttached(): boolean { - return this.mapComponent.isDrawInteractionAttached(); - } - - /** - * Stops a draw interaction on the map and returns the output vector as result - */ - public endDrawInteraction(): OlSourceVector { - if (!this.mapComponent) { - throw new Error('no MapComponent registered'); - } - return this.mapComponent.endDrawInteraction(); - } - - /** - * Changes the viewport of the map - */ - setViewportSize(newViewportSize: ViewportSize) { - if (newViewportSize.extent.length !== 4 || newViewportSize.resolution <= 0) { - throw Error('Corrupt Viewport Size'); - } - - const oldViewportSize = this.viewportSize$.value; - - if (resolutionChanged(oldViewportSize, newViewportSize) || !extentContains(oldViewportSize, newViewportSize)) { - // TODO: buffer extent to query more data - // ol.extent.buffer(newViewportSize.extent, Math.max(w, h) * 0.5); - let newExtent = newViewportSize.extent; - - if (newViewportSize.maxExtent) { - newExtent = olExtentGetIntersection(newExtent, newViewportSize.maxExtent); - } - - newViewportSize.extent = newExtent; - - this.viewportSize$.next(newViewportSize); - } - } - - /** - * Returns the current viewport of the map - */ - getViewportSize(): ViewportSize { - return this.viewportSize$.value; - } - - /** - * Returns events that indicate the viewport upon changes of the map - * Initially emits the current viewport - */ - getViewportSizeStream(): Observable { - return this.viewportSize$.pipe(distinctUntilChanged()); - } - - /** - * Trigger a zoom event at the map to an extent - */ - zoomTo(boundingBox: Extent) { - this.mapComponent.zoomTo(boundingBox); - } -} - -/** - * Is the extent of `vps1` contained in the extent of `vps2`? - */ -function extentContains(vps1: ViewportSize, vps2: ViewportSize): boolean { - const e1 = vps1.maxExtent ? olExtentGetIntersection(vps1.extent, vps1.maxExtent) : vps1.extent; - const e2 = vps2.maxExtent ? olExtentGetIntersection(vps2.extent, vps2.maxExtent) : vps2.extent; - return olExtentContainsExtent(e1, e2); -} - -/** - * Checks for equality of the resolution component of two `ViewportSize`s - */ -function resolutionChanged(vps1: ViewportSize, vps2: ViewportSize): boolean { - return vps1.resolution !== vps2.resolution; -} diff --git a/projects/wave-core/src/lib/map/style-creator.ts b/projects/wave-core/src/lib/map/style-creator.ts deleted file mode 100644 index b3c6d485..00000000 --- a/projects/wave-core/src/lib/map/style-creator.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { - Circle as OlStyleCircle, - Fill as OlStyleFill, - Stroke as OlStyleStroke, - Style as OlStyle, - StyleFunction as OlStyleFunction, - Text as OlStyleText, -} from 'ol/style'; - -import {Feature as OlFeature} from 'ol'; - -import { - AbstractVectorSymbology, - DEFAULT_VECTOR_HIGHLIGHT_FILL_COLOR, - DEFAULT_VECTOR_HIGHLIGHT_STROKE_COLOR, - MAX_ALLOWED_POINT_RADIUS, - MAX_ALLOWED_TEXT_LENGTH, - MIN_ALLOWED_POINT_RADIUS, - PointSymbology, - SymbologyType, - VectorSymbology, -} from '../layers/symbology/symbology.model'; - -/** - * The StyleCreator genreates OpenLayers styles from a layers Symbology. - */ -export class StyleCreator { - /** - * Generate a style from a vector layer symbology. - */ - public static fromVectorSymbology(sym: AbstractVectorSymbology): OlStyleFunction | OlStyle { - switch (sym.getSymbologyType()) { - case SymbologyType.SIMPLE_POINT: - case SymbologyType.CLUSTERED_POINT: - case SymbologyType.COMPLEX_POINT: - return StyleCreator.fromComplexPointSymbology(sym as PointSymbology); - - case SymbologyType.SIMPLE_LINE: - case SymbologyType.COMPLEX_LINE: - return StyleCreator.fromComplexVectorSymbology(sym as VectorSymbology); - - case SymbologyType.SIMPLE_VECTOR: - case SymbologyType.COMPLEX_VECTOR: - return StyleCreator.fromComplexVectorSymbology(sym as VectorSymbology); - - default: - console.error('StyleCreator: unknown AbstractSymbology: ' + sym.getSymbologyType()); - return StyleCreator.fromComplexVectorSymbology(sym as VectorSymbology); // VectorSymbology should handle all types - } - } - - /** - * Handles radius attribute values and converts them to valid radius. - */ - static handleRadiusAttributeValue(radius: number | string, radiusScale: number = 1.0): number | undefined { - const numberRadius = typeof radius === 'string' ? parseFloat(radius) : radius; - if (radius === undefined || radius === null) { - return undefined; - } - if (numberRadius > MAX_ALLOWED_POINT_RADIUS) { - return MAX_ALLOWED_POINT_RADIUS; - } else if (numberRadius < MIN_ALLOWED_POINT_RADIUS) { - return MIN_ALLOWED_POINT_RADIUS; - } else { - return Math.trunc(numberRadius * radiusScale); - } - } - - /** - * Handles text attribute values and converts them to a string or number for display. - */ - static handleTextAttributeValue(text: string | number): string | number | undefined { - if (text === undefined || text === null) { - return undefined; - } - if (typeof text === 'string') { - return text.slice(0, MAX_ALLOWED_TEXT_LENGTH); - } - return text; - } - - /** - * Warps a Symbology into a highlighted Symbology. - */ - static createHighlightSymbology(sym: S): S { - const highlightSymbology: S = sym.clone() as S; - highlightSymbology.fillRGBA = DEFAULT_VECTOR_HIGHLIGHT_FILL_COLOR; - highlightSymbology.strokeRGBA = DEFAULT_VECTOR_HIGHLIGHT_STROKE_COLOR; - return highlightSymbology; - } - - /** - * Generate a style key (string) for a feature. - */ - static buildStyleKey( - featureFillColorValue: string | number | undefined, - featureStrokeColorValue: string | number | undefined, - featureTextValue: string | number | undefined, - featureRadiusValue: string | number | undefined, - ): string { - const VALUE_SEPARATOR_SYMBOL = ':::'; - return ( - `${featureFillColorValue}${VALUE_SEPARATOR_SYMBOL}${featureStrokeColorValue}${VALUE_SEPARATOR_SYMBOL}` + - `${featureTextValue}${VALUE_SEPARATOR_SYMBOL}${featureRadiusValue}` - ); - } - - /** - * Generate an OpenLayers style function for vector layers. - */ - static fromComplexVectorSymbology(sym: VectorSymbology): OlStyleFunction { - // we need a style cache to speed things up. This dangles in the void of the GC... - const styleCache: {[key: string]: OlStyle} = {}; - - return (feature: OlFeature, resolution: number) => { - const featureFillColorValue = - sym.fillColorAttribute && sym.describesElementFill() ? feature.get(sym.fillColorAttribute) : undefined; - const featureStrokeColorValue = sym.strokeColorAttribute ? feature.get(sym.strokeColorAttribute) : undefined; - const featureTextValue = sym.textAttribute ? StyleCreator.handleTextAttributeValue(feature.get(sym.textAttribute)) : undefined; - const styleKey = StyleCreator.buildStyleKey(featureFillColorValue, featureStrokeColorValue, featureTextValue, undefined); - - if (!styleCache[styleKey]) { - const fillColorBreakpointLookup = sym.fillColorizer.getBreakpointForValue(featureFillColorValue, true); - const fillColor = fillColorBreakpointLookup ? fillColorBreakpointLookup.rgba.rgbaTuple() : sym.fillRGBA.rgbaTuple(); - - const strokeColorBreakpointLookup = sym.strokeColorizer.getBreakpointForValue(featureStrokeColorValue, true); - const strokeColor = strokeColorBreakpointLookup ? strokeColorBreakpointLookup.rgba.rgbaTuple() : sym.strokeRGBA.rgbaTuple(); - - const fillStyle = new OlStyleFill({color: fillColor}); - const strokeStyle = new OlStyleStroke({color: strokeColor, width: sym.strokeWidth}); - - if (sym.strokeDashStyle && sym.strokeDashStyle.length > 1) { - strokeStyle.setLineDash(sym.strokeDashStyle); - } - - // only build the text style if we are going to show it - const textStyle = !featureTextValue - ? undefined - : new OlStyleText({ - text: featureTextValue.toString(), - fill: new OlStyleFill({ - color: sym.textColor.rgbaTuple(), - }), - stroke: new OlStyleStroke({ - color: sym.strokeRGBA.rgbaTuple(), - width: sym.textStrokeWidth, - }), - overflow: true, - }); - - const style = new OlStyle({ - stroke: strokeStyle, - fill: fillStyle, - text: textStyle, - }); - styleCache[styleKey] = style; - } - - return styleCache[styleKey]; - }; - } - - /** - * Generate an OpenLayers style function for point layers. - */ - static fromComplexPointSymbology(sym: PointSymbology): OlStyleFunction { - // we need a style cache to speed things up. This dangles in the void of the GC... - const styleCache: {[key: string]: OlStyle} = {}; - - return (feature: OlFeature, resolution: number) => { - const featureFillColorValue = - sym.fillColorAttribute && sym.describesElementFill() ? feature.get(sym.fillColorAttribute) : undefined; - const featureStrokeColorValue = sym.strokeColorAttribute ? feature.get(sym.strokeColorAttribute) : undefined; - const featureTextValue = sym.textAttribute ? StyleCreator.handleTextAttributeValue(feature.get(sym.textAttribute)) : undefined; - const featureRadiusValue = sym.radiusAttribute - ? StyleCreator.handleRadiusAttributeValue(feature.get(sym.radiusAttribute)) - : undefined; - - const styleKey = StyleCreator.buildStyleKey( - featureFillColorValue, - featureStrokeColorValue, - featureTextValue, - featureRadiusValue, - ); - - if (!styleCache[styleKey]) { - const fillColorBreakpointLookup = sym.fillColorizer.getBreakpointForValue(featureFillColorValue, true); - const fillColor = fillColorBreakpointLookup ? fillColorBreakpointLookup.rgba.rgbaTuple() : sym.fillRGBA.rgbaTuple(); - - const strokeColorBreakpointLookup = sym.strokeColorizer.getBreakpointForValue(featureStrokeColorValue, true); - const strokeColor = strokeColorBreakpointLookup ? strokeColorBreakpointLookup.rgba.rgbaTuple() : sym.strokeRGBA.rgbaTuple(); - - const fillStyle = new OlStyleFill({color: fillColor}); - const strokeStyle = new OlStyleStroke({color: strokeColor, width: sym.strokeWidth}); - - if (sym.strokeDashStyle && sym.strokeDashStyle.length > 1) { - strokeStyle.setLineDash(sym.strokeDashStyle); - } - - const radius = featureRadiusValue ? featureRadiusValue : sym.radius; - - const imageStyle = new OlStyleCircle({ - radius, - fill: fillStyle, - stroke: strokeStyle, - }); - - // only build the text style if we are going to show it - const textStyle = !featureTextValue - ? undefined - : new OlStyleText({ - text: featureTextValue.toString(), - fill: new OlStyleFill({ - color: sym.textColor.rgbaTuple(), - }), - stroke: new OlStyleStroke({ - color: sym.strokeRGBA.rgbaTuple(), - width: sym.textStrokeWidth, - }), - }); - - const style = new OlStyle({ - image: imageStyle, - text: textStyle, - }); - styleCache[styleKey] = style; - } - - return styleCache[styleKey]; - }; - } -} diff --git a/projects/wave-core/src/lib/map/zoom-handles/zoom-handles.component.html b/projects/wave-core/src/lib/map/zoom-handles/zoom-handles.component.html deleted file mode 100644 index ad5fa13d..00000000 --- a/projects/wave-core/src/lib/map/zoom-handles/zoom-handles.component.html +++ /dev/null @@ -1,8 +0,0 @@ -
    - - -
    diff --git a/projects/wave-core/src/lib/map/zoom-handles/zoom-handles.component.scss b/projects/wave-core/src/lib/map/zoom-handles/zoom-handles.component.scss deleted file mode 100644 index 6cb8a667..00000000 --- a/projects/wave-core/src/lib/map/zoom-handles/zoom-handles.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -.container { - padding: 2px 2px; -} diff --git a/projects/wave-core/src/lib/map/zoom-handles/zoom-handles.component.ts b/projects/wave-core/src/lib/map/zoom-handles/zoom-handles.component.ts deleted file mode 100644 index 2279f2fe..00000000 --- a/projects/wave-core/src/lib/map/zoom-handles/zoom-handles.component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {ChangeDetectionStrategy, Component, EventEmitter, OnInit, Output} from '@angular/core'; - -@Component({ - selector: 'wave-zoom-handles', - templateUrl: './zoom-handles.component.html', - styleUrls: ['./zoom-handles.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ZoomHandlesComponent implements OnInit { - @Output() zoomIn = new EventEmitter(); - - @Output() zoomOut = new EventEmitter(); - - constructor() {} - - ngOnInit() {} -} diff --git a/projects/wave-core/src/lib/notification.service.ts b/projects/wave-core/src/lib/notification.service.ts deleted file mode 100644 index 829ca150..00000000 --- a/projects/wave-core/src/lib/notification.service.ts +++ /dev/null @@ -1,44 +0,0 @@ -import {Injectable} from '@angular/core'; -import {Subject, Observable} from 'rxjs'; -import {MatSnackBar} from '@angular/material/snack-bar'; - -export enum NotificationType { - Info, - Error, -} - -interface Notification { - type: NotificationType; - message: string; -} - -@Injectable() -export class NotificationService { - private notification$ = new Subject(); - - constructor(private snackBar: MatSnackBar) {} - - getNotificationStream(): Observable { - return this.notification$; - } - - info(message: string) { - this.notification$.next({ - type: NotificationType.Info, - message: message, - }); - this.snackBar.open(message, undefined, { - duration: 3000, - }); - } - - error(message: string) { - this.notification$.next({ - type: NotificationType.Error, - message: message, - }); - this.snackBar.open(message, undefined, { - duration: 5000, - }); - } -} diff --git a/projects/wave-core/src/lib/operators/datatype.model.ts b/projects/wave-core/src/lib/operators/datatype.model.ts deleted file mode 100644 index 1e1bc554..00000000 --- a/projects/wave-core/src/lib/operators/datatype.model.ts +++ /dev/null @@ -1,217 +0,0 @@ -/** - * A class about a data type. - */ -export abstract class DataType { - /** - * Create a human readable output of the data type. - * @returns The name. - */ - abstract toString(): string; - - /** - * @return The name of the projection. - */ - abstract getCode(): string; - - /** - * @return the largest value. - */ - abstract getMin(): number; - - /** - * @return the smallest value. - */ - abstract getMax(): number; -} - -class Byte extends DataType { - toString(): string { - return 'Byte'; - } - - getCode(): string { - return 'Byte'; - } - - getMin(): number { - return 0; - } - - getMax(): number { - return 255; - } -} - -class Int16 extends DataType { - toString(): string { - return 'Int 16'; - } - - getCode(): string { - return 'Int16'; - } - - getMin(): number { - return -32768; - } - - getMax(): number { - return 32767; - } -} - -class UInt16 extends DataType { - toString(): string { - return 'Unsigned Int 16'; - } - - getCode(): string { - return 'UInt16'; - } - - getMin(): number { - return 0; - } - - getMax(): number { - return 65535; - } -} - -class Int32 extends DataType { - toString(): string { - return 'Int 32'; - } - - getCode(): string { - return 'Int32'; - } - - getMin(): number { - return -2147483648; - } - - getMax(): number { - return 2147483647; - } -} - -class UInt32 extends DataType { - toString(): string { - return 'Unsigned Int 32'; - } - - getCode(): string { - return 'UInt32'; - } - - getMin(): number { - return 0; - } - - getMax(): number { - return 4294967295; - } -} - -class Float32 extends DataType { - toString(): string { - return 'Float 32'; - } - - getCode(): string { - return 'Float32'; - } - - getMin(): number { - return Number.POSITIVE_INFINITY; - } - - getMax(): number { - return Number.NEGATIVE_INFINITY; - } -} - -class Float64 extends DataType { - toString(): string { - return 'Float 64'; - } - - getCode(): string { - return 'Float64'; - } - - getMin(): number { - return Number.POSITIVE_INFINITY; - } - - getMax(): number { - return Number.NEGATIVE_INFINITY; - } -} - -class Alphanumeric extends DataType { - toString(): string { - return 'String'; - } - - getCode(): string { - return 'Alphanumeric'; - } - - getMin(): number { - return undefined; - } - - getMax(): number { - return undefined; - } -} - -export class DataTypeCollection { - static readonly INSTANCE = new DataTypeCollection(); - - /* eslint-disable @typescript-eslint/naming-convention,no-underscore-dangle,id-blacklist,id-match */ - Byte: DataType = new Byte(); - Int16: DataType = new Int16(); - UInt16: DataType = new UInt16(); - Int32: DataType = new Int32(); - UInt32: DataType = new UInt32(); - Float32: DataType = new Float32(); - Float64: DataType = new Float64(); - Alphanumeric: DataType = new Alphanumeric(); - /* eslint-enable */ - - ALL_DATATYPES: Array; - ALL_NUMERICS: Array; - - protected constructor() { - this.ALL_DATATYPES = [this.Byte, this.Int16, this.UInt16, this.Int32, this.UInt32, this.Float32, this.Float64, this.Alphanumeric]; - this.ALL_NUMERICS = [this.Byte, this.Int16, this.UInt16, this.Int32, this.UInt32, this.Float32, this.Float64]; - } - - fromCode(code: string) { - switch (code) { - case this.Byte.getCode(): - return this.Byte; - case this.Int16.getCode(): - return this.Int16; - case this.UInt16.getCode(): - return this.UInt16; - case this.Int32.getCode(): - return this.Int32; - case this.UInt32.getCode(): - return this.UInt32; - case this.Float32.getCode(): - return this.Float32; - case this.Float64.getCode(): - return this.Float64; - case this.Alphanumeric.getCode(): - return this.Alphanumeric; - default: - throw new Error(`Invalid Data Type: ${code}`); - } - } -} - -export const DataTypes = DataTypeCollection.INSTANCE; // eslint-disable-line @typescript-eslint/naming-convention, no-underscore-dangle, id-blacklist, id-match diff --git a/projects/wave-core/src/lib/operators/dialogs/baskets/gfbio-basket-result.component.ts b/projects/wave-core/src/lib/operators/dialogs/baskets/gfbio-basket-result.component.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/operators/dialogs/box-plot-operator/box-plot-operator.component.html b/projects/wave-core/src/lib/operators/dialogs/box-plot-operator/box-plot-operator.component.html deleted file mode 100644 index 1a572d11..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/box-plot-operator/box-plot-operator.component.html +++ /dev/null @@ -1,91 +0,0 @@ -Box plot -
    -
    - - - There must be at least one numerical attribute in this layer. - - -
    -
    -
    - -
    - - -
    -
    -
    - - - {{ attribute }} - - - -
    -
    -
    - - - Notch -
    - Mean value -
    - - - - - - - The name must be non-empty. - - -
    -
    -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/box-plot-operator/box-plot-operator.component.scss b/projects/wave-core/src/lib/operators/dialogs/box-plot-operator/box-plot-operator.component.scss deleted file mode 100644 index a0f82faf..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/box-plot-operator/box-plot-operator.component.scss +++ /dev/null @@ -1,13 +0,0 @@ -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} -.container { - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} -.actions { - text-align: right; - padding: 1rem; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/box-plot-operator/box-plot-operator.component.ts b/projects/wave-core/src/lib/operators/dialogs/box-plot-operator/box-plot-operator.component.ts deleted file mode 100644 index 748f807e..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/box-plot-operator/box-plot-operator.component.ts +++ /dev/null @@ -1,125 +0,0 @@ -import {AfterViewInit, ChangeDetectionStrategy, Component, OnInit, OnDestroy} from '@angular/core'; -import {AbstractControl, FormBuilder, FormGroup, ValidatorFn, Validators} from '@angular/forms'; -import {ResultTypes} from '../../result-type.model'; -import {AbstractSymbology} from '../../../layers/symbology/symbology.model'; -import {Layer} from '../../../layers/layer.model'; -import {Operator} from '../../operator.model'; -import {Plot} from '../../../plots/plot.model'; -import {ProjectService} from '../../../project/project.service'; -import {WaveValidators} from '../../../util/form.validators'; -import {BoxPlotType} from '../../types/boxplot-type.model'; -import {BehaviorSubject, Subscription} from 'rxjs'; -import {DataTypes} from '../../datatype.model'; - -@Component({ - selector: 'wave-box-plot-operator', - templateUrl: './box-plot-operator.component.html', - styleUrls: ['./box-plot-operator.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class BoxPlotComponent implements OnInit, AfterViewInit, OnDestroy { - readonly ResultTypes = ResultTypes; - - form: FormGroup; - layers: Array>; - selectedLayers = new BehaviorSubject>([]); - hasNumerics = new BehaviorSubject(false); - max = 5; - - private subscriptions: Array = []; - - constructor(private formBuilder: FormBuilder, private projectService: ProjectService) {} - - ngOnInit() { - this.form = this.formBuilder.group({ - vLayer: [undefined, Validators.required], - notch: [false, Validators.required], - mean: [false, Validators.required], - range: [1.5, [Validators.required, this.nonNegative]], - name: ['', [Validators.required, WaveValidators.notOnlyWhitespace]], - }); - this.subscriptions.push( - this.form.controls['vLayer'].valueChanges.subscribe((change) => { - this.selectedLayers.next([]); - const inputOperator = change.operator as Operator; - this.hasNumerics.next(inputOperator.dataTypes.some((dataType) => DataTypes.ALL_NUMERICS.includes(dataType))); - }), - ); - } - - increase() { - const inputOperator = this.form.controls['vLayer'].value.operator as Operator; - - const [numericAttribute] = inputOperator.dataTypes.findEntry((value) => { - return DataTypes.ALL_NUMERICS.indexOf(value) >= 0; - }); - - if (numericAttribute) { - const newSelectedLayers = [...this.selectedLayers.getValue()]; - newSelectedLayers[this.selectedLayers.getValue().length] = {attr: numericAttribute}; - this.selectedLayers.next(newSelectedLayers); - } else { - this.form.controls['vLayer'].setErrors({noNumericalAttributes: true}); - } - } - - decrease() { - this.selectedLayers.next(this.selectedLayers.getValue().slice(0, this.selectedLayers.getValue().length - 1)); - } - - add() { - const sourceOperator = this.form.controls['vLayer'].value.operator; - const selectedLayers = new Array(); - for (const item of this.selectedLayers.getValue()) { - selectedLayers.push(item.attr); - } - const operator: Operator = new Operator({ - operatorType: new BoxPlotType({ - notch: this.form.controls['notch'].value, - mean: this.form.controls['mean'].value, - range: this.form.controls['range'].value, - attributes: selectedLayers, - inputType: sourceOperator.resultType, - }), - resultType: ResultTypes.PLOT, - projection: sourceOperator.projection, - pointSources: sourceOperator.resultType === ResultTypes.POINTS ? [sourceOperator] : undefined, - lineSources: sourceOperator.resultType === ResultTypes.LINES ? [sourceOperator] : undefined, - polygonSources: sourceOperator.resultType === ResultTypes.POLYGONS ? [sourceOperator] : undefined, - }); - const plot = new Plot({ - name: this.form.controls['name'].value, - operator, - }); - this.projectService.addPlot(plot); - } - - ngAfterViewInit() { - setTimeout(() => { - this.form.updateValueAndValidity({ - onlySelf: false, - emitEvent: true, - }); - this.form.controls['vLayer'].updateValueAndValidity(); - - const nameSuggestion = ' of ' + (this.form.controls['vLayer'].value ? this.form.controls['vLayer'].value.name : ''); - this.form.controls['name'].setValue('Box plot' + nameSuggestion); - }); - } - - updateAttribute(i: number, attribute: string) { - const newSelectedLayers = [...this.selectedLayers.getValue()]; - newSelectedLayers[i] = {attr: attribute}; - this.selectedLayers.next(newSelectedLayers); - } - - nonNegative(val: number): ValidatorFn { - return (control: AbstractControl): {[key: string]: any} => { - return val < 0 ? {negativeNumber: {value: control.value}} : null; - }; - } - - ngOnDestroy() { - this.subscriptions.forEach((sub) => sub.unsubscribe()); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/country-polygon-selection/country-polygon-selection.component.html b/projects/wave-core/src/lib/operators/dialogs/country-polygon-selection/country-polygon-selection.component.html deleted file mode 100644 index fd3cd552..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/country-polygon-selection/country-polygon-selection.component.html +++ /dev/null @@ -1,31 +0,0 @@ -Country Selection - - - - - - - Country Name - - - - - - Area - {{ entry[sourceAreaColumn] * 10 }} km² - - - - - - - -
    - -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/country-polygon-selection/country-polygon-selection.component.scss b/projects/wave-core/src/lib/operators/dialogs/country-polygon-selection/country-polygon-selection.component.scss deleted file mode 100644 index 6f615ced..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/country-polygon-selection/country-polygon-selection.component.scss +++ /dev/null @@ -1,25 +0,0 @@ -mat-toolbar ::ng-deep mat-toolbar-row:first-child { - display: none; -} - -p { - color: var(--wave-foreground-secondary-text-color, black); -} - -mat-row { - cursor: pointer; -} - -mat-row:hover { - background-color: var(--wave-background-hover-color, grey); -} - -mat-cell ::ng-deep .highlight { - color: var(--wave-accent-color, grey); -} - -mat-progress-spinner { - width: 25%; - height: auto; - margin: 2rem auto; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/country-polygon-selection/country-polygon-selection.component.ts b/projects/wave-core/src/lib/operators/dialogs/country-polygon-selection/country-polygon-selection.component.ts deleted file mode 100644 index 20026be3..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/country-polygon-selection/country-polygon-selection.component.ts +++ /dev/null @@ -1,228 +0,0 @@ -import {combineLatest as observableCombineLatest, ReplaySubject, Subscription, BehaviorSubject, Observable} from 'rxjs'; -import {tap, mergeMap, map} from 'rxjs/operators'; - -import {ChangeDetectionStrategy, Component, OnDestroy, OnInit} from '@angular/core'; -import {UserService} from '../../../users/user.service'; -import {Operator} from '../../operator.model'; -import {VectorData, VectorLayer} from '../../../layers/layer.model'; -import {ResultTypes} from '../../result-type.model'; -import {VectorSymbology} from '../../../layers/symbology/symbology.model'; -import {RandomColorService} from '../../../util/services/random-color.service'; -import {MatDialog} from '@angular/material/dialog'; -import {ProjectService} from '../../../project/project.service'; -import {Projection, Projections} from '../../projection.model'; -import {CSVParameters, CsvSourceType} from '../../types/csv-source-type.model'; -import {MappingQueryService} from '../../../queries/mapping-query.service'; -import {WFSOutputFormats} from '../../../queries/output-formats/wfs-output-format.model'; -import {TextualAttributeFilterEngineType, TextualAttributeFilterType} from '../../types/textual-attribute-filter-type.model'; -import {DataSource} from '@angular/cdk/table'; -import {DataType, DataTypes} from '../../datatype.model'; - -function nameComparator(a: string, b: string): number { - const stripped = (s: string): string => s.replace(' ', ''); - return stripped(a).localeCompare(stripped(b)); -} - -@Component({ - selector: 'wave-country-polygon-selection', - templateUrl: './country-polygon-selection.component.html', - styleUrls: ['./country-polygon-selection.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class CountryPolygonSelectionComponent implements OnInit, OnDestroy { - searchString$ = new BehaviorSubject(''); - filteredEntries$ = new ReplaySubject>(1); - - tableEntries: CountryDataSource; - displayedColumns: Array = ['name', 'area']; - - sourceIdColumn = 'NAME'; - sourceAreaColumn = 'AREA'; - - isLoading$ = new BehaviorSubject(true); - - /* - { - "filename": "file:///home/gfbio/data/dev/csv_source/country_borders.csv", - "on_error": "keep", - "separator": ",", - "geometry": "wkt", - "time": "none", - "columns": { - "x": "WKT", - "textual": ["FIPS", "ISO2", "ISO3", "UN", "NAME"], - "numeric": ["AREA", "POP2005", "REGION", "SUBREGION", "LON", "LAT"] - } - } - */ - - private sourceFile = 'file:///home/gfbio/data/dev/csv_source/country_borders.csv'; - private sourceParameters: CSVParameters = { - header: 0, - onError: 'keep', - fieldSeparator: ',', - geometry: 'wkt', - time: 'none', - columns: { - x: 'WKT', - textual: ['FIPS', 'ISO2', 'ISO3', 'UN', 'NAME'], - numeric: ['AREA', 'POP2005', 'REGION', 'SUBREGION', 'LON', 'LAT'], - }, - provenance: { - citation: `TM_WORLD_BORDERS-0.1.ZIP - -Provided by Bjorn Sandvik, thematicmapping.org - -Use this dataset with care, as several of the borders are disputed. - -The original shapefile (world_borders.zip, 3.2 MB) was downloaded from the Mapping Hacks website: -http://www.mappinghacks.com/data/ - -The dataset was derived by Schuyler Erle from public domain sources. -Sean Gilles did some clean up and made some enhancements.`, - uri: '', - license: 'Creative Commons Attribution-Share Alike License 3.0', - }, - }; - private sourceProjection: Projection = Projections.WGS_84; - private sourceOperator: Operator; - private subscription: Subscription; - - constructor( - private userService: UserService, - private projectService: ProjectService, - private randomColorService: RandomColorService, - private mappingQueryService: MappingQueryService, - public dialog: MatDialog, - ) {} - - ngOnInit() { - this.sourceOperator = this.createCsvSourceOperator(); - - this.subscription = observableCombineLatest( - this.getOperatorDataStream().pipe( - map((vectorData) => { - // console.log('vectorData', vectorData); - const data = vectorData.data.map((olFeature) => olFeature.getProperties() as {[k: string]: any}); - // console.log('mapped', data); - return data; - }), - ), - this.searchString$.pipe(map((searchString) => searchString.toLowerCase())), - (entries, searchString) => - entries - .filter((entry) => entry[this.sourceIdColumn].toString().toLowerCase().indexOf(searchString) >= 0) - .sort((a, b) => nameComparator(a[this.sourceIdColumn].toString(), b[this.sourceIdColumn].toString())), - ) - .pipe(tap(() => this.isLoading$.next(false))) - .subscribe((entries) => this.filteredEntries$.next(entries)); - - this.tableEntries = new CountryDataSource(this.filteredEntries$); - } - - ngOnDestroy() { - this.subscription.unsubscribe(); - } - - createCsvSourceOperator(): Operator { - const csvSourceType = new CsvSourceType({ - dataURI: this.sourceFile, - parameters: this.sourceParameters, - }); - - const dataTypes = new Map(); - const attributes = new Array(); - - for (const an of this.sourceParameters.columns.numeric) { - attributes.push(an); - dataTypes.set(an, DataTypes.Float64); // TODO: get more accurate type - } - - for (const an of this.sourceParameters.columns.textual) { - attributes.push(an); - dataTypes.set(an, DataTypes.Alphanumeric); // TODO: get more accurate type - } - - const op = new Operator({ - operatorType: csvSourceType, - resultType: ResultTypes.POLYGONS, - projection: this.sourceProjection, - attributes, - dataTypes, - }); - - return op; - } - - getOperatorDataStream(): Observable { - return this.projectService.getTimeStream().pipe( - mergeMap((t) => { - return this.mappingQueryService - .getWFSData({ - operator: this.sourceOperator, - projection: this.sourceProjection, - clusteredOption: undefined, - outputFormat: WFSOutputFormats.JSON, - viewportSize: { - extent: this.sourceProjection.getExtent(), - resolution: 1, - }, - time: t, - }) - .pipe(map((d) => VectorData.olParse(t, this.sourceProjection, this.sourceProjection.getExtent(), d))); - }), - ); - } - - createFilterOperator(key: string): Operator { - const filterOperatorType = new TextualAttributeFilterType({ - attributeName: this.sourceIdColumn, - engine: TextualAttributeFilterEngineType.EXACT, - searchString: key, - }); - - const sourceOp = this.createCsvSourceOperator(); - - return new Operator({ - operatorType: filterOperatorType, - resultType: this.sourceOperator.resultType, - projection: this.sourceOperator.projection, - polygonSources: [sourceOp], - attributes: sourceOp.attributes, - dataTypes: sourceOp.dataTypes, - }); - } - - addLayer(layerName: string, operator: Operator) { - const symbology = VectorSymbology.createSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }); - - const layer = new VectorLayer({ - name: layerName, - operator, - symbology, - }); - - this.projectService.addLayer(layer); - } -} - -interface CountryMapType { - [key: string]: string | number; -} - -class CountryDataSource extends DataSource { - private countries: Observable>; - - constructor(countries: Observable>) { - super(); - this.countries = countries; - } - - connect(): Observable> { - return this.countries; - } - - disconnect() {} -} diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-properties/csv-properties-template.component.html b/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-properties/csv-properties-template.component.html deleted file mode 100644 index 3e8324cf..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-properties/csv-properties-template.component.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - Data - -
    - - - - - - - - - -
    - - - - {{ delimiter.def }} - - - -
    - - - - - - {{ textQualifier }} - - - -
    - - - - - - - - - -
    - - - - {{ decimalSeparator }} - - - -
    - - - - - -
    -
    -
    - - Spatial - -
    -
    -
    - - - - - - {{ h.value }} - - - {{ 'unnamed' }} - - - - - -
    -
    - - - - {{ projection }} - - - -
    -
    -
    -
    - - - - - - {{ h.value }} - - - {{ 'unnamed' }} - - - - - -
    -
    - - - - {{ c }} - - - -
    -
    -
    - WKT - - - - {{ rt.toString() }} - - - -
    -
    -
    - - -
    Temporal
    -
    - -
    - The file includes temporal data. - - - - {{ intervalType.display }} - - - -
    -
    - - - - - - {{ h.value }} - - - {{ 'unnamed' }} - - - - - -
    -
    - - - - - - {{ h.value }} - - - {{ 'unnamed' }} - - - - - - - - {{ temporalProperties.controls['endFormat'].value }} - -
    -
    -
    -
    - - - - {{ timeFormat.display }} - - - -
    -
    - - - - - {{ timeFormat.display }} - - - - - {{ durationFormat.display }} - - - - -
    -
    -
    -
    - - Typing - - - - Layer - -
    - - - Name is already in use. - - - - - Skip - - - Abort - - - Keep - - -
    -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-properties/csv-properties.component.scss b/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-properties/csv-properties.component.scss deleted file mode 100644 index 43950889..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-properties/csv-properties.component.scss +++ /dev/null @@ -1,35 +0,0 @@ -$latitudeColor: #26c5ff; -$longitudeColor: orange; -$startColor: darkgreen; -$endColor: darkviolet; -$backgroundColor: var(--wave-primary-color, grey); -$titleColor: white; /*Inherit from theme here.*/ - -div.latitudeSelector mat-select ::ng-deep span.mat-select-placeholder { - color: $latitudeColor; -} - -div.longitudeSelector mat-select ::ng-deep span.mat-select-placeholder { - color: $longitudeColor; -} - -div.startSelector mat-select ::ng-deep span.mat-select-placeholder { - color: $startColor; -} - -div.endSelector mat-select ::ng-deep span.mat-select-placeholder { - color: $endColor; -} - -div.constantSelector mat-form-field ::ng-deep span.mat-input-placeholder { - color: $endColor; -} - -.custom mat-form-field ::ng-deep label.mat-input-placeholder { - color: $titleColor; - opacity: 0.75; -} - -.error { - color: var(--wave-warn-color, red); -} diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-properties/csv-properties.component.ts b/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-properties/csv-properties.component.ts deleted file mode 100644 index 2b875f38..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-properties/csv-properties.component.ts +++ /dev/null @@ -1,629 +0,0 @@ -import {Observable, BehaviorSubject, Subscription, ReplaySubject} from 'rxjs'; -import {map} from 'rxjs/operators'; - -import { - Component, - ChangeDetectionStrategy, - OnInit, - AfterViewInit, - Input, - OnDestroy, - ChangeDetectorRef, - ViewChild, - ElementRef, -} from '@angular/core'; -import {FormGroup, Validators, FormControl, ValidatorFn, AbstractControl} from '@angular/forms'; -import {IntervalFormat} from '../../interval.enum'; -import {Projection, Projections} from '../../../../projection.model'; -import {UserService} from '../../../../../users/user.service'; -import {WaveValidators} from '../../../../../util/form.validators'; -import {MatStepper} from '@angular/material/stepper'; -import {CsvPropertiesService} from '../../csv-dialog/csv.properties.service'; -import {ResultType, ResultTypes} from '../../../../result-type.model'; - -export interface DataPropertiesDict { - delimiter: string; - decimalSeparator: string; - isTextQualifier: boolean; - textQualifier: string; - isHeaderRow: boolean; - headerRow: number; -} - -export interface SpatialPropertiesDict { - xColumn: number; - yColumn: number; - spatialReferenceSystem: Projection; - coordinateFormat: string; - isWkt: boolean; - wktResultType: ResultType; -} - -export interface TemporalPropertiesDict { - intervalType: IntervalFormat; - isTime: boolean; - startColumn: number; - startFormat: string; - endColumn: number; - endFormat: string; - constantDuration: number; -} - -export interface IntervalType { - display: string; - value: IntervalFormat; - requiredColumns: number; -} - -export const INTERVAL_TYPE_SELECT_ID = 'csv_interval_select', - LAYER_NAME_INPUT_ID = 'csv_layer_name_input', - IS_TIME_TOGGLE_ID = 'csv_is_time_toggle'; - -export enum FormStatus { - DataProperties, - SpatialProperties, - TemporalProperties, - TypingProperties, - LayerProperties, - Loading, -} - -@Component({ - selector: 'wave-csv-properties', - templateUrl: './csv-properties-template.component.html', - styleUrls: ['./csv-properties.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class CsvPropertiesComponent implements OnInit, AfterViewInit, OnDestroy { - Projections = Projections; - FormStatus = FormStatus; - IntervalFormat = IntervalFormat; - INTERVAL_TYPE_SELECT_ID = INTERVAL_TYPE_SELECT_ID; - LAYER_NAME_INPUT_ID = LAYER_NAME_INPUT_ID; - IS_TIME_TOGGLE_ID = IS_TIME_TOGGLE_ID; - - isSpatialVisited = false; - - delimiters: {def: string; value: string}[] = [ - {def: 'TAB', value: '\t'}, - {def: 'COMMA', value: ','}, - {def: 'SEMICOLON', value: ';'}, - ]; - - // http://man7.org/linux/man-pages/man3/strptime.3.html - timeFormats: Array<{display: string; value: string}> = [ - {display: 'yyyy-MM-ddTHH:mm:ssZ', value: '%Y-%m-%dT%H:%M:%SZ'}, - {display: 'yyyy-MM-ddTHH:mmZ', value: '%Y-%m-%dT%H:%MZ'}, - {display: 'dd-MM-yyyy HH:mm:ss', value: '%d-%m-%Y %H:%M:%S'}, - {display: 'dd.MM.yyyy HH:mm:ss', value: '%d.%m.%Y %H:%M:%S'}, - {display: 'yyyy-MM-dd HH:mm:ssZ', value: '%Y-%m-%d %H:%M:%SZ'}, - {display: 'yyyy-MM-dd HH:mmZ', value: '%Y-%m-%d %H:%MZ'}, - {display: 'dd.MM.yyyy', value: '%d.%m.%Y'}, - {display: 'yyyy-MM-dd', value: '%Y-%m-%d'}, - ]; - durationFormats: Array<{display: string; value: string}> = [ - // {display: 'days', value: 'd'}, - // {display: 'hours', value: 'h'}, - {display: 'seconds', value: 'seconds'}, - ]; - intervalTypes: IntervalType[] = [ - {display: '[Start,+inf)', value: IntervalFormat.StartInf, requiredColumns: 1}, - {display: '[Start, End]', value: IntervalFormat.StartEnd, requiredColumns: 2}, - {display: '[Start, Start+Duration]', value: IntervalFormat.StartDur, requiredColumns: 2}, - {display: '[Start, Start+Constant]', value: IntervalFormat.StartConst, requiredColumns: 1}, - ]; - decimalSeparators: string[] = [',', '.']; - textQualifiers: string[] = ['"', "'"]; - coordinateFormats: string[] = ['Degrees Minutes Seconds', 'Degrees Decimal Minutes', 'Decimal Degrees']; - vectorTypes = ResultTypes.VECTOR_TYPES; - - dataProperties: FormGroup = new FormGroup({ - delimiter: new FormControl(this.delimiters[1].value, Validators.required), - decimalSeparator: new FormControl(this.decimalSeparators[1], Validators.required), - isTextQualifier: new FormControl(true), - textQualifier: new FormControl({value: this.textQualifiers[0], disabled: true}, Validators.required), - isHeaderRow: new FormControl(true), - headerRow: new FormControl({value: 0, disabled: true}, Validators.required), - }); - spatialProperties: FormGroup = new FormGroup({ - xColumn: new FormControl(0, Validators.required), - yColumn: new FormControl(1, Validators.required), - spatialReferenceSystem: new FormControl(Projections.WGS_84), - coordinateFormat: new FormControl({value: this.coordinateFormats[2], disabled: true}, Validators.required), - isWkt: new FormControl(false, Validators.required), - wktResultType: new FormControl({value: this.vectorTypes[0], disabled: true}, Validators.required), - }); - temporalProperties: FormGroup = new FormGroup({ - intervalType: new FormControl(IntervalFormat.StartInf), - isTime: new FormControl(false), - startColumn: new FormControl(2), - startFormat: new FormControl(this.timeFormats[0].value), - endColumn: new FormControl(3), - endFormat: new FormControl(this.timeFormats[0].value), - constantDuration: new FormControl(0), - }); - typingProperties: FormGroup = new FormGroup({}); - layerProperties: FormGroup = new FormGroup({}); - - dialogTitle: string; - subtitleDescription: string; - - formStatus$: BehaviorSubject = new BehaviorSubject(this.FormStatus.Loading); - isDataProperties$: Observable; - isSpatialProperties$: Observable; - isTemporalProperties$: Observable; - isTypingProperties$: Observable; - isLayerProperties$: Observable; - - storageName$ = new ReplaySubject(1); - reservedNames$ = new BehaviorSubject>([]); - - @Input() data: {file: File; content: string; progress: number; configured: boolean; isNumberArray: boolean[]}; - @ViewChild('csv_form_status_stepper', {static: true}) public stepper: MatStepper; - - actualPage$: BehaviorSubject = new BehaviorSubject(null); - - private subscriptions: Array = []; - private header: {value: string}[] = []; - - constructor( - private userService: UserService, - private _changeDetectorRef: ChangeDetectorRef, - public propertiesService: CsvPropertiesService, - ) { - setTimeout(() => this._changeDetectorRef.markForCheck(), 10); - this.isDataProperties$ = this.formStatus$.pipe(map((status) => status === this.FormStatus.DataProperties)); - this.isSpatialProperties$ = this.formStatus$.pipe(map((status) => status === this.FormStatus.SpatialProperties)); - this.isTemporalProperties$ = this.formStatus$.pipe(map((status) => status === this.FormStatus.TemporalProperties)); - this.isTypingProperties$ = this.formStatus$.pipe(map((status) => status === this.FormStatus.TypingProperties)); - this.isLayerProperties$ = this.formStatus$.pipe(map((status) => status === this.FormStatus.LayerProperties)); - - this.userService - .getFeatureDBList() - .pipe(map((entries) => entries.map((entry) => entry.name))) - .subscribe((names) => this.reservedNames$.next(names)); - - this.layerProperties = new FormGroup({ - layerName: new FormControl('', [ - Validators.required, - WaveValidators.notOnlyWhitespace, - layerNameNoDuplicateValidator(this.reservedNames$), - ]), - onError: new FormControl('skip'), - }); - } - - ngOnInit() { - this.propertiesService.changeDataProperties(this.getDataPropertiesDict()); - this.propertiesService.changeSpatialProperties(this.getSpatialPropertiesDict()); - this.propertiesService.changeTemporalProperties(this.getTemporalPropertiesDict()); - this.storageName$.next(this.data.file.name); - this.layerProperties.patchValue({layerName: this.data.file.name}); - this.subscriptions.push( - this.formStatus$.subscribe((status) => { - switch (status) { - case this.FormStatus.DataProperties: - this.dialogTitle = 'CSV Settings'; - this.subtitleDescription = 'Please specify the properties of your CSV file, e.g. the delimiter.'; - break; - case this.FormStatus.SpatialProperties: - this.dialogTitle = 'Spatial Properties'; - this.subtitleDescription = 'In this step you can specify the spatial columns of your CSV file.'; - break; - case this.FormStatus.TemporalProperties: - this.dialogTitle = 'Temporal Properties'; - this.subtitleDescription = 'This step allows you to specify temporal columns of your CSV file.'; - break; - case this.FormStatus.TypingProperties: - this.dialogTitle = 'Typing Properties'; - this.subtitleDescription = 'You can specify the data types of the remaining columns here.'; - break; - case this.FormStatus.LayerProperties: - this.dialogTitle = 'Layer Properties'; - this.subtitleDescription = 'Choose on error behavior and layer name.'; - break; - case this.FormStatus.Loading: - /* falls through */ - default: - break; - } - this.update(10); - setTimeout(() => this.update(10), 10); - }), - this.propertiesService.header$.subscribe((h) => { - this.header = h; - - this.disabledInvalidOptions(); - - // Reorder columns if needed. There might be some columns that are out of range after refactoring delimiters - let arr = [this.spatialProperties.controls['xColumn'].value]; - if (!this.isWkt()) { - arr.push(this.spatialProperties.controls['yColumn'].value); - } - if (this.isTime()) { - arr.push(this.temporalProperties.controls['startColumn'].value); - if ( - [this.IntervalFormat.StartEnd, this.IntervalFormat.StartDur].indexOf( - this.temporalProperties.controls['endColumn'].value, - ) >= 0 - ) { - arr.push(this.temporalProperties.controls['endColumn'].value); - } - } - for (let i = 0; i < arr.length; i++) { - if (arr[i] >= this.header.length) { - this.spatialProperties.controls['xColumn'].setValue(0); - this.spatialProperties.controls['yColumn'].setValue(1); - this.temporalProperties.controls['startColumn'].setValue(2); - this.temporalProperties.controls['endColumn'].setValue(3); - break; - } - } - }), - this.dataProperties.valueChanges.subscribe((data) => { - this.propertiesService.changeDataProperties(this.getDataPropertiesDict()); - }), - this.spatialProperties.valueChanges.subscribe((spatial) => { - this.propertiesService.changeSpatialProperties(this.getSpatialPropertiesDict()); - }), - this.spatialProperties.controls['isWkt'].valueChanges.subscribe((wkt) => { - if (wkt) { - this.spatialProperties.controls['yColumn'].disable(); - this.spatialProperties.controls['wktResultType'].enable(); - this.propertiesService.xyColumn$.next({x: this.propertiesService.xyColumn$.getValue().x}); - this.updateAdmissibilityOfTemporalSpecifications(); - } else { - this.fetchYColumnAndCorrectTemporal(); - } - }), - this.spatialProperties.controls['xColumn'].valueChanges.subscribe((x) => { - if (!this.isWkt()) { - if (x === this.spatialProperties.controls['yColumn'].value) { - if (x === this.header.length - 1) { - this.spatialProperties.controls['yColumn'].setValue(this.spatialProperties.controls['yColumn'].value - 1); - } else { - this.spatialProperties.controls['yColumn'].setValue(this.spatialProperties.controls['yColumn'].value + 1); - } - } - } - this.correctColumns(); - if (!this.isWkt()) { - this.propertiesService.xyColumn$.next({x: x, y: this.spatialProperties.controls['yColumn'].value}); - } else { - this.propertiesService.xyColumn$.next({x: x}); - } - }), - this.spatialProperties.controls['yColumn'].valueChanges.subscribe((y) => { - if (y === this.spatialProperties.controls['xColumn'].value) { - if (y === this.header.length - 1) { - this.spatialProperties.controls['xColumn'].setValue(this.spatialProperties.controls['xColumn'].value - 1); - } else { - this.spatialProperties.controls['xColumn'].setValue(this.spatialProperties.controls['xColumn'].value + 1); - } - } - this.correctColumns(); - if (!this.isWkt()) { - this.propertiesService.xyColumn$.next({x: this.spatialProperties.controls['xColumn'].value, y: y}); - } else { - this.propertiesService.xyColumn$.next({x: this.spatialProperties.controls['xColumn'].value}); - } - }), - this.temporalProperties.valueChanges.subscribe((temporal) => { - this.propertiesService.changeTemporalProperties(this.getTemporalPropertiesDict()); - }), - this.temporalProperties.controls['startColumn'].valueChanges.subscribe((start) => { - if (start === this.temporalProperties.controls['endColumn'].value) { - if (start === this.header.length - 1) { - this.temporalProperties.controls['endColumn'].setValue(this.temporalProperties.controls['endColumn'].value - 1); - } else { - this.temporalProperties.controls['endColumn'].setValue(this.temporalProperties.controls['endColumn'].value + 1); - } - } - if (this.formStatus$.getValue() === this.FormStatus.TemporalProperties) { - this.propertiesService.xyColumn$.next({ - x: start, - y: this.temporalProperties.controls['endColumn'].value, - }); - } - }), - this.temporalProperties.controls['endColumn'].valueChanges.subscribe((end) => { - if (end === this.temporalProperties.controls['startColumn'].value) { - if (end === this.header.length - 1) { - this.temporalProperties.controls['startColumn'].setValue(this.temporalProperties.controls['startColumn'].value - 1); - } else { - this.temporalProperties.controls['startColumn'].setValue(this.temporalProperties.controls['startColumn'].value + 1); - } - } - if (this.formStatus$.getValue() === this.FormStatus.TemporalProperties) { - this.propertiesService.xyColumn$.next({ - x: this.temporalProperties.controls['startColumn'].value, - y: end, - }); - } - }), - this.temporalProperties.controls['isTime'].valueChanges.subscribe((value) => { - if (value === false) { - this.temporalProperties.controls['startColumn'].disable(); - this.temporalProperties.controls['startFormat'].disable(); - this.temporalProperties.controls['endColumn'].disable(); - this.temporalProperties.controls['constantDuration'].disable(); - this.temporalProperties.controls['endFormat'].disable(); - this.temporalProperties.controls['intervalType'].disable(); - } else { - this.temporalProperties.controls['startColumn'].enable(); - this.temporalProperties.controls['startFormat'].enable(); - if (this.temporalProperties.controls['intervalType'].value !== this.IntervalFormat.StartInf) { - this.temporalProperties.controls['endColumn'].enable(); - this.temporalProperties.controls['constantDuration'].enable(); - this.temporalProperties.controls['endFormat'].enable(); - } - this.temporalProperties.controls['intervalType'].enable(); - } - if (this.formStatus$.getValue() === this.FormStatus.TemporalProperties) { - this.propertiesService.xyColumn$.next({ - x: this.temporalProperties.controls['startColumn'].value, - y: this.temporalProperties.controls['endColumn'].value, - }); - } - }), - this.temporalProperties.controls['intervalType'].valueChanges.subscribe((value) => { - if ([IntervalFormat.StartInf].indexOf(value) >= 0 || !this.isTime()) { - this.temporalProperties.controls['endFormat'].disable(); - this.temporalProperties.controls['endColumn'].disable(); - this.temporalProperties.controls['constantDuration'].disable(); - } else { - this.temporalProperties.controls['endFormat'].enable(); - this.temporalProperties.controls['endColumn'].enable(); - this.temporalProperties.controls['constantDuration'].enable(); - if ([IntervalFormat.StartDur, IntervalFormat.StartConst].indexOf(value) >= 0) { - this.temporalProperties.controls['endFormat'].setValue(this.durationFormats[0].value); - } else { - this.temporalProperties.controls['endFormat'].setValue(this.timeFormats[0].value); - } - } - this.temporalProperties.updateValueAndValidity(); - this.update(10); - }), - ); - this.formStatus$.next(this.FormStatus.DataProperties); - this.actualPage$.next(this.dataProperties); - this.propertiesService.changeFormStatus(this.FormStatus.DataProperties); - } - - ngAfterViewInit() { - this.dataProperties.updateValueAndValidity({ - onlySelf: false, - emitEvent: true, - }); - } - - ngOnDestroy() { - this.subscriptions.forEach((sub) => sub.unsubscribe()); - } - - next(event) { - let group: FormGroup; - let status: FormStatus; - switch (event.selectedIndex) { - case 0: - group = this.dataProperties; - status = this.FormStatus.DataProperties; - break; - case 1: - if (!this.isSpatialVisited) { - this.isSpatialVisited = true; - if (this.header.length < 2) { - this.spatialProperties.controls['isWkt'].disable(); - this.spatialProperties.controls['isWkt'].setValue(true); - } - } - group = this.spatialProperties; - status = this.FormStatus.SpatialProperties; - break; - case 2: - group = this.temporalProperties; - status = this.FormStatus.TemporalProperties; - break; - case 3: - group = this.typingProperties; - status = this.FormStatus.TypingProperties; - break; - case 4: - group = this.layerProperties; - status = this.FormStatus.LayerProperties; - group.controls['layerName'].updateValueAndValidity(); - break; - } - this.propertiesService.changeFormStatus(status); - this.actualPage$.next(group); - this.formStatus$.next(status); - if (status === this.FormStatus.TemporalProperties) { - this.propertiesService.xyColumn$.next({ - x: this.temporalProperties.controls['startColumn'].value, - y: this.temporalProperties.controls['endColumn'].value, - }); - } - if (status === this.FormStatus.SpatialProperties) { - this.propertiesService.xyColumn$.next({ - x: this.spatialProperties.controls['xColumn'].value, - y: this.spatialProperties.controls['yColumn'].value, - }); - } - this.update(100); - } - - update(timeOut: number) { - setTimeout(() => { - this._changeDetectorRef.reattach(); - }, timeOut); - } - - correctColumns() { - if (this.temporalProperties.controls['isTime'].disabled) { - return; - } - let direction = 1; - let arr = [this.spatialProperties.controls['xColumn'].value]; - if (!this.isWkt()) { - arr.push(this.spatialProperties.controls['yColumn'].value); - } - if (!this.temporalProperties.controls['endColumn'].disabled) { - arr.push(this.temporalProperties.controls['endColumn'].value); - } - while (arr.indexOf(this.temporalProperties.controls['startColumn'].value) >= 0) { - if (this.temporalProperties.controls['startColumn'].value === 0) { - direction = 1; - } else if (this.temporalProperties.controls['startColumn'].value === this.header.length - 1) { - direction = -1; - } - this.temporalProperties.controls['startColumn'].setValue(this.temporalProperties.controls['startColumn'].value + direction, { - emitEvent: false, - }); - } - this.temporalProperties.updateValueAndValidity(); - if (!this.temporalProperties.controls['endColumn'].disabled) { - direction = 1; - arr = [ - this.spatialProperties.controls['xColumn'].value, - this.spatialProperties.controls['yColumn'].value, - this.temporalProperties.controls['startColumn'].value, - ]; - while (arr.indexOf(this.temporalProperties.controls['endColumn'].value) >= 0) { - if (this.temporalProperties.controls['endColumn'].value === 0) { - direction = 1; - } else if (this.temporalProperties.controls['endColumn'].value === this.header.length - 1) { - direction = -1; - } - this.temporalProperties.controls['endColumn'].setValue(this.temporalProperties.controls['endColumn'].value + direction, { - emitEvent: false, - }); - } - } - this.temporalProperties.updateValueAndValidity(); - } - - updateAdmissibilityOfTemporalSpecifications() { - let requiredColumns = this.isWkt() ? 1 : 2; - if (this.header.length <= requiredColumns) { - this.temporalProperties.controls['isTime'].setValue(false); - this.temporalProperties.controls['isTime'].disable(); - } else if (this.header.length <= requiredColumns + 1) { - if ([IntervalFormat.StartEnd, IntervalFormat.StartDur].indexOf(this.temporalProperties.controls['intervalType'].value) >= 0) { - this.temporalProperties.controls['intervalType'].setValue(IntervalFormat.StartInf); - } - this.temporalProperties.controls['isTime'].enable(); - this.temporalProperties.controls['startColumn'].setValue(0); - this.correctColumns(); - } else { - this.temporalProperties.controls['isTime'].enable(); - this.temporalProperties.controls['startColumn'].setValue(0); - this.temporalProperties.controls['endColumn'].setValue(0); - this.correctColumns(); - } - this._changeDetectorRef.detectChanges(); - } - - fetchYColumnAndCorrectTemporal() { - this.updateAdmissibilityOfTemporalSpecifications(); - let x = this.spatialProperties.controls['xColumn'].value; - if ( - this.spatialProperties.controls['yColumn'].value < 0 || - this.spatialProperties.controls['yColumn'].value >= this.header.length - ) { - for (let i = 0; i < this.header.length; i++) { - if (i !== this.spatialProperties.controls['xColumn'].value) { - this.spatialProperties.controls['yColumn'].setValue(i); - break; - } - } - } - this.spatialProperties.controls['yColumn'].enable(); - this.spatialProperties.controls['xColumn'].setValue(x); - this.spatialProperties.controls['wktResultType'].disable(); - this.propertiesService.xyColumn$.next({ - x: this.spatialProperties.controls['xColumn'].value, - y: this.spatialProperties.controls['yColumn'].value, - }); - } - - noAvailableColumnsForTimeSpecification(isWkt: boolean, requiredColumns: number): boolean { - return (isWkt ? 1 : 2) + requiredColumns > this.header.length; - } - - isWkt(): boolean { - return this.spatialProperties.controls['isWkt'].value; - } - - isTime(): boolean { - return this.temporalProperties.controls['isTime'].value; - } - - disabledInvalidOptions() { - if (this.header.length < 2 && this.isSpatialVisited) { - this.spatialProperties.controls['isWkt'].disable(); - this.spatialProperties.controls['isWkt'].setValue(true); - } else { - this.spatialProperties.controls['isWkt'].enable(); - } - this.updateAdmissibilityOfTemporalSpecifications(); - } - - getDataPropertiesDict(): DataPropertiesDict { - return { - delimiter: this.dataProperties.controls['delimiter'].value, - decimalSeparator: this.dataProperties.controls['decimalSeparator'].value, - isTextQualifier: this.dataProperties.controls['isTextQualifier'].value, - textQualifier: this.dataProperties.controls['textQualifier'].value, - isHeaderRow: this.dataProperties.controls['isHeaderRow'].value, - headerRow: this.dataProperties.controls['headerRow'].value, - }; - } - - getSpatialPropertiesDict(): SpatialPropertiesDict { - return { - xColumn: this.spatialProperties.controls['xColumn'].value, - yColumn: this.spatialProperties.controls['yColumn'].value, - spatialReferenceSystem: this.spatialProperties.controls['spatialReferenceSystem'].value, - coordinateFormat: this.spatialProperties.controls['coordinateFormat'].value, - isWkt: this.isWkt(), - wktResultType: this.spatialProperties.controls['wktResultType'].value, - }; - } - - getTemporalPropertiesDict(): TemporalPropertiesDict { - return { - intervalType: this.temporalProperties.controls['intervalType'].value, - isTime: this.isTime(), - startColumn: this.temporalProperties.controls['startColumn'].value, - startFormat: this.temporalProperties.controls['startFormat'].value, - endColumn: this.temporalProperties.controls['endColumn'].value, - endFormat: this.temporalProperties.controls['endFormat'].value, - constantDuration: this.temporalProperties.controls['constantDuration'].value, - }; - } - - get xColumnName(): string { - if (this.isWkt()) { - return ''; - } else { - return this.spatialProperties.controls['spatialReferenceSystem'].value.xCoordinateName + '-'; - } - } - - get isValid(): boolean { - return ( - this.dataProperties.valid && - this.spatialProperties.valid && - this.temporalProperties.valid && - this.typingProperties.valid && - this.layerProperties.valid - ); - } -} -export function layerNameNoDuplicateValidator(reservedNames: BehaviorSubject>): ValidatorFn { - return (control: AbstractControl): {[key: string]: any} => { - return reservedNames.getValue().indexOf(control.value) < 0 - ? null - : {layerNameNoDuplicate: {value: 'Layer name already in use ' + control.value}}; - }; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-table/csv-table-template.component.html b/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-table/csv-table-template.component.html deleted file mode 100644 index 825e8ceb..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-table/csv-table-template.component.html +++ /dev/null @@ -1,125 +0,0 @@ -
    -
    - - - - - - - -
    - - - Text - Number - - -

    Coordinate

    -

    - Coordinate -

    -

    - Time -

    -

    - Time -

    -
    -
    -
    -
    - - - - - - - - - - - - - - - - -
    - {{ h.value }} - - - - -
    -
    -
    -
    - - - - - - - - -
    - {{ e }} -
    -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-table/csv-table.component.scss b/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-table/csv-table.component.scss deleted file mode 100644 index 69b35088..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-table/csv-table.component.scss +++ /dev/null @@ -1,212 +0,0 @@ -$latitudeColor: #26c5ff; -$longitudeColor: orange; -$startColor: darkgreen; -$endColor: darkviolet; -$backgroundColor: var(--wave-primary-color, grey); -$titleColor: white; /*Inherit from theme here.*/ - -div.latitudeSelector mat-select ::ng-deep span.mat-select-placeholder { - color: $latitudeColor; -} - -div.longitudeSelector mat-select ::ng-deep span.mat-select-placeholder { - color: $longitudeColor; -} - -div.startSelector mat-select ::ng-deep span.mat-select-placeholder { - color: $startColor; -} - -div.endSelector mat-select ::ng-deep span.mat-select-placeholder { - color: $endColor; -} - -div.constantSelector mat-form-field ::ng-deep span.mat-input-placeholder { - color: $endColor; -} - -.custom mat-form-field ::ng-deep label.mat-input-placeholder { - color: $titleColor; - opacity: 0.75; -} - -.table-frame { - text-align: left; - font-size: 0; - max-width: 75vw; - display: inline-block; - overflow: hidden; - margin-left: auto; - margin-right: auto; - border: solid 1px darkgray; -} - -.table-frame br { - display: none; -} - -.typingdiv { - max-width: 100%; - font-size: 15px; - display: block; - overflow: hidden; - border-bottom: solid 1px dimgray; - background-color: #ffffff; - font-weight: 300; -} - -.headerdiv { - max-width: 100%; - display: block; - overflow: hidden; - border-bottom: solid 1px dimgray; - border-right: solid 1px dimgray; - margin-bottom: 0; - background-color: $backgroundColor; - color: $titleColor; - font-size: 15px; - font-weight: 300; -} - -.headerdiv table td.custom mat-form-field { - margin-bottom: 0; - padding-bottom: 0; - font-size: 15px; - height: 30px; - color: $titleColor; -} - -td { - max-width: 500px; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; -} - -.bodydiv { - max-width: 100%; - font-size: 15px; - display: block; - overflow-x: auto; - overflow-y: hidden; -} - -.bodydiv table tr:nth-child(even) { - background-color: #add4f4; /*Take background color and mix with white.*/ -} - -.resizeTable { - display: table; - table-layout: fixed; -} - -.custom { - font-weight: normal; - padding-bottom: 0; - margin-bottom: 0; -} - -.scrollbar-measure { - width: 100px; - height: 100px; - overflow: scroll; - position: absolute; - top: -9999px; -} - -.time_green { - border: solid $startColor; - border-radius: 5px; - text-align: center; - margin-top: 3px; - margin-bottom: 3px; - horiz-align: center; -} - -.time_violet { - border: solid $endColor; - border-radius: 5px; - text-align: center; - margin-top: 3px; - margin-bottom: 3px; - horiz-align: center; -} - -.coordinate_orange { - border: solid $longitudeColor; - border-radius: 5px; - text-align: center; - margin-top: 3px; - margin-bottom: 3px; - horiz-align: center; -} - -.coordinate_blue { - border: solid $latitudeColor; - border-radius: 5px; - text-align: center; - margin-top: 3px; - margin-bottom: 3px; - horiz-align: center; -} - -/**Column Colors*/ -td.orange { - border-left-style: solid; - border-right-style: solid; - border-color: $longitudeColor; -} - -td.blue { - border-left-style: solid; - border-right-style: solid; - border-color: $latitudeColor; -} - -td.green { - border-left-style: solid; - border-right-style: solid; - border-color: $startColor; -} - -td.violet { - border-left-style: solid; - border-right-style: solid; - border-color: $endColor; -} - -.orangeHead { - border-left-style: solid; - border-right-style: solid; - border-top-style: solid; - border-color: $longitudeColor; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} - -.blueHead { - border-left-style: solid; - border-right-style: solid; - border-top-style: solid; - border-color: $latitudeColor; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} - -.greenHead { - border-left-style: solid; - border-right-style: solid; - border-top-style: solid; - border-color: $startColor; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} - -.violetHead { - border-left-style: solid; - border-right-style: solid; - border-top-style: solid; - border-color: $endColor; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-table/csv-table.component.ts b/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-table/csv-table.component.ts deleted file mode 100644 index 0ba982e9..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-config/csv-table/csv-table.component.ts +++ /dev/null @@ -1,374 +0,0 @@ -import {map} from 'rxjs/operators'; -/** - * Created by Julian on 09/05/2017. - */ -import {IntervalFormat} from '../../interval.enum'; -import { - Component, - ChangeDetectionStrategy, - Input, - ViewChild, - ElementRef, - OnInit, - AfterViewInit, - ChangeDetectorRef, - OnDestroy, -} from '@angular/core'; -import {DataPropertiesDict, FormStatus} from '../csv-properties/csv-properties.component'; -import * as Papa from 'papaparse'; -import {Observable, Subscription, BehaviorSubject} from 'rxjs'; -import {UploadData} from '../../csv-upload/csv-upload.component'; -import {CsvPropertiesService} from '../../csv-dialog/csv.properties.service'; - -export const HEADER_TABLE_ID = 'CSV_TABLE_HEADER_TABLE', - HEADER_DIV_ID = 'CSV_TABLE_HEADER_DIV', - BODY_TABLE_ID = 'CSV_TABLE_BODY_TABLE', - BODY_DIV_ID = 'CSV_TABLE_BODY_DIV', - TYPING_TABLE_ID = 'CSV_TABLE_TYPING_TABLE', - TYPING_DIV_ID = 'CSV_TABLE_TYPING_DIV', - TABLE_FRAME_ID = 'CSV_TABLE_TABLE_FRAME'; - -@Component({ - selector: 'wave-csv-table', - templateUrl: './csv-table-template.component.html', - styleUrls: ['./csv-table.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class CsvTableComponent implements OnInit, AfterViewInit, OnDestroy { - HEADER_TABLE_ID = HEADER_TABLE_ID; - HEADER_DIV_ID = HEADER_DIV_ID; - BODY_TABLE_ID = BODY_TABLE_ID; - BODY_DIV_ID = BODY_DIV_ID; - TYPING_TABLE_ID = TYPING_TABLE_ID; - TYPING_DIV_ID = TYPING_DIV_ID; - TABLE_FRAME_ID = TABLE_FRAME_ID; - - @Input() data: UploadData; - @Input() cellSpacing: number; - @Input() linesToParse: number; - - IntervalFormat = IntervalFormat; - isNumberArray: number[]; - untypedColumns: BehaviorSubject; - isWkt: BehaviorSubject; - - @ViewChild(HEADER_DIV_ID, {static: true}) headerDiv: ElementRef; - @ViewChild(BODY_DIV_ID, {static: true}) bodyDiv: ElementRef; - @ViewChild(TYPING_DIV_ID) typingDiv: ElementRef; - @ViewChild(HEADER_TABLE_ID, {static: true}) headerTable: ElementRef; - @ViewChild(BODY_TABLE_ID, {static: true}) bodyTable: ElementRef; - @ViewChild(TYPING_TABLE_ID) typingTable: ElementRef; - @ViewChild(TABLE_FRAME_ID, {static: true}) tableFrame: ElementRef; - - parsedData: Array>; - customHeader: {value: string}[] = []; - header: {value: string}[] = []; - elements: string[][] = []; - cellSizes: number[] = []; - dataProperties: DataPropertiesDict; - formStatus: FormStatus; - maxColumnWidth = 500; - - isDataProperties$: Observable; - isSpatialProperties$: Observable; - isTemporalProperties$: Observable; - isTypingProperties$: Observable; - isLayerProperties$: Observable; - - xColumn$: Observable; - yColumn$: Observable; - - private subscriptions: Array = []; - - constructor(public _changeDetectorRef: ChangeDetectorRef, public propertiesService: CsvPropertiesService) { - this.isDataProperties$ = this.propertiesService.formStatus$.pipe(map((status) => status === FormStatus.DataProperties)); - this.isSpatialProperties$ = this.propertiesService.formStatus$.pipe(map((status) => status === FormStatus.SpatialProperties)); - this.isTemporalProperties$ = this.propertiesService.formStatus$.pipe(map((status) => status === FormStatus.TemporalProperties)); - this.isTypingProperties$ = this.propertiesService.formStatus$.pipe(map((status) => status === FormStatus.TypingProperties)); - this.isLayerProperties$ = this.propertiesService.formStatus$.pipe(map((status) => status === FormStatus.LayerProperties)); - this.xColumn$ = this.propertiesService.xyColumn$.pipe(map((xy) => xy.x)); - this.yColumn$ = this.propertiesService.xyColumn$.pipe(map((xy) => xy.y)); - - setTimeout(() => this._changeDetectorRef.markForCheck(), 0); // FIXME: update to Angular 7 -> changed to lambda, 0 - this.untypedColumns = new BehaviorSubject([ - this.propertiesService.xyColumn$.getValue().x, - this.propertiesService.xyColumn$.getValue().y, - ]); - this.isWkt = new BehaviorSubject(false); - } - - ngOnInit() { - this.subscriptions.push( - this.propertiesService.dataProperties$.subscribe((data) => { - if (!!this.dataProperties) { - if (this.dataProperties.isHeaderRow !== data.isHeaderRow) { - if (data.isHeaderRow === true) { - this.customHeader = new Array(this.elements[0].length); - for (let i = 0; i < this.header.length; i++) { - this.customHeader[i] = this.header[i]; - } - } else { - if (this.customHeader.length === this.elements[0].length) { - for (let i = 0; i < this.customHeader.length; i++) { - this.header[i] = this.customHeader[i]; - } - } else { - this.customHeader = new Array(this.elements[0].length); - this.header = new Array(this.elements[0].length); - for (let i = 0; i < this.customHeader.length; i++) { - this.header[i] = {value: ''}; - this.customHeader[i] = {value: ''}; - } - } - } - } - } - this.dataProperties = data; - this.parse(); - if (this.header.length > 0) { - setTimeout(() => this.resize(), 0); // FIXME: update to Angular 7 -> changed to lambda, 0 - } - }), - this.propertiesService.formStatus$.subscribe((formStatus) => { - if ([formStatus, this.formStatus].indexOf(FormStatus.TypingProperties) >= 0) { - this.resize(); - this.bodyScroll(); - } - this.formStatus = formStatus; - }), - this.propertiesService.spatialProperties$.subscribe((data) => { - let untypedColumns = [data.xColumn]; - if (!data.isWkt) { - untypedColumns.push(data.yColumn); - } - let c = this.isWkt.getValue() ? 1 : 0; - for (let i = 2 - c; i < this.untypedColumns.getValue().length; i++) { - untypedColumns.push(this.untypedColumns.getValue()[i]); - } - this.untypedColumns.next(untypedColumns); - this.isWkt.next(data.isWkt); - this.update(10); - }), - this.propertiesService.temporalProperties$.subscribe((data) => { - let untypedColumns = [this.untypedColumns.getValue()[0]]; - if (!this.isWkt.getValue()) { - untypedColumns.push(this.untypedColumns.getValue()[1]); - } - if (data.isTime) { - untypedColumns.push(data.startColumn); - if ([IntervalFormat.StartEnd, IntervalFormat.StartDur].indexOf(data.intervalType) >= 0) { - untypedColumns.push(data.endColumn); - } - } - this.untypedColumns.next(untypedColumns); - this.update(10); - }), - // this.resizeEvent$.subscribe(data => this.resizeTableFrame()) - ); - this.parse(); - this.cellSizes = new Array(this.header.length); - for (let i = 0; i < this.header.length; i++) { - this.cellSizes[i] = 0; - } - } - - ngAfterViewInit() { - this.resize(); - } - - ngOnDestroy() { - this.subscriptions.forEach((sub) => sub.unsubscribe()); - } - - parse() { - if (!!this.dataProperties) { - let textQualifier: string = this.dataProperties.isTextQualifier ? this.dataProperties.textQualifier : null; - let prev: number = this.dataProperties.isHeaderRow ? this.dataProperties.headerRow + this.linesToParse + 1 : this.linesToParse; - let parsed = Papa.parse( - this.data.content as string, - { - delimiter: this.dataProperties.delimiter, - newline: '', - quoteChar: textQualifier, - header: false, - skipEmptyLines: true, - preview: prev, - } as any, - ); - this.parsedData = parsed.data; - // this.csvProperty.dataProperties.controls['delimiter'].setValue(parsed.meta.delimiter, {emitEvent: false}); - if (this.dataProperties.isHeaderRow) { - this.header = new Array(this.parsedData[this.dataProperties.headerRow].length); - for (let i = 0; i < this.header.length; i++) { - this.header[i] = {value: this.parsedData[this.dataProperties.headerRow][i]}; - } - this.elements = this.parsedData.slice( - this.dataProperties.headerRow + 1, - this.dataProperties.headerRow + this.linesToParse + 1, - ); - } else { - this.elements = this.parsedData; - if (this.header.length !== this.elements[0].length) { - this.header = new Array(this.elements[0].length); - for (let i = 0; i < this.header.length; i++) { - this.header[i] = {value: ''}; - } - } - } - if (!this.header || !this.elements) { - console.log('to large data'); - } - this.resetNumberArr(); - this.propertiesService.changeHeader(this.header); - // TODO: set Start/End column to a valid value, if it exceeds header length. - } - } - - resetNumberArr() { - this.isNumberArray = new Array(this.header.length); - this.isNumberArray.fill(0, 0, this.header.length); - } - - /**Gets called on table property changes. Resets the min-width property of the first rows cells to 0. - * Causes a reload "effect" - */ - resetTableSize() { - this.cellSizes = []; - for (let i = 0; i < 2 * Math.max(this.header.length, this.elements.length); i++) { - this.cellSizes.push(0); - } - } - - /**Gets called on table property change with some delay, so the view can reload first. - * Sets the min-width property of every tables first rows cells to the maximum - * of every tables first rows cells(Column-wise), - * if table assigned to class "resizeTable". - */ - resizeTable() { - let tableArr: HTMLTableElement[] = []; - tableArr.push(this.headerTable.nativeElement); - tableArr.push(this.bodyTable.nativeElement); - if (this.headerTable.nativeElement === null) { - return; - } - if (this.formStatus === FormStatus.TypingProperties) { - tableArr.push(this.typingTable.nativeElement); - } - let colNumber = 0; - for (let t of tableArr) { - if (t.rows.length > colNumber) { - colNumber = t.rows.length; - } - } - for (let t of tableArr) { - // t.style.borderSpacing = this.cellSpacing + 'px 0'; - let row: HTMLTableRowElement = t.rows.item(0) as HTMLTableRowElement; - for (let j = 0; j < row.cells.length; j++) { - let cell: HTMLElement = row.cells.item(j) as HTMLElement; - if (cell.getAttribute('name') === 'spacer') { - this.cellSizes[j] = this.cellSpacing; - } else if (!this.cellSizes[j] || this.cellSizes[j] < cell.getBoundingClientRect().width) { - this.cellSizes[j] = cell.getBoundingClientRect().width; - } - } - } - // this.resizeTableFrame(); - // Reset the headerdiv to body divs scroll. - this.headerDiv.nativeElement.scrollLeft = this.bodyDiv.nativeElement.scrollLeft = 0; - if (this.formStatus === FormStatus.TypingProperties) { - this.typingDiv.nativeElement.scrollLeft = this.bodyDiv.nativeElement.scrollLeft; - } - } - - bodyScroll() { - let scrollLeft = this.bodyDiv.nativeElement.scrollLeft; - this.headerDiv.nativeElement.scrollLeft = scrollLeft; - if (this.formStatus === FormStatus.TypingProperties) { - this.typingDiv.nativeElement.scrollLeft = scrollLeft; - } - } - - headerScroll() { - let scrollLeft = this.headerDiv.nativeElement.scrollLeft; - this.bodyDiv.nativeElement.scrollLeft = scrollLeft; - if (this.formStatus === FormStatus.TypingProperties) { - this.typingDiv.nativeElement.scrollLeft = scrollLeft; - } - } - - /**Gets called on window size changes. - * It brings the table container back to its initial 80%. This is a bug fix. - */ - resizeTableFrame() { - let tableArr: Element[] = []; - tableArr.push(this.headerTable.nativeElement); - tableArr.push(this.bodyTable.nativeElement); - if (this.formStatus === FormStatus.TypingProperties) { - tableArr.push(this.typingTable.nativeElement); - } - let width = 0; - for (let t of tableArr) { - width = Math.max(width, t.clientWidth); - } - this.tableFrame.nativeElement.style.maxWidth = Math.min(window.innerWidth * 0.8 - 2 * 24, width) + 'px'; - this.tableFrame.nativeElement.style.minWidth = Math.min(window.innerWidth * 0.8 - 2 * 24, width) + 'px'; - // innerWidth * 0.8 = 80vw(max größe vom dialog) -24 ist padding von mat-dialog-content. - } - - /**Resets table size and delays then. - * After delay(so view can reload on resetted table column sizes) resizes table to maximum of every table. - */ - resize() { - this.resetTableSize(); - this.update(10); - setTimeout(() => this.resizeTable(), 100); - this.update(100); - } - - ending(i: number): string { - if ((i - 1) % 10 === 0 && (i - 11) % 100 !== 0) { - return 'st'; - } else if ((i - 2) % 10 === 0 && (i - 12) % 100 !== 0) { - return 'nd'; - } else if ((i - 3) % 10 === 0 && (i - 13) % 100 !== 0) { - return 'rd'; - } else { - return 'th'; - } - } - - update(timeOut: number) { - setTimeout(() => { - this._changeDetectorRef.markForCheck(); - }, timeOut); - } - - styleDict(i: number, isSpatial: boolean, isTemporal: boolean, head: boolean) { - let j = this.untypedColumns.getValue().indexOf(i); - if (isSpatial) { - if (head) { - return {orangeHead: j === 0, blueHead: j === 1 && !this.isWkt.getValue()}; - } else { - return {orange: j === 0, blue: j === 1 && !this.isWkt.getValue()}; - } - } - if (isTemporal) { - let c = this.isWkt.getValue() ? 1 : 0; - if (head) { - return {greenHead: j === 2 - c, violetHead: j === 3 - c}; - } else { - return {green: j === 2 - c, violet: j === 3 - c}; - } - } - return {}; - } - - get notOnlyWhiteSpace(): boolean { - for (let h of this.header) { - if (h.value === '' || h.value === null || h.value === undefined) { - return false; - } - } - return true; - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv-dialog.component.html b/projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv-dialog.component.html deleted file mode 100644 index 04e78f42..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv-dialog.component.html +++ /dev/null @@ -1,46 +0,0 @@ -CSV Upload - - -
    - - -
    - - - -
    - - -
    - - - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv-dialog.component.scss b/projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv-dialog.component.scss deleted file mode 100644 index e7ccd98d..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv-dialog.component.scss +++ /dev/null @@ -1,14 +0,0 @@ -mat-dialog-content { - padding-top: 1rem; -} - -mat-spinner { - width: 25%; - height: auto; - margin: 1rem auto; -} - -wave-csv-table { - margin-left: auto; - margin-right: auto; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv-dialog.component.ts b/projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv-dialog.component.ts deleted file mode 100644 index be79cc79..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv-dialog.component.ts +++ /dev/null @@ -1,258 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy, ViewChild, Inject} from '@angular/core'; -import {UploadData} from '../csv-upload/csv-upload.component'; -import {CsvSourceType, CSVParameters} from '../../../types/csv-source-type.model'; -import {Operator} from '../../../operator.model'; -import {ResultTypes} from '../../../result-type.model'; -import {UserService} from '../../../../users/user.service'; -import {AbstractVectorSymbology, PointSymbology, VectorSymbology} from '../../../../layers/symbology/symbology.model'; -import {VectorLayer} from '../../../../layers/layer.model'; -import {RandomColorService} from '../../../../util/services/random-color.service'; -import {MatDialogRef, MatDialog, MAT_DIALOG_DATA} from '@angular/material/dialog'; -import {BehaviorSubject} from 'rxjs'; -import {Projections} from '../../../projection.model'; -import {CsvPropertiesService} from './csv.properties.service'; -import {ProjectService} from '../../../../project/project.service'; -import {IntervalFormat} from '../interval.enum'; -import {CsvPropertiesComponent} from '../csv-config/csv-properties/csv-properties.component'; -import {CsvTableComponent} from '../csv-config/csv-table/csv-table.component'; -import {HttpErrorResponse} from '@angular/common/http'; - -@Component({ - selector: 'wave-csv-dialog', - templateUrl: './csv-dialog.component.html', - styleUrls: ['./csv-dialog.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [CsvPropertiesService], -}) -export class CsvDialogComponent implements OnInit { - IntervalFormat = IntervalFormat; - @ViewChild(CsvPropertiesComponent) csvProperties; - @ViewChild(CsvTableComponent) csvTable; - data: UploadData; - uploading$ = new BehaviorSubject(false); - - constructor( - private userService: UserService, - private randomColorService: RandomColorService, - private projectService: ProjectService, - private dialogRef: MatDialogRef, - private errorDialog: MatDialog, - ) {} - - ngOnInit() {} - - submit() { - this.uploading$.next(true); - const untypedCols = this.csvTable.untypedColumns.getValue(); - // TODO: refactor most of this - const fieldSeparator = this.csvProperties.dataProperties.controls['delimiter'].value; - const geometry = this.csvProperties.spatialProperties.controls['isWkt'].value ? 'wkt' : 'xy'; - const time = this.intervalString; - const time1Format = this.csvProperties.temporalProperties.controls['startFormat'].value; - const time2Format = this.csvProperties.temporalProperties.controls['endFormat'].value; - const header = new Array(this.csvTable.header.length); - for (let i = 0; i < this.csvTable.header.length; i++) { - header[i] = this.csvTable.header[i].value; - } - const columnX = header[this.csvProperties.spatialProperties.controls['xColumn'].value]; - const columnY = this.csvProperties.spatialProperties.controls['isWkt'].value - ? '' - : header[this.csvProperties.spatialProperties.controls['yColumn'].value]; - const time1 = this.csvProperties.temporalProperties.controls['isTime'].value - ? header[this.csvProperties.temporalProperties.controls['startColumn'].value] - : ''; - const time2 = this.csvProperties.temporalProperties.controls['isTime'].value - ? header[this.csvProperties.temporalProperties.controls['endColumn'].value] - : ''; - const numericColumns = header.filter((name, index) => { - return this.csvTable.isNumberArray[index] === 1 && untypedCols.indexOf(index) < 0; - }); - const textualColumns = header.filter((name, index) => { - return this.csvTable.isNumberArray[index] === 0 && untypedCols.indexOf(index) < 0; - }); - const onError = this.csvProperties.layerProperties.controls['onError'].value; - const columns = this.csvProperties.spatialProperties.controls['isWkt'].value - ? { - x: columnX, - numeric: numericColumns, - textual: textualColumns, - } - : { - x: columnX, - y: columnY, - numeric: numericColumns, - textual: textualColumns, - }; - const parameters: CSVParameters = { - fieldSeparator, - geometry, - time: - time.indexOf('constant') < 0 - ? (time as 'none' | 'start+inf' | 'start+end' | 'start+duration' | {use: 'start'; duration: number}) - : {use: 'start', duration: this.csvProperties.temporalProperties.controls['constantDuration'].value}, - header: this.csvProperties.dataProperties.controls['isHeaderRow'].value ? null : header, - columns, - onError, - }; - - // filter out geo columns - function removeIfExists(array: Array, name: string) { - const index = array.indexOf(name); - if (index >= 0) { - array.splice(index, 1); - } - } - - removeIfExists(parameters.columns.textual, columnX); - removeIfExists(parameters.columns.numeric, columnX); - if (this.csvProperties.spatialProperties.controls['isWkt'].value) { - removeIfExists(parameters.columns.textual, columnY); - removeIfExists(parameters.columns.numeric, columnY); - } - if (time !== 'none') { - parameters.timeFormat = { - time1: { - format: 'custom', - customFormat: time1Format, - }, - }; - parameters.columns.time1 = time1; - - removeIfExists(parameters.columns.textual, time1); - removeIfExists(parameters.columns.numeric, time1); - - if (time.indexOf('end') >= 0) { - parameters.timeFormat.time2 = { - format: 'custom', - customFormat: time2Format, - }; - parameters.columns.time2 = time2; - - removeIfExists(parameters.columns.textual, time2); - removeIfExists(parameters.columns.numeric, time2); - } - if (time.indexOf('duration') >= 0) { - // TODO: refactor for other formats - parameters.timeFormat.time2 = { - format: time2Format as 'seconds', - }; - parameters.columns.time2 = time2; - - removeIfExists(parameters.columns.textual, time2); - removeIfExists(parameters.columns.numeric, time2); - } - } - - const csvSourceType = new CsvSourceType({ - dataURI: 'data:text/plain,' + this.data.content, - parameters, - }); - - const operator = new Operator({ - operatorType: csvSourceType, - resultType: this.csvProperties.spatialProperties.controls['isWkt'].value - ? this.csvProperties.spatialProperties.controls['wktResultType'].value - : ResultTypes.POINTS, - projection: this.csvProperties.spatialProperties.controls['spatialReferenceSystem'].value, - }).getProjectedOperator(Projections.WGS_84); - this.uploading$.next(true); - - this.userService.addFeatureToDB(this.csvProperties.layerProperties.controls['layerName'].value, operator).subscribe( - (data) => { - // Regular query processing - this.addLayer(data); - - this.dialogRef.close(); - }, - (error) => { - // Error code - open dialog - this.uploading$.next(false); - this.openErrorDialog(error); - }, - ); - } - - private addLayer(entry: {name: string; operator: Operator}) { - const color = this.randomColorService.getRandomColorRgba(); - let symbology: AbstractVectorSymbology; - let clustered: boolean; - - if (entry.operator.resultType === ResultTypes.POINTS) { - symbology = PointSymbology.createClusterSymbology({ - fillRGBA: color, - }); - clustered = true; - } else { - symbology = VectorSymbology.createSymbology({ - fillRGBA: color, - }); - clustered = false; - } - - const layer = new VectorLayer({ - name: entry.name, - operator: entry.operator, - symbology, - // data: this.mappingQueryService.getWFSDataStreamAsGeoJsonFeatureCollection({ - // operator: entry.operator, - // clustered: clustered, - // }), - // provenance: this.mappingQueryService.getProvenanceStream(entry.operator), - clustered, - }); - // this.layerService.addLayer(layer); - this.projectService.addLayer(layer); - } - - openErrorDialog(error: HttpErrorResponse): void { - const errorDialogRef = this.errorDialog.open(CsvErrorDialogComponent, { - width: '400px', - data: {error}, - }); - errorDialogRef.afterClosed().subscribe((result) => { - if (result) { - this.dialogRef.close(); - } - this.uploading$.next(false); - }); - } - - get intervalString(): string { - if (!this.csvProperties.temporalProperties.controls['isTime'].value) { - return 'none'; - } - switch (this.csvProperties.temporalProperties.controls['intervalType'].value) { - case IntervalFormat.StartInf: - return 'start+inf'; - case IntervalFormat.StartEnd: - return 'start+end'; - case IntervalFormat.StartDur: - return 'start+duration'; - case IntervalFormat.StartConst: - return 'start+constant'; - default: - return 'none'; - } - } -} - -@Component({ - selector: 'wave-csv-dialog-error-dialog', - template: ` - {{ data.error.name }} -
    - {{ data.error.url }}:
    - {{ data.error.status }} - {{ data.error.statusText }} -
    - - - - - `, -}) -export class CsvErrorDialogComponent { - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: {error: HttpErrorResponse}, - ) {} -} diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv.properties.service.ts b/projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv.properties.service.ts deleted file mode 100644 index c795f92a..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-dialog/csv.properties.service.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { - DataPropertiesDict, - FormStatus, - SpatialPropertiesDict, - TemporalPropertiesDict, -} from '../csv-config/csv-properties/csv-properties.component'; -import {Subject, BehaviorSubject, Subscription, Observable} from 'rxjs'; -import {Injectable} from '@angular/core'; - -@Injectable() -export class CsvPropertiesService { - private dataProperties = new BehaviorSubject({ - delimiter: ',', - decimalSeparator: '.', - isTextQualifier: true, - textQualifier: '"', - isHeaderRow: true, - headerRow: 0, - }); - private spatialProperties = new BehaviorSubject({ - xColumn: -1, - yColumn: -1, - spatialReferenceSystem: null, - coordinateFormat: '', - isWkt: false, - wktResultType: null, - }); - private temporalProperties = new BehaviorSubject({ - intervalType: null, - isTime: false, - startColumn: -1, - startFormat: '', - endColumn: -1, - endFormat: '', - constantDuration: 0, - }); - private header = new BehaviorSubject<{value: string}[]>([]); - private formStatus = new BehaviorSubject(null); - - xyColumn$: BehaviorSubject<{x: number; y?: number}> = new BehaviorSubject<{x: number; y?: number}>({x: 0, y: 0}); - - dataProperties$ = this.dataProperties.asObservable(); - spatialProperties$ = this.spatialProperties.asObservable(); - temporalProperties$ = this.temporalProperties.asObservable(); - header$ = this.header.asObservable(); - formStatus$ = this.formStatus.asObservable(); - - public changeDataProperties(p: DataPropertiesDict) { - this.dataProperties.next(p); - } - - public changeSpatialProperties(s: SpatialPropertiesDict) { - this.spatialProperties.next(s); - } - - public changeTemporalProperties(t: TemporalPropertiesDict) { - this.temporalProperties.next(t); - } - - public changeHeader(h: {value: string}[]) { - this.header.next(h); - } - - public changeFormStatus(fs: FormStatus) { - this.formStatus.next(fs); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-upload/csv-upload-style.component.css b/projects/wave-core/src/lib/operators/dialogs/csv/csv-upload/csv-upload-style.component.css deleted file mode 100644 index a62a5bda..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-upload/csv-upload-style.component.css +++ /dev/null @@ -1,17 +0,0 @@ -.file-upload { - position: relative; - overflow: hidden; - margin: 10px; -} - -.file-upload input.file-input { - position: absolute; - top: 0; - right: 0; - margin: 0; - padding: 0; - font-size: 20px; - cursor: pointer; - opacity: 0; - filter: alpha(opacity=0); -} diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-upload/csv-upload-template.component.html b/projects/wave-core/src/lib/operators/dialogs/csv/csv-upload/csv-upload-template.component.html deleted file mode 100644 index de7984e3..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-upload/csv-upload-template.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
    - -
    -
    -

    - File too large!
    - We only accept files to a maximum size of 100MB. -

    - -
    -
    -

    - {{ this.data.file.name }} -

    - {{ data.progress }}% -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/csv-upload/csv-upload.component.ts b/projects/wave-core/src/lib/operators/dialogs/csv/csv-upload/csv-upload.component.ts deleted file mode 100644 index b478148e..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/csv-upload/csv-upload.component.ts +++ /dev/null @@ -1,116 +0,0 @@ -import {map, mapTo, filter} from 'rxjs/operators'; -import {Observable, BehaviorSubject, Subscription} from 'rxjs'; - -import {Component, Input, Output, EventEmitter, OnDestroy, OnInit} from '@angular/core'; - -enum FormStatus { - Selection, - Error, - Loading, - Finished, -} - -export interface UploadData { - file: File; - content: string; - progress: number; - isNull: boolean; -} - -@Component({ - selector: 'wave-csv-upload', - templateUrl: './csv-upload-template.component.html', - styleUrls: ['./csv-upload-style.component.css'], -}) -export class CsvUploadComponent implements OnInit, OnDestroy { - status$: BehaviorSubject = new BehaviorSubject(FormStatus.Selection); - isSelecting$: Observable; - isLoading$: Observable; - isFinished$: Observable; - isError$: Observable; - - @Input() file_size_limit: number; - @Output() onData = new EventEmitter(); - - data: UploadData = { - file: null, - content: '', - progress: 0, - isNull: true, - }; - - private subscriptions: Array = []; - - constructor() { - this.isSelecting$ = this.status$.pipe(map((status) => status === FormStatus.Selection)); - this.isLoading$ = this.status$.pipe(map((status) => status === FormStatus.Loading)); - this.isFinished$ = this.status$.pipe( - filter((status) => status === FormStatus.Finished), - mapTo(true), - ); - this.isError$ = this.status$.pipe(map((status) => status === FormStatus.Error)); - } - - ngOnInit() { - this.subscriptions.push(this.isFinished$.subscribe(() => this.onData.emit(this.data))); - } - - ngOnDestroy() { - this.subscriptions.forEach((subscription) => subscription.unsubscribe()); - } - - changeListener($event): void { - if ($event.target.files.length > 0 && $event.target.files[0].size <= this.file_size_limit) { - this.data = { - file: $event.target.files[0], - content: '', - progress: 0, - isNull: false, - }; - $event.target.value = ''; - this.upload(); - this.status$.next(FormStatus.Loading); - } else { - this.data = { - file: null, - content: '', - progress: 0, - isNull: true, - }; - if ($event.target.files[0].size > this.file_size_limit) { - $event.target.value = ''; - this.status$.next(FormStatus.Error); - } - } - } - - upload() { - let reader: FileReader = new FileReader(); - - reader.onload = (e) => { - this.data.content = reader.result as string; // FIXME: update to angular 7 -> added "as string" - this.data.progress = 100; - this.status$.next(FormStatus.Finished); - }; - - reader.readAsText(this.data.file); - } - - unerror() { - this.status$.next(FormStatus.Selection); - } - - /**This method generates a number array containing all integers i with n <= i < m - * - * @param n lowest integer. !Warning: This integer is still contained in array. - * @param m highest integer. !Warning: This integer is not contained in array. - * @returns {number[]} Array {n,..,m-1} - */ - range(n: number, m: number): number[] { - let res: number[] = []; - for (let i: number = n; i < m; i++) { - res.push(i); - } - return res; - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/csv/interval.enum.ts b/projects/wave-core/src/lib/operators/dialogs/csv/interval.enum.ts deleted file mode 100644 index f1bfefc2..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/csv/interval.enum.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Created by jmaerte on 07.04.2017. - */ -export enum IntervalFormat { - StartInf, - StartEnd, - StartDur, - StartConst, -} diff --git a/projects/wave-core/src/lib/operators/dialogs/data-repository/data-repository.component.html b/projects/wave-core/src/lib/operators/dialogs/data-repository/data-repository.component.html deleted file mode 100644 index 4395bc34..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/data-repository/data-repository.component.html +++ /dev/null @@ -1,46 +0,0 @@ -Data Repository - - - - - - - - - - - - - -
    -

    There are no sources available.

    - -
    - -
    -

    There are no sources available.

    -
    -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/data-repository/data-repository.component.scss b/projects/wave-core/src/lib/operators/dialogs/data-repository/data-repository.component.scss deleted file mode 100644 index 1eddcd94..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/data-repository/data-repository.component.scss +++ /dev/null @@ -1,34 +0,0 @@ -.datagroup { - color: var(--wave-primary-color, black) !important; -} - -.datagroup a { - color: var(--wave-primary-color, black) !important; -} - -.item { - width: 100%; - cursor: pointer; -} - -.highlight, -mat-list-item ::ng-deep .highlight { - color: var(--wave-accent-color, grey); - text-decoration: underline; -} - -mat-list-item ::ng-deep .mat-list-item-content { - height: auto !important; -} - -img { - padding: 5px 5px 5px 0; -} - -.secondary_action { - float: right; -} - -.error { - text-align: center; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/data-repository/data-repository.component.ts b/projects/wave-core/src/lib/operators/dialogs/data-repository/data-repository.component.ts deleted file mode 100644 index 88af0412..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/data-repository/data-repository.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {Component, ChangeDetectionStrategy} from '@angular/core'; - -import {Observable} from 'rxjs'; - -import {MappingSource} from './mapping-source.model'; -import {UserService} from '../../../users/user.service'; - -@Component({ - selector: 'wave-data-repository', - templateUrl: './data-repository.component.html', - styleUrls: ['./data-repository.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class DataRepositoryComponent { - searchTerm: string = ''; - sources: Observable>; - - constructor(public userService: UserService) { - this.sources = this.userService.getRasterSourcesStream(); - } - - reload() { - this.userService.reloadRasterSources(); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/data-repository/mapping-source.model.ts b/projects/wave-core/src/lib/operators/dialogs/data-repository/mapping-source.model.ts deleted file mode 100644 index 8ae1409f..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/data-repository/mapping-source.model.ts +++ /dev/null @@ -1,191 +0,0 @@ -import {Unit, UnitMappingDict} from '../../unit.model'; -import {MappingRasterColorizerDict} from '../../../colors/colorizer-data.model'; -import {IColorizerData} from '../../../colors/colorizer-data.model'; -import {Time, TimePoint} from '../../../time/time.model'; - -/** - * An interface for transformation of raster layer values. - */ -export interface MappingTransform { - datatype: string; - offset: number; - scale: number; - unit: Unit; -} - -/** - * An interface for the provenance data provided by MAPPING. - */ -export interface ProvenanceInfo { - uri: string; - license: string; - citation: string; -} - -/** - * An interface for raster layers provided by MAPPING. - */ -export interface SourceRasterLayerDescription { - name: string; - id: number; - datatype: string; - nodata: number; - unit: Unit; - methodology?: MappingRasterMethodology; - colorizer?: IColorizerData; - transform: MappingTransform; - hasTransform: boolean; - isSwitchable: boolean; - missingUnit?: boolean; - coords: { - crs: string; - origin: number[]; - scale: number[]; - size: number[]; - }; - provenance: ProvenanceInfo; - time_start?: TimePoint; - time_end?: TimePoint; -} - -/** - * An interface for vector layers provided by MAPPING. - */ -export interface SourceVectorLayerDescription { - name: string; - id: number | string; - title: string; - geometryType: string; // FIXME: this must be the layer type -> POINT, POLYGON, LINE... - textual: string[]; - numeric: string[]; - coords: { - crs: string; - }; - colorizer?: IColorizerData; - provenance: ProvenanceInfo; - time_start?: TimePoint; - time_end?: TimePoint; -} - -/** - * An interface for a MAPPING source and the provided data. - */ -export interface MappingSource { - operator: string; - source: string; - name: string; - rasterLayer?: SourceRasterLayerDescription[]; - vectorLayer?: SourceVectorLayerDescription[]; - descriptionText?: string; - imgUrl?: string; - tags?: Array; - provenance: ProvenanceInfo; - time_start?: TimePoint; - time_end?: TimePoint; -} - -/** - * An interface for sources as provided by MAPPING. - */ -export interface MappingSourceDict { - operator?: string; - name?: string; - dataset_name?: string; - descriptionText?: string; - imgUrl?: string; - tags?: string[]; - colorizer?: MappingRasterColorizerDict; - provenance?: { - uri: string; - license: string; - citation: string; - }; - coords: { - crs: string; - epsg?: number; - origin?: number[]; - scale?: number[]; - size?: number[]; - }; - channels?: [MappingSourceRasterLayerDict]; - layer?: [MappingSourceVectorLayerDict]; - time_start?: string; - time_end?: string; -} - -/** - * An interface for raster sources as provided by MAPPING. - */ -export interface MappingSourceRasterLayerDict { - datatype: string; - nodata: number; - name?: string; - unit?: UnitMappingDict; - methodology?: MappingRasterMethodology; - colorizer?: MappingRasterColorizerDict; - transform?: { - unit?: UnitMappingDict; - datatype: string; - scale: number; - offset: number; - }; - coords: { - crs: string; - origin: number[]; - scale: number[]; - size: number[]; - }; - provenance?: { - uri: string; - license: string; - citation: string; - }; - time_start?: string; - time_end?: string; -} - -/** - * An interface for vector sources as provided by MAPPING. - */ -export interface MappingSourceVectorLayerDict { - id?: number | string; - name: string; - title?: string; - geometry_type: string; // FIXME: this must be the layer type -> POINT, POLYGON, LINE... - textual?: string[]; - numeric?: string[]; - coords: { - crs: string; - }; - uri?: string; - license?: string; - citation?: string; - provenance?: { - uri: string; - license: string; - citation: string; - }; - time_start?: string; - time_end?: string; -} - -/** - * An interface for MAPPING responses when requesting sources. - */ -export interface MappingSourceResponse { - sourcelist: {[index: string]: MappingSourceDict}; -} - -/** - * An interface for raster methodology description. - */ -export interface MappingRasterMethodology { - type: 'SATELLITE_SENSOR'; -} - -/** - * An interface providing information for satellite sensor data. - */ -export interface MappingSatelliteSensorRasterMethodology extends MappingRasterMethodology { - central_wave_length_nm: number; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/data-repository/raster/source-dataset.component.html b/projects/wave-core/src/lib/operators/dialogs/data-repository/raster/source-dataset.component.html deleted file mode 100644 index c9a0fd75..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/data-repository/raster/source-dataset.component.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - no preview image available - - -

    {{ dataset?.descriptionText }}

    -
    - - - {{ tag }} - - - - -

    Time validity: {{ dataset?.time_start }} - {{ dataset?.time_end }}

    -
    - - open_in_new -

    - {{ dataset?.provenance?.uri }} -

    -
    -
    - - - - - Channel - - - - - - - Measurement - - {{ valid_unit(channel) }} - - - - - Start - - {{ channel.time_start }} - - - - - End - - {{ channel.time_end }} - - - - - - - -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/data-repository/raster/source-dataset.component.scss b/projects/wave-core/src/lib/operators/dialogs/data-repository/raster/source-dataset.component.scss deleted file mode 100644 index efbb79d6..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/data-repository/raster/source-dataset.component.scss +++ /dev/null @@ -1,51 +0,0 @@ -@import '~@angular/material/theming'; - -$mat-button-focus-transition: opacity 200ms $swift-ease-in-out-timing-function, background-color 200ms $swift-ease-in-out-timing-function !default; - -.dataset-name { - color: var(--wave-primary-color, black) !important; -} - -.dataset-uri { - overflow: hidden; - text-overflow: ellipsis; -} - -.secondary_action { - float: right; -} - -mat-list-item { - font-size: 12px; -} - -.mat-row { - color: var(--wave-primary-color, black) !important; - cursor: pointer; - min-height: 40px !important; -} - -.mat-cell { - font-size: 12px; -} -:host ::ng-deep .highlight { - color: var(--wave-accent-color, grey); -} - -// Element that overlays the button to show focus and hover effects. -.mat-row:hover { - // The button spec calls for focus on raised buttons (and FABs) to be indicated with a - // black, 12% opacity shade over the normal color (for both light and dark themes). - background-color: rgba(black, 0.12); - border-radius: inherit; - opacity: 1; - - transition: $mat-button-focus-transition; - - @include cdk-high-contrast { - // Note that IE will render this in the same way, no - // matter whether the theme is light or dark. This helps - // with the readability of focused buttons. - background-color: rgba(white, 0.5); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/data-repository/raster/source-dataset.component.ts b/projects/wave-core/src/lib/operators/dialogs/data-repository/raster/source-dataset.component.ts deleted file mode 100644 index 731b1aff..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/data-repository/raster/source-dataset.component.ts +++ /dev/null @@ -1,300 +0,0 @@ -import {Observable, of as observableOf} from 'rxjs'; -import {ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges} from '@angular/core'; -import {MappingSource, SourceRasterLayerDescription, MappingTransform} from '../mapping-source.model'; -import {Unit} from '../../../unit.model'; -import {RasterSourceType} from '../../../types/raster-source-type.model'; -import {ResultTypes} from '../../../result-type.model'; -import {Projection, Projections} from '../../../projection.model'; -import {DataType, DataTypes} from '../../../datatype.model'; -import {RasterLayer} from '../../../../layers/layer.model'; -import {MappingRasterSymbology} from '../../../../layers/symbology/symbology.model'; -import {Operator} from '../../../operator.model'; -import {ProjectService} from '../../../../project/project.service'; -import {DataSource} from '@angular/cdk/table'; -import {GdalSourceType} from '../../../types/gdal-source-type.model'; -import {ExpressionType} from '../../../types/expression-type.model'; -import {ColorBreakpointDict} from '../../../../colors/color-breakpoint.model'; -import {ColorizerData, IColorizerData} from '../../../../colors/colorizer-data.model'; -import {GdalSourceParameterOptions} from '../../../parameter-options/gdal-source-parameter-options.model'; -import {ParameterOptionType} from '../../../operator-type-parameter-options.model'; -import {Colormap} from '../../../../colors/colormaps/colormap.model'; - -@Component({ - selector: 'wave-source-dataset', - templateUrl: './source-dataset.component.html', - styleUrls: ['./source-dataset.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class SourceDatasetComponent implements OnInit, OnChanges { - @Input() dataset: MappingSource; - @Input() searchTerm: string; - _useRawData = false; - _showPreview = false; - _showDescription = false; - _channelSource: ChannelDataSource; - _displayedColumns = ['name', 'measurement']; - - /** - * Transform the values of a colorizer to match the transformation of the raster transformation. - */ - static createAndTransformColorizer(colorizerConfig: IColorizerData, transform: MappingTransform): IColorizerData { - if (transform) { - const transformedColorizerConfig: IColorizerData = { - type: colorizerConfig.type, - breakpoints: colorizerConfig.breakpoints.map((bp: ColorBreakpointDict) => { - return { - value: ((bp.value as number) - transform.offset) * transform.scale, - rgba: bp.rgba, - }; - }), - }; - return transformedColorizerConfig; - } else { - return colorizerConfig; - } - } - - constructor(private projectService: ProjectService) {} - - ngOnInit(): void { - this._channelSource = new ChannelDataSource(this.dataset.rasterLayer); - } - ngOnChanges(changes: SimpleChanges) { - for (const key in changes) { - if (changes.hasOwnProperty(key)) { - switch (key) { - // check if there is any time-validity start/end data. If there is start/end data show the column of this data. - case 'dataset': { - this.dataset.rasterLayer.forEach((element) => { - if (element.time_start && this.dataset.time_start && !this.dataset.time_start.isSame(element.time_start)) { - if (!this._displayedColumns.includes('start')) { - this._displayedColumns.push('start'); - } - } - if (element.time_end && this.dataset.time_end && !this.dataset.time_end.isSame(element.time_end)) { - if (!this._displayedColumns.includes('end')) { - this._displayedColumns.push('end'); - } - } - // get start and end in the right order - if (this._displayedColumns[2] === 'end' && this._displayedColumns[3] === 'start') { - this._displayedColumns[2] = 'start'; - this._displayedColumns[3] = 'end'; - } - }); - } - } - } - } - } - valid_colorizer(channel: SourceRasterLayerDescription): IColorizerData { - if (channel.colorizer) { - return channel.colorizer; - } else { - return ColorizerData.grayScaleColorizer(this.valid_unit(channel)); - } - } - - valid_unit(channel: SourceRasterLayerDescription): Unit { - if (channel.hasTransform && !this.useRawData) { - return channel.transform.unit; - } else { - return channel.unit; - } - } - - simple_add(channel: SourceRasterLayerDescription) { - this.add(channel, channel.hasTransform && !this.useRawData); - } - - add(channel: SourceRasterLayerDescription, doTransform: boolean) { - const unit: Unit = channel.unit; - const mappingTransformation = channel.transform; - - let operator; - if (this.dataset.operator === GdalSourceType.TYPE) { - operator = this.createGdalSourceOperator(channel, doTransform); - } else { - operator = this.createMappingRasterDbSourceOperator(channel, doTransform); - } - - // if there is no colorizer data defined for the channel, create a 'viridis' coloring with min, max bounds - let colorizerConfig = - channel.colorizer && ColorizerData.is_valid(channel.colorizer) - ? channel.colorizer - : Colormap.createColorizerDataWithName('VIRIDIS', unit.min, unit.max); - - // if the dataset / channel has a transform specification, the colorizer defined for the raw data also requires transformation - if (doTransform) { - colorizerConfig = SourceDatasetComponent.createAndTransformColorizer(colorizerConfig, mappingTransformation); - } - - const layer = new RasterLayer({ - name: channel.name, - operator, - symbology: MappingRasterSymbology.createSymbology({ - unit: doTransform ? channel.transform.unit : unit, - colorizer: colorizerConfig, - }), - }); - this.projectService.addLayer(layer); - } - - @Input('useRawData') - set useRawData(useRawData: boolean) { - this._useRawData = useRawData; - } - - get useRawData(): boolean { - return this._useRawData; - } - - get channels(): Array { - return this.dataset.rasterLayer; - } - - get channelDataSource(): ChannelDataSource { - return this._channelSource; - } - - get displayedColumns(): Array { - return this._displayedColumns; - } - - isSingleLayerDataset(): boolean { - return this.dataset.rasterLayer.length <= 1; - } - - toggleImages() { - this._showPreview = !this._showPreview; - } - - toggleDescriptions() { - this._showDescription = !this._showDescription; - } - - toggleTransform() { - this._useRawData = !this._useRawData; - } - - /** - * Creates a gdal_source operator and a wrapping expression operator to transform values if needed. - */ - createGdalSourceOperator(channel: SourceRasterLayerDescription, doTransform: boolean): Operator { - const sourceDataType = channel.datatype; - const sourceUnit: Unit = channel.unit; - let sourceProjection: Projection; - if (channel.coords.crs) { - sourceProjection = Projections.fromCode(channel.coords.crs); - } else { - throw new Error('No projection or EPSG code defined in [' + this.dataset.name + ']. channel.id: ' + channel.id); - } - - const operatorType = new GdalSourceType({ - channelConfig: { - channelNumber: channel.id, - displayValue: channel.name, - methodology: channel.methodology, - }, - sourcename: this.dataset.source, - transform: doTransform, // TODO: user selectable transform? - }); - - const operatorParameterOptions = new GdalSourceParameterOptions({ - operatorType: operatorType.toString(), - channelConfig: { - kind: ParameterOptionType.DICT_ARRAY, - options: this.channels.map((c, i) => { - return { - channelNumber: i, - displayValue: c.name, - methodology: c.methodology, - }; - }), - }, - }); - - const sourceOperator = new Operator({ - operatorType, - operatorTypeParameterOptions: operatorParameterOptions, - resultType: ResultTypes.RASTER, - projection: sourceProjection, - attributes: ['value'], - dataTypes: new Map().set('value', DataTypes.fromCode(sourceDataType)), - units: new Map().set('value', sourceUnit), - }); - - if (doTransform && channel.hasTransform) { - const transformUnit = channel.transform.unit; - const transformDatatype = DataTypes.fromCode(channel.transform.datatype); - - const transformOperatorType = new ExpressionType({ - unit: transformUnit, - expression: '(A -' + channel.transform.offset.toString() + ') *' + channel.transform.scale.toString(), - datatype: transformDatatype, - }); - - const transformOperator = new Operator({ - operatorType: transformOperatorType, - resultType: ResultTypes.RASTER, - projection: sourceProjection, - attributes: ['value'], - dataTypes: new Map().set('value', transformDatatype), - units: new Map().set('value', transformUnit), - rasterSources: [sourceOperator], - }); - return transformOperator; - } - - return sourceOperator; - } - - createMappingRasterDbSourceOperator(channel: SourceRasterLayerDescription, doTransform: boolean) { - let dataType = channel.datatype; - let unit: Unit = channel.unit; - - if (doTransform && channel.hasTransform) { - unit = channel.transform.unit; - dataType = channel.transform.datatype; - } - - let sourceProjection: Projection; - if (channel.coords.crs) { - sourceProjection = Projections.fromCode(channel.coords.crs); - } else { - throw new Error('No projection or EPSG code defined in [' + this.dataset.name + ']. channel.id: ' + channel.id); - } - - const operatorType = new RasterSourceType({ - channel: channel.id, - sourcename: this.dataset.source, - transform: doTransform, // TODO: user selectable transform? - }); - - const operator = new Operator({ - operatorType, - resultType: ResultTypes.RASTER, - projection: sourceProjection, - attributes: ['value'], - dataTypes: new Map().set('value', DataTypes.fromCode(dataType)), - units: new Map().set('value', unit), - }); - - return operator; - } -} - -class ChannelDataSource extends DataSource { - private channels: Array; - - constructor(channels: Array) { - super(); - this.channels = channels; - } - - connect(): Observable> { - return observableOf(this.channels); - } - - disconnect() {} -} diff --git a/projects/wave-core/src/lib/operators/dialogs/data-repository/vector/vector-source-dataset.component.html b/projects/wave-core/src/lib/operators/dialogs/data-repository/vector/vector-source-dataset.component.html deleted file mode 100644 index cfffffd0..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/data-repository/vector/vector-source-dataset.component.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - no preview image available - - -

    {{ dataset?.descriptionText }}

    -
    - - - -

    Time validity: {{ dataset?.time_start }} - {{ dataset?.time_end }}

    -
    - - open_in_new -

    - {{ dataset?.provenance?.uri }} -

    -
    -
    - - - - - Title - - {{ layer.title }} - - - - - Start - - {{ layer.time_start }} - - - - - End - - {{ layer.time_end }} - - - - - - - -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/data-repository/vector/vector-source-dataset.component.scss b/projects/wave-core/src/lib/operators/dialogs/data-repository/vector/vector-source-dataset.component.scss deleted file mode 100644 index 191bd17e..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/data-repository/vector/vector-source-dataset.component.scss +++ /dev/null @@ -1,48 +0,0 @@ -@import '~@angular/material/theming'; - -$mat-button-focus-transition: opacity 200ms $swift-ease-in-out-timing-function, background-color 200ms $swift-ease-in-out-timing-function !default; - -.dataset-name { - color: var(--wave-primary-color, black) !important; -} - -.dataset-uri { - overflow: hidden; - text-overflow: ellipsis; -} - -.secondary_action { - float: right; -} - -mat-list-item { - font-size: 12px; -} - -.mat-row { - color: var(--wave-primary-color, black) !important; - cursor: pointer; - min-height: 40px !important; -} - -.mat-cell { - font-size: 12px; -} - -// Element that overlays the button to show focus and hover effects. -.mat-row:hover { - // The button spec calls for focus on raised buttons (and FABs) to be indicated with a - // black, 12% opacity shade over the normal color (for both light and dark themes). - background-color: rgba(black, 0.12); - border-radius: inherit; - opacity: 1; - - transition: $mat-button-focus-transition; - - @include cdk-high-contrast { - // Note that IE will render this in the same way, no - // matter whether the theme is light or dark. This helps - // with the readability of focused buttons. - background-color: rgba(white, 0.5); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/data-repository/vector/vector-source-dataset.component.ts b/projects/wave-core/src/lib/operators/dialogs/data-repository/vector/vector-source-dataset.component.ts deleted file mode 100644 index acf4ec2d..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/data-repository/vector/vector-source-dataset.component.ts +++ /dev/null @@ -1,200 +0,0 @@ -import {of as observableOf, Observable} from 'rxjs'; -import {ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges} from '@angular/core'; -import {MappingSource, SourceVectorLayerDescription} from '../mapping-source.model'; -import {Projection, Projections} from '../../../projection.model'; -import {DataType, DataTypes} from '../../../datatype.model'; -import {VectorLayer} from '../../../../layers/layer.model'; -import {PointSymbology, VectorSymbology, LineSymbology} from '../../../../layers/symbology/symbology.model'; -import {Operator} from '../../../operator.model'; -import {ProjectService} from '../../../../project/project.service'; -import {DataSource} from '@angular/cdk/table'; - -import {RandomColorService} from '../../../../util/services/random-color.service'; -import {OgrSourceType} from '../../../types/ogr-source-type.model'; -import {ResultTypes} from '../../../result-type.model'; -import {WHITE} from '../../../../colors/color'; -import {NotificationService} from '../../../../notification.service'; - -@Component({ - selector: 'wave-vector-source-dataset', - templateUrl: './vector-source-dataset.component.html', - styleUrls: ['./vector-source-dataset.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class VectorSourceDatasetComponent implements OnInit, OnChanges { - @Input() dataset: MappingSource; - @Input() searchTerm: string; - _useRawData = false; - _showPreview = false; - _showDescription = false; - _tableSource: LayerTableDataSource; - _displayedColumns = ['title']; - - constructor( - private projectService: ProjectService, - private randomColorService: RandomColorService, - private notificationService: NotificationService, - ) {} - - ngOnInit(): void { - this._tableSource = new LayerTableDataSource(this.dataset.vectorLayer); - } - - add(layer: SourceVectorLayerDescription) { - let operator; - if (this.dataset.operator === OgrSourceType.TYPE) { - operator = this.createOgrSourceOperator(layer); - } else { - throw new Error('Unsupported operator: ' + this.dataset.operator); - } - - let clustered = false; - let symbology; - switch (operator.resultType) { - case ResultTypes.POINTS: { - symbology = PointSymbology.createClusterSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - fillColorizer: layer.colorizer, - }); - clustered = true; - break; - } - case ResultTypes.POLYGONS: { - symbology = VectorSymbology.createSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - fillColorizer: layer.colorizer, - }); - break; - } - case ResultTypes.LINES: { - symbology = LineSymbology.createSymbology({ - fillRGBA: WHITE, - strokeRGBA: this.randomColorService.getRandomColorRgba(), - strokeWidth: 2, - }); - break; - } - default: { - throw new Error('unhandled result type: ' + operator.resultType.name); - } - } - - const l = new VectorLayer({ - name: layer.name, - operator, - symbology, - clustered, - }); - this.projectService.addLayer(l); - } - ngOnChanges(changes: SimpleChanges) { - for (const key in changes) { - if (changes.hasOwnProperty(key)) { - switch (key) { - // check if there is any time-validity start/end data. If there is start/end data show the column of this data. - case 'dataset': { - this.dataset.rasterLayer.forEach((element) => { - if (element.time_start && this.dataset.time_start && !this.dataset.time_start.isSame(element.time_start)) { - if (!this._displayedColumns.includes('start')) { - this._displayedColumns.push('start'); - } - } - if (element.time_end && this.dataset.time_end && !this.dataset.time_end.isSame(element.time_end)) { - if (!this._displayedColumns.includes('end')) { - this._displayedColumns.push('end'); - } - } - // get start and end in the right order - if (this._displayedColumns[2] === 'end' && this._displayedColumns[3] === 'start') { - this._displayedColumns[2] = 'start'; - this._displayedColumns[3] = 'end'; - } - }); - } - } - } - } - } - - get layers(): Array { - return this.dataset.vectorLayer; - } - - get layerTableDataSource(): LayerTableDataSource { - return this._tableSource; - } - - get displayedColumns(): Array { - return this._displayedColumns; - } - - isSingleLayerDataset(): boolean { - return this.dataset.rasterLayer.length <= 1; - } - - toggleImages() { - this._showPreview = !this._showPreview; - } - - toggleDescriptions() { - this._showDescription = !this._showDescription; - } - - /** - * Creates a gdal_source operator and a wrapping expression operator to transform values if needed. - */ - createOgrSourceOperator(layer: SourceVectorLayerDescription): Operator { - if (!layer.geometryType) { - this.notificationService.error( - 'No geometry type defined in [' + this.dataset.name + '] assuming "POINTS". (channel.id: ' + layer.id + ')', - ); - layer.geometryType = 'POINTS'; - } - - const sourceDataType = ResultTypes.fromCode(layer.geometryType); - - if (!layer.coords || !layer.coords.crs) { - this.notificationService.error( - 'No projection or EPSG code defined in [' + this.dataset.name + '] assuming EPSG:4326. (channel.id: ' + layer.id + ')', - ); - layer.coords = {crs: 'EPSG:4326'}; - } - - const sourceProjection = Projections.fromCode(layer.coords.crs); - const dataTypes = new Map(); - layer.numeric.forEach((x) => dataTypes.set(x, DataTypes.Float32)); - layer.textual.forEach((x) => dataTypes.set(x, DataTypes.Alphanumeric)); - - const operatorType = new OgrSourceType({ - dataset_id: this.dataset.name, - layer_id: layer.id, - textual: layer.textual, - numeric: layer.numeric, - }); - - const sourceOperator = new Operator({ - operatorType, - resultType: sourceDataType, - projection: sourceProjection, - attributes: [].concat(layer.numeric, layer.textual), - dataTypes, - }); - - return sourceOperator; - } -} - -class LayerTableDataSource extends DataSource { - private layers: Array; - - constructor(layers: Array) { - super(); - this.layers = layers; - } - - connect(): Observable> { - return observableOf(this.layers); - } - - disconnect() {} -} diff --git a/projects/wave-core/src/lib/operators/dialogs/draw-features/ol-draw-features.component.html b/projects/wave-core/src/lib/operators/dialogs/draw-features/ol-draw-features.component.html deleted file mode 100644 index 0c15700f..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/draw-features/ol-draw-features.component.html +++ /dev/null @@ -1,29 +0,0 @@ -Draw Features - - -

    - This is a tool for drawing new features by clicking on the map. Select the Feature type you want to draw (points, lines or - polygons) and click Start. Click the End button if you are finished or Cancel if you want to start all over. - The new layer appears in the layer list on the left. -

    -

    Note: In the layer's context menu you can change the layer name, edit the symbology and more.

    -
    - - - - {{ featureType }} - - - -
    - - - - - -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/draw-features/ol-draw-features.component.scss b/projects/wave-core/src/lib/operators/dialogs/draw-features/ol-draw-features.component.scss deleted file mode 100644 index f611aa27..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/draw-features/ol-draw-features.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -:host { - display: block; - padding: 1rem; -} - -mat-form-field { - width: 100%; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/draw-features/ol-draw-features.component.ts b/projects/wave-core/src/lib/operators/dialogs/draw-features/ol-draw-features.component.ts deleted file mode 100644 index f4586c30..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/draw-features/ol-draw-features.component.ts +++ /dev/null @@ -1,170 +0,0 @@ -import {ChangeDetectionStrategy, Component, OnDestroy} from '@angular/core'; -import {MapService} from '../../../map/map.service'; -import OlFormatGeoJson from 'ol/format/GeoJSON'; -import {Vector as OlVectorSource} from 'ol/source'; -import OlGeometryType from 'ol/geom/GeometryType'; -import {Projections, Projection} from '../../projection.model'; -import {Operator} from '../../operator.model'; -import {AbstractVectorSymbology, LineSymbology, PointSymbology, VectorSymbology} from '../../../layers/symbology/symbology.model'; -import {UnexpectedResultType} from '../../../util/errors'; -import {VectorLayer} from '../../../layers/layer.model'; -import {ResultType, ResultTypes} from '../../result-type.model'; -import {ProjectService} from '../../../project/project.service'; -import {RandomColorService} from '../../../util/services/random-color.service'; -import {NotificationService} from '../../../notification.service'; -import {Subscription} from 'rxjs'; -import {OgrRawSourceType} from '../../types/ogr-raw-source-type.model'; -import {DataTypes} from '../../datatype.model'; -import {Map as ImmutableMap} from 'immutable'; -import {Unit} from '../../unit.model'; - -/** - * The feature draw component. Together with the MapService it allows to add new fueatures by drawing them on the map. - */ -@Component({ - selector: 'wave-ol-draw-features', - templateUrl: './ol-draw-features.component.html', - styleUrls: ['./ol-draw-features.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class OlDrawFeaturesComponent implements OnDestroy { - // the list of supported feature types - featureTypes = [ResultTypes.POLYGONS, ResultTypes.POINTS, ResultTypes.LINES]; - // the current feature type - selectedFeatureType: ResultType; - // the corresponding open layers geometry type - olGeometryType: OlGeometryType; - - isDrawingActive = false; - // the open layers feature writer - we use GeoJson - olFeatureWriter = new OlFormatGeoJson(); - - featureLayerName = 'new feature layer'; - - // the projection of the map - mapProjection: Projection; - // a subscription providing the map projection and updates if it changes - mapProjectionSubscription: Subscription; - - constructor( - private mapService: MapService, - private projectService: ProjectService, - private randomColorService: RandomColorService, - private notificationService: NotificationService, - ) { - this.mapProjectionSubscription = projectService.getProjectionStream().subscribe((p) => (this.mapProjection = p)); - } - - ngOnDestroy(): void { - if (this.isDrawingActive) { - this.cancelDrawing(); - } - this.mapProjectionSubscription.unsubscribe(); - } - - updateFeatureType(resultType: ResultType) { - this.selectedFeatureType = resultType; - - switch (resultType) { - case ResultTypes.POINTS: - this.olGeometryType = OlGeometryType.POINT; - break; - case ResultTypes.POLYGONS: - this.olGeometryType = OlGeometryType.POLYGON; - break; - case ResultTypes.LINES: - this.olGeometryType = OlGeometryType.LINE_STRING; - break; - default: - throw new UnexpectedResultType(); - } - } - - startDrawing() { - this.isDrawingActive = true; - this.mapService.startDrawInteraction(this.olGeometryType); - this.notificationService.info('Start drawing…'); - } - - cancelDrawing() { - this.isDrawingActive = false; - this.mapService.endDrawInteraction(); - this.notificationService.info('Draw features canceled.'); - } - - endDrawing() { - this.isDrawingActive = false; - const olSource = this.mapService.endDrawInteraction(); - if (olSource.getFeatures().length > 0) { - this.createAndAddOperatorFromSource(olSource); - } else { - this.notificationService.info('Empty layer skipped.'); - } - } - - private createAndAddOperatorFromSource(olSource: OlVectorSource) { - let resultSymbology: AbstractVectorSymbology; - - switch (this.selectedFeatureType) { - case ResultTypes.POINTS: - resultSymbology = PointSymbology.createSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }); - break; - case ResultTypes.POLYGONS: - resultSymbology = VectorSymbology.createSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }); - break; - case ResultTypes.LINES: - resultSymbology = LineSymbology.createSymbology({ - strokeRGBA: this.randomColorService.getRandomColorRgba(), - }); - break; - default: - throw new UnexpectedResultType(); - } - - resultSymbology.textAttribute = 'id'; - - const geoJson = this.olFeatureWriter.writeFeaturesObject(olSource.getFeatures(), { - featureProjection: this.mapProjection.getCode(), - dataProjection: Projections.WGS_84.getCode(), - }); - - // add `id` attribute to each feature - for (let i = 0; i < geoJson.features.length; ++i) { - geoJson.features[i].properties = {id: i + 1}; - } - - const dataUrl = `data:text/json,${encodeURIComponent(JSON.stringify(geoJson))}`; - - const sourceType = new OgrRawSourceType({ - filename: dataUrl, - time: 'none', - columns: { - numeric: ['id'], - textual: [], - }, - on_error: 'abort', - }); - - const operator = new Operator({ - operatorType: sourceType, - resultType: this.selectedFeatureType, - projection: Projections.WGS_84, - attributes: ['id'], - dataTypes: ImmutableMap({id: DataTypes.UInt32}), - units: ImmutableMap({id: Unit.defaultUnit}), - }); - - const layer = new VectorLayer({ - name: this.featureLayerName, - operator, - symbology: resultSymbology, - clustered: false, - }); - - this.projectService.addLayer(layer); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/expression-operator/expression-operator.component.html b/projects/wave-core/src/lib/operators/dialogs/expression-operator/expression-operator.component.html deleted file mode 100644 index 16992ef5..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/expression-operator/expression-operator.component.html +++ /dev/null @@ -1,84 +0,0 @@ -Calculate Expression on Raster - - -

    The Expression Operator allows applying mathematical calculations on one or more raster layers.

    -

    - For the expression, each raster is referred to as an alphabetic character, e.g., A for the first raster. It is possible to use basic - operations like +, -, * and /, e.g., A + B. -

    -

    - It is necessary to specify the output datatype for the expression. The list indicates the data type of the input. Furthermore, it is - required to specify the number range of the data in the form of min and max values. The system will choose an appropriate NO DATA - value automatically. -

    -

    - There is the option to specify an output unit for the expression result, e.g. temperature in °C. This will be shown in - the legend and automatically used in plots, etc. -

    -

    - Since the input rasters can be in differing projections, it is required to specify the output projection. This projection is used - when applying the operator. -

    -
    - -
    -
    - - -

    Use A to reference the existing pixel of the first raster, B for the second one, etc.

    - - Expression - - - - Output Data Type - - - {{ dataType[0] }} {{ dataType[1] }} - - - -
    - - Minimum Value - - -
    - - Maximum Value - - -
    - - Output Unit - - Unitless - {{ unit }} - Custom - - -
    - - Measurement - - - - Unit - - -
    - You must select a unit or specify one - - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/expression-operator/expression-operator.component.scss b/projects/wave-core/src/lib/operators/dialogs/expression-operator/expression-operator.component.scss deleted file mode 100644 index 9599b01e..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/expression-operator/expression-operator.component.scss +++ /dev/null @@ -1,30 +0,0 @@ -:host { - display: block; - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.container { - .custom-unit { - margin-bottom: 1rem; - } - - > mat-error { - margin-bottom: 1rem; - } -} - -.actions { - text-align: right; - padding: 1rem; -} - -mat-form-field { - width: 100%; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/expression-operator/expression-operator.component.ts b/projects/wave-core/src/lib/operators/dialogs/expression-operator/expression-operator.component.ts deleted file mode 100644 index 44f490eb..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/expression-operator/expression-operator.component.ts +++ /dev/null @@ -1,241 +0,0 @@ -import {filter, map, tap} from 'rxjs/operators'; -import {Observable, Subscription} from 'rxjs'; - -import {AfterViewInit, ChangeDetectionStrategy, Component, OnDestroy} from '@angular/core'; -import {FormControl, FormGroup, ValidationErrors, Validators} from '@angular/forms'; -import {ResultTypes} from '../../result-type.model'; -import {DataType, DataTypes} from '../../datatype.model'; -import {Interpolation, Unit} from '../../unit.model'; -import {LetterNumberConverter} from '../helpers/multi-layer-selection/multi-layer-selection.component'; -import {Operator} from '../../operator.model'; -import {ExpressionType} from '../../types/expression-type.model'; -import {RasterLayer} from '../../../layers/layer.model'; -import {MappingRasterSymbology} from '../../../layers/symbology/symbology.model'; -import {WaveValidators} from '../../../util/form.validators'; -import {ProjectService} from '../../../project/project.service'; - -/** - * This dialog allows calculations on (one or more) raster layers. - */ -@Component({ - selector: 'wave-expression-operator', - templateUrl: './expression-operator.component.html', - styleUrls: ['./expression-operator.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ExpressionOperatorComponent implements AfterViewInit, OnDestroy { - private static readonly RASTER_VALUE = 'value'; - readonly RASTER_TYPE = [ResultTypes.RASTER]; - readonly UNITLESS_UNIT = Unit.defaultUnit; - readonly CUSTOM_UNIT_ID = 'CUSTOM'; - - form: FormGroup; - - outputDataTypes$: Observable>; - outputUnits$: Observable>; - outputUnitIsCustom$: Observable; - - unitSubscription: Subscription; - - /** - * DI of services and setup of observables for the template - */ - constructor(private projectService: ProjectService) { - this.form = new FormGroup( - { - rasterLayers: new FormControl(undefined, [Validators.required]), - expression: new FormControl('1 * A', Validators.compose([Validators.required, Validators.pattern('.*A.*')])), - dataType: new FormControl(undefined, [Validators.required]), - minValue: new FormControl(0, Validators.compose([WaveValidators.isNumber])), - maxValue: new FormControl(0, Validators.compose([WaveValidators.isNumber])), - unit: new FormControl(undefined, [Validators.required]), - customUnit: new FormGroup({ - measurement: new FormControl(undefined, [Validators.required]), - unit: new FormControl(undefined, [Validators.required]), - }), - projection: new FormControl(undefined, [Validators.required]), - name: new FormControl('Expression', [Validators.required, WaveValidators.notOnlyWhitespace]), - }, - [unitOrCustomUnit], - ); - - this.outputUnits$ = this.form.controls.rasterLayers.valueChanges.pipe( - map((rasterLayers: Array>) => { - return rasterLayers - .map((layer) => layer.operator.getUnit(ExpressionOperatorComponent.RASTER_VALUE)) - .filter((unit) => unit !== this.UNITLESS_UNIT); - }), - tap((outputUnits) => { - const unitControl = this.form.controls['unit']; - const currentUnit: Unit = unitControl.value; - if (outputUnits.length > 0 && outputUnits.indexOf(currentUnit) === -1) { - setTimeout(() => { - unitControl.setValue(outputUnits[0]); - }); - } - - return outputUnits; - }), - ); - - this.outputUnitIsCustom$ = this.form.controls.unit.valueChanges.pipe( - map((unit) => unit === this.CUSTOM_UNIT_ID), - tap((isCustomUnit) => { - if (isCustomUnit) { - this.form.controls.customUnit.enable({onlySelf: true}); - } else { - this.form.controls.customUnit.disable({onlySelf: true}); - } - }), - ); - - this.unitSubscription = this.form.controls.unit.valueChanges - .pipe(filter((unit) => unit instanceof Unit)) - .subscribe((unit: Unit) => { - if (unit.min) { - this.form.controls.minValue.setValue(unit.min); - } - if (unit.max) { - this.form.controls.maxValue.setValue(unit.max); - } - }); - - this.outputDataTypes$ = this.form.controls.rasterLayers.valueChanges.pipe( - map((rasterLayers: Array>) => { - const outputDataTypes = DataTypes.ALL_NUMERICS.map((dataType: DataType) => [dataType, '']) as Array<[DataType, string]>; - - const rasterDataTypes = rasterLayers.map((layer) => - layer ? layer.operator.getDataType(ExpressionOperatorComponent.RASTER_VALUE) : undefined, - ); - - for (let i = 0; i < outputDataTypes.length; i++) { - const outputDataType = outputDataTypes[i][0]; - - const indices = rasterDataTypes - .map((dataType, index) => (dataType === outputDataType ? index : -1)) - .filter((index) => index >= 0) - .map((index) => LetterNumberConverter.toLetters(index + 1)); - - if (indices.length > 0) { - outputDataTypes[i][1] = `(like ${indices.length > 1 ? 'layers' : 'layer'} ${indices.join(', ')})`; - } - } - - return outputDataTypes; - }), - tap((outputDataTypes) => { - const dataTypeControl = this.form.controls.dataType; - const currentDataType: DataType = dataTypeControl.value; - - const rasterDataTypes = (this.form.controls.rasterLayers.value as Array>) - .map((layer) => (layer ? layer.operator.getDataType(ExpressionOperatorComponent.RASTER_VALUE) : undefined)) - .filter((layer) => !!layer); - - if (rasterDataTypes.includes(currentDataType)) { - // is already set at a meaningful type - return; - } - - let selectedDataType: DataType = currentDataType ? currentDataType : outputDataTypes[0][0]; // use default - if (rasterDataTypes.length) { - selectedDataType = rasterDataTypes[0]; - } - - setTimeout(() => { - dataTypeControl.setValue(selectedDataType); - }); - }), - ); - } - - ngAfterViewInit() { - setTimeout(() => - this.form.controls['rasterLayers'].updateValueAndValidity({ - onlySelf: false, - emitEvent: true, - }), - ); - } - - ngOnDestroy() { - this.unitSubscription.unsubscribe(); - } - - /** - * Uses the user input and creates a new expression operator. - * The resulting layer is added to the map. - */ - add() { - const name: string = this.form.controls['name'].value; - const dataType: DataType = this.form.controls['dataType'].value; - const expression: string = this.form.controls['expression'].value; - const rasterLayers = this.form.controls['rasterLayers'].value; - const projection = this.form.controls['projection'].value; - const minValue = this.form.controls['minValue'].value; - const maxValue = this.form.controls['maxValue'].value; - - const selectedUnit: Unit | string = this.form.controls['unit'].value; - let unit: Unit; - if (selectedUnit instanceof Unit) { - unit = new Unit({ - measurement: selectedUnit.measurement, - unit: selectedUnit.unit, - interpolation: selectedUnit.interpolation, - classes: selectedUnit.classes, - min: minValue, - max: maxValue, - }); - } else { - // custom unit from strings - unit = new Unit({ - measurement: this.form.controls.customUnit.value.measurement, - unit: this.form.controls.customUnit.value.unit, - interpolation: Interpolation.Continuous, - min: minValue, - max: maxValue, - }); - } - - const operator = new Operator({ - operatorType: new ExpressionType({ - expression, - datatype: dataType, - unit, - }), - resultType: ResultTypes.RASTER, - projection, - attributes: ['value'], - dataTypes: new Map().set('value', dataType), - units: new Map().set('value', unit), - rasterSources: rasterLayers.map((l) => l.operator.getProjectedOperator(projection)), - }); - - const layer = new RasterLayer({ - name, - operator, - symbology: MappingRasterSymbology.createSymbology({unit}), - }); - this.projectService.addLayer(layer); - } -} - -/** - * This is a validator function that checks whether a fields contains either a valid existing unit - * or a new (custom) unit. - */ -function unitOrCustomUnit(group: FormGroup): ValidationErrors | null { - const unit: Unit = group.controls.unit.value; - if (unit instanceof Unit) { - return null; - } - - const customUnit: {measurement: string; unit: string} = group.controls.customUnit.value; - - if (customUnit.measurement && customUnit.unit) { - return null; - } - - return { - unitOrCustomUnit: true, - }; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/featuredb-source-list/featuredb-source-list.component.html b/projects/wave-core/src/lib/operators/dialogs/featuredb-source-list/featuredb-source-list.component.html deleted file mode 100644 index 2b5307fa..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/featuredb-source-list/featuredb-source-list.component.html +++ /dev/null @@ -1,19 +0,0 @@ -Custom Features - - - - - - - - - - -

    -

    Add this {{ entry.operator.resultType }} data set.

    -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/featuredb-source-list/featuredb-source-list.component.scss b/projects/wave-core/src/lib/operators/dialogs/featuredb-source-list/featuredb-source-list.component.scss deleted file mode 100644 index 3ff806ed..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/featuredb-source-list/featuredb-source-list.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -mat-toolbar ::ng-deep mat-toolbar-row:first-child { - display: none; -} - -mat-list-item { - cursor: pointer; -} - -p { - color: var(--wave-foreground-secondary-text-color, grey); -} - -mat-list-item ::ng-deep .highlight { - color: var(--wave-accent-color, grey); -} diff --git a/projects/wave-core/src/lib/operators/dialogs/featuredb-source-list/featuredb-source-list.component.ts b/projects/wave-core/src/lib/operators/dialogs/featuredb-source-list/featuredb-source-list.component.ts deleted file mode 100644 index 5e304dee..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/featuredb-source-list/featuredb-source-list.component.ts +++ /dev/null @@ -1,87 +0,0 @@ -import {combineLatest as observableCombineLatest, BehaviorSubject, Observable, ReplaySubject} from 'rxjs'; -import {first, map} from 'rxjs/operators'; - -import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core'; -import {UserService} from '../../../users/user.service'; -import {Operator} from '../../operator.model'; -import {VectorLayer} from '../../../layers/layer.model'; -import {ResultTypes} from '../../result-type.model'; -import {AbstractVectorSymbology, PointSymbology, VectorSymbology} from '../../../layers/symbology/symbology.model'; -import {RandomColorService} from '../../../util/services/random-color.service'; -import {CsvDialogComponent} from '../csv/csv-dialog/csv-dialog.component'; -import {MatDialog} from '@angular/material/dialog'; -import {ProjectService} from '../../../project/project.service'; - -function nameComparator(a: string, b: string): number { - const stripped = (s: string): string => s.replace(' ', ''); - - return stripped(a).localeCompare(stripped(b)); -} - -@Component({ - selector: 'wave-featuredb-source-list', - templateUrl: './featuredb-source-list.component.html', - styleUrls: ['./featuredb-source-list.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class FeaturedbSourceListComponent implements OnInit { - searchString$ = new BehaviorSubject(''); - entries$ = new ReplaySubject>(1); - filteredEntries$: Observable>; - - constructor( - private userService: UserService, - private projectService: ProjectService, - private randomColorService: RandomColorService, - public dialog: MatDialog, - ) {} - - ngOnInit() { - this.refresh(); - - this.filteredEntries$ = observableCombineLatest(this.entries$, this.searchString$, (entries, searchString) => - entries.filter((entry) => entry.name.indexOf(searchString) >= 0).sort((a, b) => nameComparator(a.name, b.name)), - ); - } - - refresh() { - this.userService - .getFeatureDBList() - .pipe(map((entries) => entries.sort())) - .subscribe((entries) => this.entries$.next(entries)); - } - - openCSVDialog() { - this.dialog - .open(CsvDialogComponent) - .afterClosed() - .pipe(first()) - .subscribe(() => this.refresh()); - } - - add(entry: {name: string; operator: Operator}) { - const color = this.randomColorService.getRandomColorRgba(); - let symbology: AbstractVectorSymbology; - let clustered: boolean; - - if (entry.operator.resultType === ResultTypes.POINTS) { - symbology = PointSymbology.createClusterSymbology({ - fillRGBA: color, - }); - clustered = true; - } else { - symbology = VectorSymbology.createSymbology({ - fillRGBA: color, - }); - clustered = false; - } - - const layer = new VectorLayer({ - name: entry.name, - operator: entry.operator, - symbology, - clustered, - }); - this.projectService.addLayer(layer); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/gbif-operator/gbif-operator.component.html b/projects/wave-core/src/lib/operators/dialogs/gbif-operator/gbif-operator.component.html deleted file mode 100644 index a065eb72..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/gbif-operator/gbif-operator.component.html +++ /dev/null @@ -1,56 +0,0 @@ -GBIF Occurences Loader -
    -
    - -
    - - Search Level - - - {{ level }} - - - -
    - -
    - - - - - - {{ result }} - - -
    -
    - - -
    -
    -
    - - -
    - GBIF ({{ gbifCount }}) - IUCN ({{ iucnCount }}) -

    No Lookup Results

    -
    -
    - -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/gbif-operator/gbif-operator.component.scss b/projects/wave-core/src/lib/operators/dialogs/gbif-operator/gbif-operator.component.scss deleted file mode 100644 index 2f62bb05..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/gbif-operator/gbif-operator.component.scss +++ /dev/null @@ -1,14 +0,0 @@ -:host { - display: block; - padding: 1rem; -} - -mat-progress-spinner { - width: 25%; - height: auto; - margin: 0 auto; -} - -button:last-child { - margin-top: 2rem; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/gbif-operator/gbif-operator.component.ts b/projects/wave-core/src/lib/operators/dialogs/gbif-operator/gbif-operator.component.ts deleted file mode 100644 index cf2d906f..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/gbif-operator/gbif-operator.component.ts +++ /dev/null @@ -1,322 +0,0 @@ -import {BehaviorSubject, Observable, of as observableOf, Subscription} from 'rxjs'; -import {distinctUntilChanged, mergeMap, startWith, throttleTime} from 'rxjs/operators'; - -import {AfterViewInit, ChangeDetectionStrategy, Component, OnDestroy, OnInit, ViewChild} from '@angular/core'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; -import {Config} from '../../../config.service'; -import {MappingQueryService} from '../../../queries/mapping-query.service'; -import {OperatorType} from '../../operator-type.model'; -import {ResultType, ResultTypes} from '../../result-type.model'; -import {BasicColumns, GFBioSourceType} from '../../types/gfbio-source-type.model'; -import {Operator} from '../../operator.model'; -import {Projections} from '../../projection.model'; -import {AbstractVectorSymbology, PointSymbology, VectorSymbology, MappingRasterSymbology} from '../../../layers/symbology/symbology.model'; -import {RandomColorService} from '../../../util/services/random-color.service'; -import {Interpolation, Unit} from '../../unit.model'; -import {DataType, DataTypes} from '../../datatype.model'; -import {HttpClient} from '@angular/common/http'; -import {LayerService} from '../../../layers/layer.service'; -import {RasterLayer, VectorLayer} from '../../../layers/layer.model'; -import {UnexpectedResultType} from '../../../util/errors'; -import {MatAutocompleteTrigger} from '@angular/material/autocomplete'; -import {ProjectService} from '../../../project/project.service'; -import {HeatmapType} from '../../types/heatmap-type.model'; - -function oneIsTrue(group: FormGroup): {[key: string]: boolean} { - const errors: { - noneIsTrue?: boolean; - } = {}; - - let noneIsTrue = true; - for (const key in group.controls) { - if (group.controls[key].value as boolean) { - noneIsTrue = false; - break; - } - } - if (noneIsTrue) { - errors.noneIsTrue = true; - } - - return Object.keys(errors).length > 0 ? errors : null; -} - -enum Mode { - SEARCH = 1, - SELECT = 2, -} - -@Component({ - selector: 'wave-gbif-operator', - templateUrl: './gbif-operator.component.html', - styleUrls: ['./gbif-operator.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class GbifOperatorComponent implements OnInit, AfterViewInit, OnDestroy { - Mode = Mode; - - form: FormGroup; - - @ViewChild(MatAutocompleteTrigger, {static: true}) autoCompleteTrigger: MatAutocompleteTrigger; - - mode$ = new BehaviorSubject(1); - loading$ = new BehaviorSubject(false); - - minSearchLength = 4; - autoCompleteResults$: Observable>; - - gbifCount: number; - iucnCount: number; - - taxonLevels: Array = ['Species', 'Genus', 'Family']; - - private gbifColumns: BasicColumns = {numeric: [], textual: []}; - private gbifAttributes: Array = []; - private gbifUnits = new Map(); - private gbifDatatypes = new Map(); - - private iucnColumns: BasicColumns = {numeric: [], textual: []}; - private iucnAttributes: Array = []; - private iucnUnits = new Map(); - private iucnDatatypes = new Map(); - - private subscriptions: Array = []; - - constructor( - private config: Config, - private mappingQueryService: MappingQueryService, - private formBuilder: FormBuilder, - private randomColorService: RandomColorService, - private http: HttpClient, - private layerService: LayerService, - private projectService: ProjectService, - ) {} - - ngOnInit() { - this.form = this.formBuilder.group({ - name: [undefined, Validators.required], - searchTerm: [undefined, Validators.required], - searchLevel: [this.taxonLevels[0], Validators.required], - select: this.formBuilder.group( - { - gbif: [false], - iucn: [false], - }, - { - validator: oneIsTrue, - }, - ), - }); - - this.subscriptions.push( - this.mode$.subscribe((mode) => { - if (mode === Mode.SEARCH) { - this.form.controls['searchTerm'].enable(); - this.form.controls['searchLevel'].enable(); - } else { - this.form.controls['searchTerm'].disable(); - this.form.controls['searchLevel'].disable(); - } - }), - ); - - this.autoCompleteResults$ = this.form.controls['searchTerm'].valueChanges.pipe( - startWith(null), - throttleTime(this.config.DELAYS.DEBOUNCE), - distinctUntilChanged(), - mergeMap((autocompleteString: string) => { - if (autocompleteString && autocompleteString.length >= this.minSearchLength) { - return this.mappingQueryService.getGBIFAutoCompleteResults(this.form.controls['searchLevel'].value, autocompleteString); - } else { - return observableOf([]); - } - }), - ); - - // TODO: think about very unlikely race condition - this.http - .get>('assets/gbif-default-fields.json') - .toPromise() - .then((fieldList) => { - for (const field of fieldList) { - this.gbifAttributes.push(field.name); - - const datatype = DataTypes.fromCode(field.datatype); - if (DataTypes.ALL_NUMERICS.indexOf(datatype) >= 0) { - this.gbifColumns.numeric.push(field.name); - } else { - this.gbifColumns.textual.push(field.name); - } - - this.gbifDatatypes.set(field.name, datatype); - this.gbifUnits.set(field.name, Unit.defaultUnit); - } - }); - } - - ngAfterViewInit() { - setTimeout(() => this.form.updateValueAndValidity(), 0); - } - - ngOnDestroy() { - this.subscriptions.forEach((subscription) => subscription.unsubscribe()); - } - - lookup() { - this.mode$.next(2); - this.loading$.next(true); - - const searchLevel = this.form.controls['searchLevel'].value as string; - const searchTerm = this.form.controls['searchTerm'].value as string; - - this.mappingQueryService.getGBIFDataSourceCounts(searchLevel, searchTerm).then((results) => { - this.loading$.next(false); - - let totalCount = 0; - for (const result of results) { - switch (result.name) { - case 'GBIF': - this.gbifCount = result.count; - break; - case 'IUCN': - this.iucnCount = result.count; - break; - default: - // ignore - } - totalCount += result.count; - } - }); - - this.autoCompleteTrigger.closePanel(); - } - - reset() { - this.mode$.next(1); - this.loading$.next(false); - - this.gbifCount = 0; - this.iucnCount = 0; - - this.form.controls['searchLevel'].setValue('Species'); - this.form.controls['searchTerm'].setValue(''); - - this.form.controls['select'].setValue({ - gbif: false, - iucn: false, - }); - } - - add() { - const layerName = this.form.controls['name'].value as string; - const searchLevel = this.form.controls['searchLevel'].value as string; - const searchTerm = this.form.controls['searchTerm'].value as string; - - if (this.form.controls['select'].value.iucn) { - this.addVectorLayer( - { - name: 'IUCN', - operatorType: new GFBioSourceType({ - dataSource: 'IUCN', - level: searchLevel, - term: searchTerm, - columns: this.iucnColumns, - }), - resultType: ResultTypes.POLYGONS, - }, - layerName, - ); - } - - if (this.form.controls['select'].value.gbif) { - const source = { - name: 'GBIF', - operatorType: new GFBioSourceType({ - dataSource: 'GBIF', - level: searchLevel, - term: searchTerm, - columns: this.gbifColumns, - }), - resultType: ResultTypes.POINTS, - }; - - this.addVectorLayer(source, layerName); - } - } - - addVectorLayer(source: {name: string; operatorType: OperatorType; resultType: ResultType}, layerName: string) { - const operator = new Operator({ - operatorType: source.operatorType, - resultType: source.resultType, - projection: Projections.WGS_84, - attributes: source.name === 'GBIF' ? this.gbifAttributes : this.iucnAttributes, - dataTypes: source.name === 'GBIF' ? this.gbifDatatypes : this.iucnDatatypes, - units: source.name === 'GBIF' ? this.gbifUnits : this.iucnUnits, - }); - - let symbology: AbstractVectorSymbology; - switch (source.resultType) { - case ResultTypes.POINTS: - symbology = PointSymbology.createClusterSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }); - break; - case ResultTypes.POLYGONS: - symbology = VectorSymbology.createSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }); - break; - default: - throw new UnexpectedResultType(); - } - - const clustered = source.resultType === ResultTypes.POINTS; - const layer = new VectorLayer({ - name: `${layerName} (${source.name})`, - operator, - symbology, - clustered, - }); - - this.projectService.addLayer(layer); - } - - addRasterLayer(source: {name: string; operatorType: OperatorType; resultType: ResultType}, layerName: string, max: number) { - const sourceOperator = new Operator({ - operatorType: source.operatorType, - resultType: source.resultType, - projection: Projections.WGS_84, - }); - - const countUnit = new Unit({ - measurement: 'count', - unit: '', - interpolation: Interpolation.Continuous, - min: 0, - max, - }); - - const heatmapOperator = new Operator({ - operatorType: new HeatmapType({ - attribute: '', - radius: 5, - }), - resultType: ResultTypes.RASTER, - projection: sourceOperator.projection, - attributes: ['value'], - dataTypes: new Map().set('value', DataTypes.UInt32), - units: new Map().set('value', countUnit), - pointSources: [sourceOperator], - }); - - this.projectService.addLayer( - new RasterLayer({ - name: `${layerName} (${source.name})`, - operator: heatmapOperator, - symbology: MappingRasterSymbology.createSymbology({ - unit: countUnit, - }), - }), - ); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/heatmap/heatmap.component.html b/projects/wave-core/src/lib/operators/dialogs/heatmap/heatmap.component.html deleted file mode 100644 index a1267b77..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/heatmap/heatmap.component.html +++ /dev/null @@ -1,22 +0,0 @@ -Heatmap -
    -
    - - - - {{ attribute.name }} - - - - - - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/heatmap/heatmap.component.scss b/projects/wave-core/src/lib/operators/dialogs/heatmap/heatmap.component.scss deleted file mode 100644 index 6200d540..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/heatmap/heatmap.component.scss +++ /dev/null @@ -1,23 +0,0 @@ -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.container { - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -mat-form-field { - width: 100%; -} - -.actions { - text-align: right; - padding: 1rem; -} - -.error { - color: var(--wave-warn-color, red); -} diff --git a/projects/wave-core/src/lib/operators/dialogs/heatmap/heatmap.component.ts b/projects/wave-core/src/lib/operators/dialogs/heatmap/heatmap.component.ts deleted file mode 100644 index 2209036b..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/heatmap/heatmap.component.ts +++ /dev/null @@ -1,127 +0,0 @@ -import {ChangeDetectionStrategy, Component, OnDestroy, OnInit} from '@angular/core'; - -import {RandomColorService} from '../../../util/services/random-color.service'; - -import {RasterLayer, VectorLayer} from '../../../layers/layer.model'; -import {Operator} from '../../operator.model'; -import {ResultTypes} from '../../result-type.model'; -import {AbstractVectorSymbology, MappingRasterSymbology} from '../../../layers/symbology/symbology.model'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; -import {WaveValidators} from '../../../util/form.validators'; -import {ProjectService} from '../../../project/project.service'; -import {ReplaySubject, Subscription} from 'rxjs'; -import {DataType, DataTypes} from '../../datatype.model'; -import {HeatmapType} from '../../types/heatmap-type.model'; -import {Unit} from '../../unit.model'; - -interface AttributeType { - name: string; - value: string; -} - -/** - * This component allows creating the heatmap operator. - */ -@Component({ - selector: 'wave-heatmap', - templateUrl: './heatmap.component.html', - styleUrls: ['./heatmap.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HeatmapOperatorComponent implements OnInit, OnDestroy { - ResultTypes = ResultTypes; // make it available in the template - - form: FormGroup; - - attributes$ = new ReplaySubject>(1); - - private subscription: Subscription; - - constructor(private randomColorService: RandomColorService, private projectService: ProjectService, private formBuilder: FormBuilder) { - this.form = formBuilder.group({ - name: ['Heatmap', [Validators.required, WaveValidators.notOnlyWhitespace]], - pointLayer: [undefined, Validators.required], - attribute: [''], - radius: [10, Validators.required], - }); - } - - ngOnInit(): void { - this.subscription = this.form.controls['pointLayer'].valueChanges.subscribe((pointLayer: VectorLayer) => { - const attributes: Array = []; - pointLayer.operator.dataTypes.forEach((datatype, attribute) => { - if (DataTypes.ALL_NUMERICS.indexOf(datatype) >= 0) { - attributes.push({ - name: attribute, - value: attribute, - }); - } - }); - attributes.push({ - name: '▱ location', - value: '', - }); - this.attributes$.next(attributes); - }); - } - - ngOnDestroy(): void { - this.subscription.unsubscribe(); - } - - add(event: Event) { - event.preventDefault(); // prevent page reload on error - - if (this.form.invalid) { - return; - } - - const pointLayer: VectorLayer = this.form.controls['pointLayer'].value; - const pointOperator: Operator = pointLayer.operator; - - const attribute: string = this.form.controls['attribute'].value; - - let dataType: DataType; - if (attribute && pointOperator.dataTypes[attribute] !== null && pointOperator.dataTypes[attribute] !== undefined) { - dataType = pointOperator.dataTypes[attribute]; - } else if (attribute) { - dataType = DataTypes.Float32; - } else { - dataType = DataTypes.UInt32; - } - - let unit: Unit; - if (attribute && pointOperator.units[attribute] !== null && pointOperator.units[attribute] !== undefined) { - unit = pointOperator.units[attribute]; - } else { - unit = Unit.defaultUnit; - } - - const radius: number = this.form.controls['radius'].value; - - const name: string = this.form.controls['name'].value; - - const operator = new Operator({ - operatorType: new HeatmapType({ - attribute, - radius, - }), - resultType: ResultTypes.RASTER, - projection: pointOperator.projection, - attributes: ['value'], - dataTypes: new Map().set('value', dataType), - units: new Map().set('value', unit), - pointSources: [pointOperator], - }); - - this.projectService.addLayer( - new RasterLayer({ - name, - operator, - symbology: MappingRasterSymbology.createSymbology({ - unit, - }), - }), - ); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/helpers/layer-selection/layer-selection.component.html b/projects/wave-core/src/lib/operators/dialogs/helpers/layer-selection/layer-selection.component.html deleted file mode 100644 index d14a539a..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/helpers/layer-selection/layer-selection.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - {{ layer.name }} - - - -

    No Input Available

    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/helpers/layer-selection/layer-selection.component.scss b/projects/wave-core/src/lib/operators/dialogs/helpers/layer-selection/layer-selection.component.scss deleted file mode 100644 index 2d7e7bc4..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/helpers/layer-selection/layer-selection.component.scss +++ /dev/null @@ -1,4 +0,0 @@ -mat-form-field { - width: 100%; - margin: 1rem 0; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/helpers/layer-selection/layer-selection.component.ts b/projects/wave-core/src/lib/operators/dialogs/helpers/layer-selection/layer-selection.component.ts deleted file mode 100644 index a6fe6c42..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/helpers/layer-selection/layer-selection.component.ts +++ /dev/null @@ -1,144 +0,0 @@ -import {first} from 'rxjs/operators'; -import {Observable, BehaviorSubject, ReplaySubject, Subject, Subscription} from 'rxjs'; - -import {Component, ChangeDetectionStrategy, forwardRef, Input, OnChanges, SimpleChange, OnDestroy} from '@angular/core'; -import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms'; -import {Layer} from '../../../../layers/layer.model'; -import {AbstractSymbology} from '../../../../layers/symbology/symbology.model'; -import {ResultType, ResultTypes} from '../../../result-type.model'; -import {ProjectService} from '../../../../project/project.service'; -import {LayerService} from '../../../../layers/layer.service'; - -/** - * This component allows selecting one layer. - */ -@Component({ - selector: 'wave-layer-selection', - templateUrl: './layer-selection.component.html', - styleUrls: ['./layer-selection.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => LayerSelectionComponent), multi: true}], -}) -export class LayerSelectionComponent implements OnChanges, OnDestroy, ControlValueAccessor { - /** - * An array of possible layers. - */ - @Input() layers: Array> | Observable>> = this.projectService.getLayerStream(); - - /** - * The type is used as a filter for the layers to choose from. - */ - @Input() types: Array = ResultTypes.ALL_TYPES; - - /** - * The title of the component (optional). - */ - @Input() title: string = undefined; - - onTouched: () => void; - onChange: (_: Layer) => void = undefined; - - filteredLayers: Subject>> = new ReplaySubject(1); - selectedLayer = new BehaviorSubject>(undefined); - - private subscriptions: Array = []; - - constructor(private layerService: LayerService, private projectService: ProjectService) { - this.subscriptions.push( - this.filteredLayers.subscribe((filteredLayers) => { - if (filteredLayers.length > 0) { - this.selectedLayer.pipe(first()).subscribe((selectedLayer) => { - const selectedLayerIndex = filteredLayers.indexOf( - selectedLayer ? selectedLayer : this.layerService.getSelectedLayer(), - ); - if (selectedLayerIndex >= 0) { - this.selectedLayer.next(filteredLayers[selectedLayerIndex]); - } else { - this.selectedLayer.next(filteredLayers[0]); - } - }); - } else { - this.selectedLayer.next(undefined); - } - }), - ); - - this.subscriptions.push( - this.selectedLayer.subscribe((selectedLayer) => { - if (this.onChange) { - this.onChange(selectedLayer); - } - }), - ); - } - - ngOnDestroy() { - for (const subscription of this.subscriptions) { - subscription.unsubscribe(); - } - } - - ngOnChanges(changes: {[propertyName: string]: SimpleChange}) { - for (let propName in changes) { - // eslint-disable-line guard-for-in - switch (propName) { - /* falls through */ - case 'layers': - case 'types': - if (this.layers instanceof Observable) { - this.layers.pipe(first()).subscribe((layers) => { - this.filteredLayers.next( - layers.filter((layer: Layer) => { - return this.types.indexOf(layer.operator.resultType) >= 0; - }), - ); - }); - } else if (this.layers instanceof Array) { - this.filteredLayers.next( - this.layers.filter((layer: Layer) => { - return this.types.indexOf(layer.operator.resultType) >= 0; - }), - ); - } - - if (this.title === undefined) { - // set title out of types - this.title = this.types - .map((type) => type.toString()) - .map((name) => (name.endsWith('s') ? name.substr(0, name.length - 1) : name)) - .join(', '); - } - - break; - default: - // do nothing - } - } - } - - onBlur() { - if (this.onTouched) { - this.onTouched(); - } - } - - writeValue(layer: Layer): void { - if (layer !== null) { - this.selectedLayer.next(layer); - } - } - - registerOnChange(fn: (_: Layer) => void): void { - this.onChange = fn; - - this.onChange(this.selectedLayer.getValue()); - } - - registerOnTouched(fn: () => void): void { - this.onTouched = fn; - } - - setSelectedLayer(layer: Layer) { - this.selectedLayer.next(layer); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/helpers/multi-layer-selection/multi-layer-selection.component.html b/projects/wave-core/src/lib/operators/dialogs/helpers/multi-layer-selection/multi-layer-selection.component.html deleted file mode 100644 index 6e3ba984..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/helpers/multi-layer-selection/multi-layer-selection.component.html +++ /dev/null @@ -1,40 +0,0 @@ -
    - -
    - - -
    -
    -
    - - - {{ layer.name }} - - -
    - -

    No Input Available

    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/helpers/multi-layer-selection/multi-layer-selection.component.scss b/projects/wave-core/src/lib/operators/dialogs/helpers/multi-layer-selection/multi-layer-selection.component.scss deleted file mode 100644 index ee60bd6a..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/helpers/multi-layer-selection/multi-layer-selection.component.scss +++ /dev/null @@ -1,13 +0,0 @@ -:host { - display: block; - padding-bottom: 1em; -} - -mat-form-field { - margin: 0.5rem 0 1rem 0; -} - -button { - min-width: unset; - margin-top: 1rem; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/helpers/multi-layer-selection/multi-layer-selection.component.ts b/projects/wave-core/src/lib/operators/dialogs/helpers/multi-layer-selection/multi-layer-selection.component.ts deleted file mode 100644 index e53936e2..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/helpers/multi-layer-selection/multi-layer-selection.component.ts +++ /dev/null @@ -1,252 +0,0 @@ -import {combineLatest as observableCombineLatest, Observable, ReplaySubject, Subject, BehaviorSubject, Subscription} from 'rxjs'; - -import {first} from 'rxjs/operators'; -import {Component, ChangeDetectionStrategy, forwardRef, SimpleChange, Input, OnChanges, OnDestroy} from '@angular/core'; -import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms'; -import {Layer} from '../../../../layers/layer.model'; -import {AbstractSymbology} from '../../../../layers/symbology/symbology.model'; -import {ResultType} from '../../../result-type.model'; -import {ProjectService} from '../../../../project/project.service'; -import {LayerService} from '../../../../layers/layer.service'; - -/** - * Singleton for a letter to number converter for ids. - */ -export const LetterNumberConverter = { - // eslint-disable-line @typescript-eslint/naming-convention, no-underscore-dangle, id-blacklist, id-match - /** - * Convert a numeric id to a alphanumeric one. - * Starting with `1`. - */ - toLetters: (num: number) => { - const mod = num % 26; - let pow = (num / 26) | 0; // eslint-disable-line no-bitwise - // noinspection CommaExpressionJS - const out = mod ? String.fromCharCode(64 + mod) : (--pow, 'Z'); - return pow ? LetterNumberConverter.toLetters(pow) + out : out; - }, - - /** - * Convert an alphanumeric id to a numeric one. - * Starting with `A`. - */ - fromLetters: (str: string) => { - let out = 0; - const len = str.length; - let pos = len; - while (--pos > -1) { - out += (str.charCodeAt(pos) - 64) * Math.pow(26, len - 1 - pos); - } - return out; - }, -}; - -@Component({ - selector: 'wave-multi-layer-selection', - templateUrl: './multi-layer-selection.component.html', - styleUrls: ['./multi-layer-selection.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MultiLayerSelectionComponent), multi: true}], -}) -export class MultiLayerSelectionComponent implements ControlValueAccessor, OnChanges, OnDestroy { - /** - * An array of possible layers. - */ - @Input() layers: Array> | Observable>> = this.projectService.getLayerStream(); - - /** - * The minimum number of elements to select. - */ - @Input() min = 1; - - /** - * The maximum number of elements to select. - */ - @Input() max = 1; - - /** - * The initial amount of elements to select. - */ - @Input() initialAmount = 1; - - /** - * The type is used as a filter for the layers to choose from. - */ - @Input() types: Array; - - /** - * The title of the component (optional). - */ - @Input() title: string = undefined; - - onTouched: () => void; - onChange: (_: Array>) => void = undefined; - - filteredLayers: Subject>> = new ReplaySubject(1); - selectedLayers = new BehaviorSubject>>([]); - - private layerSubscription: Subscription; - private selectionSubscription: Subscription; - - constructor(private projectService: ProjectService, private layerService: LayerService) { - this.layerSubscription = this.filteredLayers.subscribe((filteredLayers) => { - this.selectedLayers.next(this.layersForInitialSelection(filteredLayers, [], this.initialAmount)); - }); - - this.selectionSubscription = this.selectedLayers.subscribe((selectedLayers) => { - if (this.onChange) { - this.onChange(selectedLayers); - } - }); - } - - ngOnChanges(changes: {[propertyName: string]: SimpleChange}) { - let minMaxInitialChanged = false; - let initialChange = false; - - for (const propName in changes) { - // eslint-disable-line guard-for-in - switch (propName) { - case 'initialAmount': - initialChange = changes[propName].isFirstChange(); - /* falls through */ - case 'min': - case 'max': - minMaxInitialChanged = true; - break; - case 'layers': - case 'types': - if (this.layers instanceof Observable) { - this.layers.pipe(first()).subscribe((layers) => { - this.filteredLayers.next( - layers.filter((layer: Layer) => { - return this.types.indexOf(layer.operator.resultType) >= 0; - }), - ); - }); - } else if (this.layers instanceof Array) { - this.filteredLayers.next( - this.layers.filter((layer: Layer) => { - return this.types.indexOf(layer.operator.resultType) >= 0; - }), - ); - } - - if (this.title === undefined) { - this.title = this.types.map((type) => type.toString()).join(', '); - } - break; - - default: - // DO NOTHING - } - } - - if (minMaxInitialChanged) { - observableCombineLatest(this.filteredLayers, this.selectedLayers) - .pipe(first()) - .subscribe(([filteredLayers, selectedLayers]) => { - const amountOfLayers = selectedLayers.length; - - if (this.max < amountOfLayers) { - // remove selected layers - const difference = amountOfLayers - this.max; - this.selectedLayers.next(selectedLayers.slice(0, amountOfLayers - difference)); - } else if (this.min > amountOfLayers) { - // add selected layers - const difference = this.min - amountOfLayers; - this.selectedLayers.next(selectedLayers.concat(this.layersForInitialSelection(filteredLayers, [], difference))); - } - - if (initialChange) { - // set initial layers - this.selectedLayers.next(this.layersForInitialSelection(filteredLayers, [], this.initialAmount)); - } - }); - } - } - - ngOnDestroy() { - this.layerSubscription.unsubscribe(); - this.selectionSubscription.unsubscribe(); - } - - updateLayer(index: number, layer: Layer) { - this.selectedLayers.pipe(first()).subscribe((selectedLayers) => { - const newSelectedLayers = [...selectedLayers]; - newSelectedLayers[index] = layer; - this.selectedLayers.next(newSelectedLayers); - }); - } - - add() { - observableCombineLatest(this.filteredLayers, this.selectedLayers) - .pipe(first()) - .subscribe(([filteredLayers, selectedLayers]) => { - this.selectedLayers.next(selectedLayers.concat(this.layersForInitialSelection(filteredLayers, selectedLayers, 1))); - - this.onBlur(); - }); - } - - remove() { - this.selectedLayers.pipe(first()).subscribe((selectedLayers) => { - this.selectedLayers.next(selectedLayers.slice(0, selectedLayers.length - 1)); - - this.onBlur(); - }); - } - - onBlur() { - if (this.onTouched) { - this.onTouched(); - } - } - - writeValue(layers: Array>): void { - if (layers) { - this.selectedLayers.next(layers); - } else if (this.onChange) { - this.onChange(this.selectedLayers.getValue()); - } - } - - registerOnChange(fn: (_: Array>) => void): void { - this.onChange = fn; - - this.onChange(this.selectedLayers.getValue()); - } - - registerOnTouched(fn: () => void): void { - this.onTouched = fn; - } - - // noinspection JSMethodCanBeStatic - toLetters(i: number): string { - return LetterNumberConverter.toLetters(i + 1); - } - - private layersForInitialSelection( - layers: Array>, - blacklist: Array>, - amount: number, - ): Array> { - if (layers.length === 0) { - return []; - } - - const layersForSelection = [...layers].filter((layer) => blacklist.indexOf(layer) < 0); - - const selectedLayerIndex = layersForSelection.indexOf(this.layerService.getSelectedLayer()); - if (selectedLayerIndex >= 0) { - // swap to front - layersForSelection[0] = layersForSelection.splice(selectedLayerIndex, 1, layersForSelection[0])[0]; - } - - while (layersForSelection.length < amount) { - layersForSelection.push(layers[0]); - } - - return layersForSelection.slice(0, amount); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/helpers/operator-output-name/operator-output-name.component.html b/projects/wave-core/src/lib/operators/dialogs/helpers/operator-output-name/operator-output-name.component.html deleted file mode 100644 index 1974eb2c..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/helpers/operator-output-name/operator-output-name.component.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/projects/wave-core/src/lib/operators/dialogs/helpers/operator-output-name/operator-output-name.component.scss b/projects/wave-core/src/lib/operators/dialogs/helpers/operator-output-name/operator-output-name.component.scss deleted file mode 100644 index bc76a27e..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/helpers/operator-output-name/operator-output-name.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -mat-form-field { - width: 100%; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/helpers/operator-output-name/operator-output-name.component.ts b/projects/wave-core/src/lib/operators/dialogs/helpers/operator-output-name/operator-output-name.component.ts deleted file mode 100644 index 91ece8b9..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/helpers/operator-output-name/operator-output-name.component.ts +++ /dev/null @@ -1,81 +0,0 @@ -import {Component, ChangeDetectionStrategy, OnChanges, SimpleChange, ChangeDetectorRef, Input, AfterViewInit} from '@angular/core'; -import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms'; - -@Component({ - selector: 'wave-operator-output-name', - templateUrl: './operator-output-name.component.html', - styleUrls: ['./operator-output-name.component.scss'], - providers: [{provide: NG_VALUE_ACCESSOR, useExisting: OperatorOutputNameComponent, multi: true}], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class OperatorOutputNameComponent implements ControlValueAccessor, OnChanges, AfterViewInit { - @Input() type: 'Layer' | 'Plot' = 'Layer'; - @Input() suggestion = ''; - - private _name: string; - private userChanged = false; - - private onTouched: () => void; - private onChange: (_: string) => void = undefined; - - constructor(private changeDetectorRef: ChangeDetectorRef) {} - - set name(name: string) { - this._name = name; - this.userChanged = true; - if (this.onChange) { - this.onChange(name); - } - } - - get name(): string { - return this._name; - } - - ngAfterViewInit() { - // once for rendering the input properly - setTimeout(() => this.changeDetectorRef.markForCheck()); - } - - ngOnChanges(changes: {[propertyName: string]: SimpleChange}) { - for (let propName in changes) { - // eslint-disable-line guard-for-in - switch (propName) { - case 'suggestion': - if (!this.userChanged) { - this._name = this.suggestion; - - if (this.onChange) { - this.onChange(this._name); - } - this.changeDetectorRef.markForCheck(); - } - break; - default: - // do nothing - } - } - } - - /** Implemented as part of ControlValueAccessor. */ - writeValue(value: string): void { - this._name = value; - this.changeDetectorRef.markForCheck(); - } - - /** Implemented as part of ControlValueAccessor. */ - registerOnChange(fn: () => {}) { - this.onChange = fn; - } - - /** Implemented as part of ControlValueAccessor. */ - registerOnTouched(fn: () => {}) { - this.onTouched = fn; - } - - onBlur() { - if (this.onTouched) { - this.onTouched(); - } - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/helpers/reprojection-selection/reprojection-selection.component.html b/projects/wave-core/src/lib/operators/dialogs/helpers/reprojection-selection/reprojection-selection.component.html deleted file mode 100644 index 22b7879d..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/helpers/reprojection-selection/reprojection-selection.component.html +++ /dev/null @@ -1,6 +0,0 @@ - - - {{ projection }} - - -

    No Projection Available

    diff --git a/projects/wave-core/src/lib/operators/dialogs/helpers/reprojection-selection/reprojection-selection.component.scss b/projects/wave-core/src/lib/operators/dialogs/helpers/reprojection-selection/reprojection-selection.component.scss deleted file mode 100644 index bc76a27e..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/helpers/reprojection-selection/reprojection-selection.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -mat-form-field { - width: 100%; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/helpers/reprojection-selection/reprojection-selection.component.ts b/projects/wave-core/src/lib/operators/dialogs/helpers/reprojection-selection/reprojection-selection.component.ts deleted file mode 100644 index 3680ee3b..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/helpers/reprojection-selection/reprojection-selection.component.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { - Component, - ChangeDetectionStrategy, - forwardRef, - AfterViewInit, - OnChanges, - SimpleChange, - ChangeDetectorRef, - Input, -} from '@angular/core'; -import {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms'; -import {Projection} from '../../../projection.model'; -import {Layer} from '../../../../layers/layer.model'; -import {AbstractSymbology} from '../../../../layers/symbology/symbology.model'; - -@Component({ - selector: 'wave-reprojection-selection', - templateUrl: './reprojection-selection.component.html', - styleUrls: ['./reprojection-selection.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ReprojectionSelectionComponent), multi: true}], -}) -export class ReprojectionSelectionComponent implements OnChanges, ControlValueAccessor { - /** - * An array of layers that is traversed to get all projections. - */ - @Input() layers: Array>; - - projections: Array; - selectedProjection: Projection; - - private onTouched: () => void; - private onChange: (_: Projection) => void = undefined; - - private firstUndefined = true; - - constructor(private changeDetectorRef: ChangeDetectorRef) {} - - ngOnChanges(changes: {[propertyName: string]: SimpleChange}) { - for (let propName in changes) { - // eslint-disable-line guard-for-in - switch (propName) { - case 'layers': - this.projections = []; - if (this.layers) { - for (const layer of this.layers) { - let projection = layer.operator.projection; - if (this.projections.indexOf(projection) === -1) { - this.projections.push(projection); - } - } - if (this.projections.length > 0 && this.projections.indexOf(this.selectedProjection) < 0) { - this.selectedProjection = this.layers[0].operator.projection; - if (this.onChange) { - this.onChange(this.selectedProjection); - } - } - } else { - this.selectedProjection = undefined; - } - - setTimeout(() => this.changeDetectorRef.markForCheck()); - break; - default: - // DO NOTHING - } - } - } - - /** - * Informs the component when we lose focus in order to style accordingly - * @internal - */ - onBlur() { - this.onTouched(); - } - - /** - * Implemented as part of ControlValueAccessor. - */ - writeValue(value: Projection) { - if (this.firstUndefined && !value) { - this.firstUndefined = false; - } else { - this.selectedProjection = value; - } - - this.changeDetectorRef.markForCheck(); - } - - /** - * Implemented as part of ControlValueAccessor. - */ - registerOnChange(fn: (_: Projection) => void): void { - this.onChange = fn; - - if (this.selectedProjection) { - this.onChange(this.selectedProjection); - } - } - - /** - * Implemented as part of ControlValueAccessor. - */ - registerOnTouched(fn: () => {}) { - this.onTouched = fn; - } - - selectProjection(projection: Projection) { - this.selectedProjection = projection; - if (this.onChange) { - this.onChange(projection); - } - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/histogram-operator/histogram-operator.component.html b/projects/wave-core/src/lib/operators/dialogs/histogram-operator/histogram-operator.component.html deleted file mode 100644 index bbe84662..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/histogram-operator/histogram-operator.component.html +++ /dev/null @@ -1,60 +0,0 @@ -Histogram - - -

    - This operator generates a Histogram based on a raster or vector data set (Input). Select the Range Type, which - can be the pixel values of a raster layer or the attribute values of vector data. The histogram shows the frequency of values - (y-axis) in a certain range on the x-axis. This range is defined by the number of buckets, i.e., if you choose a bucket number of - 20, the value range between min/max values is divided into 20 sections, each covering a value range of equal size. This is done - automatically if you tick the box Choose number of buckets automatically. Edit the Output Name of the plot, if - desired, and click on Create to generate the plot. -

    -

    Note: Plots change dynamically with the map view and include only pixels or features, which are located in this area.

    -
    - -
    -
    - - - - - {{ attribute }} - - - - - Custom - Unit - Data - - -
    - - - Please specify the value. - -
    - - - - The maximum must be greater or equal to the minimum. - - Please specify the value. - -
    - Choose number of buckets automatically -
    - - - -
    - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/histogram-operator/histogram-operator.component.scss b/projects/wave-core/src/lib/operators/dialogs/histogram-operator/histogram-operator.component.scss deleted file mode 100644 index 8a6c6092..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/histogram-operator/histogram-operator.component.scss +++ /dev/null @@ -1,30 +0,0 @@ -:host { - display: block; - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.actions { - text-align: right; - padding: 1rem; -} - -mat-form-field { - width: 100%; - margin: 1rem 0; -} - -.error { - color: var(--wave-warn-color, red); -} - -div { - padding-bottom: 0.5rem; - padding-top: 1rem; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/histogram-operator/histogram-operator.component.ts b/projects/wave-core/src/lib/operators/dialogs/histogram-operator/histogram-operator.component.ts deleted file mode 100644 index a6a64421..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/histogram-operator/histogram-operator.component.ts +++ /dev/null @@ -1,156 +0,0 @@ -import {Subscription, ReplaySubject, Observable} from 'rxjs'; -import {map, tap} from 'rxjs/operators'; -import {Component, ChangeDetectionStrategy, OnInit, OnDestroy, AfterViewInit} from '@angular/core'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; -import {DataTypes, DataType} from '../../datatype.model'; -import {WaveValidators} from '../../../util/form.validators'; -import {Layer} from '../../../layers/layer.model'; -import {AbstractSymbology} from '../../../layers/symbology/symbology.model'; -import {HistogramType} from '../../types/histogram-type.model'; -import {Operator} from '../../operator.model'; -import {ResultTypes} from '../../result-type.model'; -import {Unit} from '../../unit.model'; -import {Plot} from '../../../plots/plot.model'; -import {ProjectService} from '../../../project/project.service'; - -/** - * Checks whether the layer is a vector layer (points, lines, polygons). - */ -function isVectorLayer(layer: Layer): boolean { - return layer ? ResultTypes.VECTOR_TYPES.indexOf(layer.operator.resultType) >= 0 : false; -} - -/** - * This dialog allows creating a histogram plot of a layer's values. - */ -@Component({ - selector: 'wave-histogram-operator', - templateUrl: './histogram-operator.component.html', - styleUrls: ['./histogram-operator.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HistogramOperatorComponent implements OnInit, AfterViewInit, OnDestroy { - // make public to template - ResultTypes = ResultTypes; - // - - form: FormGroup; - - attributes$ = new ReplaySubject>(1); - - isVectorLayer$: Observable; - - private subscriptions: Array = []; - - /** - * DI for services - */ - constructor(private projectService: ProjectService, private formBuilder: FormBuilder) {} - - ngOnInit() { - const layerControl = this.formBuilder.control(undefined, Validators.required); - let rangeTypeControl = this.formBuilder.control('data', Validators.required); - this.form = this.formBuilder.group({ - name: ['Filtered Values', [Validators.required, WaveValidators.notOnlyWhitespace]], - layer: layerControl, - attribute: [undefined, WaveValidators.conditionalValidator(Validators.required, () => isVectorLayer(layerControl.value))], - rangeType: rangeTypeControl, - range: this.formBuilder.group( - { - min: [undefined], - max: [undefined], - }, - { - validator: WaveValidators.conditionalValidator( - WaveValidators.minAndMax('min', 'max', {checkBothExist: true}), - () => rangeTypeControl.value === 'custom', - ), - }, - ), - autoBuckets: [true, Validators.required], - numberOfBuckets: [20, Validators.required], - }); - - this.subscriptions.push( - this.form.controls['layer'].valueChanges - .pipe( - tap(() => this.form.controls['attribute'].setValue(undefined)), - map((layer) => { - if (layer) { - return layer.operator.attributes - .filter((attribute: string) => { - return DataTypes.ALL_NUMERICS.indexOf(layer.operator.dataTypes.get(attribute)) >= 0; - }) - .toArray(); - } else { - return []; - } - }), - ) - .subscribe(this.attributes$), - ); - - this.subscriptions.push( - this.form.controls['rangeType'].valueChanges.subscribe(() => this.form.controls['range'].updateValueAndValidity()), - ); - - this.isVectorLayer$ = this.form.controls['layer'].valueChanges.pipe(map((layer) => isVectorLayer(layer))); - } - - ngAfterViewInit() { - setTimeout(() => { - this.form.updateValueAndValidity(); - this.form.controls['layer'].updateValueAndValidity(); - }); - } - - ngOnDestroy() { - this.subscriptions.forEach((subscription) => subscription.unsubscribe()); - } - - /** - * Uses the user input to create a histogram plot. - * The plot is added to the plot view. - */ - add(event: any) { - const inputOperator = (this.form.controls['layer'].value as Layer).operator; - - const attributeName = this.form.controls['attribute'].value as string; - - let range: {min: number; max: number} | string = this.form.controls['rangeType'].value as string; - if (range === 'custom') { - range = this.form.controls['range'].value as {min: number; max: number}; - } - - let buckets: number = undefined; - if (!this.form.controls['autoBuckets'].value) { - buckets = this.form.controls['numberOfBuckets'].value as number; - } - - const outputName: string = this.form.controls['name'].value; - - const operator = new Operator({ - operatorType: new HistogramType({ - attribute: attributeName, - range: range, - buckets: buckets, - }), - resultType: ResultTypes.PLOT, - projection: inputOperator.projection, - attributes: [], - dataTypes: new Map(), - units: new Map(), - rasterSources: inputOperator.resultType === ResultTypes.RASTER ? [inputOperator] : [], - pointSources: inputOperator.resultType === ResultTypes.POINTS ? [inputOperator] : [], - lineSources: inputOperator.resultType === ResultTypes.LINES ? [inputOperator] : [], - polygonSources: inputOperator.resultType === ResultTypes.POLYGONS ? [inputOperator] : [], - }); - - this.projectService.addPlot( - new Plot({ - name: outputName, - operator: operator, - }), - ); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/numeric-attribute-filter/numeric-attribute-filter.component.html b/projects/wave-core/src/lib/operators/dialogs/numeric-attribute-filter/numeric-attribute-filter.component.html deleted file mode 100644 index bdedd5a3..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/numeric-attribute-filter/numeric-attribute-filter.component.html +++ /dev/null @@ -1,73 +0,0 @@ -Numeric Attribute Filter -
    -
    - - -
    - - - {{ attribute }} - - -
    - - -
    - - Min - - {{ attributeUnit$ | async }} - - Specify at least minimum or maximum. - - - - Max - - {{ attributeUnit$ | async }} - - The maximum must be greater or equal to the minimum. - - -
    - Keep NoData values? - - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/numeric-attribute-filter/numeric-attribute-filter.component.scss b/projects/wave-core/src/lib/operators/dialogs/numeric-attribute-filter/numeric-attribute-filter.component.scss deleted file mode 100644 index d00a0aee..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/numeric-attribute-filter/numeric-attribute-filter.component.scss +++ /dev/null @@ -1,40 +0,0 @@ -$circle-width: 100px; - -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.container { - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -.actions { - text-align: right; - padding: 1rem; -} - -mat-progress-spinner { - position: relative; - left: calc(50% - #{$circle-width / 2}); - width: $circle-width; -} - -mat-form-field { - width: 100%; - margin: 1rem 0; -} - -mat-form-field { - margin-bottom: 1rem; -} - -mat-form-field:not(:last-child) { - margin-right: 1rem; -} - -.downward-margin { - margin-bottom: 1rem; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/numeric-attribute-filter/numeric-attribute-filter.component.ts b/projects/wave-core/src/lib/operators/dialogs/numeric-attribute-filter/numeric-attribute-filter.component.ts deleted file mode 100644 index 68afc3ff..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/numeric-attribute-filter/numeric-attribute-filter.component.ts +++ /dev/null @@ -1,233 +0,0 @@ -import {BehaviorSubject, Observable, Subscription, combineLatest} from 'rxjs'; -import {first, map} from 'rxjs/operators'; -import {AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, OnDestroy} from '@angular/core'; -import {HistogramData} from '../../../plots/histogram/histogram.component'; -import {RandomColorService} from '../../../util/services/random-color.service'; -import {MappingQueryService} from '../../../queries/mapping-query.service'; -import {VectorLayer} from '../../../layers/layer.model'; -import {ResultTypes} from '../../result-type.model'; -import {DataType, DataTypes} from '../../datatype.model'; -import {AbstractVectorSymbology} from '../../../layers/symbology/symbology.model'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; -import {Operator} from '../../operator.model'; -import {NumericAttributeFilterType} from '../../types/numeric-attribute-filter-type.model'; -import {HistogramType} from '../../types/histogram-type.model'; -import {Unit} from '../../unit.model'; -import {ProjectService} from '../../../project/project.service'; -import {LayoutService} from '../../../layout.service'; -import {WaveValidators} from '../../../util/form.validators'; -import {MapService} from '../../../map/map.service'; - -/** - * This component allows creating the numeric attribute filter operator. - */ -@Component({ - selector: 'wave-numeric-attribute-filter', - templateUrl: './numeric-attribute-filter.component.html', - styleUrls: ['./numeric-attribute-filter.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class NumericAttributeFilterOperatorComponent implements AfterViewInit, OnDestroy { - readonly ResultTypes = ResultTypes; - - readonly form: FormGroup; - readonly attributes$: Observable>; - readonly data$: BehaviorSubject = new BehaviorSubject(undefined); - readonly dataLoading$ = new BehaviorSubject(false); - readonly attributeUnit$ = new BehaviorSubject(''); - - histogramWidth: number; - histogramHeight: number; - - private subscriptions: Array = []; - - constructor( - private randomColorService: RandomColorService, - private mappingQueryService: MappingQueryService, - private projectService: ProjectService, - private mapService: MapService, - private formBuilder: FormBuilder, - private elementRef: ElementRef, - ) { - this.form = formBuilder.group({ - name: ['Filtered Values', [Validators.required, WaveValidators.notOnlyWhitespace]], - inputLayer: [undefined, Validators.required], - attribute: [undefined, Validators.required], - bounds: formBuilder.group( - { - min: [undefined], - max: [undefined], - }, - { - validator: WaveValidators.minAndMax('min', 'max'), - }, - ), - noData: [false, Validators.required], - }); - - this.subscriptions.push( - this.form.controls['attribute'].valueChanges.subscribe((attribute: string) => { - if (!attribute) { - this.data$.next(undefined); - return; - } - - const vectorLayer: VectorLayer = this.form.controls['inputLayer'].value; - - const operator = new Operator({ - operatorType: new HistogramType({ - attribute: attribute, - range: 'data', - }), - resultType: ResultTypes.PLOT, - projection: vectorLayer.operator.projection, - attributes: [], - dataTypes: new Map(), - units: new Map(), - pointSources: vectorLayer.operator.resultType === ResultTypes.POINTS ? [vectorLayer.operator] : [], - lineSources: vectorLayer.operator.resultType === ResultTypes.LINES ? [vectorLayer.operator] : [], - polygonSources: vectorLayer.operator.resultType === ResultTypes.POLYGONS ? [vectorLayer.operator] : [], - }); - - this.dataLoading$.next(true); - - combineLatest([ - this.projectService.getTimeStream().pipe(first()), - this.projectService.getProjectionStream().pipe(first()), - ]).subscribe(([projectTime, projection]) => { - this.mappingQueryService - .getPlotData({ - operator: operator, - time: projectTime, - extent: this.mapService.getViewportSize().extent, - projection: projection, - }) - .subscribe((data) => { - this.data$.next(data as HistogramData); - this.dataLoading$.next(false); - }); - }); - }), - ); - - this.attributes$ = this.form.controls['inputLayer'].valueChanges.pipe( - map((layer) => { - // side effect!!! - this.form.controls['attribute'].setValue(undefined); - - if (layer) { - this.form.controls['attribute'].enable({onlySelf: true}); - return layer.operator.attributes - .filter((attribute: string) => { - return DataTypes.ALL_NUMERICS.indexOf(layer.operator.dataTypes.get(attribute)) >= 0; - }) - .toArray(); - } else { - this.form.controls['attribute'].disable({onlySelf: true}); - return []; - } - }), - ); - - this.subscriptions.push( - this.form.controls['attribute'].valueChanges - .pipe( - map((attribute: string) => { - if (!attribute) { - return ''; - } - - const operator = this.form.controls['inputLayer'].value.operator as Operator; - const unit = operator.getUnit(attribute); - - if (!unit || unit.unit === Unit.defaultUnit.unit || unit.measurement === Unit.defaultUnit.measurement) { - return ''; - } else { - return unit.unit; - } - }), - ) - .subscribe((unit) => this.attributeUnit$.next(unit)), - ); - } - - ngAfterViewInit() { - // calculate size for histogram - const formStyle = getComputedStyle(this.elementRef.nativeElement.querySelector('form')); - const formWidth = parseInt(formStyle.width, 10) - 2 * LayoutService.remInPx - LayoutService.scrollbarWidthPx(); - const formHeight = parseInt(formStyle.height, 10) - 2 * LayoutService.remInPx; - - this.histogramWidth = formWidth; - this.histogramHeight = Math.max(formHeight / 3, formWidth / 3); - - // initially get attributes - setTimeout(() => this.form.controls['inputLayer'].enable({emitEvent: true})); - } - - ngOnDestroy() { - this.subscriptions.forEach((subscription) => subscription.unsubscribe()); - } - - add(_event: any) { - const vectorLayer: VectorLayer = this.form.controls['inputLayer'].value; - const vectorOperator: Operator = vectorLayer.operator; - - const units = vectorOperator.units; - const dataTypes = vectorOperator.dataTypes; - const attributes = vectorOperator.attributes; - - const noData: boolean = this.form.controls['noData'].value; - const attributeName: string = this.form.controls['attribute'].value; - const boundsMin: number = this.form.controls['bounds'].value.min; - const boundsMax: number = this.form.controls['bounds'].value.max; - - const name: string = this.form.controls['name'].value; - - const dict = { - operatorType: new NumericAttributeFilterType({ - attributeName: attributeName, - includeNoData: noData, - rangeMin: boundsMin === null ? undefined : boundsMin, - rangeMax: boundsMax === null ? undefined : boundsMax, - }), - resultType: vectorOperator.resultType, - projection: vectorOperator.projection, - attributes: attributes, - dataTypes: dataTypes, - units: units, - pointSources: [], - lineSources: [], - polygonSources: [], - }; - - switch (vectorOperator.resultType) { - case ResultTypes.POINTS: - dict.pointSources.push(vectorOperator); - break; - case ResultTypes.LINES: - dict.lineSources.push(vectorOperator); - break; - case ResultTypes.POLYGONS: - dict.polygonSources.push(vectorOperator); - break; - default: - throw Error('Incompatible Input Type'); - } - - const operator = new Operator(dict); - - const symbology = (vectorLayer.symbology.clone() as any) as AbstractVectorSymbology; - symbology.fillRGBA = this.randomColorService.getRandomColorRgba(); - - const clustered = vectorLayer.clustered; - - const layer = new VectorLayer({ - name: name, - operator: operator, - symbology, - clustered, - }); - - this.projectService.addLayer(layer); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/operator-list/operator-list.component.html b/projects/wave-core/src/lib/operators/dialogs/operator-list/operator-list.component.html deleted file mode 100644 index 5ce45fbe..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/operator-list/operator-list.component.html +++ /dev/null @@ -1,14 +0,0 @@ -Operators - - - -

    {{ group.name }}

    - - - -

    -

    -
    -
    -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/operator-list/operator-list.component.scss b/projects/wave-core/src/lib/operators/dialogs/operator-list/operator-list.component.scss deleted file mode 100644 index 8a7e8651..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/operator-list/operator-list.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -p { - color: var(--wave-foreground-secondary-text-color, grey); -} - -mat-list-item ::ng-deep .highlight { - color: var(--wave-accent-color, grey); -} diff --git a/projects/wave-core/src/lib/operators/dialogs/operator-list/operator-list.component.ts b/projects/wave-core/src/lib/operators/dialogs/operator-list/operator-list.component.ts deleted file mode 100644 index aa788e58..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/operator-list/operator-list.component.ts +++ /dev/null @@ -1,231 +0,0 @@ -import {BehaviorSubject, combineLatest, Observable, of} from 'rxjs'; -import {map} from 'rxjs/operators'; - -import {ChangeDetectionStrategy, Component, Input, OnInit, Type} from '@angular/core'; -import {RasterValueExtractionType} from '../../types/raster-value-extraction-type.model'; - -import {NumericAttributeFilterType} from '../../types/numeric-attribute-filter-type.model'; -import {NumericAttributeFilterOperatorComponent} from '../numeric-attribute-filter/numeric-attribute-filter.component'; - -import {PointInPolygonFilterType} from '../../types/point-in-polygon-filter-type.model'; -import {PointInPolygonFilterOperatorComponent} from '../point-in-polygon-filter/point-in-polygon-filter.component'; - -import {ExpressionOperatorComponent} from '../expression-operator/expression-operator.component'; -import {ExpressionType} from '../../types/expression-type.model'; - -import {HistogramType} from '../../types/histogram-type.model'; -import {RasterValueExtractionOperatorComponent} from '../raster-value-extraction/raster-value-extraction.component'; -import {HistogramOperatorComponent} from '../histogram-operator/histogram-operator.component'; -import {LayoutService} from '../../../layout.service'; -import {ROperatorComponent} from '../r/r-operator/r-operator.component'; -import {RScriptType} from '../../types/r-script-type.model'; -import {PieChartComponent} from '../pie-chart-operator/pie-chart-operator.component'; -import {PieChartType} from '../../types/piechart-type.model'; -import {ScatterPlotComponent} from '../scatter-plot-operator/scatter-plot-operator.component'; -import {ScatterPlotType} from '../../types/scatterplot-type.model'; -import {TextualAttributeFilterOperatorComponent} from '../textual-attribute-filter/textual-attribute-filter.component'; -import {TextualAttributeFilterType} from '../../types/textual-attribute-filter-type.model'; -import {BoxPlotComponent} from '../box-plot-operator/box-plot-operator.component'; -import {BoxPlotType} from '../../types/boxplot-type.model'; -import {RasterPolygonClipOperatorComponent} from '../raster-polygon-clip/raster-polygon-clip.component'; -import {OperatorType} from '../../operator-type.model'; -import {HeatmapOperatorComponent} from '../heatmap/heatmap.component'; -import {HeatmapType} from '../../types/heatmap-type.model'; -import {TimePlotType} from '../../types/timeplot-type.model'; -import {TimePlotComponent} from '../time-plot-operator/time-plot-operator.component'; -import {StatisticsType} from '../../types/statistics-type.model'; -import {StatisticsPlotComponent} from '../statistics-plot/statistics-plot.component'; -import {RgbCompositeComponent} from '../rgb-composite/rgb-composite.component'; -import {RgbaCompositeType} from '../../types/rgba-composite-type.model'; -import {RasterMaskComponent} from '../raster-mask/raster-mask.component'; - -/** - * This type encapsulates… - * * a component to select, - * * a type to display (name and icon) and - * * a short description text. - */ -export interface OperatorListType { - component: Type; - type: {NAME: string; ICON_URL: string}; - description: string; -} - -/** - * This types groups operator list types - */ -export type OperatorListButtonGroups = Array<{ - name: string; - list: Array; -}>; - -/** - * This component provides a list of operator dialogs to choose from. - * - * It provides a set of default operators but they can be overridden. - */ -@Component({ - selector: 'wave-operator-list', - templateUrl: './operator-list.component.html', - styleUrls: ['./operator-list.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class OperatorListComponent implements OnInit { - static readonly DEFAULT_MIXED_OPERATOR_DIALOGS: Array = [ - { - component: RasterValueExtractionOperatorComponent, - type: RasterValueExtractionType, - description: 'Attach raster values to vector data', - }, - { - component: RasterPolygonClipOperatorComponent, - type: { - NAME: 'Raster Polygon Clip', - ICON_URL: OperatorType.createIconDataUrl('Raster Polygon Clip'), - }, - description: 'Clip a raster image via polygon boundaries', - }, - { - component: ROperatorComponent, - type: RScriptType, - description: 'Execute an R script (experimental)', - }, - ]; - - static readonly DEFAULT_PLOT_OPERATOR_DIALOGS: Array = [ - { - component: HistogramOperatorComponent, - type: HistogramType, - description: 'Create a histogram from vector or raster data', - }, - { - component: PieChartComponent, - type: PieChartType, - description: 'Plot your data as a pie chart', - }, - { - component: ScatterPlotComponent, - type: ScatterPlotType, - description: 'Scatter plot your data', - }, - { - component: BoxPlotComponent, - type: BoxPlotType, - description: 'Box plot your data', - }, - { - component: StatisticsPlotComponent, - type: StatisticsType, - description: 'Get statistics for any layer', - }, - { - component: TimePlotComponent, - type: TimePlotType, - description: 'Plot time data', - }, - ]; - - static readonly DEFAULT_RASTER_OPERATOR_DIALOGS: Array = [ - { - component: ExpressionOperatorComponent, - type: ExpressionType, - description: 'Calculate an expression on a raster', - }, - { - component: RasterMaskComponent, - type: { - NAME: 'Raster Mask', - ICON_URL: OperatorType.createIconDataUrl('Raster Mask'), - }, - description: 'Apply a mask to a raster', - }, - { - component: RgbCompositeComponent, - type: RgbaCompositeType, - description: 'Create an RGB composite from a set of rasters', - }, - ]; - - static readonly DEFAULT_VECTOR_OPERATOR_DIALOGS: Array = [ - { - component: NumericAttributeFilterOperatorComponent, - type: NumericAttributeFilterType, - description: 'Filter data via numeric range', - }, - { - component: HeatmapOperatorComponent, - type: HeatmapType, - description: 'Create a heatmap for points', - }, - { - component: PointInPolygonFilterOperatorComponent, - type: PointInPolygonFilterType, - description: 'Filter points that are enclosed by a polygon', - }, - { - component: TextualAttributeFilterOperatorComponent, - type: TextualAttributeFilterType, - description: 'Filter data via text filter', - }, - ]; - - /** - * Specify (optionally) a custom set of operator groups and list entries (buttons) - */ - @Input() operators: OperatorListButtonGroups = [ - // default operator set - {name: 'Mixed', list: OperatorListComponent.DEFAULT_MIXED_OPERATOR_DIALOGS}, - {name: 'Plots', list: OperatorListComponent.DEFAULT_PLOT_OPERATOR_DIALOGS}, - {name: 'Raster', list: OperatorListComponent.DEFAULT_RASTER_OPERATOR_DIALOGS}, - {name: 'Vector', list: OperatorListComponent.DEFAULT_VECTOR_OPERATOR_DIALOGS}, - ]; - - operatorGroups$: Observable}>>; - searchString$ = new BehaviorSubject(''); - - /** - * DI of services - */ - constructor(private layoutService: LayoutService) {} - - ngOnInit() { - this.operatorGroups$ = combineLatest([of(this.operators), this.searchString$.pipe(map((s) => s.toLowerCase()))]).pipe( - map(([operatorGroups, searchString]) => { - const nameComparator = (a: string, b: string): number => { - const stripped = (s: string): string => s.replace(' ', ''); - - return stripped(a).localeCompare(stripped(b)); - }; - - const filteredGroups = []; - for (const group of operatorGroups) { - const operators = []; - for (const operator of group.list) { - const searchMatchesTypeName = () => operator.type.NAME.toLowerCase().includes(searchString); - const searchMatchesDescription = () => operator.description.toLowerCase().includes(searchString); - - if (searchMatchesTypeName() || searchMatchesDescription()) { - operators.push(operator); - } - } - - if (operators.length > 0) { - filteredGroups.push({ - name: group.name, - list: operators.sort((a, b) => nameComparator(a.type.NAME, b.type.NAME)), - }); - } - } - - return filteredGroups.sort((a, b) => nameComparator(a.name, b.name)); - }), - ); - } - - /** - * Load a selected dialog into the sidenav - */ - load(component: Type) { - this.layoutService.setSidenavContentComponent({component, keepParent: true}); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/pie-chart-operator/pie-chart-operator.component.html b/projects/wave-core/src/lib/operators/dialogs/pie-chart-operator/pie-chart-operator.component.html deleted file mode 100644 index 331f8f42..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/pie-chart-operator/pie-chart-operator.component.html +++ /dev/null @@ -1,32 +0,0 @@ -Pie chart plot -
    -
    - -
    - - - - - {{ attribute }} - - - -
    - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/pie-chart-operator/pie-chart-operator.component.scss b/projects/wave-core/src/lib/operators/dialogs/pie-chart-operator/pie-chart-operator.component.scss deleted file mode 100644 index 07e352ee..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/pie-chart-operator/pie-chart-operator.component.scss +++ /dev/null @@ -1,20 +0,0 @@ -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.container { - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -mat-form-field { - width: 100%; - margin: 1rem 0; -} - -.actions { - text-align: right; - padding: 1rem; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/pie-chart-operator/pie-chart-operator.component.ts b/projects/wave-core/src/lib/operators/dialogs/pie-chart-operator/pie-chart-operator.component.ts deleted file mode 100644 index 20144999..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/pie-chart-operator/pie-chart-operator.component.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Created by Julian on 23/06/2017. - */ -import {AfterViewInit, ChangeDetectionStrategy, Component, OnDestroy, OnInit} from '@angular/core'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; -import {ResultTypes} from '../../result-type.model'; -import {Operator} from '../../operator.model'; -import {Plot} from '../../../plots/plot.model'; -import {ProjectService} from '../../../project/project.service'; -import {PieChartType} from '../../types/piechart-type.model'; -import {WaveValidators} from '../../../util/form.validators'; - -@Component({ - selector: 'wave-pie-chart-operator', - templateUrl: './pie-chart-operator.component.html', - styleUrls: ['./pie-chart-operator.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PieChartComponent implements OnInit, AfterViewInit, OnDestroy { - form: FormGroup; - - ResultTypes = ResultTypes; - - constructor(private formBuilder: FormBuilder, private projectService: ProjectService) {} - - ngOnInit() { - this.form = this.formBuilder.group({ - layer: [undefined, Validators.required], - attribute: [undefined, Validators.required], - name: ['', [Validators.required, WaveValidators.notOnlyWhitespace]], - }); - } - - add(event: any) { - const sourceOperator: Operator = this.form.controls['layer'].value.operator; - - const operator: Operator = new Operator({ - operatorType: new PieChartType({ - attribute: this.form.controls['attribute'].value.toString(), - inputType: sourceOperator.resultType, - }), - resultType: ResultTypes.PLOT, - projection: sourceOperator.projection, - pointSources: sourceOperator.resultType === ResultTypes.POINTS ? [sourceOperator] : undefined, - lineSources: sourceOperator.resultType === ResultTypes.LINES ? [sourceOperator] : undefined, - polygonSources: sourceOperator.resultType === ResultTypes.POLYGONS ? [sourceOperator] : undefined, - }); - - const plot = new Plot({ - name: this.form.controls['name'].value.toString(), - operator: operator, - }); - - this.projectService.addPlot(plot); - } - - ngOnDestroy() {} - - ngAfterViewInit() { - setTimeout(() => { - this.form.updateValueAndValidity({ - onlySelf: false, - emitEvent: true, - }); - this.form.controls['layer'].updateValueAndValidity(); - }); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component.html b/projects/wave-core/src/lib/operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component.html deleted file mode 100644 index 9d251b84..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component.html +++ /dev/null @@ -1,15 +0,0 @@ -Point in Polygon Filter -
    -
    - - - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component.scss b/projects/wave-core/src/lib/operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component.scss deleted file mode 100644 index ff2e4bf3..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component.scss +++ /dev/null @@ -1,19 +0,0 @@ -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.container { - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -.actions { - text-align: right; - padding: 1rem; -} - -.error { - color: var(--wave-warn-color, red); -} diff --git a/projects/wave-core/src/lib/operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component.ts b/projects/wave-core/src/lib/operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component.ts deleted file mode 100644 index 98164e6e..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/point-in-polygon-filter/point-in-polygon-filter.component.ts +++ /dev/null @@ -1,81 +0,0 @@ -import {Component, ChangeDetectionStrategy} from '@angular/core'; - -import {RandomColorService} from '../../../util/services/random-color.service'; - -import {VectorLayer} from '../../../layers/layer.model'; -import {Operator} from '../../operator.model'; -import {ResultTypes} from '../../result-type.model'; -import {PointInPolygonFilterType} from '../../types/point-in-polygon-filter-type.model'; -import {AbstractVectorSymbology, PointSymbology} from '../../../layers/symbology/symbology.model'; -import {FormGroup, FormBuilder, Validators} from '@angular/forms'; -import {WaveValidators} from '../../../util/form.validators'; -import {ProjectService} from '../../../project/project.service'; - -/** - * This component allows creating the point in polygon filter operator. - */ -@Component({ - selector: 'wave-point-in-polygon-filter', - templateUrl: './point-in-polygon-filter.component.html', - styleUrls: ['./point-in-polygon-filter.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PointInPolygonFilterOperatorComponent { - ResultTypes = ResultTypes; - - form: FormGroup; - - constructor(private randomColorService: RandomColorService, private projectService: ProjectService, private formBuilder: FormBuilder) { - this.form = formBuilder.group({ - name: ['Filtered Values', [Validators.required, WaveValidators.notOnlyWhitespace]], - pointLayer: [undefined, Validators.required], - polygonLayer: [undefined, Validators.required], - }); - } - - add(event: Event) { - event.preventDefault(); // prevent page reload on error - - if (this.form.invalid) { - return; - } - - // const pointLayer: VectorLayer = this.form.controls['pointLayers'].value[0]; - const pointLayer: VectorLayer = this.form.controls['pointLayer'].value; - const pointOperator: Operator = pointLayer.operator; - const polygonOperator: Operator = this.form.controls['polygonLayer'].value.operator; - - const name: string = this.form.controls['name'].value; - - const operator = new Operator({ - operatorType: new PointInPolygonFilterType({}), - resultType: ResultTypes.POINTS, - projection: pointOperator.projection, - attributes: pointOperator.attributes, - dataTypes: pointOperator.dataTypes, - units: pointOperator.units, - pointSources: [pointOperator], - polygonSources: [polygonOperator], - }); - - const clustered = pointLayer.clustered; - const layer = new VectorLayer({ - name, - operator, - symbology: clustered - ? PointSymbology.createClusterSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }) - : PointSymbology.createSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }), - // data: this.mappingQueryService.getWFSDataStreamAsGeoJsonFeatureCollection({ - // operator, clustered, - // }), - // provenance: this.mappingQueryService.getProvenanceStream(operator), - clustered, - }); - // this.layerService.addLayer(layer); - this.projectService.addLayer(layer); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/r/r-operator/r-operator.component.html b/projects/wave-core/src/lib/operators/dialogs/r/r-operator/r-operator.component.html deleted file mode 100644 index f647ab3b..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/r/r-operator/r-operator.component.html +++ /dev/null @@ -1,165 +0,0 @@ -R Operator -
    -
    - - - - - - - - -

    {{ operator.operatorType }}

    -

    No Input Available

    - -

    {{ operator.operatorType }}

    -

    No Input Available

    - -

    {{ operator.operatorType }}

    -

    No Input Available

    - -

    {{ operator.operatorType }}

    -

    No Input Available

    -
    - - - - - - - help - Quick Help - - How the operator works - - -

    - The R operator allows executing arbitrary R code on VAT data. The result can either be a new - raster or vector layer, a plot or plain text. For accessing the input data there exists a mapping object - that offers the following functionality: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionalityDescription
    loadRaster(rasterId, queryRectangle) - Load the rasterIdth input raster as an R - raster. -
    loadRasterAsVector(rasterId, queryRectangle)Load the rasterIdth input raster as an R numeric vector.
    rastercountThis variable contains the amount of raster inputs.
    loadPoints(pointId, queryRectangle) - Load the pointIdth input point collection as an R - SpatialPointsDataFrame. -
    pointscountThis variable contains the amount of point collection inputs.
    loadLines(lineId, queryRectangle) - Load the lineIdth input line collection as an R - SpatialLinesDataFrame. -
    linescountThis variable contains the amount of line collection inputs.
    loadPolygons(polygonId, queryRectangle) - Load the polygonIdth input polygon collection as an R - SpatialPolygonDataFrame. -
    polygonscountThis variable contains the amount of polygon collection inputs.
    qrect - This variable is a list that contains the fields - t1, t2, x1, y1, x2, y2, xres, yres and epsg. -
    -

    An example is mapping.loadRaster(0, mapping.qrect) for accessing the first raster.

    -
    -
    - - - -
    - - - -
    - - - - - {{ resultType }} - - - - - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/r/r-operator/r-operator.component.scss b/projects/wave-core/src/lib/operators/dialogs/r/r-operator/r-operator.component.scss deleted file mode 100644 index c5608c30..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/r/r-operator/r-operator.component.scss +++ /dev/null @@ -1,51 +0,0 @@ -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.container { - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -.actions { - text-align: right; - padding: 1rem; -} - -table { - display: block; - width: 100%; - overflow: auto; -} - -mat-card-content { - text-align: justify; -} - -.load-save { - margin-bottom: 1rem; -} - -mat-form-field { - width: 100%; - margin: 1rem 0; -} - -wave-code-editor { - margin: 1rem 0; -} - -.error { - color: var(--wave-warn-color, red); -} - -mat-panel-title, -mat-panel-description { - line-height: 1.5rem; -} - -mat-panel-title mat-icon { - margin-right: 0.25rem; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/r/r-operator/r-operator.component.ts b/projects/wave-core/src/lib/operators/dialogs/r/r-operator/r-operator.component.ts deleted file mode 100644 index d03ed38f..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/r/r-operator/r-operator.component.ts +++ /dev/null @@ -1,263 +0,0 @@ -import {first} from 'rxjs/operators'; -import {Component, OnInit, ChangeDetectionStrategy, AfterViewInit, ViewChild, Input} from '@angular/core'; -import {ResultTypes, ResultType} from '../../../result-type.model'; -import {FormGroup, FormBuilder, Validators} from '@angular/forms'; -import {CodeEditorComponent} from '../../../../util/components/code-editor.component'; -import {ProjectService} from '../../../../project/project.service'; -import {DataType} from '../../../datatype.model'; -import {Projections} from '../../../projection.model'; -import {Operator} from '../../../operator.model'; -import {RasterLayer, VectorLayer, Layer} from '../../../../layers/layer.model'; -import {RScriptType} from '../../../types/r-script-type.model'; -import {Unit} from '../../../unit.model'; -import {RandomColorService} from '../../../../util/services/random-color.service'; -import {Plot} from '../../../../plots/plot.model'; -import { - AbstractRasterSymbology, - AbstractVectorSymbology, - AbstractSymbology, - PointSymbology, - MappingRasterSymbology, -} from '../../../../layers/symbology/symbology.model'; -import {MatDialog} from '@angular/material/dialog'; -import {RScriptSaveComponent, RScriptSaveComponentConfig} from '../r-script-save/r-script-save.component'; -import {RScriptLoadComponent, RScriptLoadResult} from '../r-script-load/r-script-load.component'; -import {Config} from '../../../../config.service'; -import {WaveValidators} from '../../../../util/form.validators'; - -@Component({ - selector: 'wave-r-operator', - templateUrl: './r-operator.component.html', - styleUrls: ['./r-operator.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ROperatorComponent implements OnInit, AfterViewInit { - // make available - ResultTypes = ResultTypes; - // - - @ViewChild(CodeEditorComponent, {static: true}) codeEditor: CodeEditorComponent; - - form: FormGroup; - - @Input() editable: Layer | Plot = undefined; - editableSourceLines: Array = undefined; - editableSourcePoints: Array = undefined; - editableSourcePolygons: Array = undefined; - editableSourceRasters: Array = undefined; - - outputTypes: Array; - - constructor( - private formBuilder: FormBuilder, - private projectService: ProjectService, - private randomColorService: RandomColorService, - private dialog: MatDialog, - private config: Config, - ) {} - - ngOnInit() { - if (this.config.DEBUG_MODE.WAVE) { - this.outputTypes = [ResultTypes.POINTS, ResultTypes.PLOT, ResultTypes.RASTER, ResultTypes.TEXT]; - } else { - this.outputTypes = [ResultTypes.PLOT, ResultTypes.TEXT]; - } - - this.form = this.formBuilder.group({ - lineLayers: [[]], - polygonLayers: [[]], - rasterLayers: [[]], - pointLayers: [[]], - code: [`print("Hello world");\na <- 1:5;\nprint(a);`, Validators.required], - resultType: [ResultTypes.TEXT, Validators.required], - name: ['R Output', [Validators.required, WaveValidators.notOnlyWhitespace]], - }); - - if (this.editable) { - // edit existing operator - - let name: string; - let operatorType: RScriptType; - let resultType: ResultType; - let rasterOperators: Array; - let pointOperators: Array; - let lineOperators: Array; - let polygonOperators: Array; - - if (this.editable instanceof VectorLayer) { - const vectorLayer: VectorLayer = this.editable; - name = vectorLayer.name; - resultType = vectorLayer.operator.resultType; - rasterOperators = vectorLayer.operator.getSources(ResultTypes.RASTER).toArray(); - pointOperators = vectorLayer.operator.getSources(ResultTypes.POINTS).toArray(); - lineOperators = vectorLayer.operator.getSources(ResultTypes.LINES).toArray(); - polygonOperators = vectorLayer.operator.getSources(ResultTypes.POLYGONS).toArray(); - operatorType = vectorLayer.operator.operatorType as RScriptType; - } else if (this.editable instanceof RasterLayer) { - const rasterLayer: RasterLayer = this.editable as RasterLayer; - name = rasterLayer.name; - resultType = rasterLayer.operator.resultType; - rasterOperators = rasterLayer.operator.getSources(ResultTypes.RASTER).toArray(); - pointOperators = rasterLayer.operator.getSources(ResultTypes.POINTS).toArray(); - lineOperators = rasterLayer.operator.getSources(ResultTypes.LINES).toArray(); - polygonOperators = rasterLayer.operator.getSources(ResultTypes.POLYGONS).toArray(); - operatorType = rasterLayer.operator.operatorType as RScriptType; - } else if (this.editable instanceof Plot) { - const plot: Plot = this.editable; - name = plot.name; - resultType = plot.operator.resultType; - rasterOperators = plot.operator.getSources(ResultTypes.RASTER).toArray(); - pointOperators = plot.operator.getSources(ResultTypes.POINTS).toArray(); - lineOperators = plot.operator.getSources(ResultTypes.LINES).toArray(); - polygonOperators = plot.operator.getSources(ResultTypes.POLYGONS).toArray(); - operatorType = plot.operator.operatorType as RScriptType; - } else { - throw Error('unknown type to edit'); - } - - this.form.controls['name'].setValue(name); - this.form.controls['resultType'].setValue(resultType); - this.form.controls['code'].setValue(operatorType.toDict().code); - - // this.form.controls['rasterLayers'].setValue(rasterLayers); - // this.form.controls['pointLayers'].setValue(pointLayers); - this.editableSourceRasters = rasterOperators; - this.editableSourcePoints = pointOperators; - this.editableSourceLines = lineOperators; - this.editableSourcePolygons = polygonOperators; - } - } - - ngAfterViewInit() { - setTimeout(() => { - this.form.updateValueAndValidity(); - this.codeEditor.refresh(); - }); - } - - load() { - this.dialog - .open(RScriptLoadComponent) - .afterClosed() - .pipe(first()) - .subscribe((result: RScriptLoadResult) => { - if (result) { - this.form.controls['code'].setValue(result.script.code); - this.form.controls['resultType'].setValue(result.script.resultType); - } - }); - } - - save() { - this.dialog.open(RScriptSaveComponent, { - data: { - script: { - code: this.form.controls['code'].value, - resultType: this.form.controls['resultType'].value, - }, - } as RScriptSaveComponentConfig, - }); - } - - add(event: any) { - const rasterLayers: Array> = this.form.controls['rasterLayers'].value; - const pointLayers: Array> = this.form.controls['pointLayers'].value; - const lineLayers: Array> = this.form.controls['lineLayers'].value; - const polygonLayers: Array> = this.form.controls['polygonLayers'].value; - - const getAnySource = (index: number) => { - const allSources = [...rasterLayers, ...pointLayers, ...lineLayers, ...polygonLayers]; - return allSources[index]; - }; - - const outputName: string = this.form.controls['name'].value; - const resultType: DataType = this.form.controls['resultType'].value; - const code = this.form.controls['code'].value; - - // TODO: user input? - const projection = getAnySource(0) === undefined ? Projections.WGS_84 : getAnySource(0).operator.projection; - - let rasterSources: Array; - let pointSources: Array; - let lineSources: Array; - let polygonSources: Array; - - if (this.editable) { - rasterSources = this.editableSourceRasters.map((o) => o.getProjectedOperator(projection)); - pointSources = this.editableSourcePoints.map((o) => o.getProjectedOperator(projection)); - lineSources = this.editableSourceLines.map((o) => o.getProjectedOperator(projection)); - polygonSources = this.editableSourcePolygons.map((o) => o.getProjectedOperator(projection)); - } else { - rasterSources = rasterLayers.map((layer) => layer.operator.getProjectedOperator(projection)); - pointSources = pointLayers.map((layer) => layer.operator.getProjectedOperator(projection)); - lineSources = lineLayers.map((layer) => layer.operator.getProjectedOperator(projection)); - polygonSources = polygonLayers.map((layer) => layer.operator.getProjectedOperator(projection)); - } - - const operator = new Operator({ - operatorType: new RScriptType({ - code, - resultType, - }), - resultType, - projection, - attributes: [], // TODO: user input? - dataTypes: new Map(), // TODO: user input? - units: new Map(), // TODO: user input? - rasterSources, - pointSources, - lineSources, - polygonSources, - }); - - if (ResultTypes.LAYER_TYPES.indexOf(resultType) >= 0) { - // LAYER - let layer: Layer; - switch (resultType) { - case ResultTypes.POINTS: - layer = new VectorLayer({ - name: outputName, - operator, - symbology: PointSymbology.createSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }), - // data: this.mappingQueryService.getWFSDataStreamAsGeoJsonFeatureCollection({ - // operator, - // }), - // provenance: provenance$, - }); - break; - case ResultTypes.RASTER: - layer = new RasterLayer({ - name: outputName, - operator, - // TODO: read out of operator if specified - symbology: MappingRasterSymbology.createSymbology({unit: Unit.defaultUnit}), - // provenance: provenance$, - }); - break; - default: - throw Error('Unknown AbstractSymbology Error'); - } - - if (this.editable) { - // TODO: implement replace functionality - this.projectService.addLayer(layer); - } else { - this.projectService.addLayer(layer); - } - } else { - // PLOT - const plot = new Plot({ - name: outputName, - operator, - }); - - if (this.editable) { - this.projectService.replacePlot(this.editable as Plot, plot); - } else { - this.projectService.addPlot(plot); - } - } - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/r/r-script-load/r-script-load.component.html b/projects/wave-core/src/lib/operators/dialogs/r/r-script-load/r-script-load.component.html deleted file mode 100644 index 01d42983..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/r/r-script-load/r-script-load.component.html +++ /dev/null @@ -1,10 +0,0 @@ -Load R Script -
    - - - {{ name }} - - - -
    - diff --git a/projects/wave-core/src/lib/operators/dialogs/r/r-script-load/r-script-load.component.scss b/projects/wave-core/src/lib/operators/dialogs/r/r-script-load/r-script-load.component.scss deleted file mode 100644 index c8400b3d..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/r/r-script-load/r-script-load.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -mat-radio-group, -mat-radio-button, -button { - width: 100%; -} - -button { - margin-top: 1rem; -} - -mat-progress-spinner { - width: 50%; - height: auto; - margin: 0 auto; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/r/r-script-load/r-script-load.component.ts b/projects/wave-core/src/lib/operators/dialogs/r/r-script-load/r-script-load.component.ts deleted file mode 100644 index d05b5484..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/r/r-script-load/r-script-load.component.ts +++ /dev/null @@ -1,57 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy, AfterViewInit} from '@angular/core'; -import {BehaviorSubject, ReplaySubject} from 'rxjs'; -import {FormBuilder, Validators, FormGroup} from '@angular/forms'; -import {StorageService} from '../../../../storage/storage.service'; -import {MatDialogRef} from '@angular/material/dialog'; -import {RScript} from '../../../../storage/storage-provider.model'; -import {NotificationService} from '../../../../notification.service'; - -export interface RScriptLoadResult { - script: RScript; -} - -@Component({ - selector: 'wave-r-script-load', - templateUrl: './r-script-load.component.html', - styleUrls: ['./r-script-load.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class RScriptLoadComponent implements OnInit, AfterViewInit { - form: FormGroup; - - scriptNames$ = new ReplaySubject>(1); - loading$ = new BehaviorSubject(true); - - constructor( - private storageService: StorageService, - private formBuilder: FormBuilder, - private dialogRef: MatDialogRef, - private notificationService: NotificationService, - ) {} - - ngOnInit() { - this.form = this.formBuilder.group({ - scriptName: [undefined, Validators.required], - }); - - this.storageService.getRScripts().subscribe((scripts) => { - this.scriptNames$.next(scripts); - this.loading$.next(false); - }); - } - - ngAfterViewInit() { - setTimeout(() => this.form.updateValueAndValidity()); - } - - load() { - this.loading$.next(true); - - const scriptName: string = this.form.controls['scriptName'].value; - this.storageService.loadRScriptByName(scriptName).subscribe((script) => { - this.loading$.next(false); - this.notificationService.info(`Loaded R script »${scriptName}«`); - this.dialogRef.close({script: script} as RScriptLoadResult); - }); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/r/r-script-save/r-script-save.component.html b/projects/wave-core/src/lib/operators/dialogs/r/r-script-save/r-script-save.component.html deleted file mode 100644 index d4b913a8..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/r/r-script-save/r-script-save.component.html +++ /dev/null @@ -1,11 +0,0 @@ -Save R Script -
    - - - - The name must be non-empty. - - - -
    - diff --git a/projects/wave-core/src/lib/operators/dialogs/r/r-script-save/r-script-save.component.scss b/projects/wave-core/src/lib/operators/dialogs/r/r-script-save/r-script-save.component.scss deleted file mode 100644 index d3cb4cb0..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/r/r-script-save/r-script-save.component.scss +++ /dev/null @@ -1,19 +0,0 @@ -mat-form-field, -input, -button { - width: 100%; -} - -button { - margin-top: 1rem; -} - -.error { - color: var(--wave-warn-color, red); -} - -mat-progress-spinner { - width: 50%; - height: auto; - margin: 0 auto; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/r/r-script-save/r-script-save.component.ts b/projects/wave-core/src/lib/operators/dialogs/r/r-script-save/r-script-save.component.ts deleted file mode 100644 index 21e64925..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/r/r-script-save/r-script-save.component.ts +++ /dev/null @@ -1,56 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy, AfterViewInit, Inject} from '@angular/core'; -import {FormGroup, FormBuilder, Validators} from '@angular/forms'; -import {StorageService} from '../../../../storage/storage.service'; -import {MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; -import {RScript} from '../../../../storage/storage-provider.model'; -import {BehaviorSubject} from 'rxjs'; -import {NotificationService} from '../../../../notification.service'; -import {WaveValidators} from '../../../../util/form.validators'; - -export interface RScriptSaveComponentConfig { - script: RScript; -} - -@Component({ - selector: 'wave-r-script-save', - templateUrl: './r-script-save.component.html', - styleUrls: ['./r-script-save.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class RScriptSaveComponent implements OnInit, AfterViewInit { - form: FormGroup; - - loading$ = new BehaviorSubject(false); - - constructor( - private storageService: StorageService, - private formBuilder: FormBuilder, - private dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) private config: RScriptSaveComponentConfig, - private notificationService: NotificationService, - ) {} - - ngOnInit() { - this.form = this.formBuilder.group({ - name: ['', [Validators.required, WaveValidators.notOnlyWhitespace]], - script: [this.config.script, Validators.required], - }); - } - - ngAfterViewInit() { - setTimeout(() => this.form.updateValueAndValidity()); - } - - save() { - this.loading$.next(true); - - const scriptName: string = this.form.controls['name'].value; - const script: RScript = this.form.controls['script'].value; - - this.storageService.saveRScript(scriptName, script).subscribe(() => { - this.loading$.next(false); - this.notificationService.info(`Stored R script »${scriptName}«`); - this.dialogRef.close(); - }); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/raster-mask/raster-mask.component.html b/projects/wave-core/src/lib/operators/dialogs/raster-mask/raster-mask.component.html deleted file mode 100644 index 96a21ddd..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/raster-mask/raster-mask.component.html +++ /dev/null @@ -1,26 +0,0 @@ -Raster Mask - - - The Raster Mask modifies an input raster layer by applying another raster layer as a mask . The mask layer should contain either - zeros and ones or NO DATA and ones. The resulting layer contains its original values at all positions that are neither zero nor NO DATA. - - -
    -
    - - - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/raster-mask/raster-mask.component.scss b/projects/wave-core/src/lib/operators/dialogs/raster-mask/raster-mask.component.scss deleted file mode 100644 index 79df5eae..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/raster-mask/raster-mask.component.scss +++ /dev/null @@ -1,16 +0,0 @@ -:host { - display: block; - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.actions { - text-align: right; - padding: 1rem; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/raster-mask/raster-mask.component.ts b/projects/wave-core/src/lib/operators/dialogs/raster-mask/raster-mask.component.ts deleted file mode 100644 index dd93f801..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/raster-mask/raster-mask.component.ts +++ /dev/null @@ -1,72 +0,0 @@ -import {Component, ChangeDetectionStrategy} from '@angular/core'; -import {ResultTypes} from '../../result-type.model'; -import {FormControl, FormGroup, Validators} from '@angular/forms'; -import {combineLatest, Observable} from 'rxjs'; -import {map} from 'rxjs/operators'; -import {ProjectService} from '../../../project/project.service'; -import {Layer, RasterLayer} from '../../../layers/layer.model'; -import {AbstractSymbology, AbstractRasterSymbology} from '../../../layers/symbology/symbology.model'; -import {Operator} from '../../operator.model'; -import {ExpressionType} from '../../types/expression-type.model'; - -@Component({ - selector: 'wave-raster-mask', - templateUrl: './raster-mask.component.html', - styleUrls: ['./raster-mask.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class RasterMaskComponent { - readonly RASTER_TYPE = [ResultTypes.RASTER]; - - form: FormGroup; - formIsInvalid$: Observable; - availableMaskLayers$: Observable>>; - - constructor(private projectService: ProjectService) { - this.form = new FormGroup({ - input: new FormControl(undefined, [Validators.required]), - mask: new FormControl(undefined, [Validators.required]), - name: new FormControl('Masked Layer', [Validators.required]), - }); - - this.formIsInvalid$ = this.form.statusChanges.pipe(map((status) => status !== 'VALID')); - - this.availableMaskLayers$ = combineLatest([this.form.controls.input.valueChanges, this.projectService.getLayerStream()]).pipe( - map(([selectedLayer, list]: [Layer, Array>]) => { - return list.filter((layer) => layer !== selectedLayer); - }), - ); - - setTimeout(() => { - // calculate validity to enforce invalid state upfront - this.form.controls.input.updateValueAndValidity({emitEvent: true}); - this.form.updateValueAndValidity(); - }); - } - - add() { - const inputLayer: RasterLayer = this.form.controls.input.value; - const maskLayer: RasterLayer = this.form.controls.mask.value; - const name = this.form.controls.name.value as string; - - this.projectService.addLayer( - new RasterLayer({ - name, - operator: new Operator({ - attributes: inputLayer.operator.attributes, - dataTypes: inputLayer.operator.dataTypes, - operatorType: new ExpressionType({ - datatype: inputLayer.operator.dataTypes.get('value'), - expression: 'B != 0 ? A : out_info->no_data', - unit: inputLayer.operator.units.get('value'), - }), - projection: inputLayer.operator.projection, - rasterSources: [inputLayer.operator, maskLayer.operator], - resultType: inputLayer.operator.resultType, - units: inputLayer.operator.units, - }), - symbology: inputLayer.symbology, - }), - ); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/raster-polygon-clip/raster-polygon-clip.component.html b/projects/wave-core/src/lib/operators/dialogs/raster-polygon-clip/raster-polygon-clip.component.html deleted file mode 100644 index af8ade87..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/raster-polygon-clip/raster-polygon-clip.component.html +++ /dev/null @@ -1,15 +0,0 @@ -Raster Polygon Clip -
    -
    - - - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/raster-polygon-clip/raster-polygon-clip.component.scss b/projects/wave-core/src/lib/operators/dialogs/raster-polygon-clip/raster-polygon-clip.component.scss deleted file mode 100644 index ff2e4bf3..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/raster-polygon-clip/raster-polygon-clip.component.scss +++ /dev/null @@ -1,19 +0,0 @@ -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.container { - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -.actions { - text-align: right; - padding: 1rem; -} - -.error { - color: var(--wave-warn-color, red); -} diff --git a/projects/wave-core/src/lib/operators/dialogs/raster-polygon-clip/raster-polygon-clip.component.ts b/projects/wave-core/src/lib/operators/dialogs/raster-polygon-clip/raster-polygon-clip.component.ts deleted file mode 100644 index 51e91cd8..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/raster-polygon-clip/raster-polygon-clip.component.ts +++ /dev/null @@ -1,84 +0,0 @@ -import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core'; - -import {RandomColorService} from '../../../util/services/random-color.service'; - -import {RasterLayer} from '../../../layers/layer.model'; -import {Operator} from '../../operator.model'; -import {ResultTypes} from '../../result-type.model'; -import {AbstractRasterSymbology} from '../../../layers/symbology/symbology.model'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; -import {WaveValidators} from '../../../util/form.validators'; -import {ProjectService} from '../../../project/project.service'; -import {ExpressionType} from '../../types/expression-type.model'; -import {RasterizePolygonType} from '../../types/rasterize-polygon-type.model'; - -/** - * This component allows composing the raster polygon clip operator. - */ -@Component({ - selector: 'wave-raster-polygon-clip', - templateUrl: './raster-polygon-clip.component.html', - styleUrls: ['./raster-polygon-clip.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class RasterPolygonClipOperatorComponent implements OnInit { - ResultTypes = ResultTypes; - - form: FormGroup; - - constructor(private randomColorService: RandomColorService, private projectService: ProjectService, private formBuilder: FormBuilder) { - this.form = formBuilder.group({ - name: ['Clipped Raster', [Validators.required, WaveValidators.notOnlyWhitespace]], - rasterLayer: [undefined, Validators.required], - polygonLayer: [undefined, Validators.required], - }); - } - - ngOnInit(): void { - setTimeout(() => this.form.updateValueAndValidity({emitEvent: true})); - } - - add() { - if (this.form.invalid) { - return; - } - - const rasterLayer: RasterLayer = this.form.controls['rasterLayer'].value; - const rasterOperator: Operator = rasterLayer.operator; - const polygonOperator: Operator = this.form.controls['polygonLayer'].value.operator; - - const name: string = this.form.controls['name'].value; - - const rasterizePolygonOperator = new Operator({ - operatorType: new RasterizePolygonType({}), - resultType: ResultTypes.RASTER, - projection: rasterOperator.projection, - attributes: rasterOperator.attributes, - dataTypes: rasterOperator.dataTypes, - units: rasterOperator.units, - polygonSources: [polygonOperator], - }); - - const expressionOperator = new Operator({ - operatorType: new ExpressionType({ - expression: `B > 0 ? A : NAN`, - datatype: rasterOperator.getDataType('value'), - unit: rasterOperator.getUnit('value'), - }), - resultType: ResultTypes.RASTER, - projection: rasterOperator.projection, - attributes: rasterOperator.attributes, - dataTypes: rasterOperator.dataTypes, - units: rasterOperator.units, - rasterSources: [rasterOperator, rasterizePolygonOperator], - }); - - const layer = new RasterLayer({ - name, - operator: expressionOperator, - symbology: rasterLayer.symbology, - }); - - this.projectService.addLayer(layer); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/raster-value-extraction/raster-value-extraction.component.html b/projects/wave-core/src/lib/operators/dialogs/raster-value-extraction/raster-value-extraction.component.html deleted file mode 100644 index cfe6bfcc..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/raster-value-extraction/raster-value-extraction.component.html +++ /dev/null @@ -1,34 +0,0 @@ -Extract a Raster Value and Add it to the Vector Layer -
    -
    - - - -
    - - - - Duplicate Value - - -
    - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/raster-value-extraction/raster-value-extraction.component.scss b/projects/wave-core/src/lib/operators/dialogs/raster-value-extraction/raster-value-extraction.component.scss deleted file mode 100644 index 902d0327..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/raster-value-extraction/raster-value-extraction.component.scss +++ /dev/null @@ -1,24 +0,0 @@ -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.container { - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -.actions { - text-align: right; - padding: 1rem; -} - -div { - padding-bottom: 0.5rem; - padding-top: 1rem; -} - -.error { - color: var(--wave-warn-color, red); -} diff --git a/projects/wave-core/src/lib/operators/dialogs/raster-value-extraction/raster-value-extraction.component.ts b/projects/wave-core/src/lib/operators/dialogs/raster-value-extraction/raster-value-extraction.component.ts deleted file mode 100644 index b5deb50e..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/raster-value-extraction/raster-value-extraction.component.ts +++ /dev/null @@ -1,242 +0,0 @@ -import {ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy} from '@angular/core'; -import {ResultTypes} from '../../result-type.model'; -import {FormArray, FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms'; -import {RandomColorService} from '../../../util/services/random-color.service'; -import {LetterNumberConverter} from '../helpers/multi-layer-selection/multi-layer-selection.component'; -import {Subscription} from 'rxjs'; -import {VectorLayer} from '../../../layers/layer.model'; -import {AbstractVectorSymbology, PointSymbology, VectorSymbology} from '../../../layers/symbology/symbology.model'; -import {Operator} from '../../operator.model'; -import {RasterValueExtractionType} from '../../types/raster-value-extraction-type.model'; -import {WaveValidators} from '../../../util/form.validators'; -import {ProjectService} from '../../../project/project.service'; - -/** - * Checks for collisions of value name. - * Uses `startsWith` semantics. - */ -function valueNameCollision(vectorLayerControl: FormControl, valueNames: FormArray) { - return (control: FormControl): {[key: string]: boolean} => { - const errors: { - duplicateName?: boolean; - } = {}; - - const valueName: string = control.value; - - let duplicates = 0; - - for (const otherValueName of valueNames.value as Array) { - if (otherValueName.startsWith(valueName)) { - duplicates++; - } - } - - if (duplicates < 2) { - const vectorLayer: VectorLayer = vectorLayerControl.value; - if (vectorLayer) { - for (const otherValueName of vectorLayer.operator.attributes.toArray()) { - if (otherValueName.startsWith(valueName)) { - duplicates++; - } - } - } - } - - if (duplicates > 1) { - errors.duplicateName = true; - } - - return Object.keys(errors).length > 0 ? errors : null; - }; -} - -@Component({ - selector: 'wave-raster-value-extraction', - templateUrl: './raster-value-extraction.component.html', - styleUrls: ['./raster-value-extraction.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class RasterValueExtractionOperatorComponent implements OnDestroy { - // make accessible - ResultTypes = ResultTypes; - LetterNumberConverter = LetterNumberConverter; - // - - form: FormGroup; - - private valueNameChanges: Array = []; - - private subscriptions: Array = []; - - constructor( - private projectService: ProjectService, - private randomColorService: RandomColorService, - private formBuilder: FormBuilder, - private changeDetectorRef: ChangeDetectorRef, - ) { - this.form = this.formBuilder.group({ - vectorLayer: [undefined, Validators.required], - rasterLayers: [undefined, Validators.required], - valueNames: this.formBuilder.array([]), - name: ['Vectors With Raster Values', [Validators.required, WaveValidators.notOnlyWhitespace]], - }); - - this.subscriptions.push( - // update valueNames - this.form.controls['rasterLayers'].valueChanges.subscribe((rasters) => { - const valueNames = this.form.controls['valueNames'] as FormArray; - - if (valueNames.length > rasters.length) { - // remove name fields - for (let i = rasters.length; i < valueNames.length; i++) { - valueNames.removeAt(i); - this.valueNameChanges.splice(i, 1); - } - } else if (valueNames.length < rasters.length) { - // add name fields - for (let i = valueNames.length; i < rasters.length; i++) { - const control = this.formBuilder.control( - rasters[i].name, - Validators.compose([ - Validators.required, - valueNameCollision( - this.form.controls['vectorLayer'] as FormControl, - this.form.controls['valueNames'] as FormArray, - ), - ]), - ); - valueNames.push(control); - this.valueNameChanges.push(false); - - this.subscriptions.push( - control.valueChanges.subscribe((valueName) => { - // const rasterName = this.form.controls['rasterLayers'].value[i].name; - const rasterName = rasters[i].name; - if (valueName !== rasterName) { - this.valueNameChanges[i] = true; - } - - // check validity of other valueName controls - setTimeout( - () => - valueNames.controls.forEach((myControl) => { - myControl.updateValueAndValidity({ - onlySelf: false, - emitEvent: false, - }); - this.changeDetectorRef.markForCheck(); - }), - 0, - ); - }), - ); - } - } else { - // update names if not changed by user - for (let i = 0; i < rasters.length; i++) { - if (!this.valueNameChanges[i]) { - valueNames.at(i).setValue(rasters[i].name); - } - // TODO: change name if other layer is selected - } - } - }), - ); - } - - ngOnDestroy() { - this.subscriptions.forEach((subscription) => subscription.unsubscribe()); - } - - add(event: any) { - const vectorOperator: Operator = this.form.controls['vectorLayer'].value.operator; - const projection = vectorOperator.projection; - const resultType = vectorOperator.resultType; - - const rasterOperators: Array = this.form.controls['rasterLayers'].value.map((inputLayer) => - inputLayer.operator.getProjectedOperator(projection), - ); - - const valueNames: Array = this.form.controls['valueNames'].value; - - // ATTENTION: make the three mutable copies to loop just once over the rasters - // -> make them immutable to put them into the operator - const units = vectorOperator.units.asMutable(); - const dataTypes = vectorOperator.dataTypes.asMutable(); - const attributes = vectorOperator.attributes.asMutable(); - - const name: string = this.form.controls['name'].value; - - // TODO: magic numbers - const resolutionX = 1024; - const resolutionY = 1024; - - let clustered = false; - let symbology: AbstractVectorSymbology; - - switch (resultType) { - case ResultTypes.POINTS: - clustered = this.form.controls['vectorLayer'].value.clustered; - - symbology = clustered - ? PointSymbology.createClusterSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }) - : PointSymbology.createSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }); - - for (let i = 0; i < rasterOperators.length; i++) { - units.set(valueNames[i], rasterOperators[i].getUnit('value')); - dataTypes.set(valueNames[i], rasterOperators[i].getDataType('value')); - attributes.push(valueNames[i]); - } - - break; - case ResultTypes.POLYGONS: - symbology = VectorSymbology.createSymbology({ - fillRGBA: this.randomColorService.getRandomColorRgba(), - }); - - for (let i = 0; i < rasterOperators.length; i++) { - for (const valueSuffix of ['mean', 'stdev', 'min', 'max']) { - const attributeName = `${valueNames[i]}_${valueSuffix}`; - - units.set(attributeName, rasterOperators[i].getUnit('value')); - dataTypes.set(attributeName, rasterOperators[i].getDataType('value')); - attributes.push(attributeName); - } - } - - break; - default: - throw Error('Unsupported result type for raster_value_extraction operator'); - } - - const operator = new Operator({ - operatorType: new RasterValueExtractionType({ - xResolution: resolutionX, - yResolution: resolutionY, - attributeNames: valueNames, - }), - resultType, - projection, - attributes: attributes.asImmutable(), // immutable! - dataTypes: dataTypes.asImmutable(), // immutable! - units: units.asImmutable(), // immutable! - pointSources: resultType === ResultTypes.POINTS ? [vectorOperator] : undefined, - lineSources: resultType === ResultTypes.LINES ? [vectorOperator] : undefined, - polygonSources: resultType === ResultTypes.POLYGONS ? [vectorOperator] : undefined, - rasterSources: rasterOperators, - }); - - const layer = new VectorLayer({ - name, - operator, - symbology, - clustered, - }); - - this.projectService.addLayer(layer); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/rgb-composite/rgb-composite.component.html b/projects/wave-core/src/lib/operators/dialogs/rgb-composite/rgb-composite.component.html deleted file mode 100644 index c0ccb3ea..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/rgb-composite/rgb-composite.component.html +++ /dev/null @@ -1,82 +0,0 @@ -Create RGB Composite - - -

    - A RGB Composite, which is, for instance, the data product of any conventional digital camera, is a combination of three - channels in the visual light spectrum: red, green and blue. This operator allows to combine three channels (Input A, B and C) and - calculates a new RGB image based on the channel selection. The min/max values can be derived in two different ways: (1.) - calculate them on the basis of the channels' raster values or (2.) based on the image metadata. After setting the min/max values, - click the Create button. An additional option for this operator is to weight the influence of the channels on the resulting - RGB image by changing the Scaling Factor. -

    -

    - Note: Pay attention to the channel description given by the data provider to select the correct bands for the red, green and blue - channel, respectively. -

    -
    - -
    -
    - - -
    - - - - -

    Red Channel (A)

    -
    - - - - - - - - - -
    -

    Green Channel (B)

    -
    - - - - - - - - - -
    -

    Blue Channel (C)

    -
    - - - - - - - - - -
    -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/rgb-composite/rgb-composite.component.scss b/projects/wave-core/src/lib/operators/dialogs/rgb-composite/rgb-composite.component.scss deleted file mode 100644 index 5365a72f..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/rgb-composite/rgb-composite.component.scss +++ /dev/null @@ -1,28 +0,0 @@ -:host { - display: block; - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.container { -} - -.container div mat-form-field:not(:last-child) { - margin-right: 1rem; -} - -.container button, -.container mat-spinner { - margin-bottom: 1rem; -} - -.actions { - text-align: right; - padding: 1rem; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/rgb-composite/rgb-composite.component.ts b/projects/wave-core/src/lib/operators/dialogs/rgb-composite/rgb-composite.component.ts deleted file mode 100644 index d3f916ec..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/rgb-composite/rgb-composite.component.ts +++ /dev/null @@ -1,250 +0,0 @@ -import {ChangeDetectionStrategy, Component, OnDestroy, OnInit} from '@angular/core'; -import {FormControl, FormGroup, Validators} from '@angular/forms'; -import {ResultTypes} from '../../result-type.model'; -import {ProjectService} from '../../../project/project.service'; -import {Layer, RasterLayer} from '../../../layers/layer.model'; -import {MappingRasterSymbology, AbstractRasterSymbology, AbstractSymbology} from '../../../layers/symbology/symbology.model'; -import {Interpolation, Unit} from '../../unit.model'; -import {Operator} from '../../operator.model'; -import {NotificationService} from '../../../notification.service'; -import {DataType, DataTypes} from '../../datatype.model'; -import {ColorizerData} from '../../../colors/colorizer-data.model'; -import {ColorBreakpoint} from '../../../colors/color-breakpoint.model'; -import {RgbaCompositeType} from '../../types/rgba-composite-type.model'; -import {BehaviorSubject, Observable, Subscription} from 'rxjs'; -import {MappingQueryService} from '../../../queries/mapping-query.service'; -import {first, map} from 'rxjs/operators'; -import {StatisticsType} from '../../types/statistics-type.model'; -import {LayoutService} from '../../../layout.service'; -import {WaveValidators} from '../../../util/form.validators'; - -/** - * This dialog allows users to create an RGB composite out of multiple raster layers. - */ -@Component({ - selector: 'wave-create-rgb-composite', - templateUrl: './rgb-composite.component.html', - styleUrls: ['./rgb-composite.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class RgbCompositeComponent implements OnInit, OnDestroy { - readonly inputTypes = [ResultTypes.RASTER]; - readonly numberOfRasters = 3; - readonly loadingSpinnerDiameter = 2 * LayoutService.remInPx; - - form: FormGroup; - formIsInvalid$: Observable; - notAllLayersSet$: Observable; - isRasterStatsLoading$ = new BehaviorSubject(false); - - private inputLayersubscriptions: Subscription; - - /** - * DI for several dependent services - */ - constructor( - private projectService: ProjectService, - private notificationService: NotificationService, - private mappingQueryService: MappingQueryService, - ) {} - - ngOnInit() { - this.form = new FormGroup({ - inputLayers: new FormControl(undefined, [ - Validators.required, - Validators.minLength(this.numberOfRasters), - Validators.maxLength(this.numberOfRasters), - ]), - redMin: new FormControl(undefined, [WaveValidators.isNumber]), - redMax: new FormControl(undefined, [WaveValidators.isNumber]), - redScale: new FormControl(1, [WaveValidators.isNumber, Validators.min(0), Validators.max(1)]), - greenMin: new FormControl(undefined, [WaveValidators.isNumber]), - greenMax: new FormControl(undefined, [WaveValidators.isNumber]), - greenScale: new FormControl(1, [WaveValidators.isNumber, Validators.min(0), Validators.max(1)]), - blueMin: new FormControl(undefined, [WaveValidators.isNumber]), - blueMax: new FormControl(undefined, [WaveValidators.isNumber]), - blueScale: new FormControl(1, [WaveValidators.isNumber, Validators.min(0), Validators.max(1)]), - }); - - this.formIsInvalid$ = this.form.statusChanges.pipe(map((status) => status !== 'VALID')); - this.notAllLayersSet$ = this.form.controls['inputLayers'].valueChanges.pipe( - map((value: Array>) => { - return ( - value === undefined || - value === null || - value.length !== 3 || - value.some((layer) => layer === undefined || layer === null) - ); - }), - ); - - this.inputLayersubscriptions = this.form.controls['inputLayers'].valueChanges.subscribe( - (inputLayers: Array>) => { - // set meaningful default values if possible - const colors = ['red', 'green', 'blue']; - inputLayers.forEach((inputRaster, i) => { - if (inputRaster && !this.form.controls[`${colors[i]}Min`].value) { - this.form.controls[`${colors[i]}Min`].setValue(inputLayers[i].operator.getDataType('value').getMin()); - } - if (inputRaster && !this.form.controls[`${colors[i]}Max`].value) { - this.form.controls[`${colors[i]}Max`].setValue(inputLayers[i].operator.getDataType('value').getMax()); - } - }); - }, - ); - - setTimeout(() => { - // calculate validity to enforce invalid state upfront - this.form.updateValueAndValidity(); - this.form.controls['inputLayers'].updateValueAndValidity(); - }); - } - - ngOnDestroy() { - if (this.inputLayersubscriptions) { - this.inputLayersubscriptions.unsubscribe(); - } - } - - /** - * Creates an RGB layer out of the user input and adds it to the map - */ - add() { - const inputs: Array> = this.form.controls['inputLayers'].value; - const operators = inputs.map((layer) => layer.operator); - - if (inputs.length !== 3) { - this.notificationService.error('RGBA calculation requires 3 inputs.'); - return; - } - - // in case the operators have different projections, use projection of first one - const projection = operators[0].projection; - for (let i = 1; i < operators.length; ++i) { - operators[i] = operators[i].getProjectedOperator(projection); - } - - const unit = new Unit({ - interpolation: Interpolation.Unknown, - measurement: 'unknown', - unit: 'unknown', - min: 1, - max: 0xffffffff, - }); - - this.projectService.addLayer( - new RasterLayer({ - name: `RGB of (${inputs.map((layer) => layer.name).join(', ')})`, - operator: new Operator({ - operatorType: new RgbaCompositeType({ - rasterRedMin: this.form.controls['redMin'].value, - rasterRedMax: this.form.controls['redMax'].value, - rasterRedScale: this.form.controls['redScale'].value, - rasterGreenMin: this.form.controls['greenMin'].value, - rasterGreenMax: this.form.controls['greenMax'].value, - rasterGreenScale: this.form.controls['greenScale'].value, - rasterBlueMin: this.form.controls['blueMin'].value, - rasterBlueMax: this.form.controls['blueMax'].value, - rasterBlueScale: this.form.controls['blueScale'].value, - }), - projection, - rasterSources: operators, - resultType: ResultTypes.RASTER, - attributes: ['value'], - dataTypes: new Map().set('value', DataTypes.UInt32), - units: new Map().set('value', unit), - }), - symbology: MappingRasterSymbology.createSymbology({ - unit, - colorizer: new ColorizerData({ - breakpoints: [ - new ColorBreakpoint({rgba: {r: 0, g: 0, b: 0, a: 0}, value: 0}), - new ColorBreakpoint({rgba: {r: 255, g: 255, b: 255, a: 255}, value: 0xffffffff}), - ], - type: 'rgba_composite', - }), - }), - }), - ); - } - - /** - * Creates on-the-fly a statistics operator for the raster and pastes the result to the - * min/max input fields of the dialog - */ - calculateRasterStats() { - this.isRasterStatsLoading$.next(true); - - this.projectService - .getTimeStream() - .pipe(first()) - .subscribe((time) => { - const inputs: Array> = this.form.controls['inputLayers'].value; - const operators = inputs.map((layer) => layer.operator); - - const operatorA = operators[0]; - const projection = operatorA.projection; - const operatorB = operators[1].getProjectedOperator(projection); - const operatorC = operators[2].getProjectedOperator(projection); - - const operator = new Operator({ - operatorType: new StatisticsType({ - raster_width: 1024, - raster_height: 1024, - }), - projection, - rasterSources: [operatorA, operatorB, operatorC], - resultType: ResultTypes.PLOT, - }); - - this.mappingQueryService - .getPlotData({ - extent: projection.getExtent(), - operator, - projection, - time, - }) - .subscribe((result) => { - const rasterStatistics = ((result as any) as RasterStatisticsType).data.rasters; - - ['red', 'green', 'blue'].forEach((color, i) => { - this.form.controls[`${color}Min`].setValue(rasterStatistics[i].min); - this.form.controls[`${color}Max`].setValue(rasterStatistics[i].max); - }); - - this.isRasterStatsLoading$.next(false); - }); - }); - } - - /** - * Retrieves the min/max information of the units of the raster layers and - * pastes the result to the min/max input fields of the dialog - */ - retrieveRasterStatsFromUnit() { - const operators: Array = this.form.controls['inputLayers'].value.map((layer) => layer.operator); - - ['red', 'green', 'blue'].forEach((color, i) => { - const unit = operators[i].units.get('value', Unit.defaultUnit); - this.form.controls[`${color}Min`].setValue(unit.min); - this.form.controls[`${color}Max`].setValue(unit.max); - }); - } -} - -/** - * The result type of the raster statistics (plot) operator - * - * The results of tht rasters are returned in the same order of the query - */ -interface RasterStatisticsType { - data: { - rasters: Array<{ - count: number; - max: number; - mean: number; - min: number; - nan_count: number; - }>; - }; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.component.html b/projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.component.html deleted file mode 100644 index daf0d165..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.component.html +++ /dev/null @@ -1,55 +0,0 @@ -Scatter plot -
    -
    - -
    - - - - - {{ attribute }} - - - - - - {{ attribute }} - - - - - - Regression line -
    - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.component.scss b/projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.component.scss deleted file mode 100644 index 0fc777fd..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.component.scss +++ /dev/null @@ -1,17 +0,0 @@ -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} -.container { - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} -mat-form-field { - width: 100%; - margin: 1rem 0; -} -.actions { - text-align: right; - padding: 1rem; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.component.ts b/projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.component.ts deleted file mode 100644 index 853da6fc..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.component.ts +++ /dev/null @@ -1,68 +0,0 @@ -import {AfterViewInit, ChangeDetectionStrategy, Component, OnDestroy, OnInit} from '@angular/core'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; -import {ResultTypes} from '../../result-type.model'; -import {Operator} from '../../operator.model'; -import {Plot} from '../../../plots/plot.model'; -import {ProjectService} from '../../../project/project.service'; -import {DataTypes} from '../../datatype.model'; -import {ScatterPlotType} from '../../types/scatterplot-type.model'; -import {WaveValidators} from '../../../util/form.validators'; - -@Component({ - selector: 'wave-scatter-plot-operator', - templateUrl: './scatter-plot-operator.component.html', - styleUrls: ['./scatter-plot-operator.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ScatterPlotComponent implements OnInit, AfterViewInit, OnDestroy { - form: FormGroup; - ResultTypes = ResultTypes; - DataTypes = DataTypes; - - constructor(private formBuilder: FormBuilder, private projectService: ProjectService) {} - - ngOnInit() { - this.form = this.formBuilder.group({ - vLayer: [undefined, Validators.required], - attribute1: [undefined, Validators.required], - attribute2: [undefined, Validators.required], - isRegression: [false, Validators.required], - name: ['', [Validators.required, WaveValidators.notOnlyWhitespace]], - }); - } - - add(event: any) { - const sourceOperator: Operator = this.form.controls['vLayer'].value.operator; - - const operator: Operator = new Operator({ - operatorType: new ScatterPlotType({ - attribute1: this.form.controls['attribute1'].value.toString(), - attribute2: this.form.controls['attribute2'].value.toString(), - regression: this.form.controls['isRegression'].value, - inputType: sourceOperator.resultType, - }), - resultType: ResultTypes.PLOT, - projection: sourceOperator.projection, - pointSources: sourceOperator.resultType === ResultTypes.POINTS ? [sourceOperator] : undefined, - lineSources: sourceOperator.resultType === ResultTypes.LINES ? [sourceOperator] : undefined, - polygonSources: sourceOperator.resultType === ResultTypes.POLYGONS ? [sourceOperator] : undefined, - }); - const plot = new Plot({ - name: this.form.controls['name'].value, - operator: operator, - }); - this.projectService.addPlot(plot); - } - - ngOnDestroy() {} - - ngAfterViewInit() { - setTimeout(() => { - this.form.updateValueAndValidity({ - onlySelf: false, - emitEvent: true, - }); - this.form.controls['vLayer'].updateValueAndValidity(); - }); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.pipe.ts b/projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.pipe.ts deleted file mode 100644 index d9fdce49..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/scatter-plot-operator/scatter-plot-operator.pipe.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {Pipe} from '@angular/core'; -import {DataTypes} from '../../datatype.model'; -import {Operator} from '../../operator.model'; - -@Pipe({ - name: 'NumericPipe', -}) -export class NumericPipe { - transform(value: Array, op: Operator) { - return value.filter((x) => DataTypes.ALL_NUMERICS.indexOf(op.dataTypes.get(x)) >= 0); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/source-operator-list/source-operator-list.component.html b/projects/wave-core/src/lib/operators/dialogs/source-operator-list/source-operator-list.component.html deleted file mode 100644 index c8a3b762..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/source-operator-list/source-operator-list.component.html +++ /dev/null @@ -1,30 +0,0 @@ -Add Data - - -

    - The VAT system supports very different types of data: raster and vector data. Rasters consist of - many pixels, and each pixel contains a value for the particular location, e.g. the mean temperature. Vector data are collections of - features with attributes, e.g., a set of occurrences of pumas and the time of the observation. -

    -

    - In this section, you can select one of several data sources. Each data set is added to the map as a new layer, which you can further - process with operators. -

    -
    - -
    - - - - - {{ button.icon }} -

    {{ button.name }}

    -

    {{ button.description }}

    -
    -
    -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/source-operator-list/source-operator-list.component.scss b/projects/wave-core/src/lib/operators/dialogs/source-operator-list/source-operator-list.component.scss deleted file mode 100644 index d8f1dcb4..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/source-operator-list/source-operator-list.component.scss +++ /dev/null @@ -1,32 +0,0 @@ -:host { - display: block; - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -mat-list-item { - cursor: pointer; -} - -::ng-deep .mat-list-item-content img { - width: 100%; - height: 100%; -} - -::ng-deep .mat-list-item-content p { - color: var(--wave-foreground-secondary-text-color, grey); -} - -.disabled { - ::ng-deep .mat-list-item-content { - cursor: auto; - } - - h4 { - color: var(--wave-foreground-secondary-text-color, grey); - } - - img { - filter: grayscale(100%); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/source-operator-list/source-operator-list.component.ts b/projects/wave-core/src/lib/operators/dialogs/source-operator-list/source-operator-list.component.ts deleted file mode 100644 index 3bdde254..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/source-operator-list/source-operator-list.component.ts +++ /dev/null @@ -1,149 +0,0 @@ -import {ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit} from '@angular/core'; -import {LayoutService, SidenavConfig} from '../../../layout.service'; -import {DataRepositoryComponent} from '../data-repository/data-repository.component'; -import {RasterSourceType} from '../../types/raster-source-type.model'; -import {CsvSourceType} from '../../types/csv-source-type.model'; -import {FeaturedbSourceListComponent} from '../featuredb-source-list/featuredb-source-list.component'; -import {UserService} from '../../../users/user.service'; -import {Subscription} from 'rxjs'; -import {OlDrawFeaturesComponent} from '../draw-features/ol-draw-features.component'; -import {CountryPolygonSelectionComponent} from '../country-polygon-selection/country-polygon-selection.component'; - -/** - * These settings specify source list buttons. - * - * You can either specify a icon (name) from the icon library or an image source. - * Only `onlyIfLoggedIn` or `onlyIfLoggedOut` should be specified to see the button. - */ -export interface SourceOperatorListButton { - name: string; - description: string; - icon?: string; - iconSrc?: string; - sidenavConfig: SidenavConfig | undefined; - onlyIfLoggedIn?: boolean; - onlyIfLoggedOut?: boolean; -} - -/** - * This component provides a list of data source dialogs to add data. - */ -@Component({ - selector: 'wave-source-operator-list', - templateUrl: './source-operator-list.component.html', - styleUrls: ['./source-operator-list.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class SourceOperatorListComponent implements OnInit, OnDestroy { - /** - * A list of data source dialogs to display - */ - @Input() buttons!: Array; - - public isUserLoggedIn = false; - - private guestUserStreamSubscription: Subscription; - - /** - * DI for services - */ - constructor(private changeDetectorRef: ChangeDetectorRef, private layoutService: LayoutService, private userService: UserService) {} - - ngOnInit() { - this.guestUserStreamSubscription = this.userService.isGuestUserStream().subscribe((isGuest) => { - this.isUserLoggedIn = !isGuest; - this.changeDetectorRef.markForCheck(); - }); - } - - ngOnDestroy() { - if (this.guestUserStreamSubscription) { - this.guestUserStreamSubscription.unsubscribe(); - } - } - - /** - * Checks with respect to the current user and the settings - * whether the component can be displayed to the user - */ - isShowable(onlyIfLoggedIn?: boolean, onlyIfLoggedOut?: boolean): boolean { - if (onlyIfLoggedIn && onlyIfLoggedOut) { - return false; - } else if (onlyIfLoggedIn) { - return this.isUserLoggedIn; - } else if (onlyIfLoggedOut) { - return !this.isUserLoggedIn; - } else { - return true; - } - } - - /** - * Load a selected component into the sidenav - */ - setComponent(sidenavConfig: SidenavConfig) { - if (!sidenavConfig) { - return; - } - - this.layoutService.setSidenavContentComponent(sidenavConfig); - } - - /** - * Default for a data repository entry. - */ - static createDataRepositoryButton(): SourceOperatorListButton { - return { - name: 'Data Repository', - description: 'Generic data repository', - iconSrc: RasterSourceType.ICON_URL, - sidenavConfig: {component: DataRepositoryComponent, keepParent: true}, - }; - } - - /** - * Default for a draw features entry. - */ - static createDrawFeaturesButton(): SourceOperatorListButton { - return { - name: 'Draw Features', - description: 'Draw features on the map', - icon: 'create', - sidenavConfig: {component: OlDrawFeaturesComponent, keepParent: true}, - }; - } - - /** - * Default for a custom features entry. - */ - static createCustomFeaturesButtons(): [SourceOperatorListButton, SourceOperatorListButton] { - return [ - { - name: 'Custom Features', - description: 'Add and use custom vector features like CSV', - iconSrc: CsvSourceType.ICON_URL, - sidenavConfig: {component: FeaturedbSourceListComponent, keepParent: true}, - onlyIfLoggedIn: true, - }, - { - name: 'Custom Features', - description: 'Log in to use custom vector data from, e.g., CSV files', - iconSrc: CsvSourceType.ICON_URL, - sidenavConfig: undefined, - onlyIfLoggedOut: true, - }, - ]; - } - - /** - * Default for a country polygon selection entry. - */ - static createCountryPolygonsButton(): SourceOperatorListButton { - return { - name: 'Country Selection', - description: 'Select country borders', - icon: 'location_on', - sidenavConfig: {component: CountryPolygonSelectionComponent, keepParent: true}, - }; - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/statistics-plot/statistics-plot.component.html b/projects/wave-core/src/lib/operators/dialogs/statistics-plot/statistics-plot.component.html deleted file mode 100644 index 78275673..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/statistics-plot/statistics-plot.component.html +++ /dev/null @@ -1,22 +0,0 @@ -Layer statistics plot -
    -
    - - - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/statistics-plot/statistics-plot.component.scss b/projects/wave-core/src/lib/operators/dialogs/statistics-plot/statistics-plot.component.scss deleted file mode 100644 index d6da83a8..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/statistics-plot/statistics-plot.component.scss +++ /dev/null @@ -1,4 +0,0 @@ -:host { - display: block; - padding: 1rem; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/statistics-plot/statistics-plot.component.ts b/projects/wave-core/src/lib/operators/dialogs/statistics-plot/statistics-plot.component.ts deleted file mode 100644 index 5ec6932e..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/statistics-plot/statistics-plot.component.ts +++ /dev/null @@ -1,64 +0,0 @@ -import {Component, ChangeDetectionStrategy, AfterViewInit, OnDestroy, OnInit} from '@angular/core'; -import {FormGroup, FormBuilder, Validators} from '@angular/forms'; -import {ResultTypes} from '../../result-type.model'; -import {Operator} from '../../operator.model'; -import {Plot} from '../../../plots/plot.model'; -import {ProjectService} from '../../../project/project.service'; -import {WaveValidators} from '../../../util/form.validators'; -import {StatisticsType} from '../../types/statistics-type.model'; - -@Component({ - selector: 'wave-statistics-plot', - templateUrl: './statistics-plot.component.html', - styleUrls: ['./statistics-plot.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class StatisticsPlotComponent implements OnInit, AfterViewInit, OnDestroy { - form: FormGroup; - - ResultTypes = ResultTypes; - - constructor(private formBuilder: FormBuilder, private projectService: ProjectService) {} - - ngOnInit() { - this.form = this.formBuilder.group({ - layer: [undefined, Validators.required], - name: ['', [Validators.required, WaveValidators.notOnlyWhitespace]], - }); - } - - add() { - const sourceOperator: Operator = this.form.controls['layer'].value.operator; - const operator: Operator = new Operator({ - operatorType: new StatisticsType({ - raster_height: 256, - raster_width: 256, - }), - resultType: ResultTypes.PLOT, - projection: sourceOperator.projection, - pointSources: sourceOperator.resultType === ResultTypes.POINTS ? [sourceOperator] : undefined, - lineSources: sourceOperator.resultType === ResultTypes.LINES ? [sourceOperator] : undefined, - polygonSources: sourceOperator.resultType === ResultTypes.POLYGONS ? [sourceOperator] : undefined, - rasterSources: sourceOperator.resultType === ResultTypes.RASTER ? [sourceOperator] : undefined, - }); - - const plot = new Plot({ - name: this.form.controls['name'].value.toString(), - operator, - }); - - this.projectService.addPlot(plot); - } - - ngOnDestroy() {} - - ngAfterViewInit() { - setTimeout(() => { - this.form.updateValueAndValidity({ - onlySelf: false, - emitEvent: true, - }); - this.form.controls['layer'].updateValueAndValidity(); - }); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/textual-attribute-filter/textual-attribute-filter.component.html b/projects/wave-core/src/lib/operators/dialogs/textual-attribute-filter/textual-attribute-filter.component.html deleted file mode 100644 index 269062f4..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/textual-attribute-filter/textual-attribute-filter.component.html +++ /dev/null @@ -1,40 +0,0 @@ -Textual Attribute Filter -
    -
    - - - - - {{ attribute }} - - - - - is exactly - contains - starts with - - - - - - The search string must be non-empty. - - - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/textual-attribute-filter/textual-attribute-filter.component.scss b/projects/wave-core/src/lib/operators/dialogs/textual-attribute-filter/textual-attribute-filter.component.scss deleted file mode 100644 index f907881f..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/textual-attribute-filter/textual-attribute-filter.component.scss +++ /dev/null @@ -1,24 +0,0 @@ -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.container { - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -.actions { - text-align: right; - padding: 1rem; -} - -mat-form-field { - width: 100% !important; - margin: 0 0 1rem 0; -} - -.error { - color: var(--wave-warn-color, red); -} diff --git a/projects/wave-core/src/lib/operators/dialogs/textual-attribute-filter/textual-attribute-filter.component.ts b/projects/wave-core/src/lib/operators/dialogs/textual-attribute-filter/textual-attribute-filter.component.ts deleted file mode 100644 index 2a9719a8..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/textual-attribute-filter/textual-attribute-filter.component.ts +++ /dev/null @@ -1,125 +0,0 @@ -import {Observable} from 'rxjs'; -import {map, tap} from 'rxjs/operators'; -import {AfterViewInit, ChangeDetectionStrategy, Component} from '@angular/core'; - -import {VectorLayer} from '../../../layers/layer.model'; -import {ResultTypes} from '../../result-type.model'; -import {DataTypes} from '../../datatype.model'; -import {AbstractVectorSymbology} from '../../../layers/symbology/symbology.model'; -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; -import {Operator} from '../../operator.model'; -import {ProjectService} from '../../../project/project.service'; -import {WaveValidators} from '../../../util/form.validators'; -import {TextualAttributeFilterEngineType, TextualAttributeFilterType} from '../../types/textual-attribute-filter-type.model'; -import {RandomColorService} from '../../../util/services/random-color.service'; - -/** - * This component allows creating the textual attribute filter operator. - */ -@Component({ - selector: 'wave-textual-attribute-filter', - templateUrl: './textual-attribute-filter.component.html', - styleUrls: ['./textual-attribute-filter.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class TextualAttributeFilterOperatorComponent implements AfterViewInit { - // for the template - ResultTypes = ResultTypes; - TextualAttributeFilterEngineType = TextualAttributeFilterEngineType; - - form: FormGroup; - attributes$: Observable>; - - constructor(private projectService: ProjectService, private formBuilder: FormBuilder, private randomColorService: RandomColorService) { - this.form = formBuilder.group({ - name: ['Filtered Values', [Validators.required, WaveValidators.notOnlyWhitespace]], - vectorLayer: [undefined, Validators.required], - attribute: [undefined, Validators.required], - engine: [TextualAttributeFilterEngineType.EXACT, Validators.required], - searchString: ['', [Validators.required, WaveValidators.notOnlyWhitespace]], - }); - - this.attributes$ = this.form.controls['vectorLayer'].valueChanges.pipe( - tap((layer) => { - // side effects!!! - this.form.controls['attribute'].setValue(undefined); - if (layer) { - this.form.controls['attribute'].enable({onlySelf: true}); - } else { - this.form.controls['attribute'].disable({onlySelf: true}); - } - }), - map((layer) => { - if (layer) { - return layer.operator.attributes - .filter((attribute: string) => { - return DataTypes.Alphanumeric === layer.operator.dataTypes.get(attribute); - }) - .toArray() - .sort(); - } else { - return []; - } - }), - ); - } - - ngAfterViewInit() { - // initially get attributes - setTimeout(() => this.form.controls['vectorLayer'].enable({emitEvent: true})); - } - - add(event: any) { - const vectorLayer: VectorLayer = this.form.controls['vectorLayer'].value; - const sourceOperator: Operator = vectorLayer.operator; - - const attributeName: string = this.form.controls['attribute'].value; - const engine: TextualAttributeFilterEngineType = this.form.controls['engine'].value; - const searchString: string = this.form.controls['searchString'].value; - - const name: string = this.form.controls['name'].value; - - const dict = { - operatorType: new TextualAttributeFilterType({ - attributeName: attributeName, - engine: engine, - searchString: searchString, - }), - resultType: sourceOperator.resultType, - projection: sourceOperator.projection, - attributes: sourceOperator.attributes, - dataTypes: sourceOperator.dataTypes, - units: sourceOperator.units, - pointSources: [], - lineSources: [], - polygonSources: [], - }; - - switch (sourceOperator.resultType) { - case ResultTypes.POINTS: - dict.pointSources.push(sourceOperator); - break; - case ResultTypes.LINES: - dict.lineSources.push(sourceOperator); - break; - case ResultTypes.POLYGONS: - dict.polygonSources.push(sourceOperator); - break; - default: - throw Error('Incompatible Input Type'); - } - - const operator = new Operator(dict); - - const symbology = (vectorLayer.symbology.clone() as any) as AbstractVectorSymbology; - symbology.fillRGBA = this.randomColorService.getRandomColorRgba(); - const layer = new VectorLayer({ - name: name, - operator: operator, - symbology: symbology, - clustered: vectorLayer.clustered, - }); - - this.projectService.addLayer(layer); - } -} diff --git a/projects/wave-core/src/lib/operators/dialogs/time-plot-operator/time-plot-operator.component.html b/projects/wave-core/src/lib/operators/dialogs/time-plot-operator/time-plot-operator.component.html deleted file mode 100644 index 0750c435..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/time-plot-operator/time-plot-operator.component.html +++ /dev/null @@ -1,44 +0,0 @@ -Time plot -
    -
    - -
    - - - - - {{ attribute }} - - - - - - - - - - {{ attribute }} - - - -
    - - - - The name must be non-empty. - - -
    -
    - -
    -
    diff --git a/projects/wave-core/src/lib/operators/dialogs/time-plot-operator/time-plot-operator.component.scss b/projects/wave-core/src/lib/operators/dialogs/time-plot-operator/time-plot-operator.component.scss deleted file mode 100644 index 07e352ee..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/time-plot-operator/time-plot-operator.component.scss +++ /dev/null @@ -1,20 +0,0 @@ -form { - height: 100%; - width: 100%; - box-sizing: border-box; -} - -.container { - overflow-y: auto; - padding: 0 1rem 1rem 1rem; -} - -mat-form-field { - width: 100%; - margin: 1rem 0; -} - -.actions { - text-align: right; - padding: 1rem; -} diff --git a/projects/wave-core/src/lib/operators/dialogs/time-plot-operator/time-plot-operator.component.ts b/projects/wave-core/src/lib/operators/dialogs/time-plot-operator/time-plot-operator.component.ts deleted file mode 100644 index 45675227..00000000 --- a/projects/wave-core/src/lib/operators/dialogs/time-plot-operator/time-plot-operator.component.ts +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Created by Julian on 23/06/2017. - */ -import {AfterViewInit, ChangeDetectionStrategy, Component, OnDestroy, OnInit} from '@angular/core'; -import {AbstractControl, FormBuilder, FormGroup, ValidatorFn, Validators} from '@angular/forms'; -import {ResultTypes} from '../../result-type.model'; -import {Operator} from '../../operator.model'; -import {Plot} from '../../../plots/plot.model'; -import {ProjectService} from '../../../project/project.service'; -import {WaveValidators} from '../../../util/form.validators'; -import {TimePlotType} from '../../types/timeplot-type.model'; - -@Component({ - selector: 'wave-time-plot-operator', - templateUrl: './time-plot-operator.component.html', - styleUrls: ['./time-plot-operator.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class TimePlotComponent implements OnInit, AfterViewInit, OnDestroy { - form: FormGroup; - - ResultTypes = ResultTypes; - - constructor(private formBuilder: FormBuilder, private projectService: ProjectService) {} - - ngOnInit() { - this.form = this.formBuilder.group({ - layer: [undefined, Validators.required], - attribute: [undefined, Validators.required], - name: ['', [Validators.required, WaveValidators.notOnlyWhitespace]], - isGrouping: [false, [Validators.required]], - grouping: [undefined, this.ifEnabled], - }); - } - - add() { - const sourceOperator: Operator = this.form.controls['layer'].value.operator; - - const operator: Operator = new Operator({ - operatorType: new TimePlotType({ - attribute: this.form.controls['attribute'].value.toString(), - isGrouping: this.form.controls['isGrouping'].value, - grouping: this.form.controls['isGrouping'].value ? this.form.controls['grouping'].value.toString() : null, - time: 'DateLastEdited', - inputType: sourceOperator.resultType, - }), - resultType: ResultTypes.PLOT, - projection: sourceOperator.projection, - pointSources: sourceOperator.resultType === ResultTypes.POINTS ? [sourceOperator] : undefined, - lineSources: sourceOperator.resultType === ResultTypes.LINES ? [sourceOperator] : undefined, - polygonSources: sourceOperator.resultType === ResultTypes.POLYGONS ? [sourceOperator] : undefined, - }); - - const plot = new Plot({ - name: this.form.controls['name'].value.toString(), - operator: operator, - }); - - this.projectService.addPlot(plot); - } - - ngOnDestroy() {} - - ngAfterViewInit() { - setTimeout(() => { - this.form.updateValueAndValidity({ - onlySelf: false, - emitEvent: true, - }); - this.form.controls['layer'].updateValueAndValidity(); - }); - } - - ifEnabled(): ValidatorFn { - return (control: AbstractControl): {[key: string]: any} => { - return !control.value && !this.form.controls['isGrouping'] ? {valueRequired: {value: control.value}} : null; - }; - } -} diff --git a/projects/wave-core/src/lib/operators/operator-type-parameter-options.model.ts b/projects/wave-core/src/lib/operators/operator-type-parameter-options.model.ts deleted file mode 100644 index b2ed996e..00000000 --- a/projects/wave-core/src/lib/operators/operator-type-parameter-options.model.ts +++ /dev/null @@ -1,475 +0,0 @@ -import {OptionsDict} from './operator-type.model'; - -export type ParameterName = string; - -export const enum ParameterOptionType { - NUMBER_ARRAY, - STRING_ARRAY, - NUMBER_RANGE, - DICT_ARRAY, - EMPTY, -} - -export interface NumberParameterArrayConfig { - kind: ParameterOptionType.NUMBER_ARRAY; - options: Array; -} - -export interface EmptyContainerConfig { - kind: ParameterOptionType.EMPTY; -} - -export interface StringParameterArrayConfig { - kind: ParameterOptionType.STRING_ARRAY; - options: Array; -} - -export interface NumberParameterRangeConfig { - kind: ParameterOptionType.NUMBER_RANGE; - start: number; - stop: number; - step?: number; -} - -export interface DictParameterArrayConfig { - kind: ParameterOptionType.DICT_ARRAY; - options: Array; -} - -export type ParameterContainerType = - | EmptyParameterContainer - | NumberParameterArray - | NumberParameterRange - | StringParameterArray - | DictParameterArray; - -export enum TickType { - DISCRETE, - CONTINUOUS, -} - -/** - * Parameter option container provide the valid inputs for operator parematers. - * This is abstracted by ticks which are either in a numberic space or an enumeration of predefined values. - */ -export abstract class AbstractParameterContainer { - /** - * Get the parameter type. - */ - abstract get parameterType(): ParameterOptionType; - - /** - * Get the tick type, which indicates how to step through options. - */ - abstract get tickType(): TickType; - - /** - * Get a display value for a tick. - */ - abstract getDisplayValueForTick(tick: number): string | undefined; - - /** - * Check if a value is in this option container. - */ - containsValue(value: T): boolean { - return !!this.getTickForValue(value); - } - - /** - * Get the value for a tick. - */ - abstract getValueForTick(tick: number): T | undefined; - - /** - * Get the tick for a value. - */ - abstract getTickForValue(value: T): number | undefined; - - /** - * Check if a tick is valid. - */ - isValidTick(tick: number): boolean { - if (tick < this.firstTick || tick > this.lastTick) { - return false; - } - if (this.tickType === TickType.DISCRETE) { - return Number.isInteger(tick); - } - return true; - } - - /** - * Get the first possible tick. - */ - abstract get firstTick(): number; - - /** - * Get the last possible tick. - */ - abstract get lastTick(): number; - - /** - * Get the tick step size. Default = 1. - */ - get tickStepSize(): number { - return 1; - } - - /** - * Check if the container has ticks. - */ - hasTicks() { - return this.firstTick < this.lastTick; - } - - /** - * Generate an empty parameter option container. - */ - static getEmptyOption(): EmptyParameterContainer { - return EMPTY_OPTION; - } -} - -/** - * An empty parameter option container. - */ -export class EmptyParameterContainer extends AbstractParameterContainer { - constructor() { - super(); - } - - get parameterType(): ParameterOptionType { - return ParameterOptionType.EMPTY; - } - - get firstTick(): number { - return 0; - } - - getDisplayValueForTick(tick: number): string | undefined { - return undefined; - } - - getTickForValue(value: number): number | undefined { - return undefined; - } - - getValueForTick(tick: number): number | string | undefined { - return undefined; - } - - get lastTick(): number { - return 0; - } - - get tickType(): TickType { - return TickType.DISCRETE; - } -} - -/** - * Singleton empty option container. - */ -const EMPTY_OPTION = new EmptyParameterContainer(); - -/** - * A parameter option container for numerical parameters. - */ -export class NumberParameterArray extends AbstractParameterContainer { - /** - * The list of all valid options. - */ - options: Array; - - constructor(config: NumberParameterArrayConfig) { - super(); - this.options = config.options; - } - - get parameterType(): ParameterOptionType { - return ParameterOptionType.NUMBER_ARRAY; - } - - static fromDict(dict: NumberParameterArrayConfig) { - return new NumberParameterArray(dict); - } - - toDict(): NumberParameterArrayConfig { - return { - options: this.options, - kind: ParameterOptionType.NUMBER_ARRAY, - }; - } - - get firstTick(): number { - return 0; - } - - getDisplayValueForTick(tick: number): string | undefined { - return this.getValueForTick(tick).toString(); - } - - getTickForValue(value: number): number | undefined { - const findIndex = this.options.findIndex((x) => x === value); - if (findIndex < 0) { - return undefined; - } - return findIndex; - } - - getValueForTick(tick: number): number | undefined { - if (!this.isValidTick(tick)) { - return undefined; - } - return this.options[tick]; - } - - get lastTick(): number { - return this.options.length - 1; - } - - get tickType(): TickType { - return TickType.DISCRETE; - } -} - -/** - * A parameter option container for string parameters. - */ -export class StringParameterArray extends AbstractParameterContainer { - /** - * The list of all valid options. - */ - options: Array; - - constructor(config: StringParameterArrayConfig) { - super(); - this.options = config.options; - } - - get parameterType(): ParameterOptionType { - return ParameterOptionType.STRING_ARRAY; - } - - static fromDict(dict: StringParameterArrayConfig) { - return new StringParameterArray(dict); - } - - get firstTick(): number { - return 0; - } - - getDisplayValueForTick(tick: number): string | undefined { - return this.getValueForTick(tick).toString(); - } - - getTickForValue(value: string): number | undefined { - const findIndex = this.options.findIndex((x) => x === value); - if (findIndex < 0) { - return undefined; - } - return findIndex; - } - - getValueForTick(tick: number): string | undefined { - if (!this.isValidTick(tick)) { - return undefined; - } - return this.options[tick]; - } - - get lastTick(): number { - return this.options.length - 1; - } - - get tickType(): TickType { - return TickType.DISCRETE; - } -} - -/** - * An interface for numeric range parameters. - */ -export class NumberParameterRange extends AbstractParameterContainer { - /** - * Range start. - */ - start: number; - /** - * Range end. - */ - stop: number; - /** - * Range step size. - */ - step = 1; - - constructor(config: NumberParameterRangeConfig) { - super(); - this.start = config.start; - this.stop = config.stop; - this.step = config.step ? config.step : 1; - } - - get parameterType(): ParameterOptionType { - return ParameterOptionType.NUMBER_RANGE; - } - - static fromDict(dict: NumberParameterRangeConfig) { - return new NumberParameterRange(dict); - } - - toDict(): NumberParameterRangeConfig { - return { - start: this.start, - stop: this.stop, - step: this.step, - kind: ParameterOptionType.NUMBER_RANGE, - }; - } - - get firstTick(): number { - return this.start; - } - - getDisplayValueForTick(tick: number): string | undefined { - return this.getValueForTick(tick).toString(); - } - - getTickForValue(value: number): number | undefined { - return this.getValueForTick(value); - } - - getValueForTick(tick: number): number | undefined { - if (!this.isValidTick(tick)) { - return undefined; - } - return tick; - } - - get lastTick(): number { - return this.stop; - } - - get tickStepSize(): number { - return this.step; - } - - get tickType(): TickType { - return TickType.CONTINUOUS; - } -} - -/** - * An interface for complex parameter options. - * The type of the option type is generic but has to implement OptionsDict. - */ -export class DictParameterArray extends AbstractParameterContainer { - /** - * List of all valid options. - */ - options: Array; - - constructor(config: DictParameterArrayConfig) { - super(); - this.options = config.options; - } - - get parameterType(): ParameterOptionType { - return ParameterOptionType.DICT_ARRAY; - } - - static fromDict(dict: DictParameterArrayConfig): DictParameterArray { - return new DictParameterArray(dict); - } - - toDict(): DictParameterArrayConfig { - return { - options: this.options, - kind: ParameterOptionType.DICT_ARRAY, - }; - } - - get firstTick(): number { - return 0; - } - - getDisplayValueForTick(tick: number): string | undefined { - return this.getValueForTick(tick).displayValue.toString(); - } - - getTickForValue(value: T): number | undefined { - const findIndex = this.options.findIndex((x) => x.displayValue === value.displayValue); // TODO: review if displayValue is distinct - if (findIndex < 0) { - return undefined; - } - return findIndex; - } - - getValueForTick(tick: number): T | undefined { - if (!this.isValidTick(tick)) { - return undefined; - } - return this.options[tick]; - } - - get lastTick(): number { - return this.options.length - 1; - } - - get tickType(): TickType { - return TickType.DISCRETE; - } -} - -/** - * Dictionary for serializing the operator type. - */ -export interface OperatorTypeParameterOptionsConfig { - operatorType: string; -} - -/** - * The operator basic type. - */ -export abstract class OperatorTypeParameterOptions { - operatorType: string; - - constructor(config: OperatorTypeParameterOptionsConfig) { - this.operatorType = config.operatorType; - } - - /** - * Serialize the operator type. - */ - abstract toDict(): OperatorTypeParameterOptionsConfig; - - /** - * Get the parameter option type for a parameter name. - */ - public getParameterOption(parameterName: ParameterName): ParameterContainerType { - const res: [ParameterName, ParameterContainerType] = this.getParameterOptions().find(([pN, _]) => pN === parameterName); - if (!res) { - return AbstractParameterContainer.getEmptyOption(); - } - const [_, pOption] = res; - return pOption; - } - - /** - * Get the parameter options as array of tuples [ParameterName, ParameterContainerType]. - */ - public abstract getParameterOptions(): Array<[ParameterName, ParameterContainerType]>; - - /** - * Get the parameter options as array of tuples [ParameterName, ParameterOptionType]. - */ - public abstract getParametersTypes(): Array<[ParameterName, ParameterOptionType]>; - - /** - * Get a list of all parameter names. - */ - public getParameterNames(): Array { - return this.getParametersTypes().map(([n, _]) => n); - } -} diff --git a/projects/wave-core/src/lib/operators/operator-type.model.ts b/projects/wave-core/src/lib/operators/operator-type.model.ts deleted file mode 100644 index 3585e4a8..00000000 --- a/projects/wave-core/src/lib/operators/operator-type.model.ts +++ /dev/null @@ -1,129 +0,0 @@ -// eslint-disable-line - -/** - * Options allowed when cloning the operator - */ -export interface OperatorTypeCloneOptions {} // eslint-disable-line @typescript-eslint/no-empty-interface - -/** - * Dictionary for querying the server. - */ -export interface OperatorTypeMappingDict {} // eslint-disable-line @typescript-eslint/no-empty-interface - -/** - * Dictionary for serializing the operator type. - */ -export interface OperatorTypeDict { - operatorType: string; -} - -/** - * Interface required for complex operator parameter options. - * It represents display values of type options. - */ -export interface OptionsDict { - displayValue: string; -} - -/** - * The possible types of parameter values - */ -export type ParameterValue = number | string | OptionsDict; - -/** - * The operator basic type. - */ -export abstract class OperatorType { - /** - * Each operator type must have a method that returns - * an icon as a data uri image. This provides a default - * out of the operator name. - */ - public static createIconDataUrl(iconName: string) { - // TODO: replace with proper icons - // from `http://stackoverflow.com/questions/3426404/ - // create-a-hexadecimal-colour-based-on-a-string-with-javascript` - const hashCode = (str: string) => { - // java String#hashCode - let hash = 0; - for (let i = 0; i < str.length; i++) { - hash = str.charCodeAt(i) + ((hash << 5) - hash); // eslint-disable-line no-bitwise - } - return hash; - }; - const intToRGB = (i: number) => { - const c = (i & 0x00ffffff).toString(16).toUpperCase(); // eslint-disable-line no-bitwise - - return '00000'.substring(0, 6 - c.length) + c; - }; - - const color = '#' + intToRGB(hashCode(iconName)); - const size = 64; - - const canvas = document.createElement('canvas'); - canvas.width = size; - canvas.height = size; - const context = canvas.getContext('2d'); - context.fillStyle = color; - context.fillRect(0, 0, 64, 64); - return canvas.toDataURL('image/png'); - } - - /** - * Get the server-side name of the type. - */ - abstract getMappingName(): string; - - /** - * Human-readable type name. - */ - abstract toString(): string; - - /** - * Serialize the operator type. - */ - abstract toDict(): OperatorTypeDict; - - /** - * Create query parameter. - */ - abstract toMappingDict(): OperatorTypeMappingDict; - - /** - * Icon respresentation of the operator. - */ - abstract getIconUrl(): string; - - /** - * Get the value of a parameter - */ - public getParameterValue(parameterName: string): ParameterValue | undefined { - return undefined; - } - - /** - * Get the DisplayValue of a parameter - */ - public getParameterDisplayValue(parameterName: string): string | undefined { - const parameterValue = this.getParameterValue(parameterName); - if (!parameterValue) { - return undefined; - } - // parameters are either objects of 'OptionDict' i.e. they have a 'displayValue' or 'number | string' - if (typeof parameterValue === 'object') { - return parameterValue.displayValue; - } - return parameterValue.toString(); - } - - /** - * Get a human readable parameter list. - */ - abstract getParametersAsStrings(): Array<[string, string]>; - - /** - * clone an operator type with modified parameters - * @param options a dictionary with modifications - */ - abstract cloneWithModifications(options?: OperatorTypeCloneOptions): OperatorType; -} diff --git a/projects/wave-core/src/lib/operators/operator.model.ts b/projects/wave-core/src/lib/operators/operator.model.ts deleted file mode 100644 index 24fb0f26..00000000 --- a/projects/wave-core/src/lib/operators/operator.model.ts +++ /dev/null @@ -1,455 +0,0 @@ -import {List as ImmutableList, Map as ImmutableMap} from 'immutable'; - -import {ResultType, ResultTypes} from './result-type.model'; -import {Projection, Projections} from './projection.model'; -import {Unit, UnitDict} from './unit.model'; -import {DataType, DataTypes} from './datatype.model'; - -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from './operator-type.model'; -import {OperatorTypeFactory} from './types/type-factory.service'; -import {ProjectionType} from './types/projection-type.model'; -import {OperatorTypeParameterOptions, OperatorTypeParameterOptionsConfig} from './operator-type-parameter-options.model'; -import {OperatorTypeParameterOptionsFactory} from './parameter-options/type-parameter-options-factory.service'; - -type OperatorId = number; -type AttributeName = string; - -/** - * Interface for Operator constructor. - */ -interface OperatorConfig { - operatorType: OperatorType; - operatorTypeParameterOptions?: OperatorTypeParameterOptions; - resultType: ResultType; - projection: Projection; - attributes?: ImmutableList | Array; - dataTypes?: ImmutableMap | Map; - units?: ImmutableMap | Map; - rasterSources?: ImmutableList | Array; - pointSources?: ImmutableList | Array; - lineSources?: ImmutableList | Array; - polygonSources?: ImmutableList | Array; -} - -interface OperatorCloneOptions { - operatorType?: OperatorType; - operatorTypeParameterOptions?: OperatorTypeParameterOptions; -} - -/** - * Serialization interface - */ -export interface OperatorDict { - id: number; - operatorType: OperatorTypeDict; - operatorTypeParameterOptions: OperatorTypeParameterOptionsConfig; - resultType: string; - projection: string; - attributes: Array; - dataTypes: Array<[string, string]>; - units: Array<[string, UnitDict]>; - rasterSources: Array; - pointSources: Array; - lineSources: Array; - polygonSources: Array; -} - -/** - * Serialization for mapping query. - */ -interface QueryDict { - type: string; - params: OperatorTypeMappingDict; - sources?: { - raster?: Array; - points?: Array; - lines?: Array; - polygons?: Array; - }; -} - -/** - * An operator represents a query graph consisting of source operators. - * It has several metadata fields for e.g. parameters and projection. - */ -export class Operator { - static readonly RASTER_ATTRIBTE_NAME: AttributeName = 'value'; - - private static _nextOperatorId = 1; // used for operator id generation - - private _id: OperatorId; - - private _resultType: ResultType; - private _operatorType: OperatorType; - private _operatorTypeParameterOptions: OperatorTypeParameterOptions; - - private _attributes: ImmutableList; - private _dataTypes: ImmutableMap; - private _units: ImmutableMap; - - private _projection: Projection; - - private rasterSources: ImmutableList; - private pointSources: ImmutableList; - private lineSources: ImmutableList; - private polygonSources: ImmutableList; - - /** - * Deserialize an operator from a json string. - */ - static fromJSON(json: string): Operator { - return this.fromDict(JSON.parse(json)); - } - - /** - * Deserialize an operator from a dictionary. - * @param operatorDict the Dictionary - * @param operators a map from serialized ids to already deserialized operators - * @returns an operator - */ - static fromDict(operatorDict: OperatorDict, operators = new Map()): Operator { - // the operator was deserialized before, so just return it - if (operators.has(operatorDict.id)) { - return operators.get(operatorDict.id); - } - - // create the operator from the dict (recursively) - const operator = new Operator({ - operatorType: OperatorTypeFactory.fromDict(operatorDict.operatorType), - operatorTypeParameterOptions: operatorDict.operatorTypeParameterOptions - ? OperatorTypeParameterOptionsFactory.fromDict(operatorDict.operatorTypeParameterOptions) - : undefined, - resultType: ResultTypes.fromCode(operatorDict.resultType), - projection: Projections.fromCode(operatorDict.projection), - attributes: ImmutableList(operatorDict.attributes), - dataTypes: ImmutableMap( - (operatorDict.dataTypes as Array<[string, string]>).map(([name, dataTypeCode]) => [name, DataTypes.fromCode(dataTypeCode)]), - ), - units: ImmutableMap( - (operatorDict.units as Array<[string, UnitDict]>).map(([name, unitDict]) => [name, Unit.fromDict(unitDict)]), - ), - rasterSources: ImmutableList(operatorDict.rasterSources.map((dict) => Operator.fromDict(dict, operators))), - pointSources: ImmutableList(operatorDict.pointSources.map((dict) => Operator.fromDict(dict, operators))), - lineSources: ImmutableList(operatorDict.lineSources.map((dict) => Operator.fromDict(dict, operators))), - polygonSources: ImmutableList(operatorDict.polygonSources.map((dict) => Operator.fromDict(dict, operators))), - }); - - // store the operator s.th. the same operator is not deserialized into two instances - operators.set(operatorDict.id, operator); - - return operator; - } - - /** - * Instantiate an operator. - * - * @param config.operatorType The mapping type name of the operator. - * @param config.resultType A {@link resultType}. - * @param config.projection A {@link Projection}. - * @param config.displayName The user-given name of this operator instance. - * @param config.rasterSources A list of operators with {@link ResultType} `RASTER`. - * @param config.pointSources A list of operators with {@link ResultType} `POINTS`. - * @param config.lineSources A list of operators with {@link ResultType} `LINES`. - * @param config.polygonSources A list of operators with {@link ResultType} `POLYGONS`. - * - */ - constructor(config: OperatorConfig) { - this._id = Operator.nextOperatorId; - - this._operatorType = config.operatorType; - this._resultType = config.resultType; - - this._projection = config.projection; - - if (config.attributes) { - this._attributes = - config.attributes instanceof ImmutableList - ? (config.attributes as ImmutableList) - : ImmutableList(config.attributes as Array); - } else { - this._attributes = ImmutableList(); - } - - if (config.dataTypes) { - this._dataTypes = - config.dataTypes instanceof ImmutableMap - ? (config.dataTypes as ImmutableMap) - : ImmutableMap((config.dataTypes as Map).entries()); - } else { - this._dataTypes = ImmutableMap(); - } - - if (config.units) { - this._units = - config.units instanceof ImmutableMap - ? (config.units as ImmutableMap) - : ImmutableMap((config.units as Map).entries()); - } else { - this._units = ImmutableMap(); - } - - if (config.operatorTypeParameterOptions) { - this._operatorTypeParameterOptions = config.operatorTypeParameterOptions; - } else { - this._operatorTypeParameterOptions = undefined; // TODO: handle operators without parameters? - } - - const returnChecked = (source: ImmutableList | Array, type: ResultType): ImmutableList => { - if (source) { - const list = - source instanceof ImmutableList ? (source as ImmutableList) : ImmutableList(source as Array); - - if (list.filter((op) => op.resultType !== type).size > 0) { - throw Error(`The Input Operator is not of type ${type.toString()}.`); - } else { - return list; - } - } else { - return ImmutableList(); - } - }; - - this.rasterSources = returnChecked(config.rasterSources, ResultTypes.RASTER); - this.pointSources = returnChecked(config.pointSources, ResultTypes.POINTS); - this.lineSources = returnChecked(config.lineSources, ResultTypes.LINES); - this.polygonSources = returnChecked(config.polygonSources, ResultTypes.POLYGONS); - } - - /** - * Retrieve a new unique id. - * @return operator id - */ - private static get nextOperatorId(): OperatorId { - return this._nextOperatorId++; - } - - /** - * Unique id of this operator instance. - */ - get id(): OperatorId { - return this._id; - } - - /** - * The type of the operator. - */ - get operatorType(): OperatorType { - return this._operatorType; - } - - get operatorTypeParameterOptions(): OperatorTypeParameterOptions | undefined { - return this._operatorTypeParameterOptions; - } - - /** - * Retrieve the output result type. - */ - get resultType(): ResultType { - return this._resultType; - } - - /** - * Retrieve the output projection. - */ - get projection(): Projection { - return this._projection; - } - - /** - * Retrieve the output attributes. - */ - get attributes(): ImmutableList { - return this._attributes; - } - - /** - * Retrieve the attribute data type. - */ - getDataType(attribute: AttributeName): DataType { - return this._dataTypes.get(attribute); - } - - /** - * Retrieve all data types. - */ - get dataTypes(): ImmutableMap { - return this._dataTypes; - } - - /** - * Retrieve the attribute unit. - */ - getUnit(attribute: AttributeName): Unit { - return this._units.get(attribute); - } - - /** - * Retrieve all units. - */ - get units(): ImmutableMap { - return this._units; - } - - /** - * The total amount of sources. - */ - get sourceCount(): number { - return this.rasterSources.size + this.pointSources.size + this.lineSources.size + this.polygonSources.size; - } - - /** - * Retrieve a source by id. - * - * @param id The id of the source operator. - */ - getAnySource(id: number) { - const predicate = (operator: Operator) => operator._id === id; - - for (const source of [this.rasterSources, this.pointSources, this.lineSources, this.polygonSources]) { - const result = source.find(predicate); - - if (result) { - return result; - } - } - - throw Error(`getAnySource: no source found with id ${id} in ${JSON.stringify(this)}`); - } - - /** - * Does the operator has sources or it it a **source operator**? - */ - hasSources(): boolean { - return this.rasterSources.size > 0 || this.pointSources.size > 0 || this.lineSources.size > 0 || this.polygonSources.size > 0; - } - - /** - * Retrieve the sources by type. - * - * @param sourceType The {@link resultType} of the source. - */ - getSources(sourceType: ResultType): ImmutableList { - switch (sourceType) { - case ResultTypes.RASTER: - return this.rasterSources; - case ResultTypes.POINTS: - return this.pointSources; - case ResultTypes.LINES: - return this.lineSources; - case ResultTypes.POLYGONS: - return this.polygonSources; - default: - throw Error('Invalid Source Type'); - } - } - - /** - * Return the operator with an optional projection operator to - * comply with the desired {@link Projection}. - * - * @param projection The desired output projection. - */ - getProjectedOperator(projection: Projection): Operator { - if (projection === this.projection) { - return this; - } else { - return new Operator({ - operatorType: new ProjectionType({ - srcProjection: this.projection, - destProjection: projection, - }), - operatorTypeParameterOptions: this._operatorTypeParameterOptions, - resultType: this.resultType, - projection, - attributes: this._attributes, - dataTypes: this._dataTypes, - units: this._units, - rasterSources: this.resultType === ResultTypes.RASTER ? ImmutableList.of(this) : ImmutableList(), - pointSources: this.resultType === ResultTypes.POINTS ? ImmutableList.of(this) : ImmutableList(), - lineSources: this.resultType === ResultTypes.LINES ? ImmutableList.of(this) : ImmutableList(), - polygonSources: this.resultType === ResultTypes.POLYGONS ? ImmutableList.of(this) : ImmutableList(), - }); - } - } - - /** - * String representation of the operator as query parameter in JSON format. - */ - toQueryJSON(): string { - return JSON.stringify(this.toQueryDict()); - } - - toDict(): OperatorDict { - return { - id: this._id, - resultType: this._resultType.getCode(), - operatorType: this._operatorType.toDict(), - operatorTypeParameterOptions: this._operatorTypeParameterOptions ? this._operatorTypeParameterOptions.toDict() : undefined, - projection: this._projection.getCode(), - attributes: this._attributes.toArray(), - dataTypes: this._dataTypes.map((datatype) => datatype.getCode()).toArray(), - units: this._units.map((unit) => unit.toDict()).toArray(), - rasterSources: this.rasterSources.map((operator) => operator.toDict()).toArray(), - pointSources: this.pointSources.map((operator) => operator.toDict()).toArray(), - lineSources: this.lineSources.map((operator) => operator.toDict()).toArray(), - polygonSources: this.polygonSources.map((operator) => operator.toDict()).toArray(), - }; - } - - toJSON(): string { - return JSON.stringify(this.toDict()); - } - - /** - * Dictionary reprensentation of the operator as query parameter. - */ - toQueryDict(): QueryDict { - const dict: QueryDict = { - type: this._operatorType.getMappingName(), - params: this._operatorType.toMappingDict(), - }; - - if (this.hasSources()) { - const sources: {[index: string]: Array} = {}; - - const sourcesList: Array<[string, ImmutableList]> = [ - [ResultTypes.RASTER.getCode(), this.rasterSources], - [ResultTypes.POINTS.getCode(), this.pointSources], - [ResultTypes.LINES.getCode(), this.lineSources], - [ResultTypes.POLYGONS.getCode(), this.polygonSources], - ]; - for (const [sourceString, source] of sourcesList) { - if (source.size > 0) { - sources[sourceString] = source.map((operator: Operator) => operator.toQueryDict()).toArray(); - } - } - - dict.sources = sources; - } - - return dict; - } - - /** - * clone an operator with modified parameters - * @param options a dictionary with modifications - */ - - public cloneWithModifications(options?: OperatorCloneOptions): Operator { - return new Operator({ - operatorType: options.operatorType ? options.operatorType : this._operatorType, - operatorTypeParameterOptions: options.operatorTypeParameterOptions - ? options.operatorTypeParameterOptions - : this._operatorTypeParameterOptions, - resultType: this._resultType, - projection: this._projection, - attributes: this._attributes, - dataTypes: this._dataTypes, - units: this._units, - rasterSources: this.rasterSources, - pointSources: this.pointSources, - lineSources: this.lineSources, - polygonSources: this.polygonSources, - }); - } -} diff --git a/projects/wave-core/src/lib/operators/parameter-options/gdal-source-parameter-options.model.ts b/projects/wave-core/src/lib/operators/parameter-options/gdal-source-parameter-options.model.ts deleted file mode 100644 index 82b52fed..00000000 --- a/projects/wave-core/src/lib/operators/parameter-options/gdal-source-parameter-options.model.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { - DictParameterArray, - DictParameterArrayConfig, - OperatorTypeParameterOptions, - OperatorTypeParameterOptionsConfig, - ParameterName, - ParameterOptionType, -} from '../operator-type-parameter-options.model'; - -import {GdalSourceType} from '../types/gdal-source-type.model'; -import {OptionsDict} from '../operator-type.model'; -import {MappingRasterMethodology} from '../dialogs/data-repository/mapping-source.model'; - -/** - * Dictionary for serializing the operator type. - */ -export interface GdalSourceParameterOptionsConfig extends OperatorTypeParameterOptionsConfig { - channelConfig: DictParameterArrayConfig; -} - -/** - * Interface required for complex operator parameter options. - * GdalSource requires an interface with channelNumber parameter. - */ -export interface GdalSourceChannelOptions extends OptionsDict { - channelNumber: number; - methodology?: MappingRasterMethodology; -} - -/** - * GDAL source operator parameter options. - */ -export class GdalSourceParameterOptions extends OperatorTypeParameterOptions { - private channelConfig: DictParameterArray; - - constructor(config: GdalSourceParameterOptionsConfig) { - super(config); - this.channelConfig = DictParameterArray.fromDict(config.channelConfig); - } - - static fromDict(dict: GdalSourceParameterOptionsConfig) { - return new GdalSourceParameterOptions(dict); - } - - getParameterOptions(): Array<[ParameterName, DictParameterArray]> { - return [['channelConfig', this.channelConfig]]; - } - - toDict(): GdalSourceParameterOptionsConfig { - return { - operatorType: GdalSourceType.TYPE, - channelConfig: this.channelConfig.toDict(), - }; - } - - getParametersTypes(): Array<[ParameterName, ParameterOptionType]> { - return [['channelConfig', this.channelConfig.parameterType]]; - } -} diff --git a/projects/wave-core/src/lib/operators/parameter-options/layer-list-workflow-parameter-slider/layer-list-workflow-parameter-slider.component.html b/projects/wave-core/src/lib/operators/parameter-options/layer-list-workflow-parameter-slider/layer-list-workflow-parameter-slider.component.html deleted file mode 100644 index 2adb17d7..00000000 --- a/projects/wave-core/src/lib/operators/parameter-options/layer-list-workflow-parameter-slider/layer-list-workflow-parameter-slider.component.html +++ /dev/null @@ -1,16 +0,0 @@ -
    - - - -
    {{ parameterDisplayString }}: {{ parameterDisplayValue }}
    - - -
    -
    diff --git a/projects/wave-core/src/lib/operators/parameter-options/layer-list-workflow-parameter-slider/layer-list-workflow-parameter-slider.component.scss b/projects/wave-core/src/lib/operators/parameter-options/layer-list-workflow-parameter-slider/layer-list-workflow-parameter-slider.component.scss deleted file mode 100644 index e39945bd..00000000 --- a/projects/wave-core/src/lib/operators/parameter-options/layer-list-workflow-parameter-slider/layer-list-workflow-parameter-slider.component.scss +++ /dev/null @@ -1,9 +0,0 @@ -:host { - padding-left: 8px; - padding-right: 8px; - font-size: 12px; -} - -.mat-slider { - width: 100%; -} diff --git a/projects/wave-core/src/lib/operators/parameter-options/layer-list-workflow-parameter-slider/layer-list-workflow-parameter-slider.component.ts b/projects/wave-core/src/lib/operators/parameter-options/layer-list-workflow-parameter-slider/layer-list-workflow-parameter-slider.component.ts deleted file mode 100644 index caceee12..00000000 --- a/projects/wave-core/src/lib/operators/parameter-options/layer-list-workflow-parameter-slider/layer-list-workflow-parameter-slider.component.ts +++ /dev/null @@ -1,128 +0,0 @@ -import {ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnInit, SimpleChanges} from '@angular/core'; -import {AbstractSymbology} from '../../../layers/symbology/symbology.model'; -import {Layer} from '../../../layers/layer.model'; -import {AbstractParameterContainer, ParameterContainerType, ParameterName} from '../../operator-type-parameter-options.model'; -import {ProjectService} from '../../../project/project.service'; -import {ParameterValue} from '../../operator-type.model'; - -/** - * A component which allows to change operator parameters using a slider. - * Inputs are the layer, the parameter name and a display name for the parameter. - */ -@Component({ - selector: 'wave-layer-list-workflow-parameter-slider', - templateUrl: 'layer-list-workflow-parameter-slider.component.html', - styleUrls: ['layer-list-workflow-parameter-slider.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LayerListWorkflowParameterSliderComponent implements OnChanges, OnInit { - /** - * The layer which is updated - */ - @Input() layer: Layer; - /** - * The layer parameter to update - */ - @Input() parameterName: ParameterName; - /** - * The layer parameter display name - */ - @Input() parameterDisplayName = undefined; - - // The changes by slider concept requires a range (start, stop, step) of parameters. - sliderRangeStart = 0; - sliderRangeStop = 0; - sliderRangeStep = 1; - // The current slider value - sliderValue = 0; - - // the parameter option provider - parameterOptionContainer: ParameterContainerType; - // the selected parameter option value - parameterValue: ParameterValue; - - constructor(public changeDetectorRef: ChangeDetectorRef, public projectService: ProjectService) {} - - ngOnChanges(changes: SimpleChanges): void { - for (const propName in changes) { - // eslint-disable-line guard-for-in - switch (propName) { - case 'parameterDisplayName': - case 'parameterName': { - this.changeDetectorRef.markForCheck(); - break; - } - case 'layer': { - this.updateParameterOptions(); - this.changeDetectorRef.markForCheck(); - break; - } - default: { - // DO NOTHING - } - } - } - } - - get parameterDisplayString(): string { - return this.parameterDisplayName ? this.parameterDisplayName : this.parameterName; - } - - get parameterDisplayValue(): string { - return this.parameterOptionContainer.getDisplayValueForTick(this.sliderValue); - } - - get hasParameterOptions(): boolean { - return !!this.parameterOptionContainer && this.parameterOptionContainer.hasTicks(); - } - - private updateParameterOptions() { - if (this.layer && this.layer.operator && this.layer.operator.operatorType && this.layer.operator.operatorTypeParameterOptions) { - const currentParameterValue = this.layer.operator.operatorType.getParameterValue(this.parameterName); - const currentParameterOptionContainer = this.layer.operator.operatorTypeParameterOptions.getParameterOption(this.parameterName); - this.parameterValue = currentParameterValue; - this.parameterOptionContainer = currentParameterOptionContainer; - - this.sliderRangeStart = this.parameterOptionContainer.firstTick; - this.sliderRangeStop = this.parameterOptionContainer.lastTick; - this.sliderValue = (this.parameterOptionContainer as AbstractParameterContainer).getTickForValue( - this.parameterValue, - ); - } - } - - /** - * The main update method of the component is called from the template when the slider changes. - */ - update(event: any) { - // to update an operator, a dict with type options is generated. - const operatorTypeOptions = {}; - - // set the parameterName entry to the value of the current slider tick. - operatorTypeOptions[this.parameterName] = this.parameterOptionContainer.getValueForTick(this.sliderValue); - - // clone the operatorType (this is the mapping operator) and apply the modifications from the options dict. - const operatorTypeClone = this.layer.operator.operatorType.cloneWithModifications(operatorTypeOptions); - - // clone the operator with the new operator type supplied as modification. - const operatorClone = this.layer.operator.cloneWithModifications({ - operatorType: operatorTypeClone, - }); - - // clone the layer with the new operator as modification. - const layerCloneOptions = { - operator: operatorClone, - }; - // check if layer name is identical to the current parameter display value. If true change the layer name to match the new parameter - if (this.layer.name === this.layer.operator.operatorType.getParameterDisplayValue(this.parameterName)) { - layerCloneOptions['name'] = this.parameterOptionContainer.getDisplayValueForTick(this.sliderValue); - } - - // submitt the changes to the project service. - this.projectService.changeLayer(this.layer, layerCloneOptions); - } - - ngOnInit(): void { - this.updateParameterOptions(); - } -} diff --git a/projects/wave-core/src/lib/operators/parameter-options/type-parameter-options-factory.service.ts b/projects/wave-core/src/lib/operators/parameter-options/type-parameter-options-factory.service.ts deleted file mode 100644 index bbec27d9..00000000 --- a/projects/wave-core/src/lib/operators/parameter-options/type-parameter-options-factory.service.ts +++ /dev/null @@ -1,20 +0,0 @@ -import {OperatorTypeParameterOptions, OperatorTypeParameterOptionsConfig} from '../operator-type-parameter-options.model'; -import {GdalSourceParameterOptions, GdalSourceParameterOptionsConfig} from './gdal-source-parameter-options.model'; -import {GdalSourceType} from '../types/gdal-source-type.model'; - -/** - * A simple factory for de-serializing operator parameter options. - */ -export abstract class OperatorTypeParameterOptionsFactory { - /** - * Create operator type from serialized data. - */ - static fromDict(dict: OperatorTypeParameterOptionsConfig): OperatorTypeParameterOptions { - switch (dict.operatorType) { - case GdalSourceType.TYPE: - return GdalSourceParameterOptions.fromDict(dict as GdalSourceParameterOptionsConfig); - default: - throw Error('There is not ParameterOptions factory method defined for the "' + dict.operatorType + '" type.'); - } - } -} diff --git a/projects/wave-core/src/lib/operators/projection.model.ts b/projects/wave-core/src/lib/operators/projection.model.ts deleted file mode 100644 index 78b714db..00000000 --- a/projects/wave-core/src/lib/operators/projection.model.ts +++ /dev/null @@ -1,271 +0,0 @@ -import {get as olGetProjection, addProjection as olAddProjection, Projection as OlProjection} from 'ol/proj'; -import {register as olProj4Register} from 'ol/proj/proj4'; -import proj4 from 'proj4'; - -/** - * A wrapper class around a projection string. - */ -export abstract class Projection { - get xCoordinateName(): string { - return 'x'; - } - - get yCoordinateName(): string { - return 'y'; - } - - /** - * Create a human readable output of the projection. - * @returns The name and the code. - */ - toString(): string { - return `[${this.getCode()}] ${this.getName()}`; - } - - /** - * @return The code of the projection. - */ - abstract getCode(): string; - - /** - * @return The name of the projection. - */ - abstract getName(): string; - - /** - * @return The `ol.proj.Projection` for openlayers. - */ - getOpenlayersProjection(): OlProjection { - return olGetProjection(this.getCode()); - } - - /** - * @return The maximal extent of the projection. - */ - abstract getExtent(): [number, number, number, number]; - - /** - * @return the crs uri. - */ - abstract getCrsURI(): string; - - getProj4String(): string | undefined { - return undefined; - } -} - -export class WebMercator extends Projection { - getCode(): string { - return 'EPSG:3857'; - } - - getName(): string { - return 'WGS84 Web Mercator'; - } - - getExtent(): [number, number, number, number] { - return [-20037508.34, -20037508.34, 20037508.34, 20037508.34]; - } - - getCrsURI(): string { - return 'http://www.opengis.net/def/crs/EPSG/0/3857'; - } -} - -export class WGS84 extends Projection { - get xCoordinateName(): string { - return 'longitude'; - } - - get yCoordinateName(): string { - return 'latitude'; - } - - getCode(): string { - return 'EPSG:4326'; - } - - getName(): string { - return 'WGS 84'; - } - - getExtent(): [number, number, number, number] { - return [-180, -90, 180, 90]; - } - - getCrsURI(): string { - return 'http://www.opengis.net/def/crs/EPSG/0/4326'; - } -} - -export class UTM32N extends Projection { - getCode(): string { - return 'EPSG:32632'; - } - - getName(): string { - return 'WGS 84 / UTM 32 N'; - } - - getExtent(): [number, number, number, number] { - return [166021.4431, 0.0, 833978.5569, 9329005.1825]; - } - - getCrsURI(): string { - return 'http://www.opengis.net/def/crs/EPSG/0/32632'; - } - - getProj4String(): string | undefined { - return '+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs'; - } -} - -export class ETRS89UTM32N extends Projection { - getCode(): string { - return 'EPSG:25832'; - } - - getName(): string { - return 'ETRS89 / UTM 32 N'; - } - - getExtent(): [number, number, number, number] { - return [265948.8191, 6421521.2254, 677786.3629, 7288831.7014]; - } - - getCrsURI(): string { - return 'http://www.opengis.net/def/crs/EPSG/0/25832'; - } - - getProj4String(): string | undefined { - return '+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs'; - } -} - -export class GEOS extends Projection { - private static isProjectionRegistered = false; - - constructor() { - super(); - this.registerProjection(); - } - - // TODO: remove when code is correct - toString(): string { - return `[SR-ORG:81] ${this.getName()}`; - } - - getCode(): string { - // TODO: rename? - return 'SR-ORG:81'; // return 'EPSG:40453'; - } - - getName(): string { - return 'GEOS - GEOstationary Satellite'; - } - - getOpenlayersProjection() { - const projection = olGetProjection(this.getCode()); - projection.setExtent(this.getExtent()); // TODO: DT ol.proj.Projection => setExtent - return projection; - } - - getExtent(): [number, number, number, number] { - return [-5568748.276, -5568748.276, 5568748.276, 5568748.276]; - } - - getCrsURI(): string { - return 'http://spatialreference.org/ref/sr-org/81/gml/'; - } - - private registerProjection() { - if (!GEOS.isProjectionRegistered) { - olAddProjection( - new OlProjection({ - code: this.getCode(), - extent: this.getExtent(), - units: 'm', - }), - ); - - GEOS.isProjectionRegistered = true; - } - } -} - -export class ETRS89LAEA extends Projection { - getCode(): string { - return 'EPSG:3035'; - } - - getName(): string { - return 'ETRS89-LAEA'; - } - - getExtent(): [number, number, number, number] { - return [2426378.0132, 1528101.2618, 6293974.6215, 5446513.5222]; - } - - getCrsURI(): string { - return 'http://www.opengis.net/def/crs/EPSG/0/3035'; - } - - getProj4String(): string | undefined { - return '+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs'; - } -} - -export class ProjectionCollection { - static readonly INSTANCE = new ProjectionCollection(); - - WGS_84: Projection = new WGS84(); - WEB_MERCATOR: Projection = new WebMercator(); - GEOS: Projection = new GEOS(); - UTM32N: Projection = new UTM32N(); - ETRS89UTM32N: Projection = new ETRS89UTM32N(); - ERTS89LAEA: Projection = new ETRS89LAEA(); - - // required to support already stored layers - OLD_GEOS_CODE = 'EPSG:40453'; - - ALL_PROJECTIONS: Array; - - protected constructor() { - this.ALL_PROJECTIONS = [this.WGS_84, this.WEB_MERCATOR, this.GEOS, this.UTM32N, this.ETRS89UTM32N, this.ERTS89LAEA]; - this.registerProj4Projections(); - } - - fromCode(json: string) { - switch (json) { - case this.WEB_MERCATOR.getCode(): - return this.WEB_MERCATOR; - case this.WGS_84.getCode(): - return this.WGS_84; - case this.GEOS.getCode(): - return this.GEOS; - case this.OLD_GEOS_CODE: - return this.GEOS; - case this.UTM32N.getCode(): - return this.UTM32N; - case this.ETRS89UTM32N.getCode(): - return this.ETRS89UTM32N; - case this.ERTS89LAEA.getCode(): - return this.ERTS89LAEA; - default: - throw new Error('Invalid Projection String'); - } - } - - private registerProj4Projections() { - const proj4DefStrings: Array<[string, string]> = this.ALL_PROJECTIONS.filter((p) => !!p.getProj4String()).map((p) => [ - p.getCode(), - p.getProj4String(), - ]); - if (!!proj4DefStrings && proj4DefStrings.length > 0) { - proj4.defs(proj4DefStrings); - olProj4Register(proj4); - } - } -} - -export const Projections = ProjectionCollection.INSTANCE; // eslint-disable-line @typescript-eslint/naming-convention, no-underscore-dangle, id-blacklist, id-match diff --git a/projects/wave-core/src/lib/operators/result-type.model.ts b/projects/wave-core/src/lib/operators/result-type.model.ts deleted file mode 100644 index 9094608e..00000000 --- a/projects/wave-core/src/lib/operators/result-type.model.ts +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Represents the result of an operator. - */ -export abstract class ResultType { - /** - * Get the mapping representtion. - */ - abstract getCode(): string; - - /** - * Human-readable form of the result type. - */ - toString(): string { - const code = this.getCode(); - return code.charAt(0).toUpperCase() + code.substring(1); - } -} - -class Raster extends ResultType { - getCode(): string { - return 'raster'; - } -} - -class Points extends ResultType { - getCode(): string { - return 'points'; - } -} - -class Lines extends ResultType { - getCode(): string { - return 'lines'; - } -} - -class Polygons extends ResultType { - getCode(): string { - return 'polygons'; - } -} - -class Plot extends ResultType { - getCode(): string { - return 'plot'; - } -} - -class Text extends ResultType { - getCode(): string { - return 'text'; - } -} - -export class ResultTypeCollection { - static readonly INSTANCE = new ResultTypeCollection(); - - RASTER: ResultType = new Raster(); - POINTS: ResultType = new Points(); - LINES: ResultType = new Lines(); - POLYGONS: ResultType = new Polygons(); - PLOT: ResultType = new Plot(); - TEXT: ResultType = new Text(); - - ALL_TYPES: Array; - INPUT_TYPES: Array; - VECTOR_TYPES: Array; - LAYER_TYPES: Array; - PLOT_TYPES: Array; - - protected constructor() { - this.ALL_TYPES = [this.RASTER, this.POINTS, this.LINES, this.POLYGONS, this.PLOT, this.TEXT]; - - this.INPUT_TYPES = [this.RASTER, this.POINTS, this.LINES, this.POLYGONS]; - - this.VECTOR_TYPES = [this.POINTS, this.LINES, this.POLYGONS]; - - this.LAYER_TYPES = [this.RASTER, this.POINTS, this.LINES, this.POLYGONS]; - - this.PLOT_TYPES = [this.PLOT, this.TEXT]; - } - - fromCode(type: string) { - switch (type.toLowerCase()) { - case this.RASTER.getCode(): - return this.RASTER; - case this.POINTS.getCode(): - case 'point': - return this.POINTS; - case 'line string': - case 'multi line string': - case this.LINES.getCode(): - return this.LINES; - case this.POLYGONS.getCode(): - case 'multi surface': - case 'multi polygon': - return this.POLYGONS; - case this.PLOT.getCode(): - return this.PLOT; - case this.TEXT.getCode(): - return this.TEXT; - default: - throw new Error('Invalid Result Type: ' + type); - } - } -} - -export const ResultTypes = ResultTypeCollection.INSTANCE; // eslint-disable-line @typescript-eslint/naming-convention, no-underscore-dangle, id-blacklist, id-match diff --git a/projects/wave-core/src/lib/operators/timeformat.model.ts b/projects/wave-core/src/lib/operators/timeformat.model.ts deleted file mode 100644 index 3f2abe58..00000000 --- a/projects/wave-core/src/lib/operators/timeformat.model.ts +++ /dev/null @@ -1,18 +0,0 @@ -class TimeFormatCollection { - ALL_FORMATS: Array<{display: string; value: string}>; - - constructor() { - this.ALL_FORMATS = [ - {display: 'yyyy-MM-ddTHH:mm:ssZ', value: '%Y-%m-%dT%H:%M:%SZ'}, - {display: 'yyyy-MM-ddTHH:mmZ', value: '%Y-%m-%dT%H:%MZ'}, - {display: 'dd-MM-yyyy HH:mm:ss', value: '%d-%m-%Y %H:%M:%S'}, - {display: 'dd.MM.yyyy HH:mm:ss', value: '%d.%m.%Y %H:%M:%S'}, - {display: 'yyyy-MM-dd HH:mm:ssZ', value: '%Y-%m-%d %H:%M:%SZ'}, - {display: 'yyyy-MM-dd HH:mmZ', value: '%Y-%m-%d %H:%MZ'}, - {display: 'dd.MM.yyyy', value: '%d.%m.%Y'}, - {display: 'yyyy-MM-dd', value: '%Y-%m-%d'}, - ]; - } -} - -export const TimeFormats = new TimeFormatCollection(); diff --git a/projects/wave-core/src/lib/operators/types/boxplot-type.model.ts b/projects/wave-core/src/lib/operators/types/boxplot-type.model.ts deleted file mode 100644 index 08cb4006..00000000 --- a/projects/wave-core/src/lib/operators/types/boxplot-type.model.ts +++ /dev/null @@ -1,152 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -import {ResultType, ResultTypes} from '../result-type.model'; - -interface BoxPlotTypeMappingDict extends OperatorTypeMappingDict { - source: string; - result: string; -} - -export interface BoxPlotTypeDict extends OperatorTypeDict { - notch: boolean; - mean: boolean; - range: number; - attributes: string[]; - inputType: string; -} - -interface BoxPlotTypeConfig { - notch: boolean; - mean: boolean; - range: number; - attributes: string[]; - inputType: ResultType; -} - -export class BoxPlotType extends OperatorType { - private static _TYPE = 'boxplot'; - private static _ICON_URL = OperatorType.createIconDataUrl(BoxPlotType._TYPE); - private static _NAME = 'Box Plot'; - - static get TYPE(): string { - return BoxPlotType._TYPE; - } - static get ICON_URL(): string { - return BoxPlotType._ICON_URL; - } - static get NAME(): string { - return BoxPlotType._NAME; - } - - private code: string; - private notch: boolean; - private mean: boolean; - private range: number; - private attributes: string[]; - private inputType: ResultType; - private resultType: ResultType; - - static fromDict(dict: BoxPlotTypeDict): BoxPlotType { - return new BoxPlotType({ - notch: dict.notch, - mean: dict.mean, - range: dict.range, - attributes: dict.attributes, - inputType: ResultTypes.fromCode(dict.inputType), - }); - } - - constructor(config: BoxPlotTypeConfig) { - super(); - this.notch = config.notch; - this.mean = config.mean; - this.range = config.range; - this.attributes = config.attributes; - this.inputType = config.inputType; - - const camelInputType = this.inputType.toString().charAt(0).toUpperCase() + this.inputType.toString().substr(1).toLowerCase(); - - this.code = ` - library(ggplot2); - - features <- mapping.load${camelInputType}(0, mapping.qrect); - - if (length(features) > 0) { - - ${this.attributes - .map((attribute, i) => { - return `dat${i} <- data.frame(group = "${attribute}", value = features$\`${attribute}\`);`; - }) - .join('\n')} - - plot.data <- rbind( - ${this.attributes.map((attribute, i) => `dat${i}`).join(', ')} - ); - - p <- ( - ggplot(plot.data, aes(x=group, y=value, fill=group)) - + geom_boxplot(notch = ${this.notch.toString().toUpperCase()}, coef = ${this.range}) - ${this.mean ? '+ stat_summary(fun.y=mean, colour="darkred", geom="point", show_guide = FALSE, shape=18, size=3)' : ''} - ${ - this.mean - ? '+ stat_summary(fun.y=mean, colour="black", geom="text", show_guide = FALSE, vjust=-0.7, aes(label=round(..y.., digits=1)))' - : '' - } - ); - - print(p); - - } else { - - plot.new(); - - mtext("Empty Dataset"); - - } - `; - // console.log(this.code); - // console.log(this.attributes); - this.resultType = ResultTypes.PLOT; - } - - getMappingName(): string { - return 'r_script'; - } - - getIconUrl(): string { - return BoxPlotType.ICON_URL; - } - - toString(): string { - return BoxPlotType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['code', this.code.toString()], - ['resultType', this.resultType.toString()], - ]; - } - - toMappingDict(): BoxPlotTypeMappingDict { - return { - source: this.code, - result: this.resultType.getCode(), - }; - } - - toDict(): BoxPlotTypeDict { - return { - operatorType: BoxPlotType.TYPE, - notch: this.notch, - mean: this.mean, - range: this.range, - attributes: this.attributes, - inputType: this.inputType.getCode(), - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return BoxPlotType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/chronicle-db-source-type.model.ts b/projects/wave-core/src/lib/operators/types/chronicle-db-source-type.model.ts deleted file mode 100644 index 686c7161..00000000 --- a/projects/wave-core/src/lib/operators/types/chronicle-db-source-type.model.ts +++ /dev/null @@ -1,155 +0,0 @@ -import {OperatorType, OperatorTypeCloneOptions, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface ChronicleDBSourceTypeConfig { - filename: string; - layer_name?: string; - query_string?: string; - time: 'none' | 'start' | 'start+end' | 'start+duration'; - duration?: number | 'inf'; - time1_format?: MappingTimeFormat; - time2_format?: MappingTimeFormat; - columns: { - x?: string; - y?: string; - time1?: string; - time2?: string; - numeric: Array; - textual: Array; - }; - default?: string; // WKT definition of default value - force_ogr_time_filter?: boolean; - on_error: 'skip' | 'abort' | 'keep'; - provenance?: { - citation: string; - license: string; - uri: string; - }; -} - -// TODO: generalize and export -interface MappingTimeFormat { - format: 'custom' | 'seconds' | 'dmyhm' | 'iso'; - custom_format?: string; -} - -interface ChronicleDBSourceTypeMappingDict extends OperatorTypeMappingDict { - filename: string; - layer_name?: string; - time: 'none' | 'start' | 'start+end' | 'start+duration'; - duration?: number | 'inf'; - time1_format?: MappingTimeFormat; - time2_format?: MappingTimeFormat; - columns: { - x?: string; - y?: string; - time1?: string; - time2?: string; - numeric: Array; - textual: Array; - }; - default?: string; // WKT definition of default value - force_ogr_time_filter?: boolean; - on_error: 'skip' | 'abort' | 'keep'; - provenance?: { - citation: string; - license: string; - uri: string; - }; -} - -export interface ChronicleDBSourceTypeDict extends OperatorTypeDict { - filename: string; - layer_name?: string; - query_string?: string; - time: 'none' | 'start' | 'start+end' | 'start+duration'; - duration?: number | 'inf'; - time1_format?: MappingTimeFormat; - time2_format?: MappingTimeFormat; - columns: { - x?: string; - y?: string; - time1?: string; - time2?: string; - numeric: Array; - textual: Array; - }; - default?: string; // WKT definition of default value - force_ogr_time_filter?: boolean; - on_error: 'skip' | 'abort' | 'keep'; - provenance?: { - citation: string; - license: string; - uri: string; - }; -} - -/** - * The raster source type. - */ -export class ChronicleDBSourceType extends OperatorType { - private static _TYPE = 'chronicle_db_source'; - private static _ICON_URL = OperatorType.createIconDataUrl(ChronicleDBSourceType._TYPE); - private static _NAME = 'ChronicleDB Source'; - - static get TYPE(): string { - return ChronicleDBSourceType._TYPE; - } - - static get ICON_URL(): string { - return ChronicleDBSourceType._ICON_URL; - } - - static get NAME(): string { - return ChronicleDBSourceType._NAME; - } - - config: ChronicleDBSourceTypeConfig; - - static fromDict(dict: ChronicleDBSourceTypeDict): ChronicleDBSourceType { - return new ChronicleDBSourceType(dict); - } - - constructor(config: ChronicleDBSourceTypeConfig) { - super(); - this.config = config; - } - - getMappingName(): string { - return 'ogr_raw_source_with_time'; - } - - getIconUrl(): string { - return ChronicleDBSourceType.ICON_URL; - } - - toString(): string { - return ChronicleDBSourceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['filename', this.config.query_string ? '' : this.config.filename.toString()], // FIXME: workaround for CronicalDB - ['layer_name', this.config.layer_name ? this.config.layer_name.toString() : ''], - ['query_string', this.config.query_string ? this.config.query_string.toString() : ''], - ['columns.time1', this.config.columns.time1 ? this.config.columns.time1.toString() : ''], - ['columns.time2', this.config.columns.time2 ? this.config.columns.time2.toString() : ''], - ['columns.numeric', this.config.columns.numeric.toString()], - ['columns.textual', this.config.columns.textual.toString()], - ]; - } - - toMappingDict(): ChronicleDBSourceTypeMappingDict { - return this.config; - } - - toDict(): ChronicleDBSourceTypeDict { - return { - operatorType: ChronicleDBSourceType.TYPE, - ...this.config, - }; - } - - cloneWithModifications(options?: OperatorTypeCloneOptions): OperatorType { - return new ChronicleDBSourceType(this.config); - } -} diff --git a/projects/wave-core/src/lib/operators/types/classification-type.model.ts b/projects/wave-core/src/lib/operators/types/classification-type.model.ts deleted file mode 100644 index a926eb12..00000000 --- a/projects/wave-core/src/lib/operators/types/classification-type.model.ts +++ /dev/null @@ -1,95 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface ClassificationTypeConfig { - reclassNoData: boolean; - noDataClass: number; - remapRangeValues: Array; - remapRangeClasses: Array; -} - -interface ClassificationTypeMappingDict extends OperatorTypeMappingDict { - reclassNoData: boolean; - noDataClass: number; - RemapRange: [Array, Array]; -} - -export interface ClassificationTypeDict extends OperatorTypeDict, ClassificationTypeConfig {} - -/** - * The classification type. - */ -export class ClassificationType extends OperatorType { - private static _TYPE = 'classification'; - private static _ICON_URL = 'assets/operator-type-icons/classification.png'; - private static _NAME = 'Classification'; - - static get TYPE(): string { - return ClassificationType._TYPE; - } - static get ICON_URL(): string { - return ClassificationType._ICON_URL; - } - static get NAME(): string { - return ClassificationType._NAME; - } - - private reclassNoData: boolean; - private noDataClass: number; - private remapRangeValues: Array; - private remapRangeClasses: Array; - - constructor(config: ClassificationTypeConfig) { - super(); - this.reclassNoData = config.reclassNoData; - this.noDataClass = config.noDataClass; - this.remapRangeValues = config.remapRangeValues; - this.remapRangeClasses = config.remapRangeClasses; - } - - static fromDict(dict: ClassificationTypeDict): ClassificationType { - return new ClassificationType(dict); - } - - getMappingName(): string { - return ClassificationType.TYPE; - } - - getIconUrl(): string { - return ClassificationType.ICON_URL; - } - - toString(): string { - return ClassificationType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['reclassNoData', this.reclassNoData.toString()], - ['noDataClass', this.noDataClass.toString()], - ['values', this.remapRangeValues.toString()], - ['classes', this.remapRangeClasses.toString()], - ]; - } - - toMappingDict(): ClassificationTypeMappingDict { - return { - reclassNoData: this.reclassNoData, - noDataClass: this.noDataClass, - RemapRange: [this.remapRangeValues, this.remapRangeClasses], - }; - } - - toDict(): ClassificationTypeDict { - return { - operatorType: ClassificationType.TYPE, - reclassNoData: this.reclassNoData, - noDataClass: this.noDataClass, - remapRangeValues: this.remapRangeValues, - remapRangeClasses: this.remapRangeClasses, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return ClassificationType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/csv-source-type.model.ts b/projects/wave-core/src/lib/operators/types/csv-source-type.model.ts deleted file mode 100644 index 6c990c64..00000000 --- a/projects/wave-core/src/lib/operators/types/csv-source-type.model.ts +++ /dev/null @@ -1,210 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface CSVTimeFormat { - format: 'custom' | 'seconds' | 'dmyhm' | 'iso'; - customFormat?: string; -} - -export interface CSVParameters { - fieldSeparator: string; - geometry: 'xy' | 'wkt'; - time: 'none' | {use: 'start'; duration: number} | 'start+inf' | 'start+end' | 'start+duration'; - timeFormat?: { - time1?: CSVTimeFormat; - time2?: CSVTimeFormat; - }; - header: 0 | Array; - columns: { - x: string; - y?: string; - time1?: string; - time2?: string; - numeric: Array; - textual: Array; - }; - onError: 'skip' | 'abort' | 'keep'; - provenance?: { - citation: string; - license: string; - uri: string; - }; -} - -interface CsvSourceTypeConfig { - dataURI: string; - parameters: CSVParameters; -} - -interface MappingTimeFormat { - format: 'custom' | 'seconds' | 'dmyhm' | 'iso'; - custom_format?: string; -} -interface CsvSourceTypeMappingDict extends OperatorTypeMappingDict { - filename: string; - separator: string; - geometry: 'xy' | 'wkt'; - time: 'none' | 'start' | 'start+end' | 'start+duration'; - duration?: number | 'inf'; - time1_format?: MappingTimeFormat; - time2_format?: MappingTimeFormat; - columns: { - x: string; - y?: string; - time1?: string; - time2?: string; - numeric: Array; - textual: Array; - }; - on_error: 'skip' | 'abort' | 'keep'; - provenance?: { - citation: string; - license: string; - uri: string; - }; -} - -export interface CsvSourceTypeDict extends OperatorTypeDict { - dataURI: string; - parameters: CSVParameters; -} - -/** - * The CSV source type. - */ -export class CsvSourceType extends OperatorType { - private static _TYPE = 'csv_source'; - private static _ICON_URL = OperatorType.createIconDataUrl(CsvSourceType._TYPE); - private static _NAME = 'CSV Source'; - - static get TYPE(): string { - return CsvSourceType._TYPE; - } - - static get ICON_URL(): string { - return CsvSourceType._ICON_URL; - } - - static get NAME(): string { - return CsvSourceType._NAME; - } - - private dataURI: string; - private parameters: CSVParameters; - - static fromDict(dict: CsvSourceTypeDict): CsvSourceType { - return new CsvSourceType({ - dataURI: dict.dataURI, - parameters: dict.parameters, - }); - } - - constructor(config: CsvSourceTypeConfig) { - super(); - this.dataURI = config.dataURI; - this.parameters = config.parameters; - } - - getMappingName(): string { - return CsvSourceType.TYPE; - } - - getIconUrl(): string { - return CsvSourceType.ICON_URL; - } - - toString(): string { - return CsvSourceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['dataURI', this.dataURI], - ['geometry', this.parameters.geometry], - ['fieldSeparator', this.parameters.fieldSeparator], - ['time', this.parameters.time ? JSON.stringify(this.parameters.time) : ''], - ]; - } - - toMappingDict(): CsvSourceTypeMappingDict { - let data = this.dataURI; - if (Array.isArray(this.parameters.header)) { - if (data.indexOf('data:') === 0) { - const commaPosition = data.indexOf(','); - const uriPart = data.substring(0, commaPosition + 1); - const dataPart = data.substring(commaPosition + 1, data.length); - - const headerPart = (this.parameters.header as Array).join(this.parameters.fieldSeparator) + '\n'; - - data = uriPart + headerPart + dataPart; - } - } - - let dict: CsvSourceTypeMappingDict = { - filename: data, - separator: this.parameters.fieldSeparator, - geometry: this.parameters.geometry, - on_error: this.parameters.onError, - time: 'none', - columns: { - x: this.parameters.columns.x, - numeric: this.parameters.columns.numeric, - textual: this.parameters.columns.textual, - }, - }; - - if (this.parameters.time === 'start+inf') { - dict.time = 'start'; - dict.duration = 'inf'; - } else if (typeof this.parameters.time !== 'string') { - const startPlusDuration = this.parameters.time as {use: string; duration: number}; - dict.time = 'start'; - dict.duration = startPlusDuration.duration; - } else { - dict.time = this.parameters.time; - } - - if (this.parameters.time !== 'none') { - dict.time1_format = { - format: this.parameters.timeFormat.time1.format, - }; - if (this.parameters.timeFormat.time1.format === 'custom') { - dict.time1_format.custom_format = this.parameters.timeFormat.time1.customFormat; - } - - dict.columns.time1 = this.parameters.columns.time1; - - if (this.parameters.timeFormat.time2) { - dict.time2_format = { - format: this.parameters.timeFormat.time2.format, - }; - if (this.parameters.timeFormat.time2.format === 'custom') { - dict.time2_format.custom_format = this.parameters.timeFormat.time2.customFormat; - } - - dict.columns.time2 = this.parameters.columns.time2; - } - } - - if (this.parameters.geometry !== 'wkt') { - dict.columns.y = this.parameters.columns.y; - } - - if (this.parameters.provenance) { - dict.provenance = this.parameters.provenance; - } - - return dict; - } - - toDict(): CsvSourceTypeDict { - return { - operatorType: CsvSourceType.TYPE, - dataURI: this.dataURI, - parameters: this.parameters, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return CsvSourceType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/expression-type.model.ts b/projects/wave-core/src/lib/operators/types/expression-type.model.ts deleted file mode 100644 index 94232a31..00000000 --- a/projects/wave-core/src/lib/operators/types/expression-type.model.ts +++ /dev/null @@ -1,107 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -import {Unit, UnitDict, UnitMappingDict} from '../unit.model'; -import {DataType, DataTypes} from '../datatype.model'; - -/** - * The expression specifies calculations between the rasters. - * There must be a valid data type and unit for the resulting raster. - */ -interface ExpressionTypeConfig { - expression: string; - datatype: DataType; - unit: Unit; -} - -interface ExpressionTypeMappingDict extends OperatorTypeMappingDict { - expression: string; - datatype: string; - unit: UnitMappingDict; -} - -export interface ExpressionTypeDict extends OperatorTypeDict { - expression: string; - datatype: string; - unit: UnitDict; -} - -/** - * The expression type. - */ -export class ExpressionType extends OperatorType { - private static _TYPE = 'expression'; - private static _ICON_URL = 'assets/operator-type-icons/expression.png'; - private static _NAME = 'Expression'; - - static get TYPE(): string { - return ExpressionType._TYPE; - } - - static get ICON_URL(): string { - return ExpressionType._ICON_URL; - } - - static get NAME(): string { - return ExpressionType._NAME; - } - - private expression: string; - private datatype: DataType; - private unit: Unit; - - constructor(config: ExpressionTypeConfig) { - super(); - this.expression = config.expression; - this.datatype = config.datatype; - this.unit = config.unit; - } - - static fromDict(dict: ExpressionTypeDict): ExpressionType { - return new ExpressionType({ - expression: dict.expression, - datatype: DataTypes.fromCode(dict.datatype), - unit: Unit.fromDict(dict.unit), - }); - } - - getMappingName(): string { - return ExpressionType.TYPE; - } - - getIconUrl(): string { - return ExpressionType.ICON_URL; - } - - toString(): string { - return ExpressionType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['expression', this.expression.toString()], - ['datatype', this.datatype.toString()], - ['unit', this.unit.toString()], - ]; - } - - toMappingDict(): ExpressionTypeMappingDict { - return { - expression: this.expression, - datatype: this.datatype.getCode(), - unit: this.unit.toMappingDict(), - }; - } - - toDict(): ExpressionTypeDict { - return { - operatorType: ExpressionType.TYPE, - expression: this.expression, - datatype: this.datatype.getCode(), - unit: this.unit.toDict(), - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return ExpressionType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/feature-collection-db-source-type.model.ts b/projects/wave-core/src/lib/operators/types/feature-collection-db-source-type.model.ts deleted file mode 100644 index db4d4823..00000000 --- a/projects/wave-core/src/lib/operators/types/feature-collection-db-source-type.model.ts +++ /dev/null @@ -1,89 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface FeatureCollectionDBSourceTypeConfig { - owner: string; - data_set_name: string; -} - -interface FeatureCollectionDBSourceTypeMappingDict extends OperatorTypeMappingDict { - owner: string; - data_set_name: string; -} - -export interface FeatureCollectionDBSourceTypeDict extends OperatorTypeDict { - owner: string; - data_set_name: string; -} - -/** - * The FeatureCollectionDB source type. - */ -export class FeatureCollectionDBSourceType extends OperatorType { - private static _TYPE = 'featurecollectiondb_source'; - private static _ICON_URL = OperatorType.createIconDataUrl(FeatureCollectionDBSourceType._TYPE); - private static _NAME = 'Feature Collection DB Source'; - - static get TYPE(): string { - return FeatureCollectionDBSourceType._TYPE; - } - static get ICON_URL(): string { - return FeatureCollectionDBSourceType._ICON_URL; - } - static get NAME(): string { - return FeatureCollectionDBSourceType._NAME; - } - - private owner: string; - private data_set_name: string; - - static fromDict(dict: FeatureCollectionDBSourceTypeDict): FeatureCollectionDBSourceType { - return new FeatureCollectionDBSourceType({ - owner: dict.owner, - data_set_name: dict.data_set_name, - }); - } - - constructor(config: FeatureCollectionDBSourceTypeConfig) { - super(); - this.owner = config.owner; - this.data_set_name = config.data_set_name; - } - - getMappingName(): string { - return FeatureCollectionDBSourceType.TYPE; - } - - getIconUrl(): string { - return FeatureCollectionDBSourceType.ICON_URL; - } - - toString(): string { - return FeatureCollectionDBSourceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['owner', this.owner], - ['data_set_name', this.data_set_name], - ]; - } - - toMappingDict(): FeatureCollectionDBSourceTypeMappingDict { - return { - owner: this.owner, - data_set_name: this.data_set_name, - }; - } - - toDict(): FeatureCollectionDBSourceTypeDict { - return { - operatorType: FeatureCollectionDBSourceType.TYPE, - owner: this.owner, - data_set_name: this.data_set_name, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return FeatureCollectionDBSourceType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/gdal-source-type.model.ts b/projects/wave-core/src/lib/operators/types/gdal-source-type.model.ts deleted file mode 100644 index 46584428..00000000 --- a/projects/wave-core/src/lib/operators/types/gdal-source-type.model.ts +++ /dev/null @@ -1,304 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; -import {Unit, UnitDict, UnitMappingDict} from '../unit.model'; -import {GdalSourceChannelOptions} from '../parameter-options/gdal-source-parameter-options.model'; -import {MappingRasterMethodology} from '../dialogs/data-repository/mapping-source.model'; - -/** - * The interface for gdal source requests - */ -interface GdalSourceTypeConfig { - channel?: number; // required for old configs - channelConfig: GdalSourceChannelOptions; // FIXME: this should be the interface from gdal-source-parameter-options! - sourcename: string; - transform: boolean; - gdal_params?: GdalParamsType; -} - -/** - * Options allowed to replace when cloning. - */ -export interface GdalSourceTypeCloneOptions { - channelConfig: GdalSourceChannelOptions; -} - -/** - * Representation send to mapping when requesting gdal source data. - */ -interface GdalSourceTypeMappingDict extends OperatorTypeMappingDict { - channel: number; - sourcename: string; - transform: boolean; - gdal_params?: GdalParamsTypeMappingDict; -} - -/** - * Serianlization interface. - */ -export interface GdalSourceTypeDict extends OperatorTypeDict { - channelConfig: GdalSourceChannelOptions; - sourcename: string; - transform: boolean; - gdal_params?: GdalParamsTypeDict; -} - -/** - * The gdal raster source type. - */ -export class GdalSourceType extends OperatorType { - private static _TYPE = 'gdal_source'; - private static _ICON_URL = OperatorType.createIconDataUrl(GdalSourceType._TYPE); - private static _NAME = 'GDAL Source'; - - static get TYPE(): string { - return GdalSourceType._TYPE; - } - - static get ICON_URL(): string { - return GdalSourceType._ICON_URL; - } - - static get NAME(): string { - return GdalSourceType._NAME; - } - - private channelConfig: GdalSourceChannelOptions; - private sourcename: string; - private transform: boolean; - private gdalParams: GdalParamsType = undefined; - - /** - * Deserialization - */ - static fromDict(dict: GdalSourceTypeDict): GdalSourceType { - return new GdalSourceType({ - channel: dict['channel'], // old configs - channelConfig: dict.channelConfig, - gdal_params: dict.gdal_params - ? { - channels: dict.gdal_params.channels - ? dict.gdal_params.channels.map((channelDict) => { - return { - channel: channelDict.channel, - datatype: channelDict.datatype, - file_name: channelDict.file_name, - path: channelDict.path, - unit: Unit.fromDict(channelDict.unit), - netcdf_subdataset: channelDict.netcdf_subdataset, - }; - }) - : undefined, - file_name: dict.gdal_params.file_name, - path: dict.gdal_params.path, - coords: dict.gdal_params.coords, - provenance: dict.gdal_params.provenance, - netcdf_subdataset: dict.gdal_params.netcdf_subdataset, - time_start: dict.gdal_params.time_start, - time_end: dict.gdal_params.time_end, - channel_start_time_list: dict.gdal_params.channel_start_time_list, - } - : undefined, - sourcename: dict.sourcename, - transform: dict.transform, - }); - } - - constructor(config: GdalSourceTypeConfig) { - super(); - this.channelConfig = config.channelConfig - ? config.channelConfig - : {displayValue: 'channel number ' + config.channel, channelNumber: config.channel}; // convert old configs - this.sourcename = config.sourcename; - this.transform = config.transform; - this.gdalParams = config.gdal_params; - } - - getMappingName(): string { - return GdalSourceType.TYPE; - } - - getIconUrl(): string { - return GdalSourceType.ICON_URL; - } - - toString(): string { - return GdalSourceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['channelConfig', this.channelConfig.displayValue.toString()], - ['sourcename', this.sourcename.toString()], - ['transform', this.transform.toString()], - ]; - } - - getParameterValue(parameterName: string): GdalSourceChannelOptions | undefined { - switch (parameterName) { - case 'channelConfig': - return this.channelConfig; - default: - return undefined; - } - } - - toMappingDict(): GdalSourceTypeMappingDict { - return { - sourcename: this.sourcename, - channel: this.channelConfig.channelNumber, - transform: this.transform, - gdal_params: this.gdalParams - ? { - channels: this.gdalParams.channels - ? this.gdalParams.channels.map((channelDict, i) => { - if (this.channelConfig.channelNumber !== i) { - return undefined; - } - return { - channel: channelDict.channel, - datatype: channelDict.datatype, - file_name: channelDict.file_name, - path: channelDict.path, - unit: channelDict.unit.toMappingDict(), - netcdf_subdataset: channelDict.netcdf_subdataset, - }; - }) - : undefined, - file_name: this.gdalParams.file_name, - path: this.gdalParams.path, - netcdf_subdataset: this.gdalParams.netcdf_subdataset, - coords: this.gdalParams.coords, - provenance: this.gdalParams.provenance, - time_start: this.gdalParams.time_start, - time_end: this.gdalParams.time_end, - channel_start_time_list: this.gdalParams.channel_start_time_list, - } - : undefined, - }; - } - - toDict(): GdalSourceTypeDict { - return { - operatorType: GdalSourceType.TYPE, - sourcename: this.sourcename, - channelConfig: this.channelConfig, - transform: this.transform, - gdal_params: this.gdalParams - ? { - channels: this.gdalParams.channels - ? this.gdalParams.channels.map((channelDict) => { - return { - channel: channelDict.channel, - datatype: channelDict.datatype, - file_name: channelDict.file_name, - path: channelDict.path, - unit: channelDict.unit.toDict(), - netcdf_subdataset: channelDict.netcdf_subdataset, - }; - }) - : undefined, - file_name: this.gdalParams.file_name, - path: this.gdalParams.path, - netcdf_subdataset: this.gdalParams.netcdf_subdataset, - coords: this.gdalParams.coords, - provenance: this.gdalParams.provenance, - time_start: this.gdalParams.time_start, - time_end: this.gdalParams.time_end, - channel_start_time_list: this.gdalParams.channel_start_time_list, - } - : undefined, - }; - } - - cloneWithModifications(options?: GdalSourceTypeCloneOptions): OperatorType { - return new GdalSourceType({ - channelConfig: options && options.channelConfig ? options.channelConfig : this.channelConfig, - sourcename: this.sourcename, - transform: this.transform, - gdal_params: this.gdalParams ? this.gdalParams : undefined, - }); - } -} - -/** - * This interface allows to specify all gedal source params (replaces json file in MAPPING). - */ -export interface GdalParamsType { - channels: Array<{ - channel: number; - datatype: string; - file_name?: string; - path?: string; - unit: Unit; - netcdf_subdataset?: string; - }>; - netcdf_subdataset?: string; - file_name?: string; - path?: string; - coords: { - crs: string; - }; - channel_start_time_list?: Array; - time_start?: string; - time_end?: string; - provenance: { - citation: string; - license: string; - uri: string; - }; -} - -/** - * Serialization for GdalParamsType. - */ -export interface GdalParamsTypeDict { - channels: Array<{ - channel: number; - datatype: string; - file_name?: string; - path?: string; - unit: UnitDict; - netcdf_subdataset?: string; - }>; - netcdf_subdataset?: string; - file_name?: string; - path?: string; - coords: { - crs: string; - }; - channel_start_time_list?: Array; - time_start?: string; - time_end?: string; - provenance: { - citation: string; - license: string; - uri: string; - }; -} - -/** - * Serialization of GdalParamsType for mapping. - */ -export interface GdalParamsTypeMappingDict { - channels: Array<{ - channel: number; - datatype: string; - file_name?: string; - path?: string; - unit: UnitMappingDict; - netcdf_subdataset?: string; - }>; - file_name?: string; - netcdf_subdataset?: string; - path?: string; - coords: { - crs: string; - }; - channel_start_time_list?: Array; - time_start?: string; - time_end?: string; - provenance: { - citation: string; - license: string; - uri: string; - }; -} diff --git a/projects/wave-core/src/lib/operators/types/gfbio-source-type.model.ts b/projects/wave-core/src/lib/operators/types/gfbio-source-type.model.ts deleted file mode 100644 index 980c39bc..00000000 --- a/projects/wave-core/src/lib/operators/types/gfbio-source-type.model.ts +++ /dev/null @@ -1,117 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -export interface BasicColumns { - numeric: Array; - textual: Array; -} - -interface GFBioSourceTypeConfig { - dataSource: string; - level: string; // family, genus, species - term: string; - columns: BasicColumns; -} - -interface GFBioSourceTypeMappingDict extends OperatorTypeMappingDict { - dataSource: string; - level: string; - term: string; - columns: BasicColumns; -} - -export interface GFBioSourceTypeDict extends OperatorTypeDict { - dataSource: string; - level: string; - term: string; - columns: BasicColumns; - scientificName?: string; // FIXME: legacy support -} - -/** - * The GFBio source type. - */ -export class GFBioSourceType extends OperatorType { - private static _TYPE = 'gfbio_source'; - private static _ICON_URL = OperatorType.createIconDataUrl(GFBioSourceType._TYPE); - private static _NAME = 'GFBio Source'; - - static get TYPE(): string { - return GFBioSourceType._TYPE; - } - - static get ICON_URL(): string { - return GFBioSourceType._ICON_URL; - } - - static get NAME(): string { - return GFBioSourceType._NAME; - } - - private dataSource: string; - private level: string; - private term: string; - private columns: BasicColumns; - - constructor(config: GFBioSourceTypeConfig) { - super(); - this.dataSource = config.dataSource; - this.level = config.level; - this.term = config.term; - this.columns = config.columns; - } - - static fromDict(dict: GFBioSourceTypeDict): GFBioSourceType { - return new GFBioSourceType({ - dataSource: dict.dataSource, - level: dict.level ? dict.level : 'species', - term: dict.term ? dict.term : dict.scientificName, - columns: dict.columns, - }); - } - - getMappingName(): string { - return GFBioSourceType.TYPE; - } - - getIconUrl(): string { - return GFBioSourceType.ICON_URL; - } - - toString(): string { - return GFBioSourceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - const columns = this.columns.numeric.concat(this.columns.textual); - columns.sort(); - return [ - ['dataSource', this.dataSource.toString()], - ['level', this.level.toString()], - ['term', this.term.toString()], - ['columns', columns.join(', ')], - ]; - } - - toMappingDict(): GFBioSourceTypeMappingDict { - return { - dataSource: this.dataSource, - level: this.level, - term: this.term, - columns: this.columns, - }; - } - - toDict(): GFBioSourceTypeDict { - return { - operatorType: GFBioSourceType.TYPE, - dataSource: this.dataSource, - level: this.level, - term: this.term, - columns: this.columns, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return GFBioSourceType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/heatmap-type.model.ts b/projects/wave-core/src/lib/operators/types/heatmap-type.model.ts deleted file mode 100644 index 16ea4ff3..00000000 --- a/projects/wave-core/src/lib/operators/types/heatmap-type.model.ts +++ /dev/null @@ -1,91 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface HeatmapTypeConfig { - attribute: string; - radius: number; -} - -interface HeatmapTypeMappingDict extends OperatorTypeMappingDict { - attribute: string; - radius: number; -} - -export interface HeatmapTypeDict extends OperatorTypeDict { - attribute: string; - radius: number; -} - -/** - * The heatmap type. - */ -export class HeatmapType extends OperatorType { - private static _TYPE = 'rasterization'; - private static _ICON_URL = OperatorType.createIconDataUrl(HeatmapType._TYPE); - private static _NAME = 'Heatmap'; - - private attribute: string; - private radius: number; - - static fromDict(dict: HeatmapTypeDict): HeatmapType { - return new HeatmapType({ - attribute: dict.attribute, - radius: dict.radius, - }); - } - - constructor(config: HeatmapTypeConfig) { - super(); - this.attribute = config.attribute; - this.radius = config.radius; - } - - static get TYPE(): string { - return HeatmapType._TYPE; - } - - static get ICON_URL(): string { - return HeatmapType._ICON_URL; - } - - static get NAME(): string { - return HeatmapType._NAME; - } - - getMappingName(): string { - return HeatmapType.TYPE; - } - - getIconUrl(): string { - return HeatmapType.ICON_URL; - } - - toString(): string { - return HeatmapType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['attribute', this.attribute.toString()], - ['radius', this.radius.toString()], - ]; - } - - toMappingDict(): HeatmapTypeMappingDict { - return { - attribute: this.attribute, - radius: this.radius, - }; - } - - toDict(): HeatmapTypeDict { - return { - operatorType: HeatmapType.TYPE, - attribute: this.attribute, - radius: this.radius, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return HeatmapType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/histogram-type.model.ts b/projects/wave-core/src/lib/operators/types/histogram-type.model.ts deleted file mode 100644 index c890c5cf..00000000 --- a/projects/wave-core/src/lib/operators/types/histogram-type.model.ts +++ /dev/null @@ -1,117 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface HistogramTypeMappingDict extends OperatorTypeMappingDict { - attribute: string; - range: [number, number] | string; // `[min, max]` or `unit` or `data` - buckets?: number; -} - -export interface HistogramTypeDict extends OperatorTypeDict { - attribute: string; - range: {min: number; max: number} | string; - buckets?: number; -} - -/** - * The histogram is defined for one attribute of the input layer. - * The range and buckets specify the resulting histogram. - * If no number of buckets is specified, it uses suitable defaults. - */ -interface HistogramTypeConfig { - attribute: string; - range: {min: number; max: number} | string; - buckets?: number; -} - -/** - * The histogram type. - */ -export class HistogramType extends OperatorType { - private static _TYPE = 'histogram'; - private static _ICON_URL = OperatorType.createIconDataUrl(HistogramType._TYPE); - private static _NAME = 'Histogram'; - - static get TYPE(): string { - return HistogramType._TYPE; - } - - static get ICON_URL(): string { - return HistogramType._ICON_URL; - } - - static get NAME(): string { - return HistogramType._NAME; - } - - private attribute: string; - private range: {min: number; max: number} | string; - private buckets: number; - - constructor(config: HistogramTypeConfig) { - super(); - this.attribute = config.attribute; - this.range = config.range; - this.buckets = config.buckets; - } - - static fromDict(dict: HistogramTypeDict): HistogramType { - return new HistogramType(dict); - } - - getMappingName(): string { - return HistogramType.TYPE; - } - - getIconUrl(): string { - return HistogramType.ICON_URL; - } - - toString(): string { - return HistogramType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - let range: string; - if (typeof this.range === 'string') { - range = this.range as string; - } else { - const rangeStruct = this.range as {min: number; max: number}; - range = `min: ${rangeStruct.min}, max: ${rangeStruct.max}`; - } - - return [ - ['attribute', this.attribute.toString()], - ['range', range], - ['buckets', this.buckets.toString()], - ]; - } - - toMappingDict(): HistogramTypeMappingDict { - let range: [number, number] | string; - if (typeof this.range === 'string') { - range = this.range as string; - } else { - const rangeStruct = this.range as {min: number; max: number}; - range = [rangeStruct.min, rangeStruct.max]; - } - - return { - attribute: this.attribute, - range: range, - buckets: this.buckets, - }; - } - - toDict(): HistogramTypeDict { - return { - operatorType: HistogramType.TYPE, - attribute: this.attribute, - range: this.range, - buckets: this.buckets, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return HistogramType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/msg-types.model.ts b/projects/wave-core/src/lib/operators/types/msg-types.model.ts deleted file mode 100644 index af03ec10..00000000 --- a/projects/wave-core/src/lib/operators/types/msg-types.model.ts +++ /dev/null @@ -1,480 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -/** - * The MSG radiance type. - */ -export class MsgRadianceType extends OperatorType { - private static _TYPE = 'meteosat_radiance'; - private static _ICON_URL = OperatorType.createIconDataUrl(MsgRadianceType._TYPE); - private static _NAME = 'MSG Radiance Operator'; - - static get TYPE(): string { - return MsgRadianceType._TYPE; - } - - static get ICON_URL(): string { - return MsgRadianceType._ICON_URL; - } - - static get NAME(): string { - return MsgRadianceType._NAME; - } - - constructor(config: {}) { - super(); - } - - static fromDict(dict: OperatorTypeDict): MsgRadianceType { - return new MsgRadianceType({}); - } - - getMappingName(): string { - return MsgRadianceType.TYPE; - } - - getIconUrl(): string { - return MsgRadianceType.ICON_URL; - } - - toString(): string { - return MsgRadianceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return []; - } - - toMappingDict(): OperatorTypeMappingDict { - return {}; - } - - toDict(): OperatorTypeDict { - return { - operatorType: MsgRadianceType.TYPE, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return MsgRadianceType.fromDict(this.toDict()); // TODO: add modifications - } -} - -/* The MSG reflectance type */ -interface MsgReflectanceTypeMappingDict extends OperatorTypeMappingDict { - isHrv: boolean; - solarCorrection: boolean; - forceSatellite?: MeteosatSatelliteName; -} - -export interface MsgReflectanceTypeDict extends OperatorTypeDict { - isHrv: boolean; - solarCorrection: boolean; - forceSatelliteName?: MeteosatSatelliteName; -} - -interface MsgReflectanceTypeConfig { - isHrv: boolean; - solarCorrection: boolean; - forceSatelliteName?: MeteosatSatelliteName; -} - -export type MeteosatSatelliteName = 'Meteosat-8' | 'Meteosat-9' | 'Meteosat-10' | 'Meteosat-11'; - -/** - * The MSG radiance type. - */ -export class MsgReflectanceType extends OperatorType { - private static _TYPE = 'meteosat_reflectance'; - private static _ICON_URL = OperatorType.createIconDataUrl(MsgReflectanceType._TYPE); - private static _NAME = 'MSG Reflectance Operator'; - - static get TYPE(): string { - return MsgReflectanceType._TYPE; - } - static get ICON_URL(): string { - return MsgReflectanceType._ICON_URL; - } - static get NAME(): string { - return MsgReflectanceType._NAME; - } - - private isHrv: boolean = false; - private solarCorrection: boolean = true; - private forceSatelliteName: MeteosatSatelliteName = undefined; - private forceSatellite: boolean = false; - - constructor(config: MsgReflectanceTypeConfig) { - super(); - this.isHrv = config.isHrv; - this.solarCorrection = config.solarCorrection; - if (config.forceSatelliteName) { - this.forceSatelliteName = config.forceSatelliteName; - } - this.forceSatellite = this.forceSatelliteName !== undefined; - } - - static fromDict(dict: MsgReflectanceTypeDict): MsgReflectanceType { - return new MsgReflectanceType(dict); - } - - getMappingName(): string { - return MsgReflectanceType.TYPE; - } - - getIconUrl(): string { - return MsgReflectanceType.ICON_URL; - } - - toString(): string { - return MsgReflectanceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return []; - } - - toMappingDict(): MsgReflectanceTypeMappingDict { - const config: MsgReflectanceTypeMappingDict = { - isHrv: this.isHrv, - solarCorrection: this.solarCorrection, - }; - if (this.forceSatellite && this.forceSatelliteName) { - config.forceSatellite = this.forceSatelliteName; - } - return config; - } - - toDict(): MsgReflectanceTypeDict { - let dict: MsgReflectanceTypeDict = { - operatorType: MsgReflectanceType.TYPE, - isHrv: this.isHrv, - solarCorrection: this.solarCorrection, - }; - if (this.forceSatellite && this.forceSatelliteName) { - dict['forceSatelliteName'] = this.forceSatelliteName; - } - return dict; - } - - cloneWithModifications(options?: {}): OperatorType { - return MsgRadianceType.fromDict(this.toDict()); // TODO: add modifications - } -} - -/* The MSG solarangle type */ -interface MsgSolarangleTypeMappingDict extends OperatorTypeMappingDict { - solarangle: string; -} - -export interface MsgSolarangleTypeDict extends OperatorTypeDict { - solarangle: SolarangleName; -} - -interface MsgSolarangleTypeConfig { - solarangle: SolarangleName; -} - -export type SolarangleName = 'azimuth' | 'zenith'; - -/** - * The MSG solarangle type. - */ -export class MsgSolarangleType extends OperatorType { - private static _TYPE = 'meteosat_solar_angle'; - private static _ICON_URL = OperatorType.createIconDataUrl(MsgSolarangleType._TYPE); - private static _NAME = 'MSG Solarangle Operator'; - - static get TYPE(): string { - return MsgSolarangleType._TYPE; - } - static get ICON_URL(): string { - return MsgSolarangleType._ICON_URL; - } - static get NAME(): string { - return MsgSolarangleType._NAME; - } - - private solarangle: SolarangleName; - - constructor(config: MsgSolarangleTypeConfig) { - super(); - this.solarangle = config.solarangle; - } - - static fromDict(dict: MsgSolarangleTypeDict): MsgRadianceType { - return new MsgRadianceType(dict); - } - - getMappingName(): string { - return MsgSolarangleType.TYPE; - } - - getIconUrl(): string { - return MsgSolarangleType.ICON_URL; - } - - toString(): string { - return MsgSolarangleType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return []; - } - - toMappingDict(): MsgSolarangleTypeMappingDict { - return { - solarangle: this.solarangle, - }; - } - - toDict(): MsgSolarangleTypeDict { - return { - operatorType: MsgSolarangleType.TYPE, - solarangle: this.solarangle, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return MsgSolarangleType.fromDict(this.toDict()); // TODO: add modifications - } -} - -/** - * The MSG temperature type. - */ -export class MsgTemperatureType extends OperatorType { - private static _TYPE = 'meteosat_temperature'; - private static _ICON_URL = OperatorType.createIconDataUrl(MsgTemperatureType._TYPE); - private static _NAME = 'MSG Temperature Operator'; - - static get TYPE(): string { - return MsgTemperatureType._TYPE; - } - - static get ICON_URL(): string { - return MsgTemperatureType._ICON_URL; - } - - static get NAME(): string { - return MsgTemperatureType._NAME; - } - - constructor(config: {}) { - super(); - } - - static fromDict(dict: OperatorTypeDict): MsgTemperatureType { - return new MsgTemperatureType(dict); - } - - getMappingName(): string { - return MsgTemperatureType.TYPE; - } - - getIconUrl(): string { - return MsgTemperatureType.ICON_URL; - } - - toString(): string { - return MsgTemperatureType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return []; - } - - toMappingDict(): OperatorTypeMappingDict { - return {}; - } - - toDict(): OperatorTypeDict { - return { - operatorType: MsgTemperatureType.TYPE, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return MsgTemperatureType.fromDict(this.toDict()); // TODO: add modifications - } -} - -/* The MSG pansharpen type */ -interface MsgPansharpenTypeMappingDict extends OperatorTypeMappingDict {} - -export interface MsgPansharpenTypeDict extends OperatorTypeDict {} - -interface MsgPansharpenTypeConfig {} - -/** - * The MSG pansharpen type. - */ -export class MsgPansharpenType extends OperatorType { - private static _TYPE = 'meteosat_pansharpening'; - private static _ICON_URL = OperatorType.createIconDataUrl(MsgPansharpenType._TYPE); - private static _NAME = 'MSG Pansharpen Operator'; - - static get TYPE(): string { - return MsgPansharpenType._TYPE; - } - - static get ICON_URL(): string { - return MsgPansharpenType._ICON_URL; - } - - static get NAME(): string { - return MsgPansharpenType._NAME; - } - - constructor(config: MsgPansharpenTypeConfig) { - super(); - } - - static fromDict(dict: MsgPansharpenTypeDict): MsgPansharpenType { - return new MsgPansharpenType(dict); - } - - getMappingName(): string { - return MsgPansharpenType.TYPE; - } - - getIconUrl(): string { - return MsgPansharpenType.ICON_URL; - } - - toString(): string { - return MsgPansharpenType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return []; - } - - toMappingDict(): MsgPansharpenTypeMappingDict { - return {}; - } - - toDict(): MsgPansharpenTypeDict { - return { - operatorType: MsgPansharpenType.TYPE, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return MsgPansharpenType.fromDict(this.toDict()); // TODO: add modifications - } -} - -/** - * The MSG temperature type. - */ -export class MsgCo2CorrectionType extends OperatorType { - private static _TYPE = 'meteosat_co2correction'; - private static _ICON_URL = OperatorType.createIconDataUrl(MsgCo2CorrectionType._TYPE); - private static _NAME = 'MSG CO2 Correction Operator'; - - static get TYPE(): string { - return MsgCo2CorrectionType._TYPE; - } - - static get ICON_URL(): string { - return MsgCo2CorrectionType._ICON_URL; - } - - static get NAME(): string { - return MsgCo2CorrectionType._NAME; - } - - constructor(config: {}) { - super(); - } - - static fromDict(dict: OperatorTypeDict): MsgCo2CorrectionType { - return new MsgCo2CorrectionType(dict); - } - - getMappingName(): string { - return MsgCo2CorrectionType.TYPE; - } - - getIconUrl(): string { - return MsgCo2CorrectionType.ICON_URL; - } - - toString(): string { - return MsgCo2CorrectionType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return []; - } - - toMappingDict(): OperatorTypeMappingDict { - return {}; - } - - toDict(): OperatorTypeDict { - return { - operatorType: MsgCo2CorrectionType.TYPE, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return MsgCo2CorrectionType.fromDict(this.toDict()); // TODO: add modifications - } -} - -export class MsgSofosGccThermalThresholdType extends OperatorType { - private static _TYPE = 'meteosat_gccthermthresholddetection'; - private static _ICON_URL = OperatorType.createIconDataUrl(MsgSofosGccThermalThresholdType._TYPE); - private static _NAME = 'MSG SOFOS thermal threshold detection operator'; - - static get TYPE(): string { - return MsgSofosGccThermalThresholdType._TYPE; - } - - static get ICON_URL(): string { - return MsgSofosGccThermalThresholdType._ICON_URL; - } - - static get NAME(): string { - return MsgSofosGccThermalThresholdType._NAME; - } - - constructor(config: {}) { - super(); - } - - static fromDict(dict: OperatorTypeDict): MsgSofosGccThermalThresholdType { - return new MsgSofosGccThermalThresholdType(dict); - } - - getMappingName(): string { - return MsgSofosGccThermalThresholdType.TYPE; - } - - getIconUrl(): string { - return MsgSofosGccThermalThresholdType.ICON_URL; - } - - toString(): string { - return MsgSofosGccThermalThresholdType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return []; - } - - toMappingDict(): OperatorTypeMappingDict { - return {}; - } - - toDict(): OperatorTypeDict { - return { - operatorType: MsgSofosGccThermalThresholdType.TYPE, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return MsgSofosGccThermalThresholdType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/numeric-attribute-filter-type.model.ts b/projects/wave-core/src/lib/operators/types/numeric-attribute-filter-type.model.ts deleted file mode 100644 index e5f2dc08..00000000 --- a/projects/wave-core/src/lib/operators/types/numeric-attribute-filter-type.model.ts +++ /dev/null @@ -1,104 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface NumericAttributeFilterTypeMappingDict extends OperatorTypeMappingDict { - name: string; - includeNoData: boolean; - rangeMin?: number; - rangeMax?: number; -} - -export interface NumericAttributeFilterTypeDict extends OperatorTypeDict { - attributeName: string; - includeNoData: boolean; - rangeMin?: number; - rangeMax?: number; -} - -interface NumericAttributeFilterTypeConfig { - attributeName: string; - includeNoData: boolean; - rangeMin?: number; - rangeMax?: number; -} - -/** - * The numeric attribute filter type. - */ -export class NumericAttributeFilterType extends OperatorType { - private static _TYPE = 'numeric_attribute_filter'; - private static _ICON_URL = OperatorType.createIconDataUrl(NumericAttributeFilterType._TYPE); - private static _NAME = 'Numeric Attribute Filter'; - - static get TYPE(): string { - return NumericAttributeFilterType._TYPE; - } - static get ICON_URL(): string { - return NumericAttributeFilterType._ICON_URL; - } - static get NAME(): string { - return NumericAttributeFilterType._NAME; - } - - private name: string; - private includeNoData: boolean; - private rangeMin: number; - private rangeMax: number; - - constructor(config: NumericAttributeFilterTypeConfig) { - super(); - this.name = config.attributeName; - this.includeNoData = !!config.includeNoData; // defaults to false on undefined - this.rangeMin = config.rangeMin; - this.rangeMax = config.rangeMax; - } - - static fromDict(dict: NumericAttributeFilterTypeDict): NumericAttributeFilterType { - return new NumericAttributeFilterType(dict); - } - - getMappingName(): string { - return NumericAttributeFilterType.TYPE; - } - - getIconUrl(): string { - return NumericAttributeFilterType.ICON_URL; - } - - toString(): string { - return NumericAttributeFilterType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - const parameters: Array<[string, string]> = [['includeNoData', this.includeNoData.toString()]]; - if (this.rangeMin) { - parameters.push(['rangeMin', this.rangeMin.toString()]); - } - if (this.rangeMax) { - parameters.push(['rangeMax', this.rangeMax.toString()]); - } - return parameters; - } - - toMappingDict(): NumericAttributeFilterTypeMappingDict { - return { - name: this.name, - includeNoData: this.includeNoData, - rangeMin: this.rangeMin, - rangeMax: this.rangeMax, - }; - } - - toDict(): NumericAttributeFilterTypeDict { - return { - operatorType: NumericAttributeFilterType.TYPE, - attributeName: this.name, - includeNoData: this.includeNoData, - rangeMin: this.rangeMin, - rangeMax: this.rangeMax, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return NumericAttributeFilterType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/ogr-raw-source-type.model.ts b/projects/wave-core/src/lib/operators/types/ogr-raw-source-type.model.ts deleted file mode 100644 index b1f8109d..00000000 --- a/projects/wave-core/src/lib/operators/types/ogr-raw-source-type.model.ts +++ /dev/null @@ -1,155 +0,0 @@ -import {OperatorType, OperatorTypeCloneOptions, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface OgrRawSourceTypeConfig { - filename: string; - layer_name?: string; - query_string?: string; - time: 'none' | 'start' | 'start+end' | 'start+duration'; - duration?: number | 'inf'; - time1_format?: MappingTimeFormat; - time2_format?: MappingTimeFormat; - columns: { - x?: string; - y?: string; - time1?: string; - time2?: string; - numeric: Array; - textual: Array; - }; - default?: string; // WKT definition of default value - force_ogr_time_filter?: boolean; - on_error: 'skip' | 'abort' | 'keep'; - provenance?: { - citation: string; - license: string; - uri: string; - }; -} - -// TODO: generalize and export -interface MappingTimeFormat { - format: 'custom' | 'seconds' | 'dmyhm' | 'iso'; - custom_format?: string; -} - -interface OgrRawSourceTypeMappingDict extends OperatorTypeMappingDict { - filename: string; - layer_name?: string; - time: 'none' | 'start' | 'start+end' | 'start+duration'; - duration?: number | 'inf'; - time1_format?: MappingTimeFormat; - time2_format?: MappingTimeFormat; - columns: { - x?: string; - y?: string; - time1?: string; - time2?: string; - numeric: Array; - textual: Array; - }; - default?: string; // WKT definition of default value - force_ogr_time_filter?: boolean; - on_error: 'skip' | 'abort' | 'keep'; - provenance?: { - citation: string; - license: string; - uri: string; - }; -} - -export interface OgrRawSourceTypeDict extends OperatorTypeDict { - filename: string; - layer_name?: string; - query_string?: string; - time: 'none' | 'start' | 'start+end' | 'start+duration'; - duration?: number | 'inf'; - time1_format?: MappingTimeFormat; - time2_format?: MappingTimeFormat; - columns: { - x?: string; - y?: string; - time1?: string; - time2?: string; - numeric: Array; - textual: Array; - }; - default?: string; // WKT definition of default value - force_ogr_time_filter?: boolean; - on_error: 'skip' | 'abort' | 'keep'; - provenance?: { - citation: string; - license: string; - uri: string; - }; -} - -/** - * The raster source type. - */ -export class OgrRawSourceType extends OperatorType { - private static _TYPE = 'ogr_raw_source'; - private static _ICON_URL = OperatorType.createIconDataUrl(OgrRawSourceType._TYPE); - private static _NAME = 'GDAL OGR Raw Source'; - - static get TYPE(): string { - return OgrRawSourceType._TYPE; - } - - static get ICON_URL(): string { - return OgrRawSourceType._ICON_URL; - } - - static get NAME(): string { - return OgrRawSourceType._NAME; - } - - config: OgrRawSourceTypeConfig; - - static fromDict(dict: OgrRawSourceTypeDict): OgrRawSourceType { - return new OgrRawSourceType(dict); - } - - constructor(config: OgrRawSourceTypeConfig) { - super(); - this.config = config; - } - - getMappingName(): string { - return OgrRawSourceType.TYPE; - } - - getIconUrl(): string { - return OgrRawSourceType.ICON_URL; - } - - toString(): string { - return OgrRawSourceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['filename', this.config.query_string ? '' : this.config.filename.toString()], // FIXME: workaround for CronicalDB - ['layer_name', this.config.layer_name ? this.config.layer_name.toString() : ''], - ['query_string', this.config.query_string ? this.config.query_string.toString() : ''], - ['columns.time1', this.config.columns.time1 ? this.config.columns.time1.toString() : ''], - ['columns.time2', this.config.columns.time2 ? this.config.columns.time2.toString() : ''], - ['columns.numeric', this.config.columns.numeric.toString()], - ['columns.textual', this.config.columns.textual.toString()], - ]; - } - - toMappingDict(): OgrRawSourceTypeMappingDict { - return this.config; - } - - toDict(): OgrRawSourceTypeDict { - return { - operatorType: OgrRawSourceType.TYPE, - ...this.config, - }; - } - - cloneWithModifications(options?: OperatorTypeCloneOptions): OperatorType { - return new OgrRawSourceType(this.config); - } -} diff --git a/projects/wave-core/src/lib/operators/types/ogr-source-type.model.ts b/projects/wave-core/src/lib/operators/types/ogr-source-type.model.ts deleted file mode 100644 index 07056f12..00000000 --- a/projects/wave-core/src/lib/operators/types/ogr-source-type.model.ts +++ /dev/null @@ -1,102 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface OgrSourceTypeConfig { - dataset_id: string; - layer_id: string | number; - numeric: string[]; - textual: string[]; -} - -interface OgrSourceTypeMappingDict extends OperatorTypeMappingDict { - name: string; - layer_name: string | number; - numeric: string[]; - textual: string[]; -} - -export interface OgrSourceTypeDict extends OperatorTypeDict { - dataset_id: string; - layer_id: string | number; - numeric: string[]; - textual: string[]; -} - -/** - * The raster source type. - */ -export class OgrSourceType extends OperatorType { - private static _TYPE = 'ogr_source'; - private static _ICON_URL = OperatorType.createIconDataUrl(OgrSourceType._TYPE); - private static _NAME = 'GDAL OGR Source'; - - static get TYPE(): string { - return OgrSourceType._TYPE; - } - static get ICON_URL(): string { - return OgrSourceType._ICON_URL; - } - static get NAME(): string { - return OgrSourceType._NAME; - } - - dataset_id: string; - layer_id: string | number; - numeric: string[]; - textual: string[]; - - static fromDict(dict: OgrSourceTypeDict): OgrSourceType { - return new OgrSourceType(dict); - } - - constructor(config: OgrSourceTypeConfig) { - super(); - this.dataset_id = config.dataset_id; - this.layer_id = config.layer_id; - this.numeric = config.numeric; - this.textual = config.textual; - } - - getMappingName(): string { - return OgrSourceType.TYPE; - } - - getIconUrl(): string { - return OgrSourceType.ICON_URL; - } - - toString(): string { - return OgrSourceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['dataset_id', this.dataset_id.toString()], - ['layer_id', this.layer_id.toString()], - ['numeric', this.numeric.toString()], - ['textual', this.textual.toString()], - ]; - } - - toMappingDict(): OgrSourceTypeMappingDict { - return { - name: this.dataset_id, - layer_name: this.layer_id, - numeric: this.numeric, - textual: this.textual, - }; - } - - toDict(): OgrSourceTypeDict { - return { - operatorType: OgrSourceType.TYPE, - dataset_id: this.dataset_id, - layer_id: this.layer_id, - numeric: this.numeric, - textual: this.textual, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return OgrSourceType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/piechart-type.model.ts b/projects/wave-core/src/lib/operators/types/piechart-type.model.ts deleted file mode 100644 index d9c9d52c..00000000 --- a/projects/wave-core/src/lib/operators/types/piechart-type.model.ts +++ /dev/null @@ -1,117 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -import {ResultType, ResultTypes} from '../result-type.model'; - -interface PieChartTypeMappingDict extends OperatorTypeMappingDict { - source: string; - result: string; -} - -export interface PieChartTypeDict extends OperatorTypeDict { - attribute: string; - inputType: string; -} - -interface PieChartTypeConfig { - attribute: string; - inputType: ResultType; -} - -/** - * The R type. - */ -export class PieChartType extends OperatorType { - private static _TYPE = 'piechart'; - private static _ICON_URL = OperatorType.createIconDataUrl(PieChartType._TYPE); - private static _NAME = 'Pie Chart'; - - static get TYPE(): string { - return PieChartType._TYPE; - } - static get ICON_URL(): string { - return PieChartType._ICON_URL; - } - static get NAME(): string { - return PieChartType._NAME; - } - - private code: string; - private attribute: string; - private inputType: ResultType; - private resultType: ResultType; - - static fromDict(dict: PieChartTypeDict): PieChartType { - return new PieChartType({ - attribute: dict.attribute, - inputType: ResultTypes.fromCode(dict.inputType), - }); - } - - constructor(config: PieChartTypeConfig) { - super(); - this.attribute = config.attribute; - this.inputType = config.inputType; - this.resultType = ResultTypes.PLOT; - - const camelInputType = this.inputType.toString().charAt(0).toUpperCase() + this.inputType.toString().substr(1).toLowerCase(); - - this.code = ` - features <- mapping.load${camelInputType}(0, mapping.qrect); - - if (length(features) > 0) { - - kv <- table(features$\`${config.attribute}\`); - - labels <- paste("(",names(kv),")", "\n", kv, sep=""); - - pie(kv, labels = labels); - - } else { - - plot.new(); - - mtext("Empty Dataset"); - - } - - `; - } - - getMappingName(): string { - return 'r_script'; - } - - getIconUrl(): string { - return PieChartType.ICON_URL; - } - - toString(): string { - return PieChartType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['code', this.code.toString()], - ['resultType', this.resultType.toString()], - ]; - } - - toMappingDict(): PieChartTypeMappingDict { - return { - source: this.code, - result: this.resultType.getCode(), - }; - } - - toDict(): PieChartTypeDict { - return { - operatorType: PieChartType.TYPE, - attribute: this.attribute, - inputType: this.inputType.getCode(), - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return PieChartType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/point-in-polygon-filter-type.model.ts b/projects/wave-core/src/lib/operators/types/point-in-polygon-filter-type.model.ts deleted file mode 100644 index fafcb71b..00000000 --- a/projects/wave-core/src/lib/operators/types/point-in-polygon-filter-type.model.ts +++ /dev/null @@ -1,64 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface PointInPolygonFilterTypeMappingDict extends OperatorTypeMappingDict {} - -export interface PointInPolygonFilterTypeDict extends OperatorTypeDict {} - -interface PointInPolygonFilterTypeConfig {} - -/** - * The Point in Polygon Filter type. - */ -export class PointInPolygonFilterType extends OperatorType { - private static _TYPE = 'point_in_polygon_filter'; - private static _ICON_URL = OperatorType.createIconDataUrl(PointInPolygonFilterType._TYPE); - private static _NAME = 'Point in Polygon Filter'; - - static get TYPE(): string { - return PointInPolygonFilterType._TYPE; - } - static get ICON_URL(): string { - return PointInPolygonFilterType._ICON_URL; - } - static get NAME(): string { - return PointInPolygonFilterType._NAME; - } - - constructor(config: PointInPolygonFilterTypeConfig) { - super(); - } - - static fromDict(dict: PointInPolygonFilterTypeDict): PointInPolygonFilterType { - return new PointInPolygonFilterType({}); - } - - getMappingName(): string { - return PointInPolygonFilterType.TYPE; - } - - getIconUrl(): string { - return PointInPolygonFilterType.ICON_URL; - } - - toString(): string { - return PointInPolygonFilterType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return []; - } - - toMappingDict(): PointInPolygonFilterTypeMappingDict { - return {}; - } - - toDict(): PointInPolygonFilterTypeDict { - return { - operatorType: PointInPolygonFilterType.TYPE, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return PointInPolygonFilterType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/projection-type.model.ts b/projects/wave-core/src/lib/operators/types/projection-type.model.ts deleted file mode 100644 index 263c7abc..00000000 --- a/projects/wave-core/src/lib/operators/types/projection-type.model.ts +++ /dev/null @@ -1,91 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -import {Projection, Projections} from '../projection.model'; - -interface ProjectionTypeConfig { - srcProjection: Projection; - destProjection: Projection; -} - -interface ProjectionTypeMappingDict extends OperatorTypeMappingDict { - src_projection: string; - dest_projection: string; -} - -export interface ProjectionTypeDict extends OperatorTypeDict { - srcProjection: string; - destProjection: string; -} - -/** - * The projection type. - */ -export class ProjectionType extends OperatorType { - private static _TYPE = 'projection'; - private static _ICON_URL = OperatorType.createIconDataUrl(ProjectionType._TYPE); - private static _NAME = 'Projection'; - - static get TYPE(): string { - return ProjectionType._TYPE; - } - static get ICON_URL(): string { - return ProjectionType._ICON_URL; - } - static get NAME(): string { - return ProjectionType._NAME; - } - - private srcProjection: Projection; - private destProjection: Projection; - - constructor(config: ProjectionTypeConfig) { - super(); - this.srcProjection = config.srcProjection; - this.destProjection = config.destProjection; - } - - static fromDict(dict: ProjectionTypeDict): ProjectionType { - return new ProjectionType({ - srcProjection: Projections.fromCode(dict.srcProjection), - destProjection: Projections.fromCode(dict.destProjection), - }); - } - - getMappingName(): string { - return ProjectionType.TYPE; - } - - getIconUrl(): string { - return ProjectionType.ICON_URL; - } - - toString(): string { - return ProjectionType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['srcProjection', this.srcProjection.toString()], - ['destProjection', this.destProjection.toString()], - ]; - } - - toMappingDict(): ProjectionTypeMappingDict { - return { - src_projection: this.srcProjection.getCode(), - dest_projection: this.destProjection.getCode(), - }; - } - - toDict(): ProjectionTypeDict { - return { - operatorType: ProjectionType.TYPE, - srcProjection: this.srcProjection.getCode(), - destProjection: this.destProjection.getCode(), - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return ProjectionType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/r-script-type.model.ts b/projects/wave-core/src/lib/operators/types/r-script-type.model.ts deleted file mode 100644 index a099a88b..00000000 --- a/projects/wave-core/src/lib/operators/types/r-script-type.model.ts +++ /dev/null @@ -1,91 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -import {ResultType, ResultTypes} from '../result-type.model'; - -interface RScriptTypeMappingDict extends OperatorTypeMappingDict { - source: string; - result: string; -} - -export interface RScriptTypeDict extends OperatorTypeDict { - code: string; - resultType: string; -} - -interface RScriptTypeConfig { - code: string; - resultType: ResultType; -} - -/** - * The R type. - */ -export class RScriptType extends OperatorType { - private static _TYPE = 'r_script'; - private static _ICON_URL = OperatorType.createIconDataUrl(RScriptType._TYPE); - private static _NAME = 'R Script'; - - static get TYPE(): string { - return RScriptType._TYPE; - } - static get ICON_URL(): string { - return RScriptType._ICON_URL; - } - static get NAME(): string { - return RScriptType._NAME; - } - - private code: string; - private resultType: ResultType; - - static fromDict(dict: RScriptTypeDict): RScriptType { - return new RScriptType({ - code: dict.code, - resultType: ResultTypes.fromCode(dict.resultType), - }); - } - - constructor(config: RScriptTypeConfig) { - super(); - this.code = config.code; - this.resultType = config.resultType; - } - - getMappingName(): string { - return RScriptType.TYPE; - } - - getIconUrl(): string { - return RScriptType.ICON_URL; - } - - toString(): string { - return RScriptType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['code', this.code.toString()], - ['resultType', this.resultType.toString()], - ]; - } - - toMappingDict(): RScriptTypeMappingDict { - return { - source: this.code, - result: this.resultType.getCode(), - }; - } - - toDict(): RScriptTypeDict { - return { - operatorType: RScriptType.TYPE, - code: this.code, - resultType: this.resultType.getCode(), - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return RScriptType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/raster-source-type.model.ts b/projects/wave-core/src/lib/operators/types/raster-source-type.model.ts deleted file mode 100644 index 72d953cf..00000000 --- a/projects/wave-core/src/lib/operators/types/raster-source-type.model.ts +++ /dev/null @@ -1,94 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface RasterSourceTypeConfig { - channel: number; - sourcename: string; - transform: boolean; -} - -interface RasterSourceTypeMappingDict extends OperatorTypeMappingDict { - channel: number; - sourcename: string; - transform: boolean; -} - -export interface RasterSourceTypeDict extends OperatorTypeDict { - channel: number; - sourcename: string; - transform: boolean; -} - -/** - * The raster source type. - */ -export class RasterSourceType extends OperatorType { - private static _TYPE = 'rasterdb_source'; - private static _ICON_URL = OperatorType.createIconDataUrl(RasterSourceType._TYPE); - private static _NAME = 'Raster Source'; - - static get TYPE(): string { - return RasterSourceType._TYPE; - } - static get ICON_URL(): string { - return RasterSourceType._ICON_URL; - } - static get NAME(): string { - return RasterSourceType._NAME; - } - - private channel: number; - private sourcename: string; - private transform: boolean; - - constructor(config: RasterSourceTypeConfig) { - super(); - this.channel = config.channel; - this.sourcename = config.sourcename; - this.transform = config.transform; - } - - static fromDict(dict: RasterSourceTypeDict): RasterSourceType { - return new RasterSourceType(dict); - } - - getMappingName(): string { - return RasterSourceType.TYPE; - } - - getIconUrl(): string { - return RasterSourceType.ICON_URL; - } - - toString(): string { - return RasterSourceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['channel', this.channel.toString()], - ['sourcename', this.sourcename.toString()], - ['transform', this.transform.toString()], - ]; - } - - toMappingDict(): RasterSourceTypeMappingDict { - return { - sourcename: this.sourcename, - channel: this.channel, - transform: this.transform, - }; - } - - toDict(): RasterSourceTypeDict { - return { - operatorType: RasterSourceType.TYPE, - sourcename: this.sourcename, - channel: this.channel, - transform: this.transform, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return RasterSourceType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/raster-value-extraction-type.model.ts b/projects/wave-core/src/lib/operators/types/raster-value-extraction-type.model.ts deleted file mode 100644 index 45f86ea3..00000000 --- a/projects/wave-core/src/lib/operators/types/raster-value-extraction-type.model.ts +++ /dev/null @@ -1,94 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface RasterValueExtractionTypeMappingDict extends OperatorTypeMappingDict { - xResolution: number; - yResolution: number; - names: Array; -} - -export interface RasterValueExtractionTypeDict extends OperatorTypeDict { - xResolution: number; - yResolution: number; - attributeNames: Array; -} - -interface RasterValueExtractionTypeConfig { - xResolution: number; - yResolution: number; - attributeNames: Array; -} - -/** - * The raster value extraction type. - */ -export class RasterValueExtractionType extends OperatorType { - private static _TYPE = 'raster_value_extraction'; - private static _ICON_URL = OperatorType.createIconDataUrl(RasterValueExtractionType._TYPE); - private static _NAME = 'Raster Value Extraction'; - - static get TYPE(): string { - return RasterValueExtractionType._TYPE; - } - static get ICON_URL(): string { - return RasterValueExtractionType._ICON_URL; - } - static get NAME(): string { - return RasterValueExtractionType._NAME; - } - - private xResolution: number; - private yResolution: number; - private attributeNames: Array; - - constructor(config: RasterValueExtractionTypeConfig) { - super(); - this.xResolution = config.xResolution; - this.yResolution = config.yResolution; - this.attributeNames = config.attributeNames; - } - - static fromDict(dict: RasterValueExtractionTypeDict): RasterValueExtractionType { - return new RasterValueExtractionType(dict); - } - - getMappingName(): string { - return RasterValueExtractionType.TYPE; - } - - getIconUrl(): string { - return RasterValueExtractionType.ICON_URL; - } - - toString(): string { - return RasterValueExtractionType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['xResolution', this.xResolution.toString()], - ['yResolution', this.yResolution.toString()], - ['attributeNames', this.attributeNames.join(', ')], - ]; - } - - toMappingDict(): RasterValueExtractionTypeMappingDict { - return { - xResolution: this.xResolution, - yResolution: this.yResolution, - names: this.attributeNames, - }; - } - - toDict(): RasterValueExtractionTypeDict { - return { - operatorType: RasterValueExtractionType.TYPE, - xResolution: this.xResolution, - yResolution: this.yResolution, - attributeNames: this.attributeNames, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return RasterValueExtractionType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/rasterize-polygon-type.model.ts b/projects/wave-core/src/lib/operators/types/rasterize-polygon-type.model.ts deleted file mode 100644 index 9b2f8e3c..00000000 --- a/projects/wave-core/src/lib/operators/types/rasterize-polygon-type.model.ts +++ /dev/null @@ -1,64 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface RasterizePolygonTypeMappingDict extends OperatorTypeMappingDict {} // eslint-disable-line @typescript-eslint/no-empty-interface - -export interface RasterizePolygonTypeDict extends OperatorTypeDict {} // eslint-disable-line @typescript-eslint/no-empty-interface - -interface RasterizePolygonTypeConfig {} // eslint-disable-line @typescript-eslint/no-empty-interface - -/** - * The raster value extraction type. - */ -export class RasterizePolygonType extends OperatorType { - private static _TYPE = 'rasterize_polygon'; - private static _ICON_URL = OperatorType.createIconDataUrl(RasterizePolygonType._TYPE); - private static _NAME = 'Rasterize Polygon'; - - static get TYPE(): string { - return RasterizePolygonType._TYPE; - } - static get ICON_URL(): string { - return RasterizePolygonType._ICON_URL; - } - static get NAME(): string { - return RasterizePolygonType._NAME; - } - - static fromDict(dict: RasterizePolygonTypeDict): RasterizePolygonType { - return new RasterizePolygonType(dict); - } - - constructor(config: RasterizePolygonTypeConfig) { - super(); - } - - getMappingName(): string { - return RasterizePolygonType.TYPE; - } - - getIconUrl(): string { - return RasterizePolygonType.ICON_URL; - } - - toString(): string { - return RasterizePolygonType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return []; - } - - toMappingDict(): RasterizePolygonTypeMappingDict { - return {}; - } - - toDict(): RasterizePolygonTypeDict { - return { - operatorType: RasterizePolygonType.TYPE, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return RasterizePolygonType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/rgba-composite-type.model.ts b/projects/wave-core/src/lib/operators/types/rgba-composite-type.model.ts deleted file mode 100644 index 249d92e8..00000000 --- a/projects/wave-core/src/lib/operators/types/rgba-composite-type.model.ts +++ /dev/null @@ -1,159 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -/** - * Each red, green and blue layer needs a minimum and maximum values - * to scale the color intensity in between. A scale between 0 and 1 - * allows for further emphasis on colors. - */ -interface RgbaCompositeTypeConfig { - rasterRedMin: number; - rasterRedMax: number; - rasterRedScale: number; - rasterGreenMin: number; - rasterGreenMax: number; - rasterGreenScale: number; - rasterBlueMin: number; - rasterBlueMax: number; - rasterBlueScale: number; -} - -interface RgbaCompositeTypeMappingDict extends OperatorTypeMappingDict { - raster_r_min: number; - raster_r_max: number; - raster_r_scale: number; - raster_g_min: number; - raster_g_max: number; - raster_g_scale: number; - raster_b_min: number; - raster_b_max: number; - raster_b_scale: number; -} - -export interface RgbaCompositeTypeDict extends OperatorTypeDict { - rasterRedMin: number; - rasterRedMax: number; - rasterRedScale: number; - rasterGreenMin: number; - rasterGreenMax: number; - rasterGreenScale: number; - rasterBlueMin: number; - rasterBlueMax: number; - rasterBlueScale: number; -} - -/** - * The RGBA composite type. - */ -export class RgbaCompositeType extends OperatorType { - private static _TYPE = 'rgba_composite'; - private static _ICON_URL = OperatorType.createIconDataUrl(RgbaCompositeType._TYPE); - private static _NAME = 'RGBA Composite'; - - static get TYPE(): string { - return RgbaCompositeType._TYPE; - } - - static get ICON_URL(): string { - return RgbaCompositeType._ICON_URL; - } - - static get NAME(): string { - return RgbaCompositeType._NAME; - } - - readonly rasterRedMin: number; - readonly rasterRedMax: number; - readonly rasterRedScale: number; - readonly rasterGreenMin: number; - readonly rasterGreenMax: number; - readonly rasterGreenScale: number; - readonly rasterBlueMin: number; - readonly rasterBlueMax: number; - readonly rasterBlueScale: number; - - constructor(config: RgbaCompositeTypeConfig) { - super(); - this.rasterRedMin = config.rasterRedMin; - this.rasterRedMax = config.rasterRedMax; - this.rasterRedScale = config.rasterRedScale; - this.rasterGreenMin = config.rasterGreenMin; - this.rasterGreenMax = config.rasterGreenMax; - this.rasterGreenScale = config.rasterGreenScale; - this.rasterBlueMin = config.rasterBlueMin; - this.rasterBlueMax = config.rasterBlueMax; - this.rasterBlueScale = config.rasterBlueScale; - } - - static fromDict(dict: RgbaCompositeTypeDict): RgbaCompositeType { - return new RgbaCompositeType({ - rasterRedMin: dict.rasterRedMin, - rasterRedMax: dict.rasterRedMax, - rasterRedScale: dict.rasterRedScale, - rasterGreenMin: dict.rasterGreenMin, - rasterGreenMax: dict.rasterGreenMax, - rasterGreenScale: dict.rasterGreenScale, - rasterBlueMin: dict.rasterBlueMin, - rasterBlueMax: dict.rasterBlueMax, - rasterBlueScale: dict.rasterBlueScale, - }); - } - - getMappingName(): string { - return RgbaCompositeType.TYPE; - } - - getIconUrl(): string { - return RgbaCompositeType.ICON_URL; - } - - toString(): string { - return RgbaCompositeType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['rasterRedMin', this.rasterRedMin.toString()], - ['rasterRedMax', this.rasterRedMax.toString()], - ['rasterRedScale', this.rasterRedScale.toString()], - ['rasterGreenMin', this.rasterGreenMin.toString()], - ['rasterGreenMax', this.rasterGreenMax.toString()], - ['rasterGreenScale', this.rasterGreenScale.toString()], - ['rasterBlueMin', this.rasterBlueMin.toString()], - ['rasterBlueMax', this.rasterBlueMax.toString()], - ['rasterBlueScale', this.rasterBlueScale.toString()], - ]; - } - - toMappingDict(): RgbaCompositeTypeMappingDict { - return { - raster_r_min: this.rasterRedMin, - raster_r_max: this.rasterRedMax, - raster_r_scale: this.rasterRedScale, - raster_g_min: this.rasterGreenMin, - raster_g_max: this.rasterGreenMax, - raster_g_scale: this.rasterGreenScale, - raster_b_min: this.rasterBlueMin, - raster_b_max: this.rasterBlueMax, - raster_b_scale: this.rasterBlueScale, - }; - } - - toDict(): RgbaCompositeTypeDict { - return { - operatorType: RgbaCompositeType.TYPE, - rasterRedMin: this.rasterRedMin, - rasterRedMax: this.rasterRedMax, - rasterRedScale: this.rasterRedScale, - rasterGreenMin: this.rasterGreenMin, - rasterGreenMax: this.rasterGreenMax, - rasterGreenScale: this.rasterGreenScale, - rasterBlueMin: this.rasterBlueMin, - rasterBlueMax: this.rasterBlueMax, - rasterBlueScale: this.rasterBlueScale, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return RgbaCompositeType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/scatterplot-type.model.ts b/projects/wave-core/src/lib/operators/types/scatterplot-type.model.ts deleted file mode 100644 index d7a45138..00000000 --- a/projects/wave-core/src/lib/operators/types/scatterplot-type.model.ts +++ /dev/null @@ -1,138 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -import {ResultType, ResultTypes} from '../result-type.model'; - -interface ScatterPlotTypeMappingDict extends OperatorTypeMappingDict { - source: string; - result: string; -} - -export interface ScatterPlotTypeDict extends OperatorTypeDict { - attribute1: string; - attribute2: string; - regression: boolean; - inputType: string; -} - -interface ScatterPlotTypeConfig { - attribute1: string; - attribute2: string; - regression: boolean; - inputType: ResultType; -} - -export class ScatterPlotType extends OperatorType { - private static _TYPE = 'scatterplot'; - private static _ICON_URL = OperatorType.createIconDataUrl(ScatterPlotType._TYPE); - private static _NAME = 'Scatter Plot'; - - static get TYPE(): string { - return ScatterPlotType._TYPE; - } - static get ICON_URL(): string { - return ScatterPlotType._ICON_URL; - } - static get NAME(): string { - return ScatterPlotType._NAME; - } - - private code: string; - private attribute1: string; - private attribute2: string; - private regression: boolean; - private inputType: ResultType; - private resultType: ResultType; - - static fromDict(dict: ScatterPlotTypeDict): ScatterPlotType { - return new ScatterPlotType({ - attribute1: dict.attribute1, - attribute2: dict.attribute2, - regression: dict.regression, - inputType: ResultTypes.fromCode(dict.inputType), - }); - } - - constructor(config: ScatterPlotTypeConfig) { - super(); - - this.attribute1 = config.attribute1; - this.attribute2 = config.attribute2; - this.regression = config.regression; - this.inputType = config.inputType; - - const camelInputType = this.inputType.toString().charAt(0).toUpperCase() + this.inputType.toString().substr(1).toLowerCase(); - - this.code = ` - library(ggplot2); - - features <- mapping.load${camelInputType}(0, mapping.qrect); - - if (length(features) > 0) { - - first = features$\`${config.attribute1}\`; - - second = features$\`${config.attribute2}\`; - - df <- data.frame(xVal = first, yVal = second); - - p <- ( - ggplot(df, aes(x=xVal, y=yVal)) - + geom_point(shape=1) - ${this.regression ? '+ geom_smooth(method=lm, se=FALSE)' : ''} - + labs(x = "${config.attribute1}", y = "${config.attribute2}") - ); - - print(p); - - } else { - - plot.new(); - - mtext("Empty Dataset"); - - } - `; - - this.resultType = ResultTypes.PLOT; - } - - getMappingName(): string { - return 'r_script'; - } - - getIconUrl(): string { - return ScatterPlotType.ICON_URL; - } - - toString(): string { - return ScatterPlotType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['code', this.code.toString()], - ['resultType', this.resultType.toString()], - ]; - } - - toMappingDict(): ScatterPlotTypeMappingDict { - return { - source: this.code, - result: this.resultType.getCode(), - }; - } - - toDict(): ScatterPlotTypeDict { - return { - operatorType: ScatterPlotType.TYPE, - attribute1: this.attribute1, - attribute2: this.attribute2, - regression: this.regression, - inputType: this.inputType.getCode(), - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return ScatterPlotType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/statistics-type.model.ts b/projects/wave-core/src/lib/operators/types/statistics-type.model.ts deleted file mode 100644 index 58c40686..00000000 --- a/projects/wave-core/src/lib/operators/types/statistics-type.model.ts +++ /dev/null @@ -1,102 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface StatisticsTypeMappingDict extends OperatorTypeMappingDict { - raster_width?: number; - raster_height?: number; -} - -export interface StatisticsTypeDict extends OperatorTypeDict { - raster_width?: number; - raster_height?: number; -} - -/** - * If the statistic is for a raster value, it is necessary to specify - * query resolutions (in pixels) on which the statistics are calculated. - */ -interface StatisticsTypeConfig { - raster_width?: number; - raster_height?: number; -} - -/** - * The layer statistics type. - */ -export class StatisticsType extends OperatorType { - private static _TYPE = 'statistics'; - private static _ICON_URL = OperatorType.createIconDataUrl(StatisticsType._TYPE); - private static _NAME = 'Layer Statistics'; - - static get TYPE(): string { - return StatisticsType._TYPE; - } - - static get ICON_URL(): string { - return StatisticsType._ICON_URL; - } - - static get NAME(): string { - return StatisticsType._NAME; - } - - private raster_width: number; - private raster_height: number; - - constructor(config: StatisticsTypeConfig) { - super(); - this.raster_width = config.raster_width ? config.raster_width : undefined; - this.raster_height = config.raster_height ? config.raster_height : undefined; - } - - static fromDict(dict: StatisticsTypeDict): StatisticsType { - return new StatisticsType(dict); - } - - getMappingName(): string { - return StatisticsType.TYPE; - } - - getIconUrl(): string { - return StatisticsType.ICON_URL; - } - - toString(): string { - return StatisticsType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['raster_width', this.raster_width.toString()], - ['raster_height', this.raster_height.toString()], - ]; - } - - toMappingDict(): StatisticsTypeMappingDict { - if (this.raster_width || this.raster_height) { - return { - raster_height: this.raster_height, - raster_width: this.raster_width, - }; - } - - return {}; - } - - toDict(): StatisticsTypeDict { - if (this.raster_width || this.raster_height) { - return { - operatorType: StatisticsType.TYPE, - raster_height: this.raster_height, - raster_width: this.raster_width, - }; - } - - return { - operatorType: StatisticsType.TYPE, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return StatisticsType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/temporal-aggregation-type.ts b/projects/wave-core/src/lib/operators/types/temporal-aggregation-type.ts deleted file mode 100644 index 6ff364f3..00000000 --- a/projects/wave-core/src/lib/operators/types/temporal-aggregation-type.ts +++ /dev/null @@ -1,91 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -type AggregationType = 'min' | 'max' | 'avg'; - -interface TemporalAggregationTypeMappingDict extends OperatorTypeMappingDict { - duration: number; - aggregation: AggregationType; -} - -export interface TemporalAggregationTypeDict extends OperatorTypeDict { - duration: number; - aggregation: AggregationType; -} - -interface TemporalAggregationTypeConfig { - duration: number; - aggregation: AggregationType; -} - -/** - * The temporal aggregation type. - */ -export class TemporalAggregationType extends OperatorType { - private static _TYPE = 'temporal_aggregation'; - private static _ICON_URL = OperatorType.createIconDataUrl(TemporalAggregationType._TYPE); - private static _NAME = 'Temporal Aggregation'; - - static get TYPE(): string { - return TemporalAggregationType._TYPE; - } - static get ICON_URL(): string { - return TemporalAggregationType._ICON_URL; - } - static get NAME(): string { - return TemporalAggregationType._NAME; - } - - private duration: number; - private aggregation: AggregationType; - - static fromDict(dict: TemporalAggregationTypeDict): TemporalAggregationType { - return new TemporalAggregationType({ - duration: dict.duration, - aggregation: dict.aggregation, - }); - } - - constructor(config: TemporalAggregationTypeConfig) { - super(); - this.duration = config.duration; - this.aggregation = config.aggregation; - } - - getMappingName(): string { - return TemporalAggregationType.TYPE; - } - - getIconUrl(): string { - return TemporalAggregationType.ICON_URL; - } - - toString(): string { - return TemporalAggregationType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['duration', this.duration.toString()], - ['aggregation', this.aggregation.toString()], - ]; - } - - toMappingDict(): TemporalAggregationTypeMappingDict { - return { - duration: this.duration, - aggregation: this.aggregation, - }; - } - - toDict(): TemporalAggregationTypeDict { - return { - operatorType: TemporalAggregationType.TYPE, - duration: this.duration, - aggregation: this.aggregation, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return TemporalAggregationType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/textual-attribute-filter-type.model.ts b/projects/wave-core/src/lib/operators/types/textual-attribute-filter-type.model.ts deleted file mode 100644 index 4db781cc..00000000 --- a/projects/wave-core/src/lib/operators/types/textual-attribute-filter-type.model.ts +++ /dev/null @@ -1,119 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -interface TextualAttributeFilterTypeMappingDict extends OperatorTypeMappingDict { - name: string; - engine: string; - searchString: string; -} - -export interface TextualAttributeFilterTypeDict extends OperatorTypeDict { - attributeName: string; - engine: string; - searchString: string; -} - -export enum TextualAttributeFilterEngineType { - EXACT = 'exact', - CONTAINS = 'contains', - STARTSWITH = 'startswith', -} - -interface TextualAttributeFilterTypeConfig { - attributeName: string; - engine: TextualAttributeFilterEngineType; - searchString: string; -} - -/** - * The Textual attribute filter type. - */ -export class TextualAttributeFilterType extends OperatorType { - private static _TYPE = 'textual_attribute_filter'; - private static _ICON_URL = OperatorType.createIconDataUrl(TextualAttributeFilterType._TYPE); - private static _NAME = 'Textual Attribute Filter'; - - static get TYPE(): string { - return TextualAttributeFilterType._TYPE; - } - - static get ICON_URL(): string { - return TextualAttributeFilterType._ICON_URL; - } - - static get NAME(): string { - return TextualAttributeFilterType._NAME; - } - - private attributeName: string; - private engine: TextualAttributeFilterEngineType; - private searchString: string; - - static fromDict(dict: TextualAttributeFilterTypeDict): TextualAttributeFilterType { - let engine: TextualAttributeFilterEngineType; - switch (dict.engine) { - case 'exact': - engine = TextualAttributeFilterEngineType.EXACT; - break; - case 'contains': - engine = TextualAttributeFilterEngineType.CONTAINS; - break; - case 'startswith': - engine = TextualAttributeFilterEngineType.STARTSWITH; - break; - } - - return new TextualAttributeFilterType({ - attributeName: dict.attributeName, - engine: engine, - searchString: dict.searchString, - }); - } - - constructor(config: TextualAttributeFilterTypeConfig) { - super(); - this.attributeName = config.attributeName; - this.engine = config.engine; - this.searchString = config.searchString; - } - - getMappingName(): string { - return TextualAttributeFilterType.TYPE; - } - - getIconUrl(): string { - return TextualAttributeFilterType.ICON_URL; - } - - toString(): string { - return TextualAttributeFilterType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['attributeName', this.attributeName.toString()], - ['filter engine', this.engine.toString()], - ['searchString', this.searchString.toString()], - ]; - } - - toMappingDict(): TextualAttributeFilterTypeMappingDict { - return { - name: this.attributeName, - engine: this.engine, - searchString: this.searchString, - }; - } - - toDict(): TextualAttributeFilterTypeDict { - return { - operatorType: TextualAttributeFilterType.TYPE, - attributeName: this.attributeName, - engine: this.engine, - searchString: this.searchString, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return TextualAttributeFilterType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/timeplot-type.model.ts b/projects/wave-core/src/lib/operators/types/timeplot-type.model.ts deleted file mode 100644 index 52e8a0f4..00000000 --- a/projects/wave-core/src/lib/operators/types/timeplot-type.model.ts +++ /dev/null @@ -1,146 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -import {ResultType, ResultTypes} from '../result-type.model'; - -interface TimePlotTypeMappingDict extends OperatorTypeMappingDict { - source: string; - result: string; -} - -export interface TimePlotTypeDict extends OperatorTypeDict { - attribute: string; - isGrouping: boolean; - grouping: string; - time: string; - inputType: string; -} - -interface TimePlotTypeConfig { - attribute: string; - isGrouping: boolean; - grouping: string; - time: string; - inputType: ResultType; -} - -export class TimePlotType extends OperatorType { - private static _TYPE = 'timeplot'; - private static _ICON_URL = OperatorType.createIconDataUrl(TimePlotType._TYPE); - private static _NAME = 'Time Plot'; - - static get TYPE(): string { - return TimePlotType._TYPE; - } - static get ICON_URL(): string { - return TimePlotType._ICON_URL; - } - static get NAME(): string { - return TimePlotType._NAME; - } - - private code: string; - private attribute: string; - private isGrouping: boolean; - private grouping: string; - private time: string; - private inputType: ResultType; - private resultType: ResultType; - - static fromDict(dict: TimePlotTypeDict): TimePlotType { - return new TimePlotType({ - attribute: dict.attribute, - isGrouping: dict.isGrouping, - grouping: dict.grouping, - time: dict.time, - inputType: ResultTypes.fromCode(dict.inputType), - }); - } - - constructor(config: TimePlotTypeConfig) { - super(); - this.attribute = config.attribute; - this.isGrouping = config.isGrouping; - this.grouping = config.grouping; - this.time = config.time; - this.inputType = config.inputType; - this.resultType = ResultTypes.PLOT; - - const camelInputType = this.inputType.toString().charAt(0).toUpperCase() + this.inputType.toString().substr(1).toLowerCase(); - const grouping = this.isGrouping ? 'grouping = data$`' + config.grouping + '`;' : ''; - const df = this.isGrouping ? 'data.frame(start, attribute, grouping);' : 'data.frame(start, attribute);'; - const ggplot = this.isGrouping - ? 'ggplot(df, aes(x=start, y=attribute, group=grouping, color=grouping))' - : 'ggplot(df, aes(x=start,y=attribute))'; - this.code = ` -library(ggplot2); - -data <- tryCatch(mapping.load${camelInputType}(0, mapping.qrect), error = function(e) NA) -if (is.na(data)) { -plot.new(); -mtext("Dataset has no data in the specified time chunk"); -} else { -if (all(names(data) != 'time_start')) { -plot.new(); -mtext("Dataset has no temporal information"); -} else { -attr = attributes(data@data)$names[1]; -query_start = mapping.qrect$t1; -query_end = mapping.qrect$t2; -query_lim_posix = c(as.POSIXct(query_start, origin="1970-01-01", tz = "GMT"), as.POSIXct(query_end, origin="1970-01-01", tz = "GMT")); -start = as.POSIXct(data$time_start, origin="1970-01-01", tz="GMT"); -attribute = data$\`${this.attribute}\`; -${grouping} -df = ${df} -p = ( - ${ggplot} - + geom_line() - + geom_point() - + scale_x_datetime(limits=query_lim_posix) - + xlab("Time") + ylab(\"${this.attribute}\") -) -print(p) -} -}`; - } - - getMappingName(): string { - return 'r_script'; - } - - getIconUrl(): string { - return TimePlotType.ICON_URL; - } - - toString(): string { - return TimePlotType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['code', this.code.toString()], - ['resultType', this.resultType.toString()], - ]; - } - - toMappingDict(): TimePlotTypeMappingDict { - return { - source: this.code, - result: this.resultType.getCode(), - }; - } - - toDict(): TimePlotTypeDict { - return { - operatorType: TimePlotType.TYPE, - attribute: this.attribute, - isGrouping: this.isGrouping, - grouping: this.grouping, - time: this.time, - inputType: this.inputType.getCode(), - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return TimePlotType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/types/type-factory.service.ts b/projects/wave-core/src/lib/operators/types/type-factory.service.ts deleted file mode 100644 index 87eadf30..00000000 --- a/projects/wave-core/src/lib/operators/types/type-factory.service.ts +++ /dev/null @@ -1,119 +0,0 @@ -import {OperatorType, OperatorTypeDict} from '../operator-type.model'; - -import {NumericAttributeFilterType, NumericAttributeFilterTypeDict} from './numeric-attribute-filter-type.model'; -import {RasterValueExtractionType, RasterValueExtractionTypeDict} from './raster-value-extraction-type.model'; -import {ExpressionType, ExpressionTypeDict} from './expression-type.model'; -import {ProjectionType, ProjectionTypeDict} from './projection-type.model'; -import {GFBioSourceType, GFBioSourceTypeDict} from './gfbio-source-type.model'; -import {RasterSourceType, RasterSourceTypeDict} from './raster-source-type.model'; -import {HistogramType, HistogramTypeDict} from './histogram-type.model'; -import {RScriptType, RScriptTypeDict} from './r-script-type.model'; -import {PointInPolygonFilterType, PointInPolygonFilterTypeDict} from './point-in-polygon-filter-type.model'; -import {WKTSourceType, WKTSourceTypeDict} from './wkt-source-type.model'; -import { - MsgCo2CorrectionType, - MsgPansharpenType, - MsgPansharpenTypeDict, - MsgRadianceType, - MsgReflectanceType, - MsgReflectanceTypeDict, - MsgSofosGccThermalThresholdType, - MsgSolarangleType, - MsgSolarangleTypeDict, - MsgTemperatureType, -} from './msg-types.model'; -import {CsvSourceType, CsvSourceTypeDict} from './csv-source-type.model'; -import {ClassificationType, ClassificationTypeDict} from './classification-type.model'; -import {FeatureCollectionDBSourceType, FeatureCollectionDBSourceTypeDict} from './feature-collection-db-source-type.model'; -import {TextualAttributeFilterType, TextualAttributeFilterTypeDict} from './textual-attribute-filter-type.model'; -import {GdalSourceType, GdalSourceTypeDict} from './gdal-source-type.model'; -import {ScatterPlotType, ScatterPlotTypeDict} from './scatterplot-type.model'; -import {BoxPlotType, BoxPlotTypeDict} from './boxplot-type.model'; -import {PieChartType, PieChartTypeDict} from './piechart-type.model'; -import {RasterizePolygonType, RasterizePolygonTypeDict} from './rasterize-polygon-type.model'; -import {HeatmapType, HeatmapTypeDict} from './heatmap-type.model'; -import {OgrSourceType, OgrSourceTypeDict} from './ogr-source-type.model'; -import {OgrRawSourceType, OgrRawSourceTypeDict} from './ogr-raw-source-type.model'; -import {ChronicleDBSourceType, ChronicleDBSourceTypeDict} from './chronicle-db-source-type.model'; -import {TimePlotType, TimePlotTypeDict} from './timeplot-type.model'; -import {StatisticsType, StatisticsTypeDict} from './statistics-type.model'; -import {RgbaCompositeType, RgbaCompositeTypeDict} from './rgba-composite-type.model'; - -type Type = string; -type Deserializer = (dict: OperatorTypeDict) => OperatorType; - -/** - * A simple factory for de-serializing operator types. - */ -export class OperatorTypeFactory { - protected static readonly typeDeserializers: Map = OperatorTypeFactory.defaultDeserializers(); - - protected static defaultDeserializers(): Map { - const typeDeserializers = new Map(); - - typeDeserializers.set(NumericAttributeFilterType.TYPE, (dict) => - NumericAttributeFilterType.fromDict(dict as NumericAttributeFilterTypeDict), - ); - typeDeserializers.set(TextualAttributeFilterType.TYPE, (dict) => - TextualAttributeFilterType.fromDict(dict as TextualAttributeFilterTypeDict), - ); - typeDeserializers.set(RasterValueExtractionType.TYPE, (dict) => - RasterValueExtractionType.fromDict(dict as RasterValueExtractionTypeDict), - ); - typeDeserializers.set(ExpressionType.TYPE, (dict) => ExpressionType.fromDict(dict as ExpressionTypeDict)); - typeDeserializers.set(ProjectionType.TYPE, (dict) => ProjectionType.fromDict(dict as ProjectionTypeDict)); - typeDeserializers.set(GFBioSourceType.TYPE, (dict) => GFBioSourceType.fromDict(dict as GFBioSourceTypeDict)); - typeDeserializers.set(RasterSourceType.TYPE, (dict) => RasterSourceType.fromDict(dict as RasterSourceTypeDict)); - typeDeserializers.set(GdalSourceType.TYPE, (dict) => GdalSourceType.fromDict(dict as GdalSourceTypeDict)); - typeDeserializers.set(OgrSourceType.TYPE, (dict) => OgrSourceType.fromDict(dict as OgrSourceTypeDict)); - typeDeserializers.set(HistogramType.TYPE, (dict) => HistogramType.fromDict(dict as HistogramTypeDict)); - typeDeserializers.set(RScriptType.TYPE, (dict) => RScriptType.fromDict(dict as RScriptTypeDict)); - typeDeserializers.set(PointInPolygonFilterType.TYPE, (dict) => - PointInPolygonFilterType.fromDict(dict as PointInPolygonFilterTypeDict), - ); - typeDeserializers.set(WKTSourceType.TYPE, (dict) => WKTSourceType.fromDict(dict as WKTSourceTypeDict)); - typeDeserializers.set(MsgRadianceType.TYPE, (dict) => MsgRadianceType.fromDict(dict)); - typeDeserializers.set(MsgReflectanceType.TYPE, (dict) => MsgReflectanceType.fromDict(dict as MsgReflectanceTypeDict)); - typeDeserializers.set(MsgSolarangleType.TYPE, (dict) => MsgSolarangleType.fromDict(dict as MsgSolarangleTypeDict)); - typeDeserializers.set(MsgTemperatureType.TYPE, (dict) => MsgTemperatureType.fromDict(dict)); - typeDeserializers.set(MsgPansharpenType.TYPE, (dict) => MsgPansharpenType.fromDict(dict as MsgPansharpenTypeDict)); - typeDeserializers.set(MsgCo2CorrectionType.TYPE, (dict) => MsgCo2CorrectionType.fromDict(dict)); - typeDeserializers.set(MsgSofosGccThermalThresholdType.TYPE, (dict) => MsgSofosGccThermalThresholdType.fromDict(dict)); - typeDeserializers.set(CsvSourceType.TYPE, (dict) => CsvSourceType.fromDict(dict as CsvSourceTypeDict)); - typeDeserializers.set(ClassificationType.TYPE, (dict) => ClassificationType.fromDict(dict as ClassificationTypeDict)); - typeDeserializers.set(FeatureCollectionDBSourceType.TYPE, (dict) => - FeatureCollectionDBSourceType.fromDict(dict as FeatureCollectionDBSourceTypeDict), - ); - typeDeserializers.set(ScatterPlotType.TYPE, (dict) => ScatterPlotType.fromDict(dict as ScatterPlotTypeDict)); - typeDeserializers.set(BoxPlotType.TYPE, (dict) => BoxPlotType.fromDict(dict as BoxPlotTypeDict)); - typeDeserializers.set(PieChartType.TYPE, (dict) => PieChartType.fromDict(dict as PieChartTypeDict)); - typeDeserializers.set(RasterizePolygonType.TYPE, (dict) => RasterizePolygonType.fromDict(dict as RasterizePolygonTypeDict)); - typeDeserializers.set(HeatmapType.TYPE, (dict) => HeatmapType.fromDict(dict as HeatmapTypeDict)); - typeDeserializers.set(StatisticsType.TYPE, (dict) => StatisticsType.fromDict(dict as StatisticsTypeDict)); - typeDeserializers.set(TimePlotType.TYPE, (dict) => TimePlotType.fromDict(dict as TimePlotTypeDict)); - typeDeserializers.set(RgbaCompositeType.TYPE, (dict) => RgbaCompositeType.fromDict(dict as RgbaCompositeTypeDict)); - typeDeserializers.set(ChronicleDBSourceType.TYPE, (dict) => ChronicleDBSourceType.fromDict(dict as ChronicleDBSourceTypeDict)); - typeDeserializers.set(OgrRawSourceType.TYPE, (dict) => OgrRawSourceType.fromDict(dict as OgrRawSourceTypeDict)); - - return typeDeserializers; - } - - /** - * Add a new type deserializer (fromDict) to the factory - */ - static addType(type: Type, fromDict: Deserializer) { - OperatorTypeFactory.typeDeserializers.set(type, fromDict); - } - - /** - * Create operator type from serialized data. - */ - static fromDict(dict: OperatorTypeDict): OperatorType { - const fromDict = OperatorTypeFactory.typeDeserializers.get(dict.operatorType); - if (fromDict) { - return fromDict(dict); - } else { - throw Error(`There is not factory method defined for operator »${dict.operatorType}«.`); - } - } -} diff --git a/projects/wave-core/src/lib/operators/types/wkt-source-type.model.ts b/projects/wave-core/src/lib/operators/types/wkt-source-type.model.ts deleted file mode 100644 index cbbf77b5..00000000 --- a/projects/wave-core/src/lib/operators/types/wkt-source-type.model.ts +++ /dev/null @@ -1,91 +0,0 @@ -import {OperatorType, OperatorTypeDict, OperatorTypeMappingDict} from '../operator-type.model'; - -import {ResultType, ResultTypes} from '../result-type.model'; - -interface WKTSourceTypeMappingDict extends OperatorTypeMappingDict { - type: string; - wkt: string; -} - -export interface WKTSourceTypeDict extends OperatorTypeDict { - type: string; - wkt: string; -} - -interface WKTSourceTypeConfig { - type: ResultType; - wkt: string; -} - -/** - * The WKT Source type. - */ -export class WKTSourceType extends OperatorType { - private static _TYPE = 'wkt_source'; - private static _ICON_URL = OperatorType.createIconDataUrl(WKTSourceType._TYPE); - private static _NAME = 'WKT Source'; - - static get TYPE(): string { - return WKTSourceType._TYPE; - } - static get ICON_URL(): string { - return WKTSourceType._ICON_URL; - } - static get NAME(): string { - return WKTSourceType._NAME; - } - - private type: ResultType; - private wkt: string; - - constructor(config: WKTSourceTypeConfig) { - super(); - this.type = config.type; - this.wkt = config.wkt; - } - - static fromDict(dict: WKTSourceTypeDict): WKTSourceType { - return new WKTSourceType({ - type: ResultTypes.fromCode(dict.type), - wkt: dict.wkt, - }); - } - - getMappingName(): string { - return WKTSourceType.TYPE; - } - - getIconUrl(): string { - return WKTSourceType.ICON_URL; - } - - toString(): string { - return WKTSourceType.NAME; - } - - getParametersAsStrings(): Array<[string, string]> { - return [ - ['type', this.type.toString()], - ['wkt', this.wkt.toString()], - ]; - } - - toMappingDict(): WKTSourceTypeMappingDict { - return { - type: this.type.getCode(), - wkt: this.wkt, - }; - } - - toDict(): WKTSourceTypeDict { - return { - operatorType: WKTSourceType.TYPE, - type: this.type.getCode(), - wkt: this.wkt, - }; - } - - cloneWithModifications(options?: {}): OperatorType { - return WKTSourceType.fromDict(this.toDict()); // TODO: add modifications - } -} diff --git a/projects/wave-core/src/lib/operators/unit.model.ts b/projects/wave-core/src/lib/operators/unit.model.ts deleted file mode 100644 index 5e3dae77..00000000 --- a/projects/wave-core/src/lib/operators/unit.model.ts +++ /dev/null @@ -1,283 +0,0 @@ -import {Map as ImmutableMap} from 'immutable'; - -/** - * A unit can have three types of interpolation between values. - * * Unknown - no information about interpolation between values - * * Continuous - it is okay to (linearly) scale in between values - * * Discrete - the unit states discrete values, e.g. for a classification - */ -export const enum Interpolation { - Unknown = 0, - Continuous = 1, - Discrete = 2, -} - -/** - * String serialization for interpolation variants - */ -export function interpolationToName(interpolation: Interpolation): string { - 'use strict'; - switch (interpolation) { - case Interpolation.Unknown: - return 'unknown'; - case Interpolation.Continuous: - return 'continuous'; - case Interpolation.Discrete: - return 'discrete'; - default: - throw new Error('Unknown Unit Interpolation'); - } -} - -/** - * String deserialization for interpolation variants - */ -export function nameToInterpolation(name: string): Interpolation { - 'use strict'; - if (name === interpolationToName(Interpolation.Continuous)) { - return Interpolation.Continuous; - } - if (name === interpolationToName(Interpolation.Discrete)) { - return Interpolation.Discrete; - } - return Interpolation.Unknown; -} - -/** - * A name of a classification value - */ -type Class = string; - -/** - * Input of the unit constructor. - */ -export interface UnitConfig { - measurement: string; - unit: string; - min?: number; - max?: number; - interpolation: Interpolation; - classes?: Map | ImmutableMap; -} - -/** - * Serialization of the unit for storage - */ -export interface UnitDict { - measurement: string; - unit: string; - min?: number; - max?: number; - interpolation: number; - classes: {[index: number]: string}; -} - -/** - * Serialization of a unit for queries to the backend - */ -export interface UnitMappingDict { - measurement: string; - unit: string; - min?: number; - max?: number; - interpolation: string; - classes?: {[index: number]: string}; -} - -/** - * A Unit contains semantical information about a set of values (i.e. a raster's pixels or an - * attribute). - * - * These are: - * - What is measured? e.g. Temperature, Elevation, Precipitation, ... - * - What unit is the measurement in? e.g. Celsius, Kelvin, Meters, cm/day, ... - * - Does it have a minimum or maximum value? - * - is it a continuous or a discrete value (e.g. temperature vs. classification)? - * - an optional set of parameters, e.g. names for a classification's classes - * - * Units can suggest a default colorization. - */ -export class Unit { - private static _defaultUnit = new Unit({ - measurement: 'unknown', - unit: 'unknown', - interpolation: Interpolation.Continuous, - }); - - private _measurement: string; - private _unit: string; - private _min: number; - private _max: number; - private _interpolation: Interpolation; - private _classes: ImmutableMap; - - /** - * Create a new unit with all parameters specified upfront - */ - constructor(config: UnitConfig) { - this._measurement = config.measurement; - this._unit = config.unit; - this._min = config.min; - this._max = config.max; - this._interpolation = config.interpolation; - if (config.classes) { - if (config.classes instanceof ImmutableMap) { - this._classes = config.classes as ImmutableMap; - } else { - this._classes = ImmutableMap(config.classes as Map); - } - } - } - - /** - * Deserialize a unit from a `UnitDict` - */ - static fromDict(dict: UnitDict): Unit { - let classes = new Map(); - if (dict.classes !== undefined) { - for (let className in dict.classes) { - classes.set(parseFloat(className), dict.classes[className]); - } - } - let config: UnitConfig = { - measurement: dict.measurement, - unit: dict.unit, - min: dict.min, - max: dict.max, - interpolation: dict.interpolation, - classes: classes, - }; - return new Unit(config); - } - - /** - * Deserialize a unit from unit information from the backend - */ - static fromMappingDict(dict: UnitMappingDict): Unit { - let interpolation = !!dict.interpolation ? nameToInterpolation(dict.interpolation) : Interpolation.Unknown; - let classes = new Map(); - if (dict.classes !== undefined) { - if (interpolation === Interpolation.Unknown) { - interpolation = Interpolation.Discrete; - } - for (let className in dict.classes) { - classes.set(parseFloat(className), dict.classes[className]); - } - } - let config: UnitConfig = { - measurement: dict.measurement, - unit: dict.unit, - min: dict.min, - max: dict.max, - interpolation: interpolation, - classes: classes, - }; - return new Unit(config); - } - - /** - * Default unit without further information (=> unitless) - */ - static get defaultUnit(): Unit { - return Unit._defaultUnit; - } - - /** - * What do the values measures? - */ - get measurement(): string { - return this._measurement; - } - - /** - * What is the unit of the measured values? - */ - get unit(): string { - return this._unit; - } - - /** - * Return a minimum value for this unit - */ - get min(): number { - return this._min; - } - - /** - * Return a maximum value for this unit - */ - get max(): number { - return this._max; - } - - /** - * Return the interpolation for this unit - */ - get interpolation(): Interpolation { - return this._interpolation; - } - - /** - * Return a map of classes of this unit. - * This is empty if the unit is no classification. - */ - get classes(): ImmutableMap { - return this._classes; - } - - /** - * Human-readable, concise string serialization of a unit - */ - toString(): string { - const output = []; - if (this.measurement !== 'unknown') { - output.push(this.measurement); - - if (this.unit !== 'unknown') { - output.push(` (${this.unit})`); - } - } - return output.join(''); - } - - /** - * Serialize the unit for storage - */ - toDict(): UnitDict { - let classes: { - [index: number]: string; - } = this._classes === undefined ? {} : (this._classes.toJS() as {[index: number]: string}); - - return { - measurement: this._measurement, - unit: this._unit, - min: this._min, - max: this._max, - interpolation: this._interpolation, - classes: classes, - }; - } - - /** - * Serialize the unit for queries to the backend - */ - toMappingDict(): UnitMappingDict { - let dict: UnitMappingDict = { - measurement: this._measurement, - unit: this._unit, - interpolation: interpolationToName(this._interpolation), - }; - - if (this._min !== undefined) { - dict.min = this._min; - } - if (this._max !== undefined) { - dict.max = this._max; - } - if (this._unit === 'classification') { - dict['classes'] = this._classes.toJS() as {[index: number]: string}; - } - - return dict; - } -} diff --git a/projects/wave-core/src/lib/plots/histogram/histogram.component.html b/projects/wave-core/src/lib/plots/histogram/histogram.component.html deleted file mode 100644 index 2a37c09f..00000000 --- a/projects/wave-core/src/lib/plots/histogram/histogram.component.html +++ /dev/null @@ -1,3 +0,0 @@ -
    - -
    diff --git a/projects/wave-core/src/lib/plots/histogram/histogram.component.scss b/projects/wave-core/src/lib/plots/histogram/histogram.component.scss deleted file mode 100644 index 00fae4ee..00000000 --- a/projects/wave-core/src/lib/plots/histogram/histogram.component.scss +++ /dev/null @@ -1,76 +0,0 @@ -:host { - display: block; -} - -:host .histogram ::ng-deep .chartbg { - fill: transparent; -} - -:host .histogram ::ng-deep .container { - fill: white; -} - -:host .histogram ::ng-deep .chart { - font: 10px sans-serif; -} - -:host .histogram ::ng-deep .bar rect { - fill: steelblue; - shape-rendering: crispEdges; -} - -:host .histogram ::ng-deep .lines rect { - fill: #ff0000; - shape-rendering: crispEdges; -} - -:host .histogram ::ng-deep .lines text { - fill: #ff0000; -} - -:host .histogram ::ng-deep .bar text { - fill: #fff; -} - -:host .histogram ::ng-deep .axis path, -.axis line { - fill: none; - stroke: #000; - shape-rendering: crispEdges; -} - -/* taken from http://bl.ocks.org/Caged/6476579 */ - -:host .histogram ::ng-deep .d3-tip { - line-height: 1; - font-weight: bold; - padding: 12px; - background: rgba(0, 0, 0, 0.8); - color: #fff; - border-radius: 2px; -} - -/* Creates a small triangle extender for the tooltip */ -:host .histogram ::ng-deep .d3-tip:after { - box-sizing: border-box; - display: inline; - font-size: 10px; - width: 100%; - line-height: 1; - color: rgba(0, 0, 0, 0.8); - content: '25BC'; - position: absolute; - text-align: center; -} - -/* Style northward tooltips differently */ -:host .histogram ::ng-deep .d3-tip.n:after { - margin: -1px 0 0 0; - top: 100%; - left: 0; -} - -.histogram_container { - width: 100%; - height: 100%; -} diff --git a/projects/wave-core/src/lib/plots/histogram/histogram.component.ts b/projects/wave-core/src/lib/plots/histogram/histogram.component.ts deleted file mode 100644 index 881e32c9..00000000 --- a/projects/wave-core/src/lib/plots/histogram/histogram.component.ts +++ /dev/null @@ -1,553 +0,0 @@ -import { - Component, - ChangeDetectionStrategy, - Input, - Output, - AfterViewInit, - EventEmitter, - ViewChild, - ElementRef, - OnChanges, - SimpleChange, - OnDestroy, -} from '@angular/core'; - -import {LayoutService} from '../../layout.service'; -import {fromEvent as observableFromEvent, Subscription} from 'rxjs'; -import {debounceTime, filter} from 'rxjs/operators'; -import {Config} from '../../config.service'; -import * as d3 from 'd3'; - -/** - * Schema for histogram data. - */ -export interface HistogramData { - type: string; // histogram - data: Array; - lines?: Array<{name: string; pos: number}>; - metadata: { - numberOfBuckets: number; - min: number; - max: number; - nodata: number; - unit: string; - }; -} - -/** - * Helper class for slider dimension - */ -interface SliderDim { - width: number; - height: number; - margin: { - top: number; - bottom: number; - }; -} - -/** - * Helper interface for a slider - */ -interface Slider { - area: d3.Selection; - pointer: d3.Selection; - text: d3.Selection; - position: number; -} - -/** - * This component displays a histogram plot response as a d3 graph. - */ -@Component({ - selector: 'wave-histogram', - templateUrl: `histogram.component.html`, - styleUrls: [`histogram.component.scss`], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class HistogramComponent implements AfterViewInit, OnChanges, OnDestroy { - @ViewChild('svg', {static: true}) svgRef: ElementRef; - - /** - * The histogram data from the backend response - */ - @Input() data: HistogramData; - - /** - * The height of the plot - */ - @Input() height: number; - - /** - * The width of the plot - */ - @Input() width: number; - - /** - * A scaling factor for width and height - */ - @Input() viewBoxRatio = 1; - - /** - * If set to true, users can select an interval within the histogram - */ - @Input() selectable = false; - - /** - * If set to true, users can zoom and pan within the graph - */ - @Input() interactable = false; - - /** - * If set to true, the component will call its event emitter upfront - */ - @Input() emmitInitialDataMinMax = false; - - /** - * If set to true, the component will react on resize events of the browser and redraw automatically. - */ - @Input() autoResize = false; - - /** - * Specify the minimum of the selection interval - */ - @Input() minRange: number = undefined; - - /** - * Emit events when the user selection (min) changes - */ - @Output() minRangeChange = new EventEmitter(); - - /** - * Specify the maximum of the selection interval - */ - @Input() maxRange: number = undefined; - - /** - * Emit events when the user selection (max) changes - */ - @Output() maxRangeChange = new EventEmitter(); - - private leftSlider: Slider; - private rightSlider: Slider; - private xAxis: d3.Axis; - private maxWidth: number; - private windowEventSubscription: Subscription; - - /** - * DI for services - */ - constructor(private elementRef: ElementRef, private config: Config) {} - - private static makeArea(xSlider: d3.Selection, height: number): d3.Selection { - return xSlider.append('rect').attr('x', 0).attr('width', 0).attr('height', height).attr('fill-opacity', 0.2); - } - - private static makePointer( - xSlider: d3.Selection, - height: number, - sliderDim: SliderDim, - xPosition: number, - ): d3.Selection { - return xSlider - .append('rect') - .attr('y', height + sliderDim.margin.top) - .attr('x', xPosition) - .attr('width', sliderDim.width) - .attr('height', sliderDim.height) - .attr('transform', 'translate(' + -(sliderDim.width / 2) + ',0)'); - } - - private static makeText( - xSlider: d3.Selection, - height: number, - sliderDim: SliderDim, - xPosition: number, - value: number, - ): d3.Selection { - return xSlider - .append('text') - .text(value.toFixed(2)) - .attr('x', xPosition - sliderDim.width / 2 + 5) - .attr('y', sliderDim.margin.top + height + sliderDim.height + sliderDim.margin.bottom); - } - - ngOnDestroy(): void { - if (this.windowEventSubscription) { - this.windowEventSubscription.unsubscribe(); - } - } - - ngOnChanges(changes: {[propertyName: string]: SimpleChange}) { - if (changes['data'] && !changes['data'].isFirstChange()) { - // clean up histogram - this.clearHistogram(); - - // draw new one - this.drawHistogram(); - if (this.emmitInitialDataMinMax) { - this.minRangeChange.emit(this.data.metadata.min); - this.maxRangeChange.emit(this.data.metadata.max); - } - } - // TODO: refactor the set slider position function out (here and in makeDrag) - if (changes['minRange'] && !changes['minRange'].isFirstChange()) { - const value = changes['minRange'].currentValue; - const xPosition = Math.max(this.xAxis.scale()(value), 0); - this.leftSlider.pointer.attr('x', xPosition); - this.leftSlider.position = value; - this.leftSlider.text.attr('x', xPosition); - this.leftSlider.text.text(value); - this.leftSlider.area.attr('width', xPosition); - } - if (changes['maxRange'] && !changes['maxRange'].isFirstChange()) { - const value = changes['maxRange'].currentValue; - const xPosition = Math.min(this.xAxis.scale()(value), this.maxWidth); - this.rightSlider.pointer.attr('x', xPosition); - this.rightSlider.position = value; - this.rightSlider.text.attr('x', xPosition); - this.rightSlider.text.text(value); - this.rightSlider.area.attr('width', this.maxWidth - xPosition); - this.rightSlider.area.attr('x', xPosition); - } - } - - private clearHistogram() { - d3.select(this.svgRef.nativeElement).select('g').remove(); - } - - ngAfterViewInit() { - if (!this.width || !this.height) { - this.calculateHistogramWidthAndHeight(); - } - - if (this.data) { - this.drawHistogram(); - if (this.emmitInitialDataMinMax) { - this.minRangeChange.emit(this.data.metadata.min); - this.maxRangeChange.emit(this.data.metadata.max); - } - } - this.windowEventSubscription = observableFromEvent(window, 'resize') - .pipe( - filter((_) => this.autoResize), - debounceTime(this.config.DELAYS.DEBOUNCE), - ) - .subscribe(() => { - this.clearHistogram(); - this.calculateHistogramWidthAndHeight(); - this.drawHistogram(); - }); - } - - private drawHistogram() { - const drawLines: boolean = this.data.lines !== undefined; - - const maxDigitsOnYAxis = Math.max(...this.data.data.map((v) => (v > 9 ? Math.ceil(Math.log10(v)) : 1))); - - const xAxisTextPadding = 5; - const xAxisTextHeight = 10 + xAxisTextPadding; - - const margin = { - top: 10, - right: 50, - bottom: 30 + (this.data.metadata.unit ? xAxisTextHeight : 0) + (this.selectable ? 35 : 0), - left: 12 * maxDigitsOnYAxis + 25, - }; - - const width = this.width * this.viewBoxRatio - margin.left - margin.right; - this.maxWidth = width; - const height = this.height * this.viewBoxRatio - margin.top - margin.bottom; - - const x = d3.scaleLinear().domain([this.data.metadata.min, this.data.metadata.max]).range([0, width]); - - const y = d3 - .scaleLinear() - .domain([0, d3.max(this.data.data)]) - .range([height, 0]); - - const xAxis = d3.axisBottom(x); - this.xAxis = xAxis; - - const yAxis = d3.axisLeft(y).tickFormat(d3.format('d')); // allow only integer ticks - - const svg = d3 - .select(this.svgRef.nativeElement) - .attr('width', this.width) - .attr('height', this.height) - .attr('viewBox', [0, 0, this.width * this.viewBoxRatio, this.height * this.viewBoxRatio].join(' ')) - .append('g') - .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); - - const container = svg.append('g').classed('container', true); - - const barWidth = width / this.data.metadata.numberOfBuckets; - - const bar = container - .selectAll('.bar') - .data(this.data.data) - .enter() - .append('g') - .classed('bar', true) - .attr('transform', (d, i) => { - const xPos = i * barWidth; - return `translate(${xPos},0)`; - }); - - bar.append('rect') - .attr('height', (d) => { - return height - y(d); - }) - .attr('width', barWidth > 1 ? barWidth - 1 : barWidth) - .attr('transform', (d, _i) => { - const yTrans = y(d); - return `translate(0,${yTrans})`; - }); - - /* draw vertical lines */ - if (drawLines) { - const lineContainer = container.append('g'); - const lines = lineContainer.selectAll('.lines').data(this.data.lines).enter().append('g').attr('class', 'lines'); - lines - .append('rect') - .attr('x', (d) => { - return x(d.pos); - }) // position() - .attr('y', y(0) - height) - .attr('height', height) - .attr('width', 1); - - lines - .append('text') - .attr('x', (d) => { - return x(d.pos) + 5; - }) // position() - .attr('y', y(0) - height + 20) - .text((d) => { - return d.name; - }); - } - - const borders = svg.append('g').attr('transform', `translate(${-margin.left},${-margin.top})`); - - borders.append('rect').attr('width', margin.left).attr('height', this.height).attr('fill', 'white'); - - borders - .append('rect') - .attr('x', margin.left + width) - .attr('height', this.height) - .attr('width', margin.left) - .attr('fill', 'white'); - - svg.append('g').attr('class', 'x axis').attr('transform', `translate(0,${height})`).call(xAxis); - - if (this.data.metadata.unit) { - svg.append('g') - .append('text') // x axis label - .attr('x', width / 2) - .attr('y', height + margin.bottom - xAxisTextPadding) - .style('text-anchor', 'middle') - .text(this.data.metadata.unit); - } - - svg.append('g').attr('class', 'y axis').call(yAxis); - - svg.append('text') // y axis label - .attr('transform', 'rotate(-90)') - .attr('y', -margin.left) - .attr('x', -height / 2) - .attr('dy', '1em') - .style('text-anchor', 'middle') - .text('Frequency'); - - let zoom: d3.ZoomBehavior; - if (this.selectable) { - // sliders to select a range - - const sliderDim: SliderDim = { - width: 10, - height: 20, - margin: { - top: 20, - bottom: 10, - }, - }; - - const xSlider = svg.append('g'); - - const leftSlider: Slider = { - area: HistogramComponent.makeArea(xSlider, height), - pointer: HistogramComponent.makePointer(xSlider, height, sliderDim, 0), - text: HistogramComponent.makeText(xSlider, height, sliderDim, 0, this.data.metadata.min), - position: this.data.metadata.min, - }; - this.leftSlider = leftSlider; - - const rightSlider: Slider = { - area: HistogramComponent.makeArea(xSlider, height), - pointer: HistogramComponent.makePointer(xSlider, height, sliderDim, width), - text: HistogramComponent.makeText(xSlider, height, sliderDim, width, this.data.metadata.max), - position: this.data.metadata.max, - }; - this.rightSlider = rightSlider; - - const leftDrag = this.makeDrag(xAxis, leftSlider, leftSlider, rightSlider, width, true); - const rightDrag = this.makeDrag(xAxis, rightSlider, leftSlider, rightSlider, width, false); - leftSlider.pointer.call(leftDrag); - rightSlider.pointer.call(rightDrag); - - // zoom - if (this.interactable) { - zoom = d3 - .zoom() - .scaleExtent([1, 10]) - .on('zoom', this.sliderZoomed(svg, container, xAxis, height, width, leftSlider, rightSlider)); - } - } else { - if (this.interactable) { - zoom = d3.zoom().scaleExtent([1, 10]).on('zoom', this.zoomed(svg, container, xAxis)); - } - } - - const chartbg = svg.append('rect').attr('class', 'chartbg').attr('width', width).attr('height', height); - - if (this.interactable) { - chartbg.call(zoom); - } - } - - private zoomed( - svg: d3.Selection, - container: d3.Selection, - xAxis: d3.Axis, - ): (zoomEvent: d3.D3ZoomEvent) => void { - return (zoomEvent) => { - container.attr('transform', `translate(${zoomEvent.transform.x},0)scale(${zoomEvent.transform.k},1)`); - svg.select('.x.axis').call(xAxis); - }; - } - - private sliderZoomed( - svg: d3.Selection, - container: d3.Selection, - xAxis: d3.Axis, - _height: number, - width: number, - leftSlider: Slider, - rightSlider: Slider, - ): (zoomEvent: d3.D3ZoomEvent) => void { - return (zoomEvent) => { - this.zoomed(svg, container, xAxis)(zoomEvent); - - // set left slider - const leftPointerPosition = clamp(xAxis.scale()(leftSlider.position), 0, width); - leftSlider.area.attr('width', leftPointerPosition); - leftSlider.pointer.attr('x', leftPointerPosition); - leftSlider.text.attr('x', leftPointerPosition); - - // set right slider - const rightPointerPosition = clamp(xAxis.scale()(rightSlider.position), 0, width); - rightSlider.area.attr('width', width - rightPointerPosition); - rightSlider.area.attr('x', rightPointerPosition); - rightSlider.pointer.attr('x', rightPointerPosition); - rightSlider.text.attr('x', rightPointerPosition); - }; - } - - private makeDrag( - xAxis: d3.Axis, - slider: Slider, - leftSlider: Slider, - rightSlider: Slider, - width: number, - isLeft: boolean, - ): d3.DragBehavior { - return d3.drag().on('drag', (dragEvent: d3.D3DragEvent) => { - const minX = this.data.metadata.min; - const maxX = this.data.metadata.max; - const bins = this.data.metadata.numberOfBuckets; - - const eventX = dragEvent.x; - - let lowerbound: number; - let upperbound: number; - if (isLeft) { - if (xAxis.scale()(minX) > 0) { - lowerbound = xAxis.scale()(minX); - } else { - lowerbound = 0; - } - } else { - lowerbound = xAxis.scale()(leftSlider.position) + 1; - } - if (!isLeft) { - if (xAxis.scale()(maxX) < width) { - upperbound = xAxis.scale()(maxX); - } else { - upperbound = width; - } - } else { - upperbound = xAxis.scale()(rightSlider.position) - 1; - } - - let newX: number; - if (eventX > lowerbound && eventX < upperbound) { - newX = eventX; - } else if (eventX <= lowerbound) { - newX = lowerbound; - } else { - newX = upperbound; - } - - // snap to closest bar - let newXVal = (xAxis.scale() as d3.ScaleLinear).invert(newX); - const bw = (maxX - minX) / bins; - const n = Math.round((newXVal - minX) / bw); - newX = xAxis.scale()(minX + n * bw); - newXVal = (xAxis.scale() as d3.ScaleLinear).invert(newX); - - slider.pointer.attr('x', newX); - slider.position = newXVal; - slider.text.attr('x', newX); - slider.text.text(newXVal); - if (isLeft) { - this.minRange = newXVal; - this.minRangeChange.emit(this.minRange); - } else { - this.maxRange = newXVal; - this.maxRangeChange.emit(this.maxRange); - } - if (isLeft) { - if (newX > 0) { - slider.area.attr('width', newX); - } else { - slider.area.attr('width', 0); - } - } else { - slider.area.attr('width', width - newX); - slider.area.attr('x', newX); - } - }); - } - - private calculateHistogramWidthAndHeight() { - const queryElem = this.elementRef.nativeElement.querySelector('div'); - const panelWidth = queryElem.clientWidth - 2 * LayoutService.remInPx; - const panelheight = queryElem.clientHeight - 2 * LayoutService.remInPx; - this.width = panelWidth; - this.height = Math.max(panelheight / 3, panelWidth / 3); - } -} - -/** - * Restrict a value to the interval [min, max] - */ -function clamp(value: number, min: number, max: number): number { - if (value <= min) { - return min; - } else if (value >= max) { - return max; - } else { - return value; - } -} diff --git a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-numeric-details/layer-statistics-numeric-details.component.html b/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-numeric-details/layer-statistics-numeric-details.component.html deleted file mode 100644 index b3bf824c..00000000 --- a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-numeric-details/layer-statistics-numeric-details.component.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -
    Count{{ data.count }}
    NaN Count{{ data.nan_count }}
    Min{{ data.min }}
    Max{{ data.max }}
    Mean{{ data.mean }}
    Std. Dev.{{ data.stddev }}
    diff --git a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-numeric-details/layer-statistics-numeric-details.component.scss b/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-numeric-details/layer-statistics-numeric-details.component.scss deleted file mode 100644 index ae9d2df6..00000000 --- a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-numeric-details/layer-statistics-numeric-details.component.scss +++ /dev/null @@ -1,4 +0,0 @@ -th, -td { - text-align: left; -} diff --git a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-numeric-details/layer-statistics-numeric-details.component.ts b/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-numeric-details/layer-statistics-numeric-details.component.ts deleted file mode 100644 index acb6d245..00000000 --- a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-numeric-details/layer-statistics-numeric-details.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy, Input} from '@angular/core'; - -export interface NumericStatisticsData { - count: number; - nan_count: number; - min: number; - max: number; - mean: number; - stddev: number; -} - -@Component({ - selector: 'wave-layer-statistics-numeric-details', - templateUrl: './layer-statistics-numeric-details.component.html', - styleUrls: ['./layer-statistics-numeric-details.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LayerStatisticsNumericDetailsComponent implements OnInit { - @Input() - data: NumericStatisticsData; - - constructor() {} - - ngOnInit() {} -} diff --git a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-textual-details/layer-statistics-textual-details.component.html b/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-textual-details/layer-statistics-textual-details.component.html deleted file mode 100644 index 1f3b2c53..00000000 --- a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-textual-details/layer-statistics-textual-details.component.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - -
    Count{{ data.count }}
    Distinct Values{{ data.distinct_values }}
    - - - - - - - - - - - - -
    ValueCount
    {{ item[0] }}{{ item[1] }}
    diff --git a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-textual-details/layer-statistics-textual-details.component.scss b/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-textual-details/layer-statistics-textual-details.component.scss deleted file mode 100644 index ae9d2df6..00000000 --- a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-textual-details/layer-statistics-textual-details.component.scss +++ /dev/null @@ -1,4 +0,0 @@ -th, -td { - text-align: left; -} diff --git a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-textual-details/layer-statistics-textual-details.component.ts b/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-textual-details/layer-statistics-textual-details.component.ts deleted file mode 100644 index 9d9c6c8a..00000000 --- a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-textual-details/layer-statistics-textual-details.component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy, Input} from '@angular/core'; - -export interface TextualStatisticsData { - count: number; - distinct_values: number; - value_counts: Array<[string, number]>; -} - -@Component({ - selector: 'wave-layer-statistics-textual-details', - templateUrl: './layer-statistics-textual-details.component.html', - styleUrls: ['./layer-statistics-textual-details.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LayerStatisticsTextualDetailsComponent implements OnInit { - @Input() - data: TextualStatisticsData; - - constructor() {} - - ngOnInit() {} -} diff --git a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-view.component.html b/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-view.component.html deleted file mode 100644 index febb4351..00000000 --- a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-view.component.html +++ /dev/null @@ -1,58 +0,0 @@ -
    -

    Raster Layer Statistics

    - -

    Raster {{ i + 1 }}

    - -
    -
    -
    -

    Point Layer Statistics

    - -

    Points {{ i + 1 }}

    - -

    {{ featureData.key }}

    - - -
    -
    -
    -
    -

    Line Layer Statistics

    - -

    Points {{ i + 1 }}

    - -

    {{ featureData.key }}

    - - -
    -
    -
    -
    -

    Polygon Layer Statistics

    - -

    Points {{ i + 1 }}

    - -

    {{ featureData.key }}

    - - -
    -
    -
    diff --git a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-view.component.scss b/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-view.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-view.component.ts b/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-view.component.ts deleted file mode 100644 index 2af04f6c..00000000 --- a/projects/wave-core/src/lib/plots/layer-statistics-view/layer-statistics-view.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy, Input} from '@angular/core'; -import {NumericStatisticsData} from './layer-statistics-numeric-details/layer-statistics-numeric-details.component'; -import {TextualStatisticsData} from './layer-statistics-textual-details/layer-statistics-textual-details.component'; - -interface LayerStatisticsData { - rasters?: Array; - points?: Array; - lines?: Array; - polygons?: Array; -} - -interface FeatureData { - [name: string]: NumericStatisticsData | TextualStatisticsData; -} - -@Component({ - selector: 'wave-layer-statistics-view', - templateUrl: './layer-statistics-view.component.html', - styleUrls: ['./layer-statistics-view.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LayerStatisticsViewComponent implements OnInit { - @Input() - public data: LayerStatisticsData; - - constructor() {} - - ngOnInit() {} -} diff --git a/projects/wave-core/src/lib/plots/plot-detail-view/plot-detail-view.component.html b/projects/wave-core/src/lib/plots/plot-detail-view/plot-detail-view.component.html deleted file mode 100644 index a7faf459..00000000 --- a/projects/wave-core/src/lib/plots/plot-detail-view/plot-detail-view.component.html +++ /dev/null @@ -1,29 +0,0 @@ -{{ plot.name }} - - -
    {{ (projectService.getPlotDataStream(plot) | async)?.data }}
    -
    - - - - - - - - - - - - -
    {{ (projectService.getPlotDataStream(plot) | async)?.data | json }}
    -
    - -
    {{ (projectService.getPlotDataStream(plot) | async)?.data }}
    -
    -
    diff --git a/projects/wave-core/src/lib/plots/plot-detail-view/plot-detail-view.component.scss b/projects/wave-core/src/lib/plots/plot-detail-view/plot-detail-view.component.scss deleted file mode 100644 index 684b32c1..00000000 --- a/projects/wave-core/src/lib/plots/plot-detail-view/plot-detail-view.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -wave-histogram { - background-color: white; -} - -mat-dialog-content { - max-height: unset; - max-width: unset; -} diff --git a/projects/wave-core/src/lib/plots/plot-detail-view/plot-detail-view.component.ts b/projects/wave-core/src/lib/plots/plot-detail-view/plot-detail-view.component.ts deleted file mode 100644 index fe272e07..00000000 --- a/projects/wave-core/src/lib/plots/plot-detail-view/plot-detail-view.component.ts +++ /dev/null @@ -1,73 +0,0 @@ -import {ReplaySubject, BehaviorSubject, combineLatest as observableCombineLatest} from 'rxjs'; -import {first} from 'rxjs/operators'; - -import {AfterViewInit, ChangeDetectionStrategy, Component, Inject, OnInit} from '@angular/core'; -import {MAT_DIALOG_DATA} from '@angular/material/dialog'; -import {ProjectService} from '../../project/project.service'; -import {Plot} from '../plot.model'; -import {LayoutService} from '../../layout.service'; -import {MappingQueryService} from '../../queries/mapping-query.service'; -import {MapService} from '../../map/map.service'; - -@Component({ - selector: 'wave-plot-detail-view', - templateUrl: './plot-detail-view.component.html', - styleUrls: ['./plot-detail-view.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PlotDetailViewComponent implements OnInit, AfterViewInit { - maxWidth$ = new ReplaySubject(1); - maxHeight$ = new ReplaySubject(1); - - // initially blank pixel - imagePlotData$ = new BehaviorSubject('data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='); - imagePlotLoading$ = new BehaviorSubject(true); - - constructor( - public projectService: ProjectService, - private mapService: MapService, - private mappingQueryService: MappingQueryService, - @Inject(MAT_DIALOG_DATA) public plot: Plot, - ) {} - - ngOnInit() { - observableCombineLatest( - this.projectService.getPlotDataStream(this.plot), - this.projectService.getTimeStream(), - this.projectService.getProjectionStream(), - this.mapService.getViewportSizeStream(), - this.maxWidth$, - this.maxHeight$, - ) - .pipe(first()) - .subscribe(([plotData, time, projection, viewport, width, height]) => { - // set data uri for png type and load full screen image - if (plotData.type === 'png') { - this.imagePlotData$.next(`data:image/png;base64,${plotData.data}`); - - this.mappingQueryService - .getPlotData({ - operator: this.plot.operator, - time: time, - extent: viewport.extent, - projection: projection, - plotWidth: width - LayoutService.remInPx, - plotHeight: height, - }) - .pipe(first()) - .subscribe((newPlotData) => { - this.imagePlotData$.next(`data:image/png;base64,${newPlotData.data}`); - - this.imagePlotLoading$.next(false); - }); - } - }); - } - - ngAfterViewInit() { - setTimeout(() => { - this.maxWidth$.next(window.innerWidth - 2 * LayoutService.remInPx); - this.maxHeight$.next(window.innerHeight - 2 * LayoutService.remInPx - LayoutService.getToolbarHeightPx()); - }); - } -} diff --git a/projects/wave-core/src/lib/plots/plot-list/plot-list.component.html b/projects/wave-core/src/lib/plots/plot-list/plot-list.component.html deleted file mode 100644 index 6fdf7e1e..00000000 --- a/projects/wave-core/src/lib/plots/plot-list/plot-list.component.html +++ /dev/null @@ -1,75 +0,0 @@ -Plots -

    - no plots available -
    - -

    - - - - {{ plot.name }} - {{ plot.operator.operatorType.toString() }} - - - - - - -
    {{ (projectService.getPlotDataStream(plot) | async)?.data }}
    -
    - - {{ plot.name }} - - - - - - - - -
    {{ (projectService.getPlotDataStream(plot) | async)?.data | json }}
    -
    - -
    {{ (projectService.getPlotDataStream(plot) | async)?.data }}
    -
    -
    - - - - - - - - - - - - -
    diff --git a/projects/wave-core/src/lib/plots/plot-list/plot-list.component.scss b/projects/wave-core/src/lib/plots/plot-list/plot-list.component.scss deleted file mode 100644 index e33d19c0..00000000 --- a/projects/wave-core/src/lib/plots/plot-list/plot-list.component.scss +++ /dev/null @@ -1,39 +0,0 @@ -:host { - display: block; - padding: 1rem; -} - -mat-card:not(:last-child) { - margin-bottom: 1rem; -} - -img { - width: 100%; - height: auto; -} - -img.mat-card-avatar { - height: 40px; - width: auto; - border-radius: 50%; -} - -pre { - overflow: hidden; -} - -mat-spinner { - width: 25%; - height: auto; - margin: 0 auto; -} - -.error { - color: var(--wave-warn-color, red); -} - -.no-plots { - color: var(--wave-foreground-secondary-text-color, grey); - margin-top: 50%; - text-align: center; -} diff --git a/projects/wave-core/src/lib/plots/plot-list/plot-list.component.ts b/projects/wave-core/src/lib/plots/plot-list/plot-list.component.ts deleted file mode 100644 index 603ba076..00000000 --- a/projects/wave-core/src/lib/plots/plot-list/plot-list.component.ts +++ /dev/null @@ -1,112 +0,0 @@ -import {BehaviorSubject, Subscription} from 'rxjs'; -import {first, filter} from 'rxjs/operators'; - -import {MatDialog} from '@angular/material/dialog'; -import {AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Input, OnDestroy, OnInit} from '@angular/core'; - -import {BoxPlotType} from '../../operators/types/boxplot-type.model'; -import {LayoutService} from '../../layout.service'; -import {LoadingState} from '../../project/loading-state.model'; -import {OperatorListComponent} from '../../operators/dialogs/operator-list/operator-list.component'; -import {PieChartType} from '../../operators/types/piechart-type.model'; -import {PlotDetailViewComponent} from '../plot-detail-view/plot-detail-view.component'; -import {Plot} from '../plot.model'; -import {ProjectService} from '../../project/project.service'; -import {ROperatorComponent} from '../../operators/dialogs/r/r-operator/r-operator.component'; -import {RScriptType} from '../../operators/types/r-script-type.model'; -import {ScatterPlotType} from '../../operators/types/scatterplot-type.model'; -import {TimePlotType} from '../../operators/types/timeplot-type.model'; - -/** - * This component lists all current plots. - */ -@Component({ - selector: 'wave-plot-list', - templateUrl: './plot-list.component.html', - styleUrls: ['./plot-list.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PlotListComponent implements OnInit, AfterViewInit, OnDestroy { - /** - * If the list is empty, show the following button. - */ - @Input() operatorsListConfig = {component: OperatorListComponent}; - - readonly RScriptType = RScriptType; - readonly ScatterPlotType = ScatterPlotType; - readonly PieChartType = PieChartType; - readonly BoxPlotType = BoxPlotType; - readonly TimePlotType = TimePlotType; - readonly LoadingState = LoadingState; - - // to distinguish some r-script operators out of the editable ones. - readonly editExceptions = [this.ScatterPlotType.NAME, this.PieChartType.NAME, this.BoxPlotType.NAME, this.TimePlotType.NAME]; - readonly cardWidth$: BehaviorSubject = new BehaviorSubject(undefined); - - private subscriptions: Array = []; - - /** - * DI for services - */ - constructor( - public readonly projectService: ProjectService, - public readonly dialog: MatDialog, - private readonly layoutService: LayoutService, - private readonly elementRef: ElementRef, - ) {} - - ngOnInit() {} - - ngAfterViewInit() { - this.subscriptions.push( - this.projectService - .getPlotStream() - .pipe( - filter((plots) => plots.length > 0), - first(), - ) - .subscribe(() => { - setTimeout(() => { - const cardContent = this.elementRef.nativeElement.querySelector('mat-card'); - const width = parseInt(getComputedStyle(cardContent).width, 10); - this.cardWidth$.next(width); - }); - }), - ); - } - - ngOnDestroy() { - this.subscriptions.forEach((subscription) => subscription.unsubscribe()); - } - - /** - * If the plot is an RScript type, open the operator dialog for editing the source code. - */ - editRPlot(plot: Plot) { - this.layoutService.setSidenavContentComponent({ - component: ROperatorComponent, - keepParent: true, - config: { - editable: plot, - }, - }); - } - - /** - * Loads the component in `operatorsListConfig` into the sidenav - */ - goToOperatorsTab() { - this.layoutService.setSidenavContentComponent(this.operatorsListConfig); - } - - /** - * Show a plot as a fullscreen modal dialog - */ - showFullscreen(plot: Plot) { - this.dialog.open(PlotDetailViewComponent, { - data: plot, - maxHeight: '100vh', - maxWidth: '100vw', - }); - } -} diff --git a/projects/wave-core/src/lib/plots/plot.model.ts b/projects/wave-core/src/lib/plots/plot.model.ts deleted file mode 100644 index c17c27a1..00000000 --- a/projects/wave-core/src/lib/plots/plot.model.ts +++ /dev/null @@ -1,80 +0,0 @@ -import {Operator, OperatorDict} from '../operators/operator.model'; - -/** - * Schema for plot data. - */ -export interface PlotData { - type: string; - data: Array | string; - lines?: Array<{name: string; pos: number}>; - metadata?: { - numberOfBuckets?: number; - min?: number; - max?: number; - nodata?: number; - }; -} - -/** - * Dictionary for instantiating plot. - */ -interface PlotConfig { - name: string; - operator: Operator; -} - -/** - * Dictionary for serialization. - */ -export interface PlotDict { - name: string; - operator: OperatorDict; -} - -/** - * A model for plots and text outputs - */ -export class Plot { - private _name: string; - private _operator: Operator; - - /** - * De-Serialization - */ - static fromDict(dict: PlotDict, operatorMap = new Map()): Plot { - const operator = Operator.fromDict(dict.operator, operatorMap); - return new Plot({ - name: dict.name, - operator: operator, - }); - } - - constructor(config: PlotConfig) { - this._name = config.name; - this._operator = config.operator; - } - - /** - * @return the operator. - */ - get operator(): Operator { - return this._operator; - } - - /** - * @returns the data observable. - */ - get name(): string { - return this._name; - } - - /** - * Serialization - */ - toDict(): PlotDict { - return { - name: this.name, - operator: this.operator.toDict(), - }; - } -} diff --git a/projects/wave-core/src/lib/project/change-projection/change-projection.component.html b/projects/wave-core/src/lib/project/change-projection/change-projection.component.html deleted file mode 100644 index e9485c8b..00000000 --- a/projects/wave-core/src/lib/project/change-projection/change-projection.component.html +++ /dev/null @@ -1,10 +0,0 @@ -Change Projection -

    - Change the projection of the current project. Note, that this projection only has an impact on the final result. VAT processes all - intermediate steps with as few re-projections as necessary. -

    - - - {{ projection }} - - diff --git a/projects/wave-core/src/lib/project/change-projection/change-projection.component.scss b/projects/wave-core/src/lib/project/change-projection/change-projection.component.scss deleted file mode 100644 index 2e62f261..00000000 --- a/projects/wave-core/src/lib/project/change-projection/change-projection.component.scss +++ /dev/null @@ -1,13 +0,0 @@ -:host { - display: block; - padding: 1rem; -} - -p { - margin-bottom: 2rem; - text-align: justify; -} - -mat-form-field { - width: 100%; -} diff --git a/projects/wave-core/src/lib/project/change-projection/change-projection.component.ts b/projects/wave-core/src/lib/project/change-projection/change-projection.component.ts deleted file mode 100644 index 06240694..00000000 --- a/projects/wave-core/src/lib/project/change-projection/change-projection.component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core'; -import {ProjectService} from '../project.service'; -import {Projections, Projection} from '../../operators/projection.model'; -import {Observable} from 'rxjs'; - -@Component({ - selector: 'wave-change-projection', - templateUrl: './change-projection.component.html', - styleUrls: ['./change-projection.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class ChangeProjectionComponent implements OnInit { - readonly Projections = Projections; - - projection$: Observable; - - constructor(public projectService: ProjectService) {} - - ngOnInit() { - this.projection$ = this.projectService.getProjectionStream(); - } -} diff --git a/projects/wave-core/src/lib/project/load-project/load-project.component.html b/projects/wave-core/src/lib/project/load-project/load-project.component.html deleted file mode 100644 index b66d7698..00000000 --- a/projects/wave-core/src/lib/project/load-project/load-project.component.html +++ /dev/null @@ -1,10 +0,0 @@ -Load Project -
    - - - {{ name }}{{ name === currentProjectName ? ' (current)' : '' }} - - - -
    - diff --git a/projects/wave-core/src/lib/project/load-project/load-project.component.scss b/projects/wave-core/src/lib/project/load-project/load-project.component.scss deleted file mode 100644 index fcacec57..00000000 --- a/projects/wave-core/src/lib/project/load-project/load-project.component.scss +++ /dev/null @@ -1,27 +0,0 @@ -:host { - display: block; - padding: 1rem; - height: 100%; - box-sizing: border-box; -} - -form { - height: 100%; -} - -mat-radio-group { - overflow-y: auto; -} - -mat-radio-button { - display: block; -} - -button { - width: 100%; - margin-top: 2rem; -} - -mat-progress-spinner { - margin: 0 auto; -} diff --git a/projects/wave-core/src/lib/project/load-project/load-project.component.ts b/projects/wave-core/src/lib/project/load-project/load-project.component.ts deleted file mode 100644 index 5431d600..00000000 --- a/projects/wave-core/src/lib/project/load-project/load-project.component.ts +++ /dev/null @@ -1,78 +0,0 @@ -import {BehaviorSubject, ReplaySubject} from 'rxjs'; -import {first} from 'rxjs/operators'; -import {Component, OnInit, ChangeDetectionStrategy, AfterViewInit} from '@angular/core'; -import {ProjectService} from '../project.service'; -import {StorageService} from '../../storage/storage.service'; -import {FormBuilder, FormGroup, Validators, AbstractControl, ValidatorFn} from '@angular/forms'; -import {NotificationService} from '../../notification.service'; - -function notCurrentProject(currentProjectName: () => string): ValidatorFn { - return (control: AbstractControl): {[key: string]: boolean} => { - const errors: { - currentProject?: boolean; - } = {}; - - if (currentProjectName() === control.value) { - errors.currentProject = true; - } - - return Object.keys(errors).length > 0 ? errors : null; - }; -} - -@Component({ - selector: 'wave-load-project', - templateUrl: './load-project.component.html', - styleUrls: ['./load-project.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class LoadProjectComponent implements OnInit, AfterViewInit { - form: FormGroup; - - projects$ = new ReplaySubject>(1); - loading$ = new BehaviorSubject(true); - - currentProjectName: string; - - constructor( - private projectService: ProjectService, - private storageService: StorageService, - private notificationService: NotificationService, - private formBuilder: FormBuilder, - ) {} - - ngOnInit() { - this.currentProjectName = ''; - this.projectService - .getProjectStream() - .pipe(first()) - .subscribe((project) => { - this.currentProjectName = project.name; - }); - - this.form = this.formBuilder.group({ - projectName: [ - this.currentProjectName, - Validators.compose([Validators.required, notCurrentProject(() => this.currentProjectName)]), - ], - }); - - this.storageService.getProjects().subscribe((projects) => { - this.projects$.next(projects); - this.loading$.next(false); - }); - } - - ngAfterViewInit() { - setTimeout(() => this.form.updateValueAndValidity()); - } - - load() { - const newProject: string = this.form.controls['projectName'].value; - this.storageService.loadProjectByName(newProject); - this.currentProjectName = newProject; - setTimeout(() => this.form.controls['projectName'].updateValueAndValidity({emitEvent: true})); - - this.notificationService.info(`Switched to project »${newProject}«`); - } -} diff --git a/projects/wave-core/src/lib/project/loading-state.model.ts b/projects/wave-core/src/lib/project/loading-state.model.ts deleted file mode 100644 index f424efaf..00000000 --- a/projects/wave-core/src/lib/project/loading-state.model.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * A signal for the state of a async data observable. - */ -export enum LoadingState { - OK = 0, - LOADING = 1, - ERROR = 3, - NODATAFORGIVENTIME = 4, -} diff --git a/projects/wave-core/src/lib/project/new-project/new-project.component.html b/projects/wave-core/src/lib/project/new-project/new-project.component.html deleted file mode 100644 index 6ac08555..00000000 --- a/projects/wave-core/src/lib/project/new-project/new-project.component.html +++ /dev/null @@ -1,28 +0,0 @@ -New Project - -

    Create a new, blank project.

    -
    -
    - - - The name is already in usage. - -
    -
    - - - - {{ projection }} - - - -
    - -
    -
    - -

    - Created project {{ form.controls['name'].value }} and switched to it.

    - You are ready to go! -

    -
    diff --git a/projects/wave-core/src/lib/project/new-project/new-project.component.scss b/projects/wave-core/src/lib/project/new-project/new-project.component.scss deleted file mode 100644 index df9e83a6..00000000 --- a/projects/wave-core/src/lib/project/new-project/new-project.component.scss +++ /dev/null @@ -1,26 +0,0 @@ -:host { - display: block; - padding: 1rem; -} - -p { - text-align: justify; - margin-bottom: 2rem; -} - -.error { - color: var(--wave-warn-color, red); -} - -mat-form-field { - margin: 1rem 0; -} - -button { - margin-top: 1rem; - width: 100%; -} - -p.finished { - text-align: center; -} diff --git a/projects/wave-core/src/lib/project/new-project/new-project.component.ts b/projects/wave-core/src/lib/project/new-project/new-project.component.ts deleted file mode 100644 index 90e04e56..00000000 --- a/projects/wave-core/src/lib/project/new-project/new-project.component.ts +++ /dev/null @@ -1,74 +0,0 @@ -import {BehaviorSubject} from 'rxjs'; -import {first} from 'rxjs/operators'; -import {Component, OnInit, ChangeDetectionStrategy, AfterViewInit} from '@angular/core'; -import {FormGroup, FormBuilder, Validators} from '@angular/forms'; -import {StorageService} from '../../storage/storage.service'; -import {ProjectService} from '../project.service'; -import {Project} from '../project.model'; -import {Projections} from '../../operators/projection.model'; -import {NotificationService} from '../../notification.service'; -import {WaveValidators} from '../../util/form.validators'; - -@Component({ - selector: 'wave-new-project', - templateUrl: './new-project.component.html', - styleUrls: ['./new-project.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class NewProjectComponent implements OnInit, AfterViewInit { - // make available - Projections = Projections; - // - - form: FormGroup; - - created$ = new BehaviorSubject(false); - - constructor( - private formBuilder: FormBuilder, - private storageService: StorageService, - private projectService: ProjectService, - private notificationService: NotificationService, - ) {} - - ngOnInit() { - this.form = this.formBuilder.group({ - name: ['', Validators.required, WaveValidators.uniqueProjectName(this.storageService)], - projection: [Projections.WEB_MERCATOR, Validators.required], - }); - this.projectService - .getProjectionStream() - .pipe(first()) - .subscribe((projection) => { - this.form.controls['projection'].setValue(projection); - }); - } - - ngAfterViewInit() { - setTimeout(() => this.form.updateValueAndValidity()); - } - - /** - * Create a new project and switch to it. - */ - create() { - this.projectService - .getTimeStream() - .pipe(first()) - .subscribe((time) => { - const projectName: string = this.form.controls['name'].value; - this.projectService.setProject( - new Project({ - name: projectName, - projection: this.form.controls['projection'].value, - time: time, - layers: [], - timeStepDuration: {durationAmount: 1, durationUnit: 'months'}, - }), - ); - - this.created$.next(true); - this.notificationService.info(`Created and switched to new project »${projectName}«`); - }); - } -} diff --git a/projects/wave-core/src/lib/project/project.model.ts b/projects/wave-core/src/lib/project/project.model.ts deleted file mode 100644 index 433ccc0c..00000000 --- a/projects/wave-core/src/lib/project/project.model.ts +++ /dev/null @@ -1,189 +0,0 @@ -import {Projection, Projections} from '../operators/projection.model'; -import {Time, TimeDict, timeFromDict, TimePoint, TimeInterval, TimeStepDuration} from '../time/time.model'; -import {Plot, PlotDict} from '../plots/plot.model'; -import {Operator} from '../operators/operator.model'; -import {Config} from '../config.service'; -import {NotificationService} from '../notification.service'; -import {AbstractSymbology} from '../layers/symbology/symbology.model'; -import {Layer, LayerDict} from '../layers/layer.model'; - -export interface ProjectConfig { - name: string; - projection: Projection; - time: Time; - plots?: Array; - layers?: Array>; - timeStepDuration: TimeStepDuration; -} - -export interface ProjectDict { - name: string; - projection: string; - time: TimeDict; - plots: Array; - layers: Array; - timeStepDuration: TimeStepDuration; -} - -export class Project { - private _projection: Projection; - private _time: Time; - private _name: string; - private _plots: Array; - private _layers: Array>; - private _timeStepDuration: TimeStepDuration; - - static fromJSON(parameters: { - json: string; - config: Config; - notificationService: NotificationService; - operatorMap?: Map; - }): Project { - if (!parameters.operatorMap) { - parameters.operatorMap = new Map(); - } - - try { - const dict = JSON.parse(parameters.json); - return Project.fromDict({ - dict: dict, - config: parameters.config, - notificationService: parameters.notificationService, - operatorMap: parameters.operatorMap, - }); - } catch (error) { - parameters.notificationService.error(`Invalid JSON from project due to »${error}«`); - // return default project - return new Project({ - name: parameters.config.DEFAULTS.PROJECT.NAME, - projection: Projections.fromCode(parameters.config.DEFAULTS.PROJECT.PROJECTION), - time: new TimePoint(parameters.config.DEFAULTS.PROJECT.TIME), - plots: [], - layers: [], - timeStepDuration: {durationAmount: 1, durationUnit: 'months'}, // TODO: move to DEFAULTS! - }); - } - } - - static fromDict(parameters: { - dict: ProjectDict; - config: Config; - notificationService: NotificationService; - operatorMap?: Map; - }): Project { - if (!parameters.operatorMap) { - parameters.operatorMap = new Map(); - } - - let plots: Array; - if (parameters.dict.plots) { - plots = parameters.dict.plots - .map((plotDict) => { - try { - return Plot.fromDict(plotDict, parameters.operatorMap); - } catch (error) { - parameters.notificationService.error(`Cannot load plot because of »${error}«`); - return undefined; - } - }) - .filter((plot) => plot !== undefined); - } else { - plots = []; - } - - let projection: Projection; - try { - projection = Projections.fromCode(parameters.dict.projection); - } catch (error) { - projection = Projections.fromCode(parameters.config.DEFAULTS.PROJECT.PROJECTION); - parameters.notificationService.error(`Cannot load projection because of »${error}«`); - } - - let time: TimePoint | TimeInterval; - try { - time = timeFromDict(parameters.dict.time); - } catch (error) { - time = new TimePoint(parameters.config.DEFAULTS.PROJECT.TIME); - parameters.notificationService.error(`Cannot load time because of »${error}«`); - } - - let layers: Array>; - if (parameters.dict.layers) { - layers = parameters.dict.layers - .map((layerDict) => { - try { - return Layer.fromDict(layerDict, parameters.operatorMap); - } catch (error) { - parameters.notificationService.error(`Cannot load layer because of »${error}«`); - return undefined; - } - }) - .filter((layer) => layer !== undefined); - } else { - layers = []; - } - let timeStepDuration: TimeStepDuration; - if (parameters.dict.timeStepDuration) { - timeStepDuration = parameters.dict.timeStepDuration; - } else { - timeStepDuration = {durationAmount: 1, durationUnit: 'months'}; - } - - return new Project({ - name: parameters.dict.name, - projection: projection, - time: time, - plots: plots, - layers: layers, - timeStepDuration: timeStepDuration, - }); - } - - constructor(config: ProjectConfig) { - this._name = config.name; - this._projection = config.projection; - this._time = config.time; - this._plots = config.plots ? config.plots : []; - this._layers = config.layers ? config.layers : []; - this._timeStepDuration = config.timeStepDuration; - } - - get name(): string { - return this._name; - } - - get time(): Time { - return this._time; - } - - get projection(): Projection { - return this._projection; - } - - get plots(): Array { - return this._plots; - } - - get layers(): Array> { - return this._layers; - } - - get timeStepDuration(): TimeStepDuration { - return this._timeStepDuration; - } - - toDict(): ProjectDict { - return { - name: this.name, - projection: this._projection.getCode(), - time: this._time.asDict(), - plots: this._plots.map((plot) => plot.toDict()), - layers: this._layers.map((layer) => layer.toDict()), - timeStepDuration: this._timeStepDuration, - }; - } - - toJSON(): string { - return JSON.stringify(this.toDict()); - } -} diff --git a/projects/wave-core/src/lib/project/project.service.spec.ts b/projects/wave-core/src/lib/project/project.service.spec.ts deleted file mode 100644 index 595a75af..00000000 --- a/projects/wave-core/src/lib/project/project.service.spec.ts +++ /dev/null @@ -1,320 +0,0 @@ -import {configureWaveTesting} from '../spec/wave-testing.configuration'; -import {fakeAsync, TestBed, TestModuleMetadata, tick} from '@angular/core/testing'; -import {Config} from '../config.service'; -import {UserService} from '../users/user.service'; -import {NotificationService} from '../notification.service'; -import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; -import {ProjectService} from './project.service'; -import {MappingQueryService} from '../queries/mapping-query.service'; -import {clear_user_service_requests, MockBackend} from '../users/user.service.spec'; -import {LayerService} from '../layers/layer.service'; -import {LayoutService} from '../layout.service'; -import {ReplaySubject, Subject} from 'rxjs'; -import {Plot} from '../plots/plot.model'; -import {MapService} from '../map/map.service'; -import {RScriptTypeDict} from '../operators/types/r-script-type.model'; -import {Layer} from '../layers/layer.model'; -import {RasterSourceType} from '../operators/types/raster-source-type.model'; -import {RasterSymbologyDict} from '../layers/symbology/symbology.model'; - -class MockConfig { - static MOCK_URL = 'localhost:8089/mapping-mock'; - static MOCK_USER = { - GUEST: { - NAME: 'guest', - PASSWORD: 'guest', - }, - }; - - get MAPPING_URL(): string { - return MockConfig.MOCK_URL; - } - - get USER(): {GUEST: {NAME: string; PASSWORD: string}} { - return MockConfig.MOCK_USER; - } - - get DELAYS(): {LOADING: {MIN: number}; TOOLTIP: number; DEBOUNCE: number; STORAGE_DEBOUNCE: number; GUEST_LOGIN_HINT: number} { - return { - LOADING: { - MIN: 0, - }, - TOOLTIP: 5, - DEBOUNCE: 0, - STORAGE_DEBOUNCE: 0, - GUEST_LOGIN_HINT: 5, - }; - } - - get DEFAULTS(): { - PROJECT: { - NAME: string; - TIME: string; - TIMESTEP: '15 minutes' | '1 hour' | '1 day' | '1 month' | '6 months' | '1 year'; - PROJECTION: 'EPSG:3857' | 'EPSG:4326'; - }; - } { - return { - PROJECT: { - NAME: 'DEFAULT', - TIME: '2000-01-01T00:00:00', - TIMESTEP: '1 hour', - PROJECTION: 'EPSG:3857', - }, - }; - } -} - -class MockNotificationService { - info(message: string) {} - error(message: string) {} -} - -class MockLayoutService { - private sidenavContentMaxWidth$: Subject = new ReplaySubject(1); - - constructor() { - this.sidenavContentMaxWidth$.next(200); - } - - getSidenavWidthStream() { - return this.sidenavContentMaxWidth$; - } -} - -const module = { - providers: [ - {provide: Config, useClass: MockConfig}, - {provide: NotificationService, useClass: MockNotificationService}, - LayerService, - {provide: LayoutService, useClass: MockLayoutService}, - MapService, - UserService, - MappingQueryService, - ProjectService, - ], - imports: [HttpClientTestingModule], -} as TestModuleMetadata; - -function login(http: HttpTestingController, backend: MockBackend) { - clear_user_service_requests(http); - - expect(http.match((req) => true).length).toBe(0); - - let user = TestBed.inject(UserService); - - let completed = null; - user.login({user: 'test', password: 'test_pw'}).subscribe( - (login_response) => { - expect(login_response).toBe(true); - - expect(user.getSession().user).toBe('test'); - expect(user.getSession().sessionToken).toBe('mockSessionToken'); - }, - (error) => {}, - () => { - completed = true; - }, - ); - - backend.testLogin(); - http.verify(); - expect(user.getSession()).toEqual({ - user: 'test', - sessionToken: 'mockSessionToken', - staySignedIn: true, - isExternallyConnected: false, - }); - expect(completed).toBeTruthy(); -} - -describe('Service: Project Service', () => { - describe('Plot tests', () => { - configureWaveTesting( - fakeAsync(() => { - TestBed.configureTestingModule(module); - this.service = TestBed.inject(ProjectService); - this.http = TestBed.inject(HttpTestingController); // Mapping Query Service requires http for plot subscriptions - this.backend = new MockBackend(this.http, MockConfig.MOCK_URL); - this.service.setProject(this.service.createDefaultProject()); - - login(this.http, this.backend); - - // add a plot to the service. - - this.plot = Plot.fromDict({ - name: 'test_plot', - operator: { - id: 0, - operatorType: { - operatorType: 'r_script', - resultType: 'plot', - code: 'test_code', - } as RScriptTypeDict, - resultType: 'plot', - projection: 'EPSG:3857', - attributes: [], - dataTypes: [], - units: [], - rasterSources: [], - pointSources: [], - lineSources: [], - polygonSources: [], - operatorTypeParameterOptions: undefined, - }, - }); - this.plotUrl = - MockConfig.MOCK_URL + - '?time=2000-01-01T00:00:00.000Z&service=plot&request=&sessiontoken=mockSessionToken&crs=EPSG:3857&bbox=0,0,0,' + - '0&query=%7B%22type%22%3A%22r_script%22%2C%22params%22%3A%7B%22source%22%3A%22test_code%22%2C%22result%22%3A%' + - '22plot%22%2C%22plot_width%22%3A168%2C%22plot_height%22%3A168%7D%7D'; - this.completed = false; - - this.service.addPlot(this.plot).subscribe( - () => {}, - (error) => {}, - () => { - this.completed = true; - }, - ); - - // Wait until all promises are resolved (chain of multiple function calls in addPlot) - tick(); - - const request = this.http.expectOne(this.plotUrl); - request.flush({type: 'png', data: 'dummy_data'}); - }), - ); - - it('uses the expected http calls', () => { - this.http.verify(); - }); - - it('finalizes addPlot-Observable', () => { - expect(this.completed).toBeTruthy(); - }); - - it('finalizes removePlot-Observable', async () => { - let completed = false; - await this.service.removePlot(this.plot).subscribe( - () => {}, - (error) => {}, - () => { - completed = true; - }, - ); - expect(completed).toBeTruthy(); - }); - - it('adds plot', async () => { - await this.service.getProjectStream().subscribe((project) => { - expect(project.plots.length).toBe(1); - }); - await this.service.getPlotDataStream(this.plot).subscribe((data) => { - expect(data.data).toEqual('dummy_data'); - }); - }); - - it('removes plot', async () => { - await this.service.removePlot(this.plot); - await this.service.getProjectStream().subscribe((project) => { - expect(project.plots.length).toBe(0); - }); - }); - - it('clears plots', async () => { - this.service.clearPlots(); - await this.service.getProjectStream().subscribe((project) => { - expect(project.plots.length).toBe(0); - }); - }); - }); - - describe('Layer tests', () => { - configureWaveTesting( - fakeAsync(() => { - TestBed.configureTestingModule(module); - this.service = TestBed.inject(ProjectService); - this.http = TestBed.inject(HttpTestingController); // Mapping Query Service requires http for plot subscriptions - this.backend = new MockBackend(this.http, MockConfig.MOCK_URL); - this.service.setProject(this.service.createDefaultProject()); - - login(this.http, this.backend); - - this.layer = Layer.fromDict({ - name: 'test_layer', - operator: { - id: 0, - operatorType: new RasterSourceType({ - channel: 0, - sourcename: 'source', - transform: false, - }).toDict(), - resultType: 'raster', - projection: 'EPSG:3857', - attributes: [], - dataTypes: [], - units: [], - rasterSources: [], - pointSources: [], - lineSources: [], - polygonSources: [], - operatorTypeParameterOptions: undefined, - }, - symbology: { - symbologyType: 'RASTER', - opacity: 0.5, - unit: { - measurement: 'row', - unit: 'unknown', - }, - } as RasterSymbologyDict, - expanded: true, - visible: true, - editSymbology: false, - type: 'raster', - }); - - this.completed = false; - - this.service.addLayer(this.layer).subscribe( - () => {}, - (error) => {}, - () => { - this.completed = true; - }, - ); - }), - ); - - it('finalizes addLayer-Observable', () => { - expect(this.completed).toBeTruthy(); - }); - - it('adds layer', async () => { - await this.service.getLayerStream().subscribe((arr) => expect(arr.length).toBe(1)); - }); - - it('removes layer and finalizes Observable', async () => { - let completed = false; - await this.service.removeLayer(this.layer).subscribe( - () => {}, - (error) => {}, - () => { - completed = true; - }, - ); - expect(completed).toBeTruthy(); - await this.service.getProjectStream().subscribe((project) => { - expect(project.layers.length).toBe(0); - }); - }); - - it('clears layers', async () => { - this.service.clearLayers(); - await this.service.getProjectStream().subscribe((project) => { - expect(project.layers.length).toBe(0); - }); - }); - }); -}); diff --git a/projects/wave-core/src/lib/project/project.service.ts b/projects/wave-core/src/lib/project/project.service.ts deleted file mode 100644 index ba79bbb4..00000000 --- a/projects/wave-core/src/lib/project/project.service.ts +++ /dev/null @@ -1,1157 +0,0 @@ -import { - combineLatest as observableCombineLatest, - Observable, - Observer, - of as observableOf, - ReplaySubject, - Subject, - Subscription, -} from 'rxjs'; - -import {catchError, debounceTime, distinctUntilChanged, first, map, switchMap, tap} from 'rxjs/operators'; -import {Injectable} from '@angular/core'; - -import {Projection, Projections} from '../operators/projection.model'; - -import {Project} from './project.model'; - -import {Time, TimePoint, TimeStepDuration} from '../time/time.model'; -import {Config} from '../config.service'; -import {Plot, PlotData} from '../plots/plot.model'; -import {LoadingState} from './loading-state.model'; -import {MappingQueryService} from '../queries/mapping-query.service'; -import {NotificationService} from '../notification.service'; -import {Layer, LayerChanges, LayerData, RasterData, RasterLayer, VectorData, VectorLayer} from '../layers/layer.model'; -import {AbstractRasterSymbology, AbstractSymbology, AbstractVectorSymbology, PointSymbology} from '../layers/symbology/symbology.model'; -import {Provenance} from '../provenance/provenance.model'; -import {MapService} from '../map/map.service'; -import {WFSOutputFormats} from '../queries/output-formats/wfs-output-format.model'; -import {ResultTypes} from '../operators/result-type.model'; -import {LayerService} from '../layers/layer.service'; -import {HttpErrorResponse} from '@angular/common/http'; -import {LayoutService} from '../layout.service'; -import {DeprecatedMappingColorizerDoNotUse} from '../colors/colorizer-data.model'; - -/*** - * The ProjectService is the main housekeeping component of WAVE. - * All layers, plots, and provenance are registered with the ProjectService. - */ -@Injectable() -export class ProjectService { - private project$ = new ReplaySubject(1); - - private layerData$: Map, ReplaySubject>>; - private layerDataState$: Map, ReplaySubject>; - private layerDataSubscriptions: Map, Subscription>; - private layerSymbologyData$: Map, ReplaySubject>; - private layerSymbologyDataState$: Map, ReplaySubject>; - private layerSymbologyDataSubscriptions: Map, Subscription>; - private layerProvenanceData$: Map, ReplaySubject>>; - private layerProvenanceDataState$: Map, ReplaySubject>; - private layerProvenanceDataSubscriptions: Map, Subscription>; - private layerCombinedState$: Map, Observable>; - private layerChanges$: Map, ReplaySubject>>; - - private newLayer$: Subject>; - - private plotData$: Map>; - private plotDataState$: Map>; - private plotSubscriptions: Map; - private newPlot$: Subject; - - constructor( - private config: Config, - private notificationService: NotificationService, - private mappingQueryService: MappingQueryService, - private mapService: MapService, - private layerService: LayerService, - private layoutService: LayoutService, - ) { - this.plotData$ = new Map(); - this.plotDataState$ = new Map(); - this.plotSubscriptions = new Map(); - this.newPlot$ = new Subject(); - - this.layerData$ = new Map(); - this.layerDataState$ = new Map(); - this.layerDataSubscriptions = new Map(); - this.layerSymbologyData$ = new Map(); - this.layerSymbologyDataState$ = new Map(); - this.layerSymbologyDataSubscriptions = new Map(); - this.layerProvenanceData$ = new Map(); - this.layerProvenanceDataState$ = new Map(); - this.layerProvenanceDataSubscriptions = new Map(); - this.layerCombinedState$ = new Map(); - this.newLayer$ = new Subject>(); - this.layerChanges$ = new Map(); - } - - /** - * Generate a default Project with values from the config file. - */ - createDefaultProject(): Project { - let timeStepDuration: TimeStepDuration; - switch (this.config.DEFAULTS.PROJECT.TIMESTEP) { - case '15 minutes': - timeStepDuration = {durationAmount: 15, durationUnit: 'minutes'}; - break; - case '1 hour': - timeStepDuration = {durationAmount: 1, durationUnit: 'hour'}; - break; - case '1 day': - timeStepDuration = {durationAmount: 1, durationUnit: 'day'}; - break; - case '1 month': - timeStepDuration = {durationAmount: 1, durationUnit: 'month'}; - break; - case '6 months': - timeStepDuration = {durationAmount: 6, durationUnit: 'months'}; - break; - case '1 year': - timeStepDuration = {durationAmount: 1, durationUnit: 'year'}; - break; - default: - timeStepDuration = {durationAmount: 1, durationUnit: 'month'}; - } - - return new Project({ - name: this.config.DEFAULTS.PROJECT.NAME, - projection: Projections.fromCode(this.config.DEFAULTS.PROJECT.PROJECTION), - time: new TimePoint(this.config.DEFAULTS.PROJECT.TIME), - timeStepDuration, - }); - } - - /** - * Get a stream of Projects. This way compments can react to new Projects. - */ - getProjectStream(): Observable { - return this.project$; - } - - /** - * Set a new Project. The ProjectService will clear all layer, plots, and provenance. - */ - setProject(project: Project) { - // console.log("`setProject`"); - - // clear layer data - this.layerData$.forEach((subject) => subject.complete()); - this.layerData$.clear(); - this.layerDataState$.forEach((subject) => subject.complete()); - this.layerDataState$.clear(); - this.layerDataSubscriptions.forEach((subscription) => subscription.unsubscribe()); - this.layerDataSubscriptions.clear(); - this.layerProvenanceData$.forEach((subject) => subject.complete()); - this.layerProvenanceData$.clear(); - this.layerProvenanceDataState$.forEach((subject) => subject.complete()); - this.layerProvenanceDataState$.clear(); - this.layerProvenanceDataSubscriptions.forEach((subscription) => subscription.unsubscribe()); - this.layerProvenanceDataSubscriptions.clear(); - this.layerSymbologyData$.forEach((subject) => subject.complete()); - this.layerSymbologyData$.clear(); - this.layerSymbologyDataState$.forEach((subject) => subject.complete()); - this.layerSymbologyDataState$.clear(); - this.layerSymbologyDataSubscriptions.forEach((subscription) => subscription.unsubscribe()); - this.layerSymbologyDataSubscriptions.clear(); - this.layerCombinedState$.clear(); - - // clears all layer changes subscriptions, but completes them first - this.layerChanges$.forEach((subject) => subject.complete()); - this.layerChanges$.clear(); - - // clear plot data - this.plotData$.forEach((subject) => subject.complete()); - this.plotData$.clear(); - this.plotDataState$.forEach((subject) => subject.complete()); - this.plotDataState$.clear(); - this.plotSubscriptions.forEach((subscription) => subscription.unsubscribe()); - this.plotSubscriptions.clear(); - - // add plot streams - for (const plot of project.plots) { - this.createPlotDataStreams(plot); - } - - // add layer streams - for (const layer of project.layers) { - this.createLayerDataStreams(layer); - this.createLayerChangesStream(layer); - } - - this.project$.next(project); - } - - /** - * Set the time of the current project. - */ - setTime(time: Time) { - this.project$.pipe(first()).subscribe((project) => { - const oldTime = project.time; - if (time && time.isValid() && !time.isSame(oldTime)) { - this.changeProjectConfig({ - time, - }); - } - }); - } - - /** - * Set a ttime duration for the current project. - */ - setTimeStepDuration(timeStepDuration: TimeStepDuration) { - this.changeProjectConfig({ - timeStepDuration, - }); - } - - /** - * Set the name of the current Project. - */ - setName(name: string) { - this.changeProjectConfig({name}); - } - - /** - * Set the projection used by the current project. - */ - setProjection(projection: Projection) { - this.changeProjectConfig({ - projection, - }); - } - - /** - * Get a stream of the projects projection. - */ - getProjectionStream(): Observable { - return this.project$.pipe( - map((project) => project.projection), - distinctUntilChanged(), - ); - } - - /** - * Get a stream of the projects time. - */ - getTimeStream(): Observable

- {{ group.key }} - - open_in_new - -