English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

مثال على التحقق من موقف النقطة في منطقة شكل متعدد في php + mongodb

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 (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) للإبلاغ، وتقديم الأدلة ذات الصلة، إذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فورًا.

أعجبك