|  | /* | 
|  | * 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); | 
|  | } | 
|  |  | 
|  | }; |