| 
/* 
 | 
* 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. 
 | 
*/ 
 | 
  
 | 
  
 | 
/** 
 | 
 * AUTO-GENERATED FILE. DO NOT MODIFY. 
 | 
 */ 
 | 
  
 | 
/* 
 | 
* 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 * as zrUtil from 'zrender/lib/core/util.js'; 
 | 
import Geo, { geo2DDimensions } from './Geo.js'; 
 | 
import * as layout from '../../util/layout.js'; 
 | 
import * as numberUtil from '../../util/number.js'; 
 | 
import geoSourceManager from './geoSourceManager.js'; 
 | 
import * as vector from 'zrender/lib/core/vector.js'; 
 | 
/** 
 | 
 * Resize method bound to the geo 
 | 
 */ 
 | 
function resizeGeo(geoModel, api) { 
 | 
  var boundingCoords = geoModel.get('boundingCoords'); 
 | 
  if (boundingCoords != null) { 
 | 
    var leftTop_1 = boundingCoords[0]; 
 | 
    var rightBottom_1 = boundingCoords[1]; 
 | 
    if (!(isFinite(leftTop_1[0]) && isFinite(leftTop_1[1]) && isFinite(rightBottom_1[0]) && isFinite(rightBottom_1[1]))) { 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        console.error('Invalid boundingCoords'); 
 | 
      } 
 | 
    } else { 
 | 
      // Sample around the lng/lat rect and use projection to calculate actual bounding rect. 
 | 
      var projection_1 = this.projection; 
 | 
      if (projection_1) { 
 | 
        var xMin = leftTop_1[0]; 
 | 
        var yMin = leftTop_1[1]; 
 | 
        var xMax = rightBottom_1[0]; 
 | 
        var yMax = rightBottom_1[1]; 
 | 
        leftTop_1 = [Infinity, Infinity]; 
 | 
        rightBottom_1 = [-Infinity, -Infinity]; 
 | 
        // TODO better way? 
 | 
        var sampleLine = function (x0, y0, x1, y1) { 
 | 
          var dx = x1 - x0; 
 | 
          var dy = y1 - y0; 
 | 
          for (var i = 0; i <= 100; i++) { 
 | 
            var p = i / 100; 
 | 
            var pt = projection_1.project([x0 + dx * p, y0 + dy * p]); 
 | 
            vector.min(leftTop_1, leftTop_1, pt); 
 | 
            vector.max(rightBottom_1, rightBottom_1, pt); 
 | 
          } 
 | 
        }; 
 | 
        // Top 
 | 
        sampleLine(xMin, yMin, xMax, yMin); 
 | 
        // Right 
 | 
        sampleLine(xMax, yMin, xMax, yMax); 
 | 
        // Bottom 
 | 
        sampleLine(xMax, yMax, xMin, yMax); 
 | 
        // Left 
 | 
        sampleLine(xMin, yMax, xMax, yMin); 
 | 
      } 
 | 
      this.setBoundingRect(leftTop_1[0], leftTop_1[1], rightBottom_1[0] - leftTop_1[0], rightBottom_1[1] - leftTop_1[1]); 
 | 
    } 
 | 
  } 
 | 
  var rect = this.getBoundingRect(); 
 | 
  var centerOption = geoModel.get('layoutCenter'); 
 | 
  var sizeOption = geoModel.get('layoutSize'); 
 | 
  var viewWidth = api.getWidth(); 
 | 
  var viewHeight = api.getHeight(); 
 | 
  var aspect = rect.width / rect.height * this.aspectScale; 
 | 
  var useCenterAndSize = false; 
 | 
  var center; 
 | 
  var size; 
 | 
  if (centerOption && sizeOption) { 
 | 
    center = [numberUtil.parsePercent(centerOption[0], viewWidth), numberUtil.parsePercent(centerOption[1], viewHeight)]; 
 | 
    size = numberUtil.parsePercent(sizeOption, Math.min(viewWidth, viewHeight)); 
 | 
    if (!isNaN(center[0]) && !isNaN(center[1]) && !isNaN(size)) { 
 | 
      useCenterAndSize = true; 
 | 
    } else { 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        console.warn('Given layoutCenter or layoutSize data are invalid. Use left/top/width/height instead.'); 
 | 
      } 
 | 
    } 
 | 
  } 
 | 
  var viewRect; 
 | 
  if (useCenterAndSize) { 
 | 
    viewRect = {}; 
 | 
    if (aspect > 1) { 
 | 
      // Width is same with size 
 | 
      viewRect.width = size; 
 | 
      viewRect.height = size / aspect; 
 | 
    } else { 
 | 
      viewRect.height = size; 
 | 
      viewRect.width = size * aspect; 
 | 
    } 
 | 
    viewRect.y = center[1] - viewRect.height / 2; 
 | 
    viewRect.x = center[0] - viewRect.width / 2; 
 | 
  } else { 
 | 
    // Use left/top/width/height 
 | 
    var boxLayoutOption = geoModel.getBoxLayoutParams(); 
 | 
    boxLayoutOption.aspect = aspect; 
 | 
    viewRect = layout.getLayoutRect(boxLayoutOption, { 
 | 
      width: viewWidth, 
 | 
      height: viewHeight 
 | 
    }); 
 | 
  } 
 | 
  this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height); 
 | 
  this.setCenter(geoModel.get('center'), api); 
 | 
  this.setZoom(geoModel.get('zoom')); 
 | 
} 
 | 
// Back compat for ECharts2, where the coord map is set on map series: 
 | 
// {type: 'map', geoCoord: {'cityA': [116.46,39.92], 'cityA': [119.12,24.61]}}, 
 | 
function setGeoCoords(geo, model) { 
 | 
  zrUtil.each(model.get('geoCoord'), function (geoCoord, name) { 
 | 
    geo.addGeoCoord(name, geoCoord); 
 | 
  }); 
 | 
} 
 | 
var GeoCreator = /** @class */function () { 
 | 
  function GeoCreator() { 
 | 
    // For deciding which dimensions to use when creating list data 
 | 
    this.dimensions = geo2DDimensions; 
 | 
  } 
 | 
  GeoCreator.prototype.create = function (ecModel, api) { 
 | 
    var geoList = []; 
 | 
    function getCommonGeoProperties(model) { 
 | 
      return { 
 | 
        nameProperty: model.get('nameProperty'), 
 | 
        aspectScale: model.get('aspectScale'), 
 | 
        projection: model.get('projection') 
 | 
      }; 
 | 
    } 
 | 
    // FIXME Create each time may be slow 
 | 
    ecModel.eachComponent('geo', function (geoModel, idx) { 
 | 
      var mapName = geoModel.get('map'); 
 | 
      var geo = new Geo(mapName + idx, mapName, zrUtil.extend({ 
 | 
        nameMap: geoModel.get('nameMap') 
 | 
      }, getCommonGeoProperties(geoModel))); 
 | 
      geo.zoomLimit = geoModel.get('scaleLimit'); 
 | 
      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) { 
 | 
      if (!seriesModel.getHostGeoModel()) { 
 | 
        var mapType = seriesModel.getMapType(); 
 | 
        mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || []; 
 | 
        mapModelGroupBySeries[mapType].push(seriesModel); 
 | 
      } 
 | 
    }); 
 | 
    zrUtil.each(mapModelGroupBySeries, function (mapSeries, mapType) { 
 | 
      var nameMapList = zrUtil.map(mapSeries, function (singleMapSeries) { 
 | 
        return singleMapSeries.get('nameMap'); 
 | 
      }); 
 | 
      var geo = new Geo(mapType, mapType, zrUtil.extend({ 
 | 
        nameMap: zrUtil.mergeAll(nameMapList) 
 | 
      }, getCommonGeoProperties(mapSeries[0]))); 
 | 
      geo.zoomLimit = zrUtil.retrieve.apply(null, zrUtil.map(mapSeries, function (singleMapSeries) { 
 | 
        return singleMapSeries.get('scaleLimit'); 
 | 
      })); 
 | 
      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; 
 | 
  }; 
 | 
  /** 
 | 
   * Fill given regions array 
 | 
   */ 
 | 
  GeoCreator.prototype.getFilledRegions = function (originRegionArr, mapName, nameMap, nameProperty) { 
 | 
    // Not use the original 
 | 
    var regionsArr = (originRegionArr || []).slice(); 
 | 
    var dataNameMap = zrUtil.createHashMap(); 
 | 
    for (var i = 0; i < regionsArr.length; i++) { 
 | 
      dataNameMap.set(regionsArr[i].name, regionsArr[i]); 
 | 
    } 
 | 
    var source = geoSourceManager.load(mapName, nameMap, nameProperty); 
 | 
    zrUtil.each(source.regions, function (region) { 
 | 
      var name = region.name; 
 | 
      var regionOption = dataNameMap.get(name); 
 | 
      // apply specified echarts style in GeoJSON data 
 | 
      var specifiedGeoJSONRegionStyle = region.properties && region.properties.echartsStyle; 
 | 
      if (!regionOption) { 
 | 
        regionOption = { 
 | 
          name: name 
 | 
        }; 
 | 
        regionsArr.push(regionOption); 
 | 
      } 
 | 
      specifiedGeoJSONRegionStyle && zrUtil.merge(regionOption, specifiedGeoJSONRegionStyle); 
 | 
    }); 
 | 
    return regionsArr; 
 | 
  }; 
 | 
  return GeoCreator; 
 | 
}(); 
 | 
var geoCreator = new GeoCreator(); 
 | 
export default geoCreator; 
 |