Skip to content

Instantly share code, notes, and snippets.

@mjaakko mjaakko/bbox2geohashes.js
Last active Jul 18, 2018

Embed
What would you like to do?
Converts a bounding box to geohashes
//Converts a bounding box bounded by minLat and maxLat and minLng and maxLng to a list of geohashes (e.g. ["60;24/19/84", "60;24/19/85"]) used for MQTT topic filters
function bbox2geohashes(minLat, minLng, maxLat, maxLng) {
var deltaLat = maxLat - minLat;
var deltaLng = maxLng - minLng;
var geohashLevel = Math.max(Math.ceil(Math.abs(Math.log10(deltaLat))), Math.ceil(Math.abs(Math.log10(deltaLng))));
var delta = Math.pow(10, -geohashLevel);
var geohashes = [];
var lat = truncate(minLat, geohashLevel);
while(lat < maxLat) {
var lng = truncate(minLng, geohashLevel);
while(lng < maxLng) {
geohashes.push(calculateGeohash(lat, lng, geohashLevel));
lng += delta;
}
lat += delta;
}
return geohashes;
}
function calculateGeohash(lat, lng, level) {
var geohash = Math.floor(lat)+";"+Math.floor(lng);
for(var i = 0; i < level; i++) {
geohash += "/";
geohash += lat.toFixed(level + 1).split(".")[1][i];
geohash += lng.toFixed(level + 1).split(".")[1][i];
}
return geohash;
}
function truncate(x, n) {
if (n == 0) {
return x;
}
var split = x.toFixed(n+1).split(".");
return parseFloat(split[0]+"."+split[1].substring(0, n));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.