| /* | |
| * 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 encode(json) { | |
| if (json.UTF8Encoding) { | |
| return; | |
| } | |
| json.UTF8Encoding = true; | |
| var features = json.features; | |
| features.forEach(function (feature){ | |
| var encodeOffsets = feature.geometry.encodeOffsets = []; | |
| var coordinates = feature.geometry.coordinates; | |
| if (feature.geometry.type === 'MultiPolygon') { | |
| coordinates.forEach(function (polygon, idx1){ | |
| encodeOffsets[idx1] = []; | |
| polygon.forEach(function (coordinate, idx2) { | |
| coordinates[idx1][idx2] = encodeRing( | |
| coordinate, encodeOffsets[idx1][idx2] = [] | |
| ); | |
| }); | |
| }); | |
| } | |
| else if (feature.geometry.type == 'Polygon' | |
| || feature.geometry.type == 'MultiLineString' | |
| ) { | |
| coordinates.forEach(function (coordinate, idx){ | |
| coordinates[idx] = encodeRing( | |
| coordinate, encodeOffsets[idx] = [] | |
| ); | |
| }); | |
| } | |
| else if (feature.geometry.type === 'LineString') { | |
| feature.geometry.coordinates = encodeRing(coordinates, encodeOffsets) | |
| } | |
| }); | |
| return json; | |
| } | |
| function encodeRing(coordinates, encodeOffsets) { | |
| var result = ''; | |
| var prevX = quantize(coordinates[0][0]); | |
| var prevY = quantize(coordinates[0][1]); | |
| // Store the origin offset | |
| encodeOffsets[0] = prevX; | |
| encodeOffsets[1] = prevY; | |
| for (var i = 0; i < coordinates.length; i++) { | |
| var point = coordinates[i]; | |
| result += encodePoint(point[0], prevX); | |
| result += encodePoint(point[1], prevY); | |
| prevX = quantize(point[0]); | |
| prevY = quantize(point[1]); | |
| } | |
| return result; | |
| } | |
| function quantize(val) { | |
| return Math.ceil(val * 1024); | |
| } | |
| function encodePoint(val, prev){ | |
| // Quantization | |
| val = quantize(val); | |
| // var tmp = val; | |
| // Delta | |
| var delta = val - prev; | |
| if (((delta << 1) ^ (delta >> 15)) + 64 === 8232) { | |
| //WTF, 8232 will get syntax error in js code | |
| delta--; | |
| } | |
| // ZigZag | |
| delta = (delta << 1) ^ (delta >> 15); | |
| // add offset and get unicode | |
| return String.fromCharCode(delta + 64); | |
| } | |
| // Export for testing. | |
| if (typeof module !== 'undefined') { | |
| module.exports = encode; | |
| } | |
| else { | |
| window.encodeGeoJSON = encode; | |
| } |