php 地理位置距离最近,PHP实现搜索地理位置及计算两点地理位置间距离的实例...

搜索热词

地理位置搜寻LBS,存储每个地点的经纬度坐标,搜寻附近的地点,建立地理位置索引可提高查询效率。

mongodb地理位置索引,2d和2dsphere,对应平面和球面。

1.创建lbs集合存放地点坐标

PHP;">

use lbs;

db.lbs.insert(

{

loc:{

type: "Point",coordinates: [113.332264,23.156206]

},name: "广州东站"

}

)

db.lbs.insert(

{

loc:{

type: "Point",coordinates: [113.330611,23.147234]

},name: "林和西"

}

)

db.lbs.insert(

{

loc:{

type: "Point",coordinates: [113.328095,23.165376]

},name: "天平架"

}

)

2.创建地理位置索引

PHP;">

db.lbs.ensureIndex(

{

loc: "2dsphere"

}

)

3.查询附近的坐标

当前位置为:时代广场,

坐标:

搜寻附近一公里内的点,由近到远排序

PHP;">

db.lbs.find(

{

loc: {

$near:{

$geometry:{

type: "Point",coordinates: [113.323568,23.146436]

},$maxDistance: 1000

}

}

}

)

搜寻结果:

代码如下:

{ "_id" : ObjectId("556a651996f1ac2add8928fa"),"loc" : { "type" : "Point","coordinates" : [ 113.330611,23.147234 ] },"name" : "林和西" }

PHP;">

selectDB($dbname);

} catch (MongoException $e){

throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(),31);

}

return $db;

}

// 插入坐标到mongodb

function add($dbconn,$tablename,$longitude,$latitude,$name){

$index = array('loc'=>'2dsphere');

$data = array(

'loc' => array(

'type' => 'Point','coordinates' => array(doubleval($longitude),doubleval($latitude))

),'name' => $name

);

$coll = $dbconn->selectCollection($tablename);

$coll->ensureIndex($index);

$result = $coll->insert($data,array('w' => true));

return (isset($result['ok']) && !empty($result['ok'])) ? true : false;

}

// 搜寻附近的坐标

function query($dbconn,$maxdistance,$limit=10){

$param = array(

'loc' => array(

'$nearSphere' => array(

'$geometry' => array(

'type' => 'Point',doubleval($latitude)),),'$maxDistance' => $maxdistance*1000

)

)

);

$coll = $dbconn->selectCollection($tablename);

$cursor = $coll->find($param);

$cursor = $cursor->limit($limit);

$result = array();

foreach($cursor as $v){

$result[] = $v;

}

return $result;

}

$db = conn('localhost','lbs','root','123456');

// 随机插入100条坐标纪录

for($i=0; $i<100; $i++){

$longitude = '113.3'.mt_rand(10000,99999);

$latitude = '23.15'.mt_rand(1000,9999);

$name = 'name'.mt_rand(10000,99999);

add($db,$name);

}

// 搜寻一公里内的点

$longitude = 113.323568;

$latitude = 23.146436;

$maxdistance = 1;

$result = query($db,$maxdistance);

print_r($result);

?>

演示PHP代码,首先需要在mongodb的lbs中创建用户和执行auth。方法如下:

PHP;">

use lbs;

db.createUser(

{

"user":"root","pwd":"123456","roles":[]

}

)

db.auth(

{

"user":"root","pwd":"123456"

}

)

计算两点地理坐标的距离功能:根据圆周率和地球半径系数与两点坐标的经纬度,计算两点之间的球面距离。

获取两点坐标距离:

PHP;">

$EARTH_RADIUS = 6370.996; // 地球半径系数

$PI = 3.1415926;

$radLat1 = $latitude1 $PI / 180.0;

$radLat2 = $latitude2 $PI / 180.0;

$radLng1 = $longitude1 $PI / 180.0;

$radLng2 = $longitude2 $PI /180.0;

$a = $radLat1 - $radLat2;

$b = $radLng1 - $radLng2;

$distance = 2 asin(sqrt(pow(sin($a/2),2) + cos($radLat1) cos($radLat2) pow(sin($b/2),2)));

$distance = $distance $EARTH_RADIUS * 1000;

if($unit==2){

$distance = $distance / 1000;

}

return round($distance,$decimal);

}

// 起点坐标

$longitude1 = 113.330405;

$latitude1 = 23.147255;

// 终点坐标

$longitude2 = 113.314271;

$latitude2 = 23.1323;

$distance = getDistance($longitude1,1);

echo $distance.'m'; // 2342.38m

$distance = getDistance($longitude1,2);

echo $distance.'km'; // 2.34km

?>

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值