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

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

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

<?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, );
$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' => ,
'maxDistance' => ,
'num' =>
];
$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 > ) {
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':, loc:[115.993121,28.676436]}
代表一条用户数据,其中gender:0代表女1,代表男,loc是一个经纬度的数组,当然也可以是loc : { lng : 115.993067 , lat : 28.67606 },但官方推荐数组。 db.user.insertMany([
{'name':'杨帅哥', 'address':'江西省南昌市青山湖区市场和质量监督管理局', 'gender':, loc:[115.993121,28.676436]},
{'name':'王美眉', 'address':'江西省南昌市青山湖区创新一路职位小厨', 'gender':, loc:[116.000093,28.679402]},
{'name':'张美眉', 'address':'江西省南昌市青山湖区紫阳大道1916号', 'gender':, loc:[115.999967,28.679743]},
{'name':'李美眉', 'address':'江西省南昌市青山湖区云中城', 'gender':, loc:[115.995593,28.681632]},
{'name':'彭美眉', 'address':'江西省南昌市青山湖区北京东路1666号', 'gender':, loc:[115.975543,28.679509]},
{'name':'赵美眉', 'address':'江西省南昌市青山湖区市场一路大润发', 'gender':, loc:[115.968428,28.669368]},
{'name':'廖美眉', 'address':'江西省南昌市南昌县奥林匹克中心', 'gender':, loc:[116.035262,28.677037]},
{'name':'余帅哥', 'address':'江西省南昌市南昌县科技学院瑶湖校区', 'gender':, loc:[116.02477,28.68667]},
{'name':'吴帅哥', 'address':'江西省南昌市青山湖区创新一路母婴店', 'gender':, loc:[116.002384,28.683865]},
{'name':'何帅哥', 'address':'江西省南昌市青山湖区紫阳大道2999号', 'gender':, loc:[116.000821,28.68129]},
])

设置2d索引

因为我以二维平面上点的方式存储的数据,想要进行LBS查询,那么要设置2d索引。db.user.createIndex({'loc':"2d"})其中loc是索引的字段。

六、查询附近200米的人

查询附近的人,首先的指导当前用户所在的经纬度,如果不仅想要得到数据还要得到距离,那么可以使用$geoNear指令,如果距离自己去计算可以使用$near或者$geoWithin然后在手动计算距离。此处采用$geoNear指令查询附近2000m的人。

db.user.aggregate({
$geoNear:{
near: [115.999567,28.681813], // 当前坐标
spherical: true, // 计算球面距离
distanceMultiplier: , // 地球半径,单位是米,那么的除的记录也是米
maxDistance: /, // 过滤条件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' => ,
'maxDistance' => / ,
'num' => ,
];
$res = $this>CI>lib_mongodb>command($document);
PE($res); }

PHP使用MongoDB存储经纬度,查询距离的更多相关文章

  1. 根据经纬度查询最近距离,mysql查询经纬度附近范围

    public class Test{ private static List<LocalAddress> ilist = new ArrayList<LocalAddress> ...

  2. mongoDB常见的查询索引(三)

    1. _id索引     _id索引是绝大多数集合默认建立的索引     对于每个插入的数据,MongoDB会自动生成一条唯一的_id字段. 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  3. MongoDB 常见的查询索引

    常见的查询索引 _id索引         _id 索引是绝大多数集合默认建立的索引.对于每一个插入的数据.MongoDB 会自己主动生成一条唯一的 _id 字段. 1 2 3 4 5 6 7 8 9 ...

  4. php根据地址的经纬度查询周围的城市例子

    目前的工作是需要对用户的一些数据进行分析,每个用户都有若干条记录,每条记录中有用户的一个位置,是用经度和纬度表示的.还有一个给定的数据库,存储的是一些已知地点以及他们的经纬度,内有43W多条的数据.现 ...

  5. MongoDB 存储引擎和数据模型设计

    标签: MongoDB NoSQL MongoDB 存储引擎和数据模型设计 1. 存储引擎 1.1 存储引擎是什么 1.2 MongoDB中的默认存储引擎 2. 数据模型设计 2.1 内嵌和引用 2. ...

  6. Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程

    Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...

  7. 使用 MongoDB 存储日志数据

    使用 MongoDB 存储日志数据     线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息.通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题 ...

  8. MongoDB存储引擎选择

    MongoDB存储引擎选择 MongoDB存储引擎构架 插件式存储引擎, MongoDB 3.0引入了插件式存储引擎API,为第三方的存储引擎厂商加入MongoDB提供了方便,这一变化无疑参考了MyS ...

  9. MongoDB存储基础教程

    一.MongoDB简介 1. mangodb是一种基于分布式.文件存储的非关系型数据库 2. C++写的,性能高 3. 为web应用提供可扩展的高性能数据存储解决方案 4. 所支持的格式是json格式 ...

随机推荐

  1. 前端自己导出Excel

    1.导出当前页面,这是最简单的,只是导出当前页面的数据. exportData(tableid, name) { let table; let uri = 'data:application/vnd. ...

  2. Vue 中的Vue Router一级路由,二级路由,三级路由以及跳转

    今天编写了一下Vue中的路由 先用命令行新建一个空的项目,并且我知道要用路由,就下载了路由的相关依赖 vue init webpack demo5 完毕之后进入所在的项目 cd demo5 之后用vs ...

  3. osi七层网络模型(一)

    在网络中OSI分为七层网络模型,怎么理解七层模型呢?简单理解我们的手机都有手机壳.屏幕.摄像头.电池.芯片等很多原件,每个原件都是由不同的 厂家生产,最终组装成了一部功能完整的手机,同样,在网络中,也 ...

  4. python BeautifulSoup4解析网页

    html = """ <html><head><title>The Dormouse's story</title>< ...

  5. 初识python中的68个内置函数

    内置函数思维导图的链接: https://www.processon.com/view/link/5b72b805e4b08d3622ad8b48 面向对象和反射相关的后面补充

  6. 13 复习 - webpack基本配置2

    在webpack下使用样式表 1.安装处理样式表的loader cnpm i style-loader css-loader -D //css cnpm i less-loader less -D / ...

  7. AfxBeginThread深入解析

    看过<深入浅出MFC>书中,j.j.hou提到在创建新的线程时,最好不要直接使用CreateThread,虽然AfxBeginThread也是对CreateThread的封装,但是AfxB ...

  8. SQlAlchemy的增删改查

    一.创建数据表 # ORM中的数据表是什么呢? # Object Relation Mapping # Object - Table 通过 Object 去操纵数据表 # 从而引出了我们的第一步创建数 ...

  9. spark读HFile对hbase表数据进行分析

    要求:计算hasgj表,计算每天新增mac数量. 因为spark直接扫描hbase表,对hbase集群访问量太大,给集群造成压力,这里考虑用spark读取HFile进行数据分析. 1.建立hasgj表 ...

  10. 最短路--Dijkstra

    Dijkstra--单源最短路 算法思想 主要记住这句话:每次选择没有被访问过的,并且dis最小的点,加入集合,更新dis 模板 int dis[maxn],vis[maxn]; //距离,标记 vo ...