private function GeoHash::decode in geoPHP 8
Same name and namespace in other branches
- 7 geoPHP/lib/adapters/GeoHash.class.php \GeoHash::decode()
@author algorithm based on code by Alexander Songe <a@songe.me>
Parameters
string $hash a geohash:
See also
https://github.com/asonge/php-geohash/issues/1
1 call to GeoHash::decode()
- GeoHash::read in geoPHP/
lib/ adapters/ GeoHash.class.php - Convert the geohash to a Point. The point is 2-dimensional.
File
- geoPHP/
lib/ adapters/ GeoHash.class.php, line 130
Class
- GeoHash
- PHP Geometry GeoHash encoder/decoder.
Code
private function decode($hash) {
$ll = array();
$minlat = -90;
$maxlat = 90;
$minlon = -180;
$maxlon = 180;
$latE = 90;
$lonE = 180;
for ($i = 0, $c = strlen($hash); $i < $c; $i++) {
$v = strpos($this->table, $hash[$i]);
if (1 & $i) {
if (16 & $v) {
$minlat = ($minlat + $maxlat) / 2;
}
else {
$maxlat = ($minlat + $maxlat) / 2;
}
if (8 & $v) {
$minlon = ($minlon + $maxlon) / 2;
}
else {
$maxlon = ($minlon + $maxlon) / 2;
}
if (4 & $v) {
$minlat = ($minlat + $maxlat) / 2;
}
else {
$maxlat = ($minlat + $maxlat) / 2;
}
if (2 & $v) {
$minlon = ($minlon + $maxlon) / 2;
}
else {
$maxlon = ($minlon + $maxlon) / 2;
}
if (1 & $v) {
$minlat = ($minlat + $maxlat) / 2;
}
else {
$maxlat = ($minlat + $maxlat) / 2;
}
$latE /= 8;
$lonE /= 4;
}
else {
if (16 & $v) {
$minlon = ($minlon + $maxlon) / 2;
}
else {
$maxlon = ($minlon + $maxlon) / 2;
}
if (8 & $v) {
$minlat = ($minlat + $maxlat) / 2;
}
else {
$maxlat = ($minlat + $maxlat) / 2;
}
if (4 & $v) {
$minlon = ($minlon + $maxlon) / 2;
}
else {
$maxlon = ($minlon + $maxlon) / 2;
}
if (2 & $v) {
$minlat = ($minlat + $maxlat) / 2;
}
else {
$maxlat = ($minlat + $maxlat) / 2;
}
if (1 & $v) {
$minlon = ($minlon + $maxlon) / 2;
}
else {
$maxlon = ($minlon + $maxlon) / 2;
}
$latE /= 4;
$lonE /= 8;
}
}
$ll['minlat'] = $minlat;
$ll['minlon'] = $minlon;
$ll['maxlat'] = $maxlat;
$ll['maxlon'] = $maxlon;
$ll['medlat'] = round(($minlat + $maxlat) / 2, max(1, -round(log10($latE))) - 1);
$ll['medlon'] = round(($minlon + $maxlon) / 2, max(1, -round(log10($lonE))) - 1);
return $ll;
}