123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- /*
- * 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 Region = require("./Region");
- /*
- * 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.
- */
- /**
- * Parse and decode geo json
- * @module echarts/coord/geo/parseGeoJson
- */
- function decode(json) {
- if (!json.UTF8Encoding) {
- return json;
- }
- var encodeScale = json.UTF8Scale;
- if (encodeScale == null) {
- encodeScale = 1024;
- }
- var features = json.features;
- for (var f = 0; f < features.length; f++) {
- var feature = features[f];
- var geometry = feature.geometry;
- var coordinates = geometry.coordinates;
- var encodeOffsets = geometry.encodeOffsets;
- for (var c = 0; c < coordinates.length; c++) {
- var coordinate = coordinates[c];
- if (geometry.type === 'Polygon') {
- coordinates[c] = decodePolygon(coordinate, encodeOffsets[c], encodeScale);
- } else if (geometry.type === 'MultiPolygon') {
- for (var c2 = 0; c2 < coordinate.length; c2++) {
- var polygon = coordinate[c2];
- coordinate[c2] = decodePolygon(polygon, encodeOffsets[c][c2], encodeScale);
- }
- }
- }
- } // Has been decoded
- json.UTF8Encoding = false;
- return json;
- }
- function decodePolygon(coordinate, encodeOffsets, encodeScale) {
- var result = [];
- var prevX = encodeOffsets[0];
- var prevY = encodeOffsets[1];
- for (var i = 0; i < coordinate.length; i += 2) {
- var x = coordinate.charCodeAt(i) - 64;
- var y = coordinate.charCodeAt(i + 1) - 64; // ZigZag decoding
- x = x >> 1 ^ -(x & 1);
- y = y >> 1 ^ -(y & 1); // Delta deocding
- x += prevX;
- y += prevY;
- prevX = x;
- prevY = y; // Dequantize
- result.push([x / encodeScale, y / encodeScale]);
- }
- return result;
- }
- /**
- * @alias module:echarts/coord/geo/parseGeoJson
- * @param {Object} geoJson
- * @param {string} nameProperty
- * @return {module:zrender/container/Group}
- */
- function _default(geoJson, nameProperty) {
- decode(geoJson);
- return zrUtil.map(zrUtil.filter(geoJson.features, function (featureObj) {
- // Output of mapshaper may have geometry null
- return featureObj.geometry && featureObj.properties && featureObj.geometry.coordinates.length > 0;
- }), function (featureObj) {
- var properties = featureObj.properties;
- var geo = featureObj.geometry;
- var coordinates = geo.coordinates;
- var geometries = [];
- if (geo.type === 'Polygon') {
- geometries.push({
- type: 'polygon',
- // According to the GeoJSON specification.
- // First must be exterior, and the rest are all interior(holes).
- exterior: coordinates[0],
- interiors: coordinates.slice(1)
- });
- }
- if (geo.type === 'MultiPolygon') {
- zrUtil.each(coordinates, function (item) {
- if (item[0]) {
- geometries.push({
- type: 'polygon',
- exterior: item[0],
- interiors: item.slice(1)
- });
- }
- });
- }
- var region = new Region(properties[nameProperty || 'name'], geometries, properties.cp);
- region.properties = properties;
- return region;
- });
- }
- module.exports = _default;
|