之前写过一篇《mongodb 判断坐标是否在指定多边形区域内的方法》
是基于mongodb实现,所有操作都是在mongodb执行。
这次提供使用php连接mongodb,判断坐标是否在指定多边形区域内的实例。
1.定义多边形区域
多边形的坐标点如下:113.314882,23.163055113.355845,23.167042113.370289,23.149564113.356779,23.129758113.338238,23.13913113.330979,23.124706113.313588,23.140858113.323865,23.158204113.314882,23.163055
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2.在mongodb创建数据库
use testdb;db.createUser( { "user":"root", "pwd":"123456", "roles":[{"role" : "readWrite", "db":"testdb"}] } );db.auth( { "user":"root", "pwd":"123456" } );
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
3.使用php插入多边形数据,并判断坐标是否在区域内
MongoDBPolygons.class.php
<?php/** * MongoDB 多边形区域类,判断坐标是否在多边形区域内 * Date: 2016-09-30 * Author: fdipzone * Ver: 1.0 * * Func: * public add 创建多边形区域 * public checkInArea 判断坐标是否在多边形区域内 * private connect 连接mongodb */class MongoDBPolygons { // class start // mongo db 连接 private $_conn = null; // mongo db private $_db = null; /** * 初始化 * @param String $host mongodb地址 * @param String $user 用户名 * @param String $passwd 密码 * @param String $db 数据库 */ public function __construct($host, $user, $passwd, $db){ $this->_conn = $this->connect($host, $user, $passwd); $this->_db = $db; } /** * 插入多边形数据 * @param String $collname 表名称 * @param Array $data 多边形坐标数据 * @param Array $index 索引 * @return Int */ public function add($collname, $data, $index){ // 创建索引 $cmd = array( 'createIndexes' => $collname, 'indexes' => array( array( 'name' => 'index', 'key' => $index, 'ns' => $this->_db.'.'.$collname ) ) ); $command = new MongoDB\Driver\Command($cmd); $this->_conn->executeCommand($this->_db, $command); // 插入数据 $bulk = new MongoDB\Driver\BulkWrite(); $inserted = 0; if($data){ foreach($data as $k=>$v){ $bulk->insert($v); } $result = $this->_conn->executeBulkWrite($this->_db.'.'.$collname, $bulk); $inserted = $result->getInsertedCount(); } return $inserted; } /** * 判断是否在多边形区域 * @param String $collname 表名称 * @param Decimal $longitude 经度 * @param Decimal $latitude 纬度 * @return Array */ public function checkInArea($collname, $longitude, $latitude){ $filter = array( 'polygons' => array( '$geoIntersects' => array( '$geometry' => array( 'type' => 'Point', 'coordinates' => array(doubleval($longitude), doubleval($latitude)) ) ) ) ); $options = array('limit'=>1); $query = new MongoDB\Driver\Query($filter, $options); $cursor = $this->_conn->executeQuery($this->_db.'.'.$collname, $query); $result = array(); if($cursor){ foreach($cursor as $v){ $result[] = $v; } } return $result? $result[0] : $result; } /** * 连接mongodb * @param String $host 数据库地址 * @param String $user 用户名 * @param String $passwd 密码 * @return DBLink */ private function connect($host, $user, $passwd){ $server = 'mongodb://'.$user.':'.$passwd.'@'.$host; try{ $conn = new MongoDB\Driver\Manager(); } catch (MongoDB\Driver\Exception\ConnectionException $e){ throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31); } return $conn; }} // class end?>
- 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
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
demo.php
<?phprequire 'MongoDBPolygons.class.php';echo '<strong>php MongoDB 判断坐标是否在多边形区域内演示:</strong><br><br>';// 调用mongodb多边形区域类$oMongoDBPolygons = new MongoDBPolygons('localhost','root','123456','testdb');// 索引$index = array('polygons'=>'2dsphere');// 插入多边形区域数据$data = array( array( 'polygons' => array( 'type' => 'Polygon', 'coordinates' => array( array( array(doubleval(113.314882),doubleval(23.163055)), array(doubleval(113.355845),doubleval(23.167042)), array(doubleval(113.370289),doubleval(23.149564)), array(doubleval(113.356779),doubleval(23.129758)), array(doubleval(113.338238),doubleval(23.13913)), array(doubleval(113.330979),doubleval(23.124706)), array(doubleval(113.313588),doubleval(23.140858)), array(doubleval(113.323865),doubleval(23.158204)), array(doubleval(113.314882),doubleval(23.163055)), ) ) ), ) );$inserted = $oMongoDBPolygons->add('geo', $data, $index);if($inserted){ echo '1.成功插入多边形数据<br><br>';}// 判断坐标是否在多边形区域echo '2.判断广州东站坐标(113.330908, 23.155678)是否在区域内<br>';$result = $oMongoDBPolygons->checkInArea('geo', 113.330908, 23.155678);echo '结果:广州东站坐标(113.330908, 23.155678)'.( $result? '在区域内' : '在区域外');echo '<br><br>';echo '3.判断宏发大厦坐标(113.33831, 23.137335)是否在区域内<br>';$result = $oMongoDBPolygons->checkInArea('geo', 113.33831, 23.137335);echo '结果:宏发大厦坐标(113.33831, 23.137335)'.( $result? '在区域内' : '在区域外');echo '<br><br>';?>
- 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
输出:
php MongoDB 判断坐标是否在多边形区域内演示:1.成功插入多边形数据2.判断广州东站坐标(113.330908, 23.155678)是否在区域内结果:广州东站坐标(113.330908, 23.155678)在区域内3.判断宏发大厦坐标(113.33831, 23.137335)是否在区域内结果:宏发大厦坐标(113.33831, 23.137335)在区域外
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
广州东站坐标
宏发大厦坐标
源码下载地址:点击查看
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow