kibana-123
Version:
Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic
85 lines (79 loc) • 2.23 kB
JavaScript
/* eslint-disable */
/*
* Decodes geohash to object containing
* top-left and bottom-right corners of
* rectangle and center point.
*
* geohash.js
* Geohash library for Javascript
* (c) 2008 David Troy
* Distributed under the MIT License
*
* @method refine_interval
* @param interval {Array} [long, lat]
* @param cd {Number}
* @param mask {Number}
* @return {Object} interval
*/
function decodeGeoHash(geohash) {
let BITS = [16, 8, 4, 2, 1];
let BASE32 = '0123456789bcdefghjkmnpqrstuvwxyz';
let is_even = 1;
let lat = [];
let lon = [];
lat[0] = -90.0;
lat[1] = 90.0;
lon[0] = -180.0;
lon[1] = 180.0;
let lat_err = 90.0;
let lon_err = 180.0;
for (let i = 0; i < geohash.length; i++) {
let c = geohash[i];
let cd = BASE32.indexOf(c);
for (let j = 0; j < 5; j++) {
let mask = BITS[j];
if (is_even) {
lon_err /= 2;
refine_interval(lon, cd, mask);
} else {
lat_err /= 2;
refine_interval(lat, cd, mask);
}
is_even = !is_even;
}
}
lat[2] = (lat[0] + lat[1]) / 2;
lon[2] = (lon[0] + lon[1]) / 2;
return { latitude: lat, longitude: lon};
}
function refine_interval(interval, cd, mask) {
if (cd & mask) {
interval[0] = (interval[0] + interval[1]) / 2;
} else {
interval[1] = (interval[0] + interval[1]) / 2;
}
}
export default decodeGeoHash;
/**
* Get the number of geohash cells for a given precision
*
* @param {number} precision the geohash precision (1<=precision<=12).
* @param {number} axis constant for the axis 0=lengthwise (ie. columns, along longitude), 1=heightwise (ie. rows, along latitude).
* @returns {number} Number of geohash cells (rows or columns) at that precision
*/
function geohashCells(precision, axis) {
let cells = 1;
for (let i = 1; i <= precision; i += 1) {
//On odd precisions, rows divide by 4 and columns by 8. Vice-versa on even precisions.
cells *= (i % 2 === axis) ? 4 : 8;
}
return cells;
}
/**
* Get the number of geohash columns (world-wide) for a given precision
* @param precision the geohash precision
* @returns {number} the number of columns
*/
export function geohashColumns(precision) {
return geohashCells(precision, 0);
}