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