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