mongodb 地理位置搜寻

2023-05-16

LBS,存储每个地点的经纬度坐标,搜寻附近的地点,建立地理位置索引可提高查询效率。

mongodb地理位置索引,2d2dsphere,对应平面和球面。


1.创建lbs集合存放地点坐标

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.创建地理位置索引

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

3.查询附近的坐标

当前位置为:时代广场,

坐标:113.323568, 23.146436


搜寻附近一公里内的点,由近到远排序

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

搜寻结果:

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

php代码如下:

<?php
// 连接mongodb
function conn($dbhost, $dbname, $dbuser, $dbpasswd){
    $server = 'mongodb://'.$dbuser.':'.$dbpasswd.'@'.$dbhost.'/'.$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 = '113.3'.mt_rand(10000, 99999);
    $latitude = '23.15'.mt_rand(1000, 9999);
    $name = 'name'.mt_rand(10000,99999);
    add($db, 'lbs', $longitude, $latitude, $name);
}

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


演示php代码,首先需要在mongodb的lbs中创建用户和执行auth。方法如下:

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

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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mongodb 地理位置搜寻 的相关文章

  • php 双向队列类

    xff08 deque xff0c 全名double ended queue xff09 是一种具有队列和栈的性质的数据结构 双向队列中的元素可以从两端弹出 xff0c 其限定插入和删除操作在表的两端进行 在实际使用中 xff0c 还可以有
  • php heredoc 与 nowdoc

    php heredoc 与 nowdoc heredoc 结构 heredoc 句法结构 xff1a lt lt lt 在该运算符之后要提供一个标识符 xff0c 然后换行 接下来是字符串本身 xff0c 最后要用前面定义的标识符作为结束标
  • HTML5 localStorage and sessionStorage

    HTML5 提供两种web存储方法 xff0c localStorage 与 sessionStorage localStorage 与 sessionStorage 区别 localStorage没有过期时间 xff0c 只要不clear
  • AZ_自定义不等高的cell

    自定义不等高的cell 1 给模型增加frame数据 纯代码 让ViewController继承UITableViewController xff0c 移除storyboard中的ViewController xff0c 新建一个UITab
  • php 导出CSV抽象类

    php 导出CSV抽象类 xff0c 根据总记录数与每批次记录数 xff0c 计算总批次 xff0c 循环导出 避免内存不足的问题 ExportCSV class php lt php php Export CSV abstract cla
  • php zip文件内容比较类

    php zip 文件比较类 xff0c 比较两个zip文件的内容 xff0c 返回新增 xff0c 删除 xff0c 及相同的文件列表 暂时只支持单层 需求 xff1a 上传一个zip文件 xff0c zip内有很多图片文件 需要对图片文件
  • php 获取/设置用户访问页面语言类

    User Language Class 获取 设置用户访问的页面语言 xff0c 如果用户没有设置访问语言 xff0c 则读取Accept Language 根据用户选择的语言显示对应的页面 xff08 英文 xff0c 简体中文 xff0
  • php session 读写锁

    php session 读写锁 先看一个例子 xff0c 功能 xff1a 1 点击页面中一个按钮 xff0c ajax执行php xff0c php中用session记录执行到哪一步 2 使用ajax轮询另一个php xff0c 获取se
  • linux 打开文件数 too many open files 解决方法

    linux 打开文件数 too many open files 解决方法 too many open files 出现这句提示的原因是程序打开的文件 socket连接数量超过系统设定值 查看每个用户最大允许打开文件数量 ulimit a f
  • php 求水仙花数优化

    水仙花数是指一个n位数 n gt 61 3 xff0c 它每个位上数字的n次幂之和等于它本身 xff0c n为它的位数 xff08 例如 xff1a 1 3 43 5 3 43 3 3 61 153 水仙花数又称阿姆斯特朗数 三位的水仙花数
  • php 验证身份证号码

    身份证号码的结构 身份证号码是特征组合码 xff0c 由17位数字本体码和一位校验码组成 排列顺序从左至右依此为 xff1a 六位数字地址码 xff0c 八位数字出生日期码 xff0c 三位数字顺序码和一位数字校验码 地址码 xff08 前
  • php 删除空目录及空子目录

    php 删除空目录及空子目录 步骤 xff1a 1 遍历目录及子目录 2 使用 scandir 判断目录是否为空 xff0c 为空则使用rmdir 删除 lt php 删除所有空目录 64 param String path 目录路径 fu
  • linux 分卷压缩命令

    linux 分卷压缩命令 1 使用tar分卷压缩 格式 tar cvzf filedir split d b 50m filename 例子 xff1a tar cvzf picture split d b 10m picture 将 pi
  • 使用html5 FileReader获取图片,并异步上传到服务器(不使用iframe)

    使用html5 FileReader获取图片 xff0c 并异步上传到服务器 不使用iframe 原理 xff1a 1 使用FileReader 读取图片的base64编码 2 使用ajax xff0c 把图片的base64编码post到服
  • C语言 赶鸭子题 (用递归写)

    用递归写 赶鸭子题 题目 一个人赶着鸭子去每个村庄卖 xff0c 每经过一个村子卖去所赶鸭子的 61 61 一半又一只 61 61 这样他经过了 61 61 七个村子 61 61 后还剩两只鸭子 xff0c 问他出发时共赶多少只鸭子 xff
  • php unserialize 返回false的解决方法

    php unserialize 返回false的解决方法 php 提供serialize 序列化 与unserialize 反序列化 方法 使用serialize序列化后 xff0c 再使用unserialize反序列化就可以获取原来的数据
  • linux使用flock文件锁解决crontab冲突问题

    linux的crontab命令 xff0c 可以定时执行操作 xff0c 最小周期是每分钟执行一次 关于crontab实现每秒执行可参考我之前的文章 linux crontab 实现每秒执行 现在有个问题 xff0c 如果设定了任务每分钟执
  • php 根据字符串生成对应数组方法

    php 根据字符串生成对应数组方法 例如 xff1a lt php config 61 array 39 project page index 39 61 gt 39 content 39 39 project page nav 39 61
  • facebook comments plugins 介绍

    facebook comments plugins 介绍 首先 xff0c 需要在facebook创建一个APP xff0c 创建方法见https developers facebook com xff0c APP有一项是填写Domain的
  • 使用FormData对象提交表单及上传图片

    FormData 对象 xff0c 可以把form中所有表单元素的name与value组成一个queryString xff0c 提交到后台 在使用Ajax提交时 xff0c 使用FormData对象可以减少拼接queryString的工作

随机推荐