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

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でデータベースを作成

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(doubleval(
          '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#63; $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('dbサーバーに接続できません。エラー:' . $e->getMessage(), 31);
    }
    return $conn;
  }
} // class end
;>63;>

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(doubleval(
        'polygons' => array(
          'type' => 'Polygon',
          'coordinates' => array(
            array(doubleval(
              doubleval(113。314882))23。163055))
              doubleval(113。355845))23。167042))
              doubleval(113。370289))23。149564))
              doubleval(113。356779))23。129758))
              doubleval(113。338238))23。13913))
              doubleval(113。330979))23。124706))
              doubleval(113。313588))23。140858))
              doubleval(113。323865))23。158204))
              doubleval(113。314882))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)。( $result63;'地域内' : '地域外');
echo '<br><br>';
echo '3。宏發大廈の座標(113。33831、 23。137335)が地域内に位置しています<br>';
$result = $oMongoDBPolygons->checkInArea('geo', 113。33831、 23。137335);
echo '結果:宏發大廈の座標(113。33831、 23。137335)。( $result63;'地域内' : '地域外');
echo '<br><br>';
;>63;>

出力:
php MongoDB 坐標が多角形地域内にあるかどうかの判定デモ:

1。多角形データが成功して挿入されました

2。広州東駅の座標(113。330908、 23。155678)が地域内に位置していますか?
結果:広州東駅の座標(113。330908、 23。155678)が地域内に位置しています

3。宏發大廈の座標(113。33831、 23。137335)が地域内に位置していますか?
結果:宏發大廈の座標(113。33831、 23。137335)地域外に位置しています

広州東駅の座標

宏發大廈の座標

これで本文のすべてが終わり、皆様の学習に役立つことを願っています。また、ナイアラ教程を多くのサポートをお願いします。

声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、本サイトは所有権を持ちません。また、人工的な編集は行われていません。著作権侵害の疑いがある場合は、メールで:notice#wにご連絡ください。3codebox.com(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がとりあえず、本サイトは即座に侵害疑いのコンテンツを削除します。)

おすすめ