UNPKG

echarts

Version:

A powerful charting and visualization library for browser

189 lines (147 loc) 5.89 kB
require('./GeoModel'); var Geo = require('./Geo'); var layout = require('../../util/layout'); var zrUtil = require('zrender/lib/core/util'); var mapDataStores = {}; /** * Resize method bound to the geo * @param {module:echarts/coord/geo/GeoModel|module:echarts/chart/map/MapModel} geoModel * @param {module:echarts/ExtensionAPI} api */ function resizeGeo (geoModel, api) { var rect = this.getBoundingRect(); var boxLayoutOption = geoModel.getBoxLayoutParams(); // 0.75 rate boxLayoutOption.aspect = rect.width / rect.height * 0.75; var viewRect = layout.getLayoutRect(boxLayoutOption, { width: api.getWidth(), height: api.getHeight() }); this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height); var roamDetailModel = geoModel.getModel('roamDetail'); var panX = roamDetailModel.get('x') || 0; var panY = roamDetailModel.get('y') || 0; var zoom = roamDetailModel.get('zoom') || 1; this.setPan(panX, panY); this.setZoom(zoom); } /** * @param {module:echarts/coord/Geo} geo * @param {module:echarts/model/Model} model * @inner */ function setGeoCoords(geo, model) { zrUtil.each(model.get('geoCoord'), function (geoCoord, name) { geo.addGeoCoord(name, geoCoord); }); } function mapNotExistsError(name) { console.error('Map ' + name + ' not exists'); } var geoCreator = { // For deciding which dimensions to use when creating list data dimensions: Geo.prototype.dimensions, create: function (ecModel, api) { var geoList = []; // FIXME Create each time may be slow ecModel.eachComponent('geo', function (geoModel, idx) { var name = geoModel.get('map'); var mapData = mapDataStores[name]; if (!mapData) { mapNotExistsError(name); } var geo = new Geo( name + idx, name, mapData && mapData.geoJson, mapData && mapData.specialAreas, geoModel.get('nameMap') ); geoList.push(geo); setGeoCoords(geo, geoModel); geoModel.coordinateSystem = geo; geo.model = geoModel; // Inject resize method geo.resize = resizeGeo; geo.resize(geoModel, api); }); ecModel.eachSeries(function (seriesModel) { var coordSys = seriesModel.get('coordinateSystem'); if (coordSys === 'geo') { var geoIndex = seriesModel.get('geoIndex') || 0; seriesModel.coordinateSystem = geoList[geoIndex]; } }); // If has map series var mapModelGroupBySeries = {}; ecModel.eachSeriesByType('map', function (seriesModel) { var mapType = seriesModel.get('map'); mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || []; mapModelGroupBySeries[mapType].push(seriesModel); }); zrUtil.each(mapModelGroupBySeries, function (mapSeries, mapType) { var mapData = mapDataStores[mapType]; if (!mapData) { mapNotExistsError(name); } var nameMapList = zrUtil.map(mapSeries, function (singleMapSeries) { return singleMapSeries.get('nameMap'); }); var geo = new Geo( mapType, mapType, mapData && mapData.geoJson, mapData && mapData.specialAreas, zrUtil.mergeAll(nameMapList) ); geoList.push(geo); // Inject resize method geo.resize = resizeGeo; geo.resize(mapSeries[0], api); zrUtil.each(mapSeries, function (singleMapSeries) { singleMapSeries.coordinateSystem = geo; setGeoCoords(geo, singleMapSeries); }); }); return geoList; }, /** * @param {string} mapName * @param {Object|string} geoJson * @param {Object} [specialAreas] * * @example * $.get('USA.json', function (geoJson) { * echarts.registerMap('USA', geoJson); * // Or * echarts.registerMap('USA', { * geoJson: geoJson, * specialAreas: {} * }) * }); */ registerMap: function (mapName, geoJson, specialAreas) { if (geoJson.geoJson && !geoJson.features) { specialAreas = geoJson.specialAreas; geoJson = geoJson.geoJson; } if (typeof geoJson === 'string') { geoJson = (typeof JSON !== 'undefined' && JSON.parse) ? JSON.parse(geoJson) : (new Function('return (' + geoJson + ');'))(); } mapDataStores[mapName] = { geoJson: geoJson, specialAreas: specialAreas }; }, /** * @param {string} mapName * @return {Object} */ getMap: function (mapName) { return mapDataStores[mapName]; } }; // Inject methods into echarts var echarts = require('../../echarts'); echarts.registerMap = geoCreator.registerMap; echarts.getMap = geoCreator.getMap; // TODO echarts.loadMap = function () {}; echarts.registerCoordinateSystem('geo', geoCreator);