/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import { createHashMap } from 'zrender/src/core/util'; import { GeoSVGResource } from './GeoSVGResource'; import { GeoJSON, GeoJSONSourceInput, GeoResource, GeoSpecialAreas, NameMap, GeoSVGSourceInput } from './geoTypes'; import { GeoJSONResource } from './GeoJSONResource'; type MapInput = GeoJSONMapInput | SVGMapInput; interface GeoJSONMapInput { geoJSON: GeoJSONSourceInput; specialAreas: GeoSpecialAreas; } interface GeoJSONMapInputCompat extends GeoJSONMapInput { geoJson: GeoJSONSourceInput; } interface SVGMapInput { svg: GeoSVGSourceInput; } const storage = createHashMap(); export default { /** * Compatible with previous `echarts.registerMap`. * * @usage * ```js * * echarts.registerMap('USA', geoJson, specialAreas); * * echarts.registerMap('USA', { * geoJson: geoJson, * specialAreas: {...} * }); * echarts.registerMap('USA', { * geoJSON: geoJson, * specialAreas: {...} * }); * * echarts.registerMap('airport', { * svg: svg * } * ``` * * Note: * Do not support that register multiple geoJSON or SVG * one map name. Because different geoJSON and SVG have * different unit. It's not easy to make sure how those * units are mapping/normalize. * If intending to use multiple geoJSON or SVG, we can * use multiple geo coordinate system. */ registerMap: function ( mapName: string, rawDef: MapInput | GeoJSONSourceInput, rawSpecialAreas?: GeoSpecialAreas ): void { if ((rawDef as SVGMapInput).svg) { const resource = new GeoSVGResource( mapName, (rawDef as SVGMapInput).svg ); storage.set(mapName, resource); } else { // Recommend: // echarts.registerMap('eu', { geoJSON: xxx, specialAreas: xxx }); // Backward compatibility: // echarts.registerMap('eu', geoJSON, specialAreas); // echarts.registerMap('eu', { geoJson: xxx, specialAreas: xxx }); let geoJSON = (rawDef as GeoJSONMapInputCompat).geoJson || (rawDef as GeoJSONMapInput).geoJSON; if (geoJSON && !(rawDef as GeoJSON).features) { rawSpecialAreas = (rawDef as GeoJSONMapInput).specialAreas; } else { geoJSON = rawDef as GeoJSONSourceInput; } const resource = new GeoJSONResource( mapName, geoJSON, rawSpecialAreas ); storage.set(mapName, resource); } }, getGeoResource(mapName: string): GeoResource { return storage.get(mapName); }, /** * Only for exporting to users. * **MUST NOT** used internally. */ getMapForUser: function (mapName: string): ReturnType { const resource = storage.get(mapName); // Do not support return SVG until some real requirement come. return resource && resource.type === 'geoJSON' && (resource as GeoJSONResource).getMapForUser(); }, load: function (mapName: string, nameMap: NameMap, nameProperty: string): ReturnType { const resource = storage.get(mapName); if (!resource) { if (__DEV__) { console.error( 'Map ' + mapName + ' not exists. The GeoJSON of the map must be provided.' ); } return; } return resource.load(nameMap, nameProperty); } };