PHP实现搜索地理位置及计算两点地理位置间距离的实例

2025-05-29 0 44

地理位置搜寻
LBS,存储每个地点的经纬度坐标,搜寻附近的地点,建立地理位置索引可提高查询效率。
mongodb地理位置索引,2d和2dsphere,对应平面和球面。

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31
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.创建地理位置索引

?

1

2

3

4

5
db.lbs.ensureIndex(

{

loc: "2dsphere"

}

)

3.查询附近的坐标
当前位置为:时代广场,
坐标:

?

1
113.323568, 23.146436

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13
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代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72
<?php

// 连接mongodb

function conn($dbhost, $dbname, $dbuser, $dbpasswd){

$server = 'mongodb://'.$dbuser.':'.$dbpasswd.'@'.$dbhost.'/'.$dbname;

try{

$conn = new MongoClient($server);

$db = $conn->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, $tablename, $longitude, $latitude, $maxdistance, $limit=10){

$param = array(

'loc' => array(

'$nearSphere' => array(

'$geometry' => array(

'type' => 'Point',

'coordinates' => array(doubleval($longitude), 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, 'lbs', $longitude, $latitude, $name);

}

// 搜寻一公里内的点

$longitude = 113.323568;

$latitude = 23.146436;

$maxdistance = 1;

$result = query($db, 'lbs', $longitude, $latitude, $maxdistance);

print_r($result);

?>

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
use lbs;

db.createUser(

{

"user":"root",

"pwd":"123456",

"roles":[]

}

)

db.auth(

{

"user":"root",

"pwd":"123456"

}

)

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


获取两点坐标距离:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51
<?php

/**

* 计算两点地理坐标之间的距离

* @param Decimal $longitude1 起点经度

* @param Decimal $latitude1 起点纬度

* @param Decimal $longitude2 终点经度

* @param Decimal $latitude2 终点纬度

* @param Int $unit 单位 1:米 2:公里

* @param Int $decimal 精度 保留小数位数

* @return Decimal

*/

function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=2, $decimal=2){

$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, $latitude1, $longitude2, $latitude2, 1);

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

$distance = getDistance($longitude1, $latitude1, $longitude2, $latitude2, 2);

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

?>

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 PHP实现搜索地理位置及计算两点地理位置间距离的实例 https://www.kuaiidc.com/99807.html

相关文章

猜你喜欢
发表评论
暂无评论