| /* | 
 | * 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<GeoResource>(); | 
 |  | 
 |  | 
 | 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<GeoJSONResource['getMapForUser']> { | 
 |         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<GeoResource['load']> { | 
 |         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); | 
 |     } | 
 |  | 
 | }; |