218 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
 | |
| /*
 | |
| * 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.
 | |
| */
 | |
| 
 | |
| var zrUtil = require("zrender/lib/core/util");
 | |
| 
 | |
| var BoundingRect = require("zrender/lib/core/BoundingRect");
 | |
| 
 | |
| var View = require("../View");
 | |
| 
 | |
| var geoSourceManager = require("./geoSourceManager");
 | |
| 
 | |
| /*
 | |
| * 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.
 | |
| */
 | |
| 
 | |
| /**
 | |
|  * [Geo description]
 | |
|  * For backward compatibility, the orginal interface:
 | |
|  * `name, map, geoJson, specialAreas, nameMap` is kept.
 | |
|  *
 | |
|  * @param {string|Object} name
 | |
|  * @param {string} map Map type
 | |
|  *        Specify the positioned areas by left, top, width, height
 | |
|  * @param {Object.<string, string>} [nameMap]
 | |
|  *        Specify name alias
 | |
|  * @param {boolean} [invertLongitute=true]
 | |
|  */
 | |
| function Geo(name, map, nameMap, invertLongitute) {
 | |
|   View.call(this, name);
 | |
|   /**
 | |
|    * Map type
 | |
|    * @type {string}
 | |
|    */
 | |
| 
 | |
|   this.map = map;
 | |
|   var source = geoSourceManager.load(map, nameMap);
 | |
|   this._nameCoordMap = source.nameCoordMap;
 | |
|   this._regionsMap = source.regionsMap;
 | |
|   this._invertLongitute = invertLongitute == null ? true : invertLongitute;
 | |
|   /**
 | |
|    * @readOnly
 | |
|    */
 | |
| 
 | |
|   this.regions = source.regions;
 | |
|   /**
 | |
|    * @type {module:zrender/src/core/BoundingRect}
 | |
|    */
 | |
| 
 | |
|   this._rect = source.boundingRect;
 | |
| }
 | |
| 
 | |
| Geo.prototype = {
 | |
|   constructor: Geo,
 | |
|   type: 'geo',
 | |
| 
 | |
|   /**
 | |
|    * @param {Array.<string>}
 | |
|    * @readOnly
 | |
|    */
 | |
|   dimensions: ['lng', 'lat'],
 | |
| 
 | |
|   /**
 | |
|    * If contain given lng,lat coord
 | |
|    * @param {Array.<number>}
 | |
|    * @readOnly
 | |
|    */
 | |
|   containCoord: function (coord) {
 | |
|     var regions = this.regions;
 | |
| 
 | |
|     for (var i = 0; i < regions.length; i++) {
 | |
|       if (regions[i].contain(coord)) {
 | |
|         return true;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return false;
 | |
|   },
 | |
| 
 | |
|   /**
 | |
|    * @override
 | |
|    */
 | |
|   transformTo: function (x, y, width, height) {
 | |
|     var rect = this.getBoundingRect();
 | |
|     var invertLongitute = this._invertLongitute;
 | |
|     rect = rect.clone();
 | |
| 
 | |
|     if (invertLongitute) {
 | |
|       // Longitute is inverted
 | |
|       rect.y = -rect.y - rect.height;
 | |
|     }
 | |
| 
 | |
|     var rawTransformable = this._rawTransformable;
 | |
|     rawTransformable.transform = rect.calculateTransform(new BoundingRect(x, y, width, height));
 | |
|     rawTransformable.decomposeTransform();
 | |
| 
 | |
|     if (invertLongitute) {
 | |
|       var scale = rawTransformable.scale;
 | |
|       scale[1] = -scale[1];
 | |
|     }
 | |
| 
 | |
|     rawTransformable.updateTransform();
 | |
| 
 | |
|     this._updateTransform();
 | |
|   },
 | |
| 
 | |
|   /**
 | |
|    * @param {string} name
 | |
|    * @return {module:echarts/coord/geo/Region}
 | |
|    */
 | |
|   getRegion: function (name) {
 | |
|     return this._regionsMap.get(name);
 | |
|   },
 | |
|   getRegionByCoord: function (coord) {
 | |
|     var regions = this.regions;
 | |
| 
 | |
|     for (var i = 0; i < regions.length; i++) {
 | |
|       if (regions[i].contain(coord)) {
 | |
|         return regions[i];
 | |
|       }
 | |
|     }
 | |
|   },
 | |
| 
 | |
|   /**
 | |
|    * Add geoCoord for indexing by name
 | |
|    * @param {string} name
 | |
|    * @param {Array.<number>} geoCoord
 | |
|    */
 | |
|   addGeoCoord: function (name, geoCoord) {
 | |
|     this._nameCoordMap.set(name, geoCoord);
 | |
|   },
 | |
| 
 | |
|   /**
 | |
|    * Get geoCoord by name
 | |
|    * @param {string} name
 | |
|    * @return {Array.<number>}
 | |
|    */
 | |
|   getGeoCoord: function (name) {
 | |
|     return this._nameCoordMap.get(name);
 | |
|   },
 | |
| 
 | |
|   /**
 | |
|    * @override
 | |
|    */
 | |
|   getBoundingRect: function () {
 | |
|     return this._rect;
 | |
|   },
 | |
| 
 | |
|   /**
 | |
|    * @param {string|Array.<number>} data
 | |
|    * @param {boolean} noRoam
 | |
|    * @param {Array.<number>} [out]
 | |
|    * @return {Array.<number>}
 | |
|    */
 | |
|   dataToPoint: function (data, noRoam, out) {
 | |
|     if (typeof data === 'string') {
 | |
|       // Map area name to geoCoord
 | |
|       data = this.getGeoCoord(data);
 | |
|     }
 | |
| 
 | |
|     if (data) {
 | |
|       return View.prototype.dataToPoint.call(this, data, noRoam, out);
 | |
|     }
 | |
|   },
 | |
| 
 | |
|   /**
 | |
|    * @override
 | |
|    */
 | |
|   convertToPixel: zrUtil.curry(doConvert, 'dataToPoint'),
 | |
| 
 | |
|   /**
 | |
|    * @override
 | |
|    */
 | |
|   convertFromPixel: zrUtil.curry(doConvert, 'pointToData')
 | |
| };
 | |
| zrUtil.mixin(Geo, View);
 | |
| 
 | |
| function doConvert(methodName, ecModel, finder, value) {
 | |
|   var geoModel = finder.geoModel;
 | |
|   var seriesModel = finder.seriesModel;
 | |
|   var coordSys = geoModel ? geoModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem // For map.
 | |
|   || (seriesModel.getReferringComponents('geo')[0] || {}).coordinateSystem : null;
 | |
|   return coordSys === this ? coordSys[methodName](value) : null;
 | |
| }
 | |
| 
 | |
| var _default = Geo;
 | |
| module.exports = _default; | 
