| /* | |
| * 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; | |
| } |