/* * 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. */ function decode(json) { if (json.UTF8Encoding) { return; } var jsonCompressed = json; var encodeScale = jsonCompressed.UTF8Scale; if (encodeScale == null) { encodeScale = 1024; } var features = jsonCompressed.features; features.forEach(function (feature) { var geometry = feature.geometry; var encodeOffsets = geometry.encodeOffsets; var coordinates = geometry.coordinates; // Geometry may be appeded manually in the script after json loaded. // In this case this geometry is usually not encoded. if (!encodeOffsets) { return; } switch (geometry.type) { case 'LineString': geometry.coordinates = decodeRing(coordinates, encodeOffsets, encodeScale); break; case 'Polygon': case 'MultiLineString': decodeRings(coordinates, encodeOffsets, encodeScale); break; case 'MultiPolygon': zrUtil.each(coordinates, function (rings, idx) { return decodeRings(rings, encodeOffsets[idx], encodeScale) }); } }); // Has been decoded jsonCompressed.UTF8Encoding = false; } function decodeRings(rings, encodeOffsets, encodeScale) { for (var c = 0; c < rings.length; c++) { rings[c] = decodeRing( rings[c], encodeOffsets[c], encodeScale ); } } function decodeRing(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; } // Export for testing. if (typeof module !== 'undefined') { module.exports = decode; } else { window.decodeGeoJSON = decode; }