English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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
use testdb; db.createUser( { "user":"root", "pwd":"123456", "roles":[{"role" : "readWrite", "db":"testdb"}] } ); db.auth( { "user":"root", "pwd":"123456" } );
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 { // начало класса // 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('Не удалось подключиться к серверу базы данных. Ошибка: ' . $e->getMessage(), 31); } возврат $conn; } } // класс завершен ?>
demo.php
<?php require '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>'; ?>
Вывод:
Демонстрация php MongoDB Определите, находится ли координата в многоугольной区域内:
1. Успешно вставлено многоугольное данные
2. Определите, находится ли координата Гуандунского ж/д вокзала (113.330908, 23.155678) в区域内
Результат: Координаты Гуандунского ж/д вокзала (113.330908, 23.155678) в区域内
3. Определите, находится ли координата Маково-Дворца (113.33831, 23.137335) в区域内
Результат: Координаты Маково-Дворца (113.33831, 23.137335) за пределами региона
Координаты Гуандунского ж/д вокзала
Координаты Маково-Дворца
Это конец статьи. Надеемся, что она поможет вам в изучении. Мы также надеемся на вашу поддержку и поддержку руководства по呐喊.
Заявление: Контент этой статьи был взят из Интернета, авторские права принадлежат соответствующему автору. Контент был предоставлен пользователями Интернета, сайт не имеет права собственности, не был обработан вручную и не несет ответственности за юридические последствия. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для отчета и предоставьте соответствующие доказательства. Если факт будет подтвержден, сайт немедленно удалит涉嫌侵权的内容.