|
本帖最后由 xnceo 于 2015-7-30 10:30 编辑
把用户的坐标记录到内存中,如memcached , redis 中,加快查询速度,如没有这两个,那就经纬分开记录到数据库字段中,并分别建立索引,查询时分两次查询,不要写成一条where条件,否则索起不到多大效果。按经纬范围搜索出大概的数据再计算。
当然位置的计算也可以分散到用户的设备上,不过这样要改一改,将上面的PHP改成javascript版的计算距离,我给个我用的吧:
- <script type="text/javascript">
- /*
- 获取坐标地址:http://api.map**.**/lbsapi/getpoint/index.html
- 计算地图两点距离,返回的数组由距离(d[0])和单位(d[1])组成
- dis(起点经,纬,终点经,纬)
- */
- function dis(sLon, sLat, eLon, eLat){
- if( (sLon==0 && sLat==0) || (eLon==0 && eLat==0) || sLon == undefined || sLat == undefined || eLon == undefined || eLat == undefined ){
- return new Array("unknow");
- }
- var arr = new Array(2);
-
- var radLat1 = sLat * Math.PI/180.0;
- var radLat2 = eLat * Math.PI/180.0;
- var a = radLat1 - radLat2;
- var b = (sLon * Math.PI/180.0) - (eLon * Math.PI/180.0);
- var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b/2),2)));
- s = s * 6378.14;
- s = Math.round(s*1000)/1000;
- if(s<1){
- s *= 1000;
- arr[1] = 'm';
- }else{
- s = Math.round(s*10)/10;
- arr[1] = 'km';
- }
- arr[0] = s;
- return arr;
- }
- //示例 //
- var d = dis(0,0, 120.152559,30.258524);
- document.write( d.join("") +"<br>");
- //白堤
- var d = dis(120.158452,30.264621, 120.152559,30.258524);
- document.write( d.join("") +"<br>");
- //堤 -> 校
- var d = dis(120.158452,30.264621, 120.172704,30.296707);
- document.write( d.join("") +"<br>");
- //堤 -> 金
- var d = dis(120.158452,30.264621, 119.745303,29.12065);
- document.write( d.join("") +"<br>");
- </script>
复制代码 |
|