PHP使用MongoDB存儲經緯度,查詢距離

https://blog.csdn.net/qq_40012295/article/details/84861466php

https://docs.mongodb.com/manual/reference/command/geoNear/index.htmlhtml

https://juejin.im/entry/5b7cfe296fb9a019d80a8ed8mongodb

 

<?php

/*
使用命令建立數據庫:
use user

使用命令建立集合:
db.createCollection(user)

使用命令建立2dsphere索引:
db.user.createIndex({location: "2dsphere"})
*/

//PHP代碼插入經緯度數據:
function uploadMongoDBLocation()
{
    $document = [
        'name' => '張三',
        'location' => [
            (float)115.036545,
            (float)36.313916,
        ],
    ];
    $manager = new \MongoDB\Driver\Manager('mongodb://127.0.0.1:27017');
    $bulk = new \MongoDB\Driver\BulkWrite;
    $bulk->insert($document); // 可連續使用多個insert
    $writeConcern = new \MongoDB\Driver\WriteConcern(\MongoDB\Driver\WriteConcern::MAJORITY, 1000);
    $res = $manager->executeBulkWrite('user.user', $bulk, $writeConcern);
    return $res;
}

//PHP代碼查詢距離:
//注意:這裏使用的command根據版本不一樣,用法可能會有區別,這裏使用的MongoDB版本是3.6.5
function findMongoDBLocation()
{
    $document = [
        'geoNear' => 'user',
        'near' => [
            'type' => 'Point',
            'coordinates' => [(float)'115.042725', (float)'36.312956'],
        ],
        'spherical' => true,
        'minDistance' => 0,
        'maxDistance' => 100000,
        'num' => 1000
    ];
    $command = new \MongoDB\Driver\Command($document);
    $manager = new \MongoDB\Driver\Manager('mongodb://127.0.0.1:27017');
    $cursor = $manager->executeCommand('user', $command);
    $items = [];
    foreach ($cursor as $document) {
        $total = count($document->results);
        if ($total > 0) {
            foreach ($document->results as $result) {
                $item = json_decode(json_encode($result->obj), true);
                $item['distance'] = intval($result->dis);
                unset($item['_id']);
                $items[] = $item;
            }
        }
    }
    return $items;
}

 

https://zhuanlan.zhihu.com/p/51839804數據庫

MongoDB實現附近的人

往數據庫中批量插入數據,use mage切換到mage數據庫,執行db.user.insertMany(),user是文檔名,insertMany()是批量插入命令,裏面傳入json數組,
{'name':'楊帥哥', 'address':'江西省南昌市青山湖區市場和質量監督管理局', 'gender':1, loc:[115.993121,28.676436]}
表明一條用戶數據,其中gender:0表明女1,表明男,loc是一個經緯度的數組,固然也能夠是loc : { lng : 115.993067 , lat : 28.67606 },但官方推薦數組。 db.user.insertMany([ {'name':'楊帥哥', 'address':'江西省南昌市青山湖區市場和質量監督管理局', 'gender':1, loc:[115.993121,28.676436]}, {'name':'王美眉', 'address':'江西省南昌市青山湖區創新一路職位小廚', 'gender':0, loc:[116.000093,28.679402]}, {'name':'張美眉', 'address':'江西省南昌市青山湖區紫陽大道1916號', 'gender':0, loc:[115.999967,28.679743]}, {'name':'李美眉', 'address':'江西省南昌市青山湖區雲中城', 'gender':0, loc:[115.995593,28.681632]}, {'name':'彭美眉', 'address':'江西省南昌市青山湖區北京東路1666號', 'gender':0, loc:[115.975543,28.679509]}, {'name':'趙美眉', 'address':'江西省南昌市青山湖區市場一路大潤發', 'gender':0, loc:[115.968428,28.669368]}, {'name':'廖美眉', 'address':'江西省南昌市南昌縣奧林匹克中心', 'gender':0, loc:[116.035262,28.677037]}, {'name':'餘帥哥', 'address':'江西省南昌市南昌縣科技學院瑤湖校區', 'gender':1, loc:[116.02477,28.68667]}, {'name':'吳帥哥', 'address':'江西省南昌市青山湖區創新一路母嬰店', 'gender':1, loc:[116.002384,28.683865]}, {'name':'何帥哥', 'address':'江西省南昌市青山湖區紫陽大道2999號', 'gender':1, loc:[116.000821,28.68129]}, ])

 

設置2d索引

由於我以二維平面上點的方式存儲的數據,想要進行LBS查詢,那麼要設置2d索引。db.user.createIndex({'loc':"2d"})其中loc是索引的字段。json

6、查詢附近200米的人

查詢附近的人,首先的指導當前用戶所在的經緯度,若是不只想要獲得數據還要獲得距離,那麼能夠使用$geoNear指令,若是距離本身去計算能夠使用$near或者$geoWithin而後在手動計算距離。此處採用$geoNear指令查詢附近2000m的人。數組

db.user.aggregate({
    $geoNear:{
        near: [115.999567,28.681813], // 當前座標
        spherical: true, // 計算球面距離
        distanceMultiplier: 6378137, // 地球半徑,單位是米,那麼的除的記錄也是米
        maxDistance: 2000/6378137, // 過濾條件2000米內,須要弧度
        distanceField: "distance" // 距離字段別名
    }
})
    public function CI_mongodb($data)
    {
        //near: [115.999567,28.681813], // 當前座標
        //spherical: true, // 計算球面距離
        //distanceMultiplier: 6378137, // 地球半徑,單位是米,那麼的除的記錄也是米
        //maxDistance: 400/6378137, // 過濾條件2000米內,須要弧度
        //distanceField: "distance" // 距離字段別名

        $document = [
            'geoNear' => 'user',
            'near' => [(float)'115.999567', (float)'28.681813'],
            'spherical' => true,
            'distanceMultiplier' => 6378137,
            'maxDistance' => 400 / 6378137,
            'num' => 2,
        ];
        $res = $this>CI>lib_mongodb>command($document);
        PE($res);
    
    }
相關文章
相關標籤/搜索