decode解码 geohash_php版本的geohash类库,包括查询周边8个格子的hash编码

classGeoHash

{

privatestatic$table=“0123456789bcdefghjkmnpqrstuvwxyz”;

privatestatic $bits=array(

0b10000, 0b01000, 0b00100, 0b00010, 0b00001

);

publicstatic functionencode($lat, $lng, $prec = 0.00001)

{

$minlng = -180;

$maxlng = 180;

$minlat = -90;

$maxlat = 90;

$hash = array();

$error = 180;

$isEven = true;

$chr = 0b00000;

$b = 0;

while($error >= $prec) {

if($isEven) {

$next = ($minlng + $maxlng) / 2;

if($lng > $next) {

$chr |= self::$bits[$b];

$minlng = $next;

} else{

$maxlng = $next;

}

} else{

$next = ($minlat + $maxlat) / 2;

if($lat > $next) {

$chr |= self::$bits[$b];

$minlat = $next;

} else{

$maxlat = $next;

}

}

$isEven = !$isEven;

if($b < 4) {

$b++;

} else{

$hash[] = self::$table[$chr];

$error = max($maxlng – $minlng, $maxlat – $minlat);

$b = 0;

$chr = 0b00000;

}

}

returnjoin(”, $hash);

}

publicstatic functionexpand($hash, $prec = 0.00001)

{

list($minlng, $maxlng, $minlat, $maxlat) = self::decode($hash);

$dlng = ($maxlng – $minlng) / 2;

$dlat = ($maxlat – $minlat) / 2;

return array(

self::encode($minlng – $dlng, $maxlat + $dlat, $prec),

self::encode($minlng + $dlng, $maxlat + $dlat, $prec),

self::encode($maxlng + $dlng, $maxlat + $dlat, $prec),

self::encode($minlng – $dlng, $maxlat – $dlat, $prec),

self::encode($maxlng + $dlng, $maxlat – $dlat, $prec),

self::encode($minlng – $dlng, $minlat – $dlat, $prec),

self::encode($minlng + $dlng, $minlat – $dlat, $prec),

self::encode($maxlng + $dlng, $minlat – $dlat, $prec),

);

}

publicstatic functiongetRect($hash)

{

list($minlng, $maxlng, $minlat, $maxlat) = self::decode($hash);

return array(

array($minlng, $minlat),

array($minlng, $maxlat),

array($maxlng, $maxlat),

array($maxlng, $minlat),

);

}

/**

* decode a geohash string to a geographical area

*

* @var $hash string geohash

* @return array array($minlng, $maxlng, $minlat, $maxlat);

*/

publicstatic functiondecode($hash)

{

$minlng = -180;

$maxlng = 180;

$minlat = -90;

$maxlat = 90;

for($i=0,$c=strlen($hash); $i

$v = strpos(self::$table, $hash[$i]);

if(1&$i) {

if(16&$v) {

$minlat = ($minlat + $maxlat) / 2;

} else{

$maxlat = ($minlat + $maxlat) / 2;

}

if(8&$v) {

$minlng = ($minlng + $maxlng) / 2;

} else{

$maxlng = ($minlng + $maxlng) / 2;

}

if(4&$v) {

$minlat = ($minlat + $maxlat) / 2;

} else{

$maxlat = ($minlat + $maxlat) / 2;

}

if(2&$v) {

$minlng = ($minlng + $maxlng) / 2;

} else{

$maxlng = ($minlng + $maxlng) / 2;

}

if(1&$v) {

$minlat = ($minlat + $maxlat) / 2;

} else{

$maxlat = ($minlat + $maxlat) / 2;

}

} else{

if(16&$v) {

$minlng = ($minlng + $maxlng) / 2;

} else{

$maxlng = ($minlng + $maxlng) / 2;

}

if(8&$v) {

$minlat = ($minlat + $maxlat) / 2;

} else{

$maxlat = ($minlat + $maxlat) / 2;

}

if(4&$v) {

$minlng = ($minlng + $maxlng) / 2;

} else{

$maxlng = ($minlng + $maxlng) / 2;

}

if(2&$v) {

$minlat = ($minlat + $maxlat) / 2;

} else{

$maxlat = ($minlat + $maxlat) / 2;

}

if(1&$v) {

$minlng = ($minlng + $maxlng) / 2;

} else{

$maxlng = ($minlng + $maxlng) / 2;

}

}

}

return array($minlat, $maxlat, $minlng, $maxlng);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值