标签归档:LBS

php增加经纬度地址编码geohash扩展

geohash

php geohash extension (php geohash 扩展)

geohash简介:

geohash是一种地址编码,它能把二维的经纬度编码成一维的字符串。

geohash有以下几个特点:

首先,geohash用一个字符串表示经度和纬度两个坐标。某些情况下无法在两列上同时应用索引 (例如MySQL 4之前的版本,Google App Engine的数据层等),利用geohash,只需在一列上应用索引即可。

其次,geohash表示的并不是一个点,而是一个矩形区域。比如编码wx4g0ec19,它表示的是一个矩形区域。 使用者可以发布地址编码,既能表明自己位于北海公园附近,又不至于暴露自己的精确坐标,有助于隐私保护。

第三,编码的前缀可以表示更大的区域。例如wx4g0ec1,它的前缀wx4g0e表示包含编码wx4g0ec1在内的更大范围。
这个特性可以用于附近地点搜索。首先根据用户当前坐标计算geohash(例如wx4g0ec1)然后取其前缀进行查询 (SELECT * FROM
place WHERE geohash LIKE ‘wx4g0e%’),即可查询附近的所有地点。Geohash比直接用经纬度的高效很多。

编译

git clone https://github.com/shenzhe/geohash.git

执行:
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install

然后把 geohash.so 加入到php.ini中 

方法

/**
 *  $latitude    //纬度
 *  $longitude   //经度
 *  $precision   //精密度, 默认是12
 *  返回 $precision 长度的 string 
 */
geohash_encode($latitude, $longitude, $precision=12);  



/**
 *  $hash    //geohash_encode后的值
 *  返回 array // Array
 *					(
 *					    [latitude] => 39.416916975752
 *					    [longitude] => 100.92223992571
 *					    [north] => 39.416917059571
 *					    [east] => 100.92224009335
 *					    [south] => 100.92223992571
 *					    [west] => 100.92223975807
 *					)
 */
geohash_decode($hash);

/**
 *  $hash    //geohash_encode后的值
 *  返回 在$hash 8个方向的hash值 (顺序:N, NE, E, SE, S, SW, W, NW)
 *  
 *		  NW N NE
 *		    \|/
 *		  W - - E
 *		    /|\
 *		  SW S SE
 * 
 */
geohash_neighbors($hash);

/**
 *  $precision    //精密度
 *  返回 数组,array("width"=>12.0, "height"=>12.0) 
 *  表示矩形的宽和高
 */
geohash_dimension($precision);