English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
MongoDB هو قاعدة بيانات تعتمد على التخزين الموزع للملفات وتقدم القدرة على إنشاء مؤشرات بناء على الفضاء الجغرافي، وسيقدم هذا المقال مثالاً على كيفية الاتصال بمongoDB باستخدام PHP والتحقق مما إذا كانت الإحداثيات موجودة داخل منطقة مضلع معين.
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 { // 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; } /** * Connect to 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 ?>
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 لتحديد ما إذا كانتordinates داخل مضلع:
1. تم إدخال بيانات المضلع بنجاح
2. تحديد ما إذا كان موقع محطة广州 شرق (113.330908, 23.155678) داخل المنطقة
النتيجة: موقع محطة广州 شرق (113.330908, 23.155678) داخل المنطقة
3. تحديد ما إذا كان موقع مبنى هونغ فا (113.33831, 23.137335) داخل المنطقة
النتيجة: موقع مبنى هونغ فا (113.33831, 23.137335) خارج المنطقة
موقع محطة广州 شرق
موقع مبنى هونغ فا
هذا هو نهاية محتوى هذا المقال، آمل أن يكون قد ساعدكم في التعلم، وأتمنى أن تدعموا دليل النطق أيضًا.
بيان: محتوى هذا المقال تم جمعه من الإنترنت، ملكية المقال تخص المالك الأصلي، تم جمع المحتوى من قبل المستخدمين على الإنترنت بذاتي، هذا الموقع لا يمتلك الحقوق، لم يتم تعديل المحتوى بشكل إنساني، ولا يتحمل أي مسؤولية قانونية متعلقة بذلك. إذا وجدت محتوى يشتبه في حقوق النسخ، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) للإبلاغ، وتقديم الأدلة ذات الصلة، إذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فورًا.