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