diff --git a/package-lock.json b/package-lock.json index 4e5c8dfaebb0900cb43d156cdc2238b0c0673bdd..f019440ccd1f2b27175177d153ff839612d1e9df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@asymmetrik/ngx-leaflet": "^13.0.2", "@ghsc/disagg-d3": "^0.8.0", "@ghsc/nshmp-template": "^13.3.1", - "@ghsc/nshmp-web-utils": "^2.2.0", + "@ghsc/nshmp-web-utils": "^2.3.0", "@ngrx/effects": "^13.0.2", "@ngrx/router-store": "^13.0.2", "@ngrx/schematics": "^13.0.2", @@ -3233,9 +3233,9 @@ } }, "node_modules/@ghsc/nshmp-web-utils": { - "version": "2.2.0", - "resolved": "https://code.usgs.gov/api/v4/projects/1414/packages/npm/@ghsc/nshmp-web-utils/-/@ghsc/nshmp-web-utils-2.2.0.tgz", - "integrity": "sha1-FhMRiT5cXs+NIBl4y2t/F/ZPE+E=", + "version": "2.3.0", + "resolved": "https://code.usgs.gov/api/v4/projects/1414/packages/npm/@ghsc/nshmp-web-utils/-/@ghsc/nshmp-web-utils-2.3.0.tgz", + "integrity": "sha1-Y9fDyU+cFzKRytl6XEGtw+HDG3c=", "dependencies": { "@types/d3-format": "^3.0.1", "@types/leaflet": "^1.9.0", @@ -34045,9 +34045,9 @@ } }, "@ghsc/nshmp-web-utils": { - "version": "2.2.0", - "resolved": "https://code.usgs.gov/api/v4/projects/1414/packages/npm/@ghsc/nshmp-web-utils/-/@ghsc/nshmp-web-utils-2.2.0.tgz", - "integrity": "sha1-FhMRiT5cXs+NIBl4y2t/F/ZPE+E=", + "version": "2.3.0", + "resolved": "https://code.usgs.gov/api/v4/projects/1414/packages/npm/@ghsc/nshmp-web-utils/-/@ghsc/nshmp-web-utils-2.3.0.tgz", + "integrity": "sha1-Y9fDyU+cFzKRytl6XEGtw+HDG3c=", "requires": { "@types/d3-format": "^3.0.1", "@types/leaflet": "^1.9.0", diff --git a/package.json b/package.json index 722f33f8a2e853b278c3a3c0e3dc171538a22bc6..b0e1a459bd646229688dd449335ce0d1f1d14d07 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "@asymmetrik/ngx-leaflet": "^13.0.2", "@ghsc/disagg-d3": "^0.8.0", "@ghsc/nshmp-template": "^13.3.1", - "@ghsc/nshmp-web-utils": "^2.2.0", + "@ghsc/nshmp-web-utils": "^2.3.0", "@ngrx/effects": "^13.0.2", "@ngrx/router-store": "^13.0.2", "@ngrx/schematics": "^13.0.2", diff --git a/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.html b/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.html index db346977aece10d43e6e4ddf0a87fded272b5c80..2926ee8f8d009a70f8fc31ce65bc8f0b9a7a8dd7 100644 --- a/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.html +++ b/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.html @@ -63,12 +63,15 @@ <div [leafletLayer]="layers.baseLayer"></div> <!-- Map bounds layers --> - <div *ngIf="layers.mapBounds" [leafletLayer]="layers.mapBounds"></div> + <div + *ngIf="layers.mapBounds$ | async as mapBounds" + [leafletLayer]="mapBounds" + ></div> <!-- Outside NSHM bounds layers --> <div - *ngIf="layers.outsideBounds" - [leafletLayer]="layers.outsideBounds" + *ngIf="layers.outsideBounds$ | async as outsideBounds" + [leafletLayer]="outsideBounds" ></div> <!-- Site marker --> @@ -112,12 +115,12 @@ </mat-form-field> </div> - <div class="field"> + <div class="field" *ngIf="layers.mapBounds$ | async as mapBounds"> <button mat-raised-button color="accent" class="field" - (click)="onFitBounds()" + (click)="onFitBounds(mapBounds)" > Reset Zoom </button> diff --git a/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.ts b/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.ts index d04cc131129905464d8e8e11c0def8ad33c616cc..b178efe62834ade48021d2cfb21c05e1f319c5ee 100644 --- a/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.ts +++ b/projects/map-lib/src/lib/components/select-site-dialog/select-site-dialog.component.ts @@ -39,8 +39,8 @@ interface Layers { baseLayer: L.TileLayer; baseLayers: LeafletControlLayersConfig; faultSections$: Observable<L.GeoJSON>; - mapBounds: L.GeoJSON; - outsideBounds: L.GeoJSON; + mapBounds$: Observable<L.GeoJSON>; + outsideBounds$: Observable<L.GeoJSON>; outsideBoundsPopup: L.Tooltip; siteMarker: L.Marker; testSites: L.GeoJSON; @@ -63,8 +63,8 @@ export class SelectSiteDialogComponent implements OnInit, OnDestroy { overlays: {}, }, faultSections$: undefined, - mapBounds: undefined, - outsideBounds: undefined, + mapBounds$: undefined, + outsideBounds$: undefined, outsideBoundsPopup: undefined, siteMarker: undefined, testSites: undefined, @@ -132,19 +132,8 @@ export class SelectSiteDialogComponent implements OnInit, OnDestroy { } } - onTestSitesToggle(event: MatSlideToggleChange): void { - this.testSiteSelect.value = ''; - - if (event.checked) { - this.getTestSites(); - } else { - this.testSites = undefined; - this.locationInputValue = locationInputPlaceholder; - } - } - - onFitBounds(): void { - this.map.fitBounds(this.layers.mapBounds.getBounds()); + onFitBounds(mapBounds: L.GeoJSON): void { + this.map.fitBounds(mapBounds.getBounds()); } onMapReady(map: L.Map): void { @@ -162,8 +151,6 @@ export class SelectSiteDialogComponent implements OnInit, OnDestroy { } L.control.scale({position: 'bottomleft'}).addTo(map); - - this.setLayerEvents(this.layers); } onTestSitesSelectionChange(event: MatSelectChange) { @@ -177,53 +164,89 @@ export class SelectSiteDialogComponent implements OnInit, OnDestroy { this.onTestSiteClick(site); } - private createMapBoundsLayer(): L.GeoJSON { - const mapPolygon = this.data.map.features.find( - feature => feature.id !== 'Extents' - ); - return L.geoJSON(mapPolygon, { - style: { - color: 'grey', - fillColor: 'grey', - fillOpacity: 0, - }, - }); + onTestSitesToggle(event: MatSlideToggleChange): void { + this.testSiteSelect.value = ''; + + if (event.checked) { + this.getTestSites(); + } else { + this.testSites = undefined; + this.locationInputValue = locationInputPlaceholder; + } } - private createOutsideBoundsLayer(): L.GeoJSON { - const mapPolygon = this.data.map.features.find( - feature => feature.id !== 'Extents' + private createMapBoundsLayer$(): Observable<L.GeoJSON> { + const layer$ = this.getMap$().pipe( + map(map => { + const mapPolygon = map.features.find( + feature => feature.id !== 'Extents' + ); + + const layer = L.geoJSON(mapPolygon, { + style: { + color: 'grey', + fillColor: 'grey', + fillOpacity: 0, + }, + }); + + layer.on('click', event => this.zone.run(() => this.onMapClick(event))); + + this.onFitBounds(layer); + + return layer; + }) ); - const featureCollection: GeoJSON.FeatureCollection<GeoJSON.Polygon> = { - features: [ - { - geometry: { - coordinates: [ - [ - [-360, 90], - [180, 90], - [180, -90], - [-360, -90], - ], - ...mapPolygon.geometry.coordinates, - ], - type: 'Polygon', + return layer$; + } + + private createOutsideBoundsLayer$(): Observable<L.GeoJSON> { + const layer$ = this.getMap$().pipe( + map(map => { + const mapPolygon = map.features.find( + feature => feature.id !== 'Extents' + ); + + const featureCollection: GeoJSON.FeatureCollection<GeoJSON.Polygon> = { + features: [ + { + geometry: { + coordinates: [ + [ + [-360, 90], + [180, 90], + [180, -90], + [-360, -90], + ], + ...mapPolygon.geometry.coordinates, + ], + type: 'Polygon', + }, + properties: {}, + type: 'Feature', + }, + ], + type: 'FeatureCollection', + }; + + const layer = L.geoJSON(featureCollection, { + style: { + color: 'grey', + fillColor: 'grey', + fillOpacity: 0.5, }, - properties: {}, - type: 'Feature', - }, - ], - type: 'FeatureCollection', - }; + }); - return L.geoJSON(featureCollection, { - style: { - color: 'grey', - fillColor: 'grey', - fillOpacity: 0.5, - }, - }); + layer.on('click', event => + this.zone.run(() => this.onOutsideMapClick(event)) + ); + + return layer; + }) + ); + + return layer$; } private createSelectedSiteMarker(site: L.LatLng): void { @@ -255,6 +278,12 @@ export class SelectSiteDialogComponent implements OnInit, OnDestroy { ); } + private getMap$(): Observable<GeoJSON.FeatureCollection<GeoJSON.Polygon>> { + return this.http.get<GeoJSON.FeatureCollection<GeoJSON.Polygon>>( + this.data.mapUrl + ); + } + private getTestSites(): void { this.spinner.show('Getting test sites ...'); @@ -350,21 +379,9 @@ export class SelectSiteDialogComponent implements OnInit, OnDestroy { ); } - private setLayerEvents(layers: Layers): void { - layers.outsideBounds.on('click', event => - this.zone.run(() => this.onOutsideMapClick(event)) - ); - - layers.mapBounds.on('click', event => - this.zone.run(() => this.onMapClick(event)) - ); - } - private setLayers(): void { - this.layers.outsideBounds = this.createOutsideBoundsLayer(); - - this.layers.mapBounds = this.createMapBoundsLayer(); - this.map.fitBounds(this.layers.mapBounds.getBounds()); + this.layers.mapBounds$ = this.createMapBoundsLayer$(); + this.layers.outsideBounds$ = this.createOutsideBoundsLayer$(); } private setSelectedSite(site: L.LatLng): void { diff --git a/projects/map-lib/src/lib/models/select-site.model.ts b/projects/map-lib/src/lib/models/select-site.model.ts index 4481ffefc648c2d3405d9e2420b6f52c5b6c1f09..e8852493c4c2e59c614ebdf59bfd78cefc0fd0cb 100644 --- a/projects/map-lib/src/lib/models/select-site.model.ts +++ b/projects/map-lib/src/lib/models/select-site.model.ts @@ -1,7 +1,7 @@ import {NshmId} from '@ghsc/nshmp-web-utils/libs/nshmp-lib/nshm'; export interface SelectSiteDialogData { - map: GeoJSON.FeatureCollection<GeoJSON.Polygon>; + mapUrl: string; nshm: NshmId; sitesUrl: string; } diff --git a/projects/nshmp-apps/src/app/hazard/disagg/components/control-panel/control-panel.component.ts b/projects/nshmp-apps/src/app/hazard/disagg/components/control-panel/control-panel.component.ts index 281e02c5f25ff7ee0ab2815881aefb0cef130a93..85c121281de42436fb3a29848dff96505914f528 100644 --- a/projects/nshmp-apps/src/app/hazard/disagg/components/control-panel/control-panel.component.ts +++ b/projects/nshmp-apps/src/app/hazard/disagg/components/control-panel/control-panel.component.ts @@ -35,7 +35,7 @@ export class ControlPanelComponent { environment.webServices.nshmpHazWs.services.curveServices; return { - map: usage.response.model.map, + mapUrl: `${nshmService.url}${services.map}?raw=true`, nshm: form.value.model, sitesUrl: `${nshmService.url}${services.sites}?raw=true`, }; diff --git a/projects/nshmp-apps/src/app/hazard/dynamic/components/control/control.component.ts b/projects/nshmp-apps/src/app/hazard/dynamic/components/control/control.component.ts index 81dc4c8c2750858c5c1e16712e23078f6104f262..bc43ad0459877587279c4802aa9ba97ff8db293e 100644 --- a/projects/nshmp-apps/src/app/hazard/dynamic/components/control/control.component.ts +++ b/projects/nshmp-apps/src/app/hazard/dynamic/components/control/control.component.ts @@ -41,7 +41,7 @@ export class ControlComponent { environment.webServices.nshmpHazWs.services.curveServices; return { - map: usage.response.model.map, + mapUrl: `${nshmService.url}${services.map}?raw=true`, nshm: form.value.model, sitesUrl: `${nshmService.url}${services.sites}?raw=true`, }; diff --git a/projects/nshmp-apps/src/app/hazard/static/components/control-panel/control-panel.component.ts b/projects/nshmp-apps/src/app/hazard/static/components/control-panel/control-panel.component.ts index acfc0390e9a364fa2f8653fa5108ed77c43f22ee..92a0cd82b4f575f737e63a850d90834c329f931e 100644 --- a/projects/nshmp-apps/src/app/hazard/static/components/control-panel/control-panel.component.ts +++ b/projects/nshmp-apps/src/app/hazard/static/components/control-panel/control-panel.component.ts @@ -38,7 +38,7 @@ export class ControlPanelComponent { environment.webServices.nshmpWsStatic.services.curveServices; return { - map: usage.response.models.map, + mapUrl: `${nshmService.url}${services.map}?raw=true`, nshm: form.value.model, sitesUrl: `${nshmService.url}${services.sites}?raw=true`, }; diff --git a/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.html b/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.html index ba198fe2b177bcbc4fc5e96ba9c2fb8de58d2209..e27a7ca4a12814171150a3ebe55d07b797920be0 100644 --- a/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.html +++ b/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.html @@ -20,6 +20,7 @@ <mat-slide-toggle color="primary" [ngrxFormControlState]="form?.controls?.hasNshmBoundaryLayer" + (change)="onMapToggle($event.checked)" > NSHM Border Layer </mat-slide-toggle> diff --git a/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.ts b/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.ts index d3f7474c619c072e067ea5b4e80c618e5c33cce3..e639f507fec142d59066769b37fc5bc81f6a8d1f 100644 --- a/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.ts +++ b/projects/nshmp-apps/src/app/source/data/components/control-panel/control-panel.component.ts @@ -18,6 +18,12 @@ export class ControlPanelComponent { } } + onMapToggle(checked: boolean): void { + if (checked) { + this.facade.callMapService(); + } + } + onTestSitesToggle(checked: boolean): void { if (checked) { this.facade.callTestSitesService(); diff --git a/projects/nshmp-apps/src/app/source/data/state/app.actions.ts b/projects/nshmp-apps/src/app/source/data/state/app.actions.ts index 8044b192a334bbb168ad5ae222917fadc46d2460..5bae364182c5f848bda4347a24f7dfa536226347 100644 --- a/projects/nshmp-apps/src/app/source/data/state/app.actions.ts +++ b/projects/nshmp-apps/src/app/source/data/state/app.actions.ts @@ -12,6 +12,7 @@ import * as sharedActions from 'projects/nshmp-lib/src/lib/state/shared/shared.a export enum ActionTypes { BASE_LAYER = '[Data Mapping App] Set Base Layer', CALL_FAULT_SECTION_SERVICE = '[Data Mapping App] Call Fault Section Service', + CALL_MAP_SERVICE = '[Data Mapping App] Call Map Service', CALL_TEST_SITES_SERVICE = '[Data Mapping App] Call Test Sites Service', CHECK_FAULT_SECTIONS = '[Data Mapping App] Check for Fault Sections', CHECK_TEST_SITES = '[Data Mapping App] Check for Test Sites', @@ -40,6 +41,8 @@ export const callTestSitesService = createAction( ActionTypes.CALL_TEST_SITES_SERVICE ); +export const callMapService = createAction(ActionTypes.CALL_MAP_SERVICE); + export const checkFaultSections = createAction( ActionTypes.CHECK_FAULT_SECTIONS ); diff --git a/projects/nshmp-apps/src/app/source/data/state/app.effects.ts b/projects/nshmp-apps/src/app/source/data/state/app.effects.ts index 2289b08ef46cdd39e941c65899f089c6d9bac683..e1d3995b7ea27fbc86333afb7de3f6d570470bb2 100644 --- a/projects/nshmp-apps/src/app/source/data/state/app.effects.ts +++ b/projects/nshmp-apps/src/app/source/data/state/app.effects.ts @@ -1,9 +1,6 @@ import {HttpClient} from '@angular/common/http'; import {Injectable} from '@angular/core'; -import { - HazardRequestMetadata, - HazardUsageResponse, -} from '@ghsc/nshmp-web-utils/libs/nshmp-haz/www/hazard-service'; +import {HazardRequestMetadata} from '@ghsc/nshmp-web-utils/libs/nshmp-haz/www/hazard-service'; import { FaultSectionsResponse, FaultSectionUsage, @@ -60,6 +57,35 @@ export class AppEffects { ) ); + callMapService$ = createEffect(() => + this.actions$.pipe( + ofType(actions.callMapService), + concatLatestFrom(() => this.store.select(selectors.selectNshmService)), + exhaustMap(([, nshm]) => { + this.spinnerService.show('Getting Border ...'); + const url = `${nshm.url}${this.services.map}?raw=true`; + + return this.http.get<GeoJSON.FeatureCollection>(url).pipe( + map(response => { + this.spinnerService.remove(); + + const nshmBorder = response.features.find( + feature => feature.id !== 'Extents' + ); + + return actions.nshmBoundaryLayer({ + nshmBoundaryLayer: L.geoJSON(nshmBorder, { + style: { + fill: false, + }, + }), + }); + }) + ); + }) + ) + ); + callTestSitesService$ = createEffect(() => this.actions$.pipe( ofType(actions.callTestSitesService), @@ -98,8 +124,7 @@ export class AppEffects { init$ = createEffect(() => this.actions$.pipe( ofType(actions.init), - concatLatestFrom(() => this.store.select(selectors.selectControlForm)), - exhaustMap(([, form]) => { + exhaustMap(() => { this.spinnerService.show('Getting Metadata ...'); const faultSectionsUrl = `${this.baseUrl}${environment.webServices.nonNSHM.services.faultSections}`; @@ -114,25 +139,12 @@ export class AppEffects { return forkJoin([faultSectionCall, modelCall]).pipe( mergeMap(([faultSectionUsage, nshms]) => { this.spinnerService.remove(); - const nshm: HazardUsageResponse = nshms.usageResponses.get( - form.value.model - ); - const nshmBorder = nshm.response.model.map.features.find( - feature => feature.id !== 'Extents' - ); return [ actions.nshms({nshms}), actions.faultSectionsUsageResponse({ usageResponse: faultSectionUsage, }), - actions.nshmBoundaryLayer({ - nshmBoundaryLayer: L.geoJSON(nshmBorder, { - style: { - fill: false, - }, - }), - }), ]; }) ); diff --git a/projects/nshmp-apps/src/app/source/data/state/app.facade.ts b/projects/nshmp-apps/src/app/source/data/state/app.facade.ts index 5e1ec92f370238b79fb2da5c791fd9e17a1b9bd4..6de19d3589483983ce1a7d838366876b827d4ba6 100644 --- a/projects/nshmp-apps/src/app/source/data/state/app.facade.ts +++ b/projects/nshmp-apps/src/app/source/data/state/app.facade.ts @@ -55,6 +55,10 @@ export class AppFacade { this.store.dispatch(actions.callFaultSectionService()); } + callMapService(): void { + this.store.dispatch(actions.callMapService()); + } + callTestSitesService(): void { this.store.dispatch(actions.callTestSitesService()); } diff --git a/projects/nshmp-apps/src/app/source/data/state/app.reducer.ts b/projects/nshmp-apps/src/app/source/data/state/app.reducer.ts index e450448dfaaeec7eb45c23720f2d9d17fec03f05..50502154e44f574e8dc5180cf5d824a46e660f69 100644 --- a/projects/nshmp-apps/src/app/source/data/state/app.reducer.ts +++ b/projects/nshmp-apps/src/app/source/data/state/app.reducer.ts @@ -1,7 +1,5 @@ import * as nshmpLeaflet from '@ghsc/nshmp-web-utils/libs/leaflet'; -import {HazardUsageResponse} from '@ghsc/nshmp-web-utils/libs/nshmp-haz/www/hazard-service'; import {Action, createReducer, on} from '@ngrx/store'; -import * as L from 'leaflet'; import { disable, enable, @@ -23,14 +21,6 @@ const rawReducer = createReducer( onNgrxFormsAction(SetValueAction, (state, action) => { switch (action.controlId) { case `${CONTROL_FORM_ID}.${ControlFormIds.model}`: { - const nshm: HazardUsageResponse = state.nshms.usageResponses.get( - state.controlForm.value.model - ); - - const nshmBorder = nshm.response.model.map.features.find( - feature => feature.id !== 'Extents' - ); - const faultSectionNshms = state.faultSections.usageResponse.response.parameters.nshm.values; @@ -42,15 +32,14 @@ const rawReducer = createReducer( faultSectionNshms.includes(state.controlForm.value.model) ? enable(setValue(control, false)) : disable(setValue(control, false)), + hasNshmBoundaryLayer: control => setValue(control, false), + hasTestSitesLayer: control => setValue(control, false), })(state.controlForm), layers: { ...state.layers, faultSectionLayer: null, - nshmBoundaryLayer: L.geoJSON(nshmBorder, { - style: { - fill: false, - }, - }), + nshmBoundaryLayer: null, + testSitesLayer: null, }, }; } @@ -140,8 +129,22 @@ const rawReducer = createReducer( }; }), on(actions.nshmBoundaryLayer, (state, {nshmBoundaryLayer}) => { + let bounds = nshmBoundaryLayer.getBounds(); + const hasFaultSectionLayer = state.controlForm.value.hasFaultSectionLayer; + const faultSectionLayer = state.layers.faultSectionLayer; + const hasTestSitesLayer = state.controlForm.value.hasTestSitesLayer; + const testSitesLayer = state.layers.testSitesLayer; + + if (hasFaultSectionLayer && faultSectionLayer) { + bounds = bounds.extend(faultSectionLayer.getBounds()); + } + if (hasTestSitesLayer && testSitesLayer) { + bounds = bounds.extend(testSitesLayer.getBounds()); + } + return { ...state, + bounds, layers: { ...state.layers, nshmBoundaryLayer, diff --git a/projects/nshmp-apps/src/environments/web-services.ts b/projects/nshmp-apps/src/environments/web-services.ts index e45bf554e29ca9252c84fd5cdb1013ed833c8875..7c3df98201e0dfba24dd9cf50d07a43c8e7aef9b 100644 --- a/projects/nshmp-apps/src/environments/web-services.ts +++ b/projects/nshmp-apps/src/environments/web-services.ts @@ -62,6 +62,7 @@ export function webServices(baseUrl: string): WebServices { curveServices: { disagg: '/disagg', hazard: '/hazard', + map: '/map', probability: '/probability', rate: '/rate', sites: '/sites', @@ -79,6 +80,7 @@ export function webServices(baseUrl: string): WebServices { services: { curveServices: { hazard: '/hazard', + map: '/map', sites: '/sites', swagger: '/swagger', }, diff --git a/projects/nshmp-lib/src/lib/models/web-services.model.ts b/projects/nshmp-lib/src/lib/models/web-services.model.ts index daff8f5fe39d9113d1435ced6d4e693249969692..47bb581f2f3d421df6eb2011b0cb46ad8f020831 100644 --- a/projects/nshmp-lib/src/lib/models/web-services.model.ts +++ b/projects/nshmp-lib/src/lib/models/web-services.model.ts @@ -29,6 +29,7 @@ export interface AwsServices { export interface DynamicCurvesServices { disagg: string; hazard: string; + map: string; probability: string; rate: string; sites: string; @@ -86,6 +87,7 @@ export interface RtgmServices { export interface StaticCurvesServices { hazard: string; + map: string; sites: string; swagger: string; }