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