当前位置: 首页 > 工具软件 > PHP Geo > 使用案例 >

geohash php扩展,php实现的geohash

孔瑾瑜
2023-12-01

$geo = encode_geohash(30.63578, 104.031601, 12); //神马时候做成个php扩展把!

echo $geo;

print_r(decode_geohash($geo));

function encode_geohash($latitude, $longitude, $deep)

{

$BASE32= '0123456789bcdefghjkmnpqrstuvwxyz';

$bits = array(16,8,4,2,1);

$lat = array(-90.0, 90.0);

$lon = array(-180.0, 180.0);

$bit = $ch = $i = 0;

$is_even = 1;

$i = 0;

$mid;

$geohash = '';

while($i < $deep)

{

if ($is_even)

{

$mid = ($lon[0] + $lon[1]) / 2;

if($longitude > $mid)

{

$ch |= $bits[$bit];

$lon[0] = $mid;

}else{

$lon[1] = $mid;

}

} else{

$mid = ($lat[0] + $lat[1]) / 2;

if($latitude > $mid)

{

$ch |= $bits[$bit];

$lat[0] = $mid;

}else{

$lat[1] = $mid;

}

}

$is_even = !$is_even;

if ($bit < 4)

$bit++;

else {

$i++;

$geohash .= $BASE32[$ch];

$bit = 0;

$ch = 0;

}

}

return $geohash;

}

function decode_geohash($geohash)

{

$geohash = strtolower($geohash);

$BASE32= '0123456789bcdefghjkmnpqrstuvwxyz';

$bits = array(16,8,4,2,1);

$lat = array(-90.0, 90.0);

$lon = array(-180.0, 180.0);

$hashlen = strlen($geohash);

$is_even = 1;

for($i = 0; $i < $hashlen; $i++ )

{

$of = strpos($BASE32,$geohash[$i]);

for ($j=0; $j<5; $j++) {

$mask = $bits[$j];

if ($is_even) {

$lon[!($of&$mask)] = ($lon[0] + $lon[1])/2;

} else {

$lat[!($of&$mask)] = ($lat[0] + $lat[1])/2;

}

$is_even = !$is_even;

}

}

$point = array( 0 => ($lat[0] + $lat[1]) / 2, 1 => ($lon[0] + $lon[1]) / 2);

return $point;

}

 类似资料: