php实现的geohash

$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;
}

转载于:https://my.oschina.net/xming4321/blog/134194

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值