当前位置:Gxlcms > PHP教程 > php+mongodb判断坐标是否在指定多边形区域内的实例

php+mongodb判断坐标是否在指定多边形区域内的实例

时间:2021-07-01 10:21:17 帮助过:20人阅读

本篇文章主要介绍了php+mongodb判断坐标是否在指定多边形区域内的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

MongoDB是一个基于分布式文件存储的数据库,并提供创建基于地理空间的索引的能力,本文将提供使用PHP连接mongodb,判断坐标是否在指定多边形区域内的实例。

1.定义多边形区域

多边形的坐标点如下:

113.314882,23.163055
113.355845,23.167042
113.370289,23.149564
113.356779,23.129758
113.338238,23.13913
113.330979,23.124706
113.313588,23.140858
113.323865,23.158204
113.314882,23.163055

2.在mongodb创建数据库

  1. use testdb;
  2. db.createUser(
  3. {
  4. "user":"root",
  5. "pwd":"123456",
  6. "roles":[{"role" : "readWrite", "db":"testdb"}]
  7. }
  8. );
  9. db.auth(
  10. {
  11. "user":"root",
  12. "pwd":"123456"
  13. }
  14. );

3.使用php插入多边形数据,并判断坐标是否在区域内

MongoDBPolygons.class.php

  1. <?php
  2. /**
  3. * MongoDB 多边形区域类,判断坐标是否在多边形区域内
  4. * Date: 2016-09-30
  5. * Author: fdipzone
  6. * Ver: 1.0
  7. *
  8. * Func:
  9. * public add 创建多边形区域
  10. * public checkInArea 判断坐标是否在多边形区域内
  11. * private connect 连接mongodb
  12. */
  13. class MongoDBPolygons { // class start
  14. // mongo db 连接
  15. private $_conn = null;
  16. // mongo db
  17. private $_db = null;
  18. /**
  19. * 初始化
  20. * @param String $host mongodb地址
  21. * @param String $user 用户名
  22. * @param String $passwd 密码
  23. * @param String $db 数据库
  24. */
  25. public function __construct($host, $user, $passwd, $db){
  26. $this->_conn = $this->connect($host, $user, $passwd);
  27. $this->_db = $db;
  28. }
  29. /**
  30. * 插入多边形数据
  31. * @param String $collname 表名称
  32. * @param Array $data 多边形坐标数据
  33. * @param Array $index 索引
  34. * @return Int
  35. */
  36. public function add($collname, $data, $index){
  37. // 创建索引
  38. $cmd = array(
  39. 'createIndexes' => $collname,
  40. 'indexes' => array(
  41. array(
  42. 'name' => 'index',
  43. 'key' => $index,
  44. 'ns' => $this->_db.'.'.$collname
  45. )
  46. )
  47. );
  48. $command = new MongoDB\Driver\Command($cmd);
  49. $this->_conn->executeCommand($this->_db, $command);
  50. // 插入数据
  51. $bulk = new MongoDB\Driver\BulkWrite();
  52. $inserted = 0;
  53. if($data){
  54. foreach($data as $k=>$v){
  55. $bulk->insert($v);
  56. }
  57. $result = $this->_conn->executeBulkWrite($this->_db.'.'.$collname, $bulk);
  58. $inserted = $result->getInsertedCount();
  59. }
  60. return $inserted;
  61. }
  62. /**
  63. * 判断是否在多边形区域
  64. * @param String $collname 表名称
  65. * @param Decimal $longitude 经度
  66. * @param Decimal $latitude 纬度
  67. * @return Array
  68. */
  69. public function checkInArea($collname, $longitude, $latitude){
  70. $filter = array(
  71. 'polygons' => array(
  72. '$geoIntersects' => array(
  73. '$geometry' => array(
  74. 'type' => 'Point',
  75. 'coordinates' => array(doubleval($longitude), doubleval($latitude))
  76. )
  77. )
  78. )
  79. );
  80. $options = array('limit'=>1);
  81. $query = new MongoDB\Driver\Query($filter, $options);
  82. $cursor = $this->_conn->executeQuery($this->_db.'.'.$collname, $query);
  83. $result = array();
  84. if($cursor){
  85. foreach($cursor as $v){
  86. $result[] = $v;
  87. }
  88. }
  89. return $result? $result[0] : $result;
  90. }
  91. /**
  92. * 连接mongodb
  93. * @param String $host 数据库地址
  94. * @param String $user 用户名
  95. * @param String $passwd 密码
  96. * @return DBLink
  97. */
  98. private function connect($host, $user, $passwd){
  99. $server = 'mongodb://'.$user.':'.$passwd.'@'.$host;
  100. try{
  101. $conn = new MongoDB\Driver\Manager();
  102. } catch (MongoDB\Driver\Exception\ConnectionException $e){
  103. throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);
  104. }
  105. return $conn;
  106. }
  107. } // class end
  108. ?>

demo.php

  1. <?php
  2. require 'MongoDBPolygons.class.php';
  3. echo '<strong>php MongoDB 判断坐标是否在多边形区域内演示:</strong><br><br>';
  4. // 调用mongodb多边形区域类
  5. $oMongoDBPolygons = new MongoDBPolygons('localhost','root','123456','testdb');
  6. // 索引
  7. $index = array('polygons'=>'2dsphere');
  8. // 插入多边形区域数据
  9. $data = array(
  10. array(
  11. 'polygons' => array(
  12. 'type' => 'Polygon',
  13. 'coordinates' => array(
  14. array(
  15. array(doubleval(113.314882),doubleval(23.163055)),
  16. array(doubleval(113.355845),doubleval(23.167042)),
  17. array(doubleval(113.370289),doubleval(23.149564)),
  18. array(doubleval(113.356779),doubleval(23.129758)),
  19. array(doubleval(113.338238),doubleval(23.13913)),
  20. array(doubleval(113.330979),doubleval(23.124706)),
  21. array(doubleval(113.313588),doubleval(23.140858)),
  22. array(doubleval(113.323865),doubleval(23.158204)),
  23. array(doubleval(113.314882),doubleval(23.163055)),
  24. )
  25. )
  26. ),
  27. )
  28. );
  29. $inserted = $oMongoDBPolygons->add('geo', $data, $index);
  30. if($inserted){
  31. echo '1.成功插入多边形数据<br><br>';
  32. }
  33. // 判断坐标是否在多边形区域
  34. echo '2.判断广州东站坐标(113.330908, 23.155678)是否在区域内<br>';
  35. $result = $oMongoDBPolygons->checkInArea('geo', 113.330908, 23.155678);
  36. echo '结果:广州东站坐标(113.330908, 23.155678)'.( $result? '在区域内' : '在区域外');
  37. echo '<br><br>';
  38. echo '3.判断宏发大厦坐标(113.33831, 23.137335)是否在区域内<br>';
  39. $result = $oMongoDBPolygons->checkInArea('geo', 113.33831, 23.137335);
  40. echo '结果:宏发大厦坐标(113.33831, 23.137335)'.( $result? '在区域内' : '在区域外');
  41. echo '<br><br>';
  42. ?>

输出:
php MongoDB 判断坐标是否在多边形区域内演示:

1.成功插入多边形数据

2.判断广州东站坐标(113.330908, 23.155678)是否在区域内
结果:广州东站坐标(113.330908, 23.155678)在区域内

3.判断宏发大厦坐标(113.33831, 23.137335)是否在区域内
结果:宏发大厦坐标(113.33831, 23.137335)在区域外

广州东站坐标

宏发大厦坐标

以上就是本文的全部内容,希望对大家的学习有所帮助。


相关推荐:

PHP 实现页面静态化的几种方法详解

PHP读取CSV大文件导入数据库的方法

php实现和c#一致的DES加密解密的方法

以上就是php+mongodb判断坐标是否在指定多边形区域内的实例的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行