grafana/public/app/plugins/panel/geomap/layers/basemaps/esri.ts
Ryan McKinley c2aee2b6da
Geomap: Add alpha day/night layer (#50201)
Co-authored-by: drew08t <drew08@gmail.com>
2022-06-20 19:35:03 +02:00

110 lines
3.0 KiB
TypeScript

import Map from 'ol/Map';
import { MapLayerRegistryItem, MapLayerOptions, GrafanaTheme2, RegistryItem, Registry, EventBus } from '@grafana/data';
import { xyzTiles, defaultXYZConfig, XYZConfig } from './generic';
interface PublicServiceItem extends RegistryItem {
slug: string;
}
const CUSTOM_SERVICE = 'custom';
const DEFAULT_SERVICE = 'streets';
export const publicServiceRegistry = new Registry<PublicServiceItem>(() => [
{
id: DEFAULT_SERVICE,
name: 'World Street Map',
slug: 'World_Street_Map',
},
{
id: 'world-imagery',
name: 'World Imagery',
slug: 'World_Imagery',
},
{
id: 'world-physical',
name: 'World Physical',
slug: 'World_Physical_Map',
},
{
id: 'topo',
name: 'Topographic',
slug: 'World_Topo_Map',
},
{
id: 'usa-topo',
name: 'USA Topographic',
slug: 'USA_Topo_Maps',
},
{
id: 'ocean',
name: 'World Ocean',
slug: 'Ocean/World_Ocean_Base',
},
{
id: CUSTOM_SERVICE,
name: 'Custom MapServer',
description: 'Use a custom MapServer with pre-cached values',
slug: '',
},
]);
export interface ESRIXYZConfig extends XYZConfig {
server: string;
}
export const esriXYZTiles: MapLayerRegistryItem<ESRIXYZConfig> = {
id: 'esri-xyz',
name: 'ArcGIS MapServer',
description: 'Add layer from an ESRI ArcGIS MapServer',
isBaseMap: true,
create: async (map: Map, options: MapLayerOptions<ESRIXYZConfig>, eventBus: EventBus, theme: GrafanaTheme2) => {
const cfg = { ...options.config };
const svc = publicServiceRegistry.getIfExists(cfg.server ?? DEFAULT_SERVICE)!;
if (svc.id !== CUSTOM_SERVICE) {
const base = 'https://services.arcgisonline.com/ArcGIS/rest/services/';
cfg.url = `${base}${svc.slug}/MapServer/tile/{z}/{y}/{x}`;
cfg.attribution = `Tiles © <a href="${base}${svc.slug}/MapServer">ArcGIS</a>`;
}
const opts = { ...options, config: cfg as XYZConfig };
return xyzTiles.create(map, opts, eventBus, theme).then((xyz) => {
xyz.registerOptionsUI = (builder) => {
builder
.addSelect({
path: 'config.server',
name: 'Server instance',
settings: {
options: publicServiceRegistry.selectOptions().options,
},
})
.addTextInput({
path: 'config.url',
name: 'URL template',
description: 'Must include {x}, {y} or {-y}, and {z} placeholders',
settings: {
placeholder: defaultXYZConfig.url,
},
showIf: (cfg) => cfg.config?.server === CUSTOM_SERVICE,
})
.addTextInput({
path: 'config.attribution',
name: 'Attribution',
settings: {
placeholder: defaultXYZConfig.attribution,
},
showIf: (cfg) => cfg.config?.server === CUSTOM_SERVICE,
});
};
return xyz;
});
},
defaultOptions: {
server: DEFAULT_SERVICE,
},
};
export const esriLayers = [esriXYZTiles];