| /* |
| * 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 { each } from 'zrender/src/core/util'; |
| import parseGeoJson from './parseGeoJson'; |
| import { makeInner } from '../../util/model'; // Built-in GEO fixer. |
| |
| import fixNanhai from './fix/nanhai'; |
| import fixTextCoord from './fix/textCoord'; |
| import fixGeoCoord from './fix/geoCoord'; |
| import fixDiaoyuIsland from './fix/diaoyuIsland'; |
| var inner = makeInner(); |
| export default { |
| /** |
| * @param {string} mapName |
| * @param {Object} mapRecord {specialAreas, geoJSON} |
| * @return {Object} {regions, boundingRect} |
| */ |
| load: function (mapName, mapRecord) { |
| var parsed = inner(mapRecord).parsed; |
| |
| if (parsed) { |
| return parsed; |
| } |
| |
| var specialAreas = mapRecord.specialAreas || {}; |
| var geoJSON = mapRecord.geoJSON; |
| var regions; // https://jsperf.com/try-catch-performance-overhead |
| |
| try { |
| regions = geoJSON ? parseGeoJson(geoJSON) : []; |
| } catch (e) { |
| throw new Error('Invalid geoJson format\n' + e.message); |
| } |
| |
| each(regions, function (region) { |
| var regionName = region.name; |
| fixTextCoord(mapName, region); |
| fixGeoCoord(mapName, region); |
| fixDiaoyuIsland(mapName, region); // Some area like Alaska in USA map needs to be tansformed |
| // to look better |
| |
| var specialArea = specialAreas[regionName]; |
| |
| if (specialArea) { |
| region.transformTo(specialArea.left, specialArea.top, specialArea.width, specialArea.height); |
| } |
| }); |
| fixNanhai(mapName, regions); |
| return inner(mapRecord).parsed = { |
| regions: regions, |
| boundingRect: getBoundingRect(regions) |
| }; |
| } |
| }; |
| |
| function getBoundingRect(regions) { |
| var rect; |
| |
| for (var i = 0; i < regions.length; i++) { |
| var regionRect = regions[i].getBoundingRect(); |
| rect = rect || regionRect.clone(); |
| rect.union(regionRect); |
| } |
| |
| return rect; |
| } |