| /* |
| * 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 { EChartsExtensionInstallRegisters } from '../../extension'; |
| import GeoModel from '../../coord/geo/GeoModel'; |
| import geoCreator from '../../coord/geo/geoCreator'; |
| import { ActionInfo } from '../../util/types'; |
| import { each } from 'zrender/src/core/util'; |
| import GlobalModel from '../../model/Global'; |
| import { updateCenterAndZoom, RoamPaylod } from '../../action/roamHelper'; |
| import MapSeries from '../../chart/map/MapSeries'; |
| import GeoView from './GeoView'; |
| |
| export function install(registers: EChartsExtensionInstallRegisters) { |
| |
| registers.registerCoordinateSystem('geo', geoCreator); |
| |
| registers.registerComponentModel(GeoModel); |
| registers.registerComponentView(GeoView); |
| |
| |
| function makeAction( |
| method: 'toggleSelected' | 'select' | 'unSelect', |
| actionInfo: ActionInfo |
| ): void { |
| actionInfo.update = 'geo:updateSelectStatus'; |
| registers.registerAction(actionInfo, function (payload, ecModel) { |
| const selected = {} as {[regionName: string]: boolean}; |
| const allSelected = [] as ({ name: string[], geoIndex: number })[]; |
| |
| ecModel.eachComponent( |
| { mainType: 'geo', query: payload}, |
| function (geoModel: GeoModel) { |
| geoModel[method](payload.name); |
| const geo = geoModel.coordinateSystem; |
| |
| each(geo.regions, function (region) { |
| selected[region.name] = geoModel.isSelected(region.name) || false; |
| }); |
| |
| // Notice: there might be duplicated name in different regions. |
| const names = [] as string[]; |
| each(selected, function (v, name) { |
| selected[name] && names.push(name); |
| }); |
| allSelected.push({ |
| geoIndex: geoModel.componentIndex, |
| // Use singular, the same naming convention as the event `selectchanged`. |
| name: names |
| }); |
| } |
| ); |
| |
| return { |
| selected: selected, |
| allSelected: allSelected, |
| name: payload.name |
| }; |
| }); |
| } |
| |
| makeAction('toggleSelected', { |
| type: 'geoToggleSelect', |
| event: 'geoselectchanged' |
| }); |
| makeAction('select', { |
| type: 'geoSelect', |
| event: 'geoselected' |
| }); |
| makeAction('unSelect', { |
| type: 'geoUnSelect', |
| event: 'geounselected' |
| }); |
| |
| /** |
| * @payload |
| * @property {string} [componentType=series] |
| * @property {number} [dx] |
| * @property {number} [dy] |
| * @property {number} [zoom] |
| * @property {number} [originX] |
| * @property {number} [originY] |
| */ |
| registers.registerAction({ |
| type: 'geoRoam', |
| event: 'geoRoam', |
| update: 'updateTransform' |
| }, function (payload: RoamPaylod, ecModel: GlobalModel) { |
| const componentType = payload.componentType || 'series'; |
| |
| ecModel.eachComponent( |
| { mainType: componentType, query: payload }, |
| function (componentModel: GeoModel | MapSeries) { |
| const geo = componentModel.coordinateSystem; |
| if (geo.type !== 'geo') { |
| return; |
| } |
| |
| const res = updateCenterAndZoom( |
| geo, payload, (componentModel as GeoModel).get('scaleLimit') |
| ); |
| |
| componentModel.setCenter |
| && componentModel.setCenter(res.center); |
| |
| componentModel.setZoom |
| && componentModel.setZoom(res.zoom); |
| |
| // All map series with same `map` use the same geo coordinate system |
| // So the center and zoom must be in sync. Include the series not selected by legend |
| if (componentType === 'series') { |
| each((componentModel as MapSeries).seriesGroup, function (seriesModel) { |
| seriesModel.setCenter(res.center); |
| seriesModel.setZoom(res.zoom); |
| }); |
| } |
| } |
| ); |
| }); |
| } |