您的位置:首页 > 其它

在SAE上开发LBS应用之 根据一点的经纬度实现附近点的查询

2012-10-11 11:57 441 查看
http://blog.sina.com.cn/s/blog_62ba0fdd0100tul4.html

这年头和LBS相关的应用越来越火。从foursquare的热闹程度就可见一般(什么,没听过 foursquare…. 哥们,你 out 了)。和 LBS有关的应用一般都包括一些共同的操作,最常见的一个,就是找附近的东东(餐馆, 商店, 妞…)。 所以, 这里就抛出了一个问题, 怎样才能知道两个物体离得近呢?

例如:用iPhone/android手机定位得到理想国际大厦的经纬度:39.98123848,
116.30683690 然后查找附近的妞




<?php

require_once('geohash.class.php');

$geohash = new Geohash;

//得到这点的hash值

$hash = $geohash->encode(39.98123848, 116.30683690);

//取前缀,前缀约长范围越小

$prefix = substr($hash, 0, 6);

//取出相邻八个区域

$neighbors = $geohash->neighbors($prefix);

array_push($neighbors, $prefix);

print_r($neighbors);



?>



得到9个geohash值:



Array

(

[top] => wx4eqx

[bottom] => wx4eqt

[right] => wx4eqy

[left] => wx4eqq

[topleft] => wx4eqr

[topright] => wx4eqz

[bottomright] => wx4eqv

[bottomleft] => wx4eqm

[0] => wx4eqw

)



范围如图:











用sql语句查询:



SELECT * FROM xy WHERE geohash LIKE 'wx4eqw%';

SELECT * FROM xy WHERE geohash LIKE 'wx4eqx%';

SELECT * FROM xy WHERE geohash LIKE 'wx4eqt%';

SELECT * FROM xy WHERE geohash LIKE 'wx4eqy%';

SELECT * FROM xy WHERE geohash LIKE 'wx4eqq%';

SELECT * FROM xy WHERE geohash LIKE 'wx4eqr%';

SELECT * FROM xy WHERE geohash LIKE 'wx4eqz%';

SELECT * FROM xy WHERE geohash LIKE 'wx4eqv%';

SELECT * FROM xy WHERE geohash LIKE 'wx4eqm%';



看一下是否用上索引(一共有50多万行测试数据):













geohash.class.php下载地址: http://vdisk.weibo.com/s/ybAZ



资料:

· geohash演示: http://openlocation.org/geohash/geohash-js/

· wiki: http://en.wikipedia.org/wiki/Geohash

· 原理: http://blog.sina.com.cn/s/blog_62ba0fdd0100tr98.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐