Heim  >  Artikel  >  Backend-Entwicklung  >  Mongodb-Standortsuche

Mongodb-Standortsuche

WBOY
WBOYOriginal
2016-08-08 09:23:261103Durchsuche

LBS speichert die Breiten- und Längenkoordinaten jedes Standorts, sucht nach Standorten in der Nähe und erstellt einen geografischen Standortindex, um die Abfrageeffizienz zu verbessern.

mongodb geografischer Standortindex, 2d und 2dsphere, entsprechend Ebene und Kugel.

1. Erstellen Sie die Koordinaten des Pfund-Sammellagerorts

use lbs;

db.lbs.insert(
    {
        loc:{
            type: "Point",
            coordinates: [113.332264, 23.156206]
        },
        name: "广州东站"
    }
)

db.lbs.insert(
    {
        loc:{
            type: "Point",
            coordinates: [113.330611, 23.147234]
        },
        name: "林和西"
    }
)

db.lbs.insert(
    {
        loc:{
            type: "Point",
            coordinates: [113.328095, 23.165376]
        },
        name: "天平架"
    }
)

2 index
db.lbs.ensureIndex(
    {
        loc: "2dsphere"
    }
)

3. Koordinaten in der Nähe abfragen

Der aktuelle Standort ist: Times Square,

Koordinaten: 113.323568, 23.146436

Suche nach Punkten in der Nähe innerhalb eines Kilometers, sortiert vom nächsten zum entferntesten

db.lbs.find(
    {
        loc: {
            $near:{
                $geometry:{
                    type: "Point",
                    coordinates: [113.323568, 23.146436]
                },
                $maxDistance: 1000
            }
        }
    }
)

Suchergebnisse:
{ "_id" : ObjectId("556a651996f1ac2add8928fa"), "loc" : { "type" : "Point", "coordinates" : [ 113.330611, 23.147234 ] }, "name" : "林和西" }

Der PHP-Code lautet wie folgt:
<?php
// 连接mongodb
function conn($dbhost, $dbname, $dbuser, $dbpasswd){
    $server = &#39;mongodb://&#39;.$dbuser.&#39;:&#39;.$dbpasswd.&#39;@&#39;.$dbhost.&#39;/&#39;.$dbname;
    try{
        $conn = new MongoClient($server);
        $db = $conn->selectDB($dbname);
    } catch (MongoException $e){
        throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);
    }
    return $db;
}

// 插入坐标到mongodb
function add($dbconn, $tablename, $longitude, $latitude, $name){
    $index = array('loc'=>'2dsphere');
    $data = array(
            'loc' => array(
                    'type' => 'Point',
                    'coordinates' => array(doubleval($longitude), doubleval($latitude))
            ),
            'name' => $name
    );
    $coll = $dbconn->selectCollection($tablename);
    $coll->ensureIndex($index);
    $result = $coll->insert($data, array('w' => true));
    return (isset($result['ok']) && !empty($result['ok'])) ? true : false;
}

// 搜寻附近的坐标
function query($dbconn, $tablename, $longitude, $latitude, $maxdistance, $limit=10){
    $param = array(
        'loc' => array(
            '$nearSphere' => array(
                '$geometry' => array(
                    'type' => 'Point',
                    'coordinates' => array(doubleval($longitude), doubleval($latitude)), 
                ),
                '$maxDistance' => $maxdistance*1000
            )
        )
    );

    $coll = $dbconn->selectCollection($tablename);
    $cursor = $coll->find($param);
    $cursor = $cursor->limit($limit);
    
    $result = array();
    foreach($cursor as $v){
        $result[] = $v;
    }  

    return $result;
}

$db = conn('localhost','lbs','root','123456');

// 随机插入100条坐标纪录
for($i=0; $i<100; $i++){
    $longitude = &#39;113.3&#39;.mt_rand(10000, 99999);
    $latitude = &#39;23.15&#39;.mt_rand(1000, 9999);
    $name = &#39;name&#39;.mt_rand(10000,99999);
    add($db, &#39;lbs&#39;, $longitude, $latitude, $name);
}

// 搜寻一公里内的点
$longitude = 113.323568;
$latitude = 23.146436;
$maxdistance = 1;
$result = query($db, &#39;lbs&#39;, $longitude, $latitude, $maxdistance);
print_r($result);
?>

Zur Demonstration des PHP-Code, zuerst müssen Sie ihn in Benutzer erstellen und Authentifizierung ausführen in mongodbs lbs hinzufügen. Die Methode ist wie folgt:

use lbs;
db.createUser(
    {
        "user":"root",
        "pwd":"123456",
        "roles":[]
    }
)

db.auth(
    {
        "user":"root",
        "pwd":"123456"
    }
)

Das Obige stellt die geografische Standortsuche von Mongodb vor, einschließlich der relevanten Inhalte. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn