PHP使用MongoDB存储经纬度,查询距离

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

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

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

1<?php 2 3/* 4使用命令创建数据库: 5use user 6 7使用命令创建集合: 8db.createCollection(user) 9 10使用命令创建2dsphere索引: 11db.user.createIndex({location: "2dsphere"}) 12*/ 13 14//PHP代码插入经纬度数据: 15function uploadMongoDBLocation() 16{ 17 $document = [ 18 'name' => '张三', 19 'location' => [ 20 (float)115.036545, 21 (float)36.313916, 22 ], 23 ]; 24 $manager = new \MongoDB\Driver\Manager('mongodb://127.0.0.1:27017'); 25 $bulk = new \MongoDB\Driver\BulkWrite; 26 $bulk->insert($document); // 可连续使用多个insert 27 $writeConcern = new \MongoDB\Driver\WriteConcern(\MongoDB\Driver\WriteConcern::MAJORITY, 1000); 28 $res = $manager->executeBulkWrite('user.user', $bulk, $writeConcern); 29 return $res; 30} 31 32//PHP代码查询距离: 33//注意:这里使用的command根据版本不同,用法可能会有区别,这里使用的MongoDB版本是3.6.5 34function findMongoDBLocation() 35{ 36 $document = [ 37 'geoNear' => 'user', 38 'near' => [ 39 'type' => 'Point', 40 'coordinates' => [(float)'115.042725', (float)'36.312956'], 41 ], 42 'spherical' => true, 43 'minDistance' => 0, 44 'maxDistance' => 100000, 45 'num' => 1000 46 ]; 47 $command = new \MongoDB\Driver\Command($document); 48 $manager = new \MongoDB\Driver\Manager('mongodb://127.0.0.1:27017'); 49 $cursor = $manager->executeCommand('user', $command); 50 $items = []; 51 foreach ($cursor as $document) { 52 $total = count($document->results); 53 if ($total > 0) { 54 foreach ($document->results as $result) { 55 $item = json_decode(json_encode($result->obj), true); 56 $item['distance'] = intval($result->dis); 57 unset($item['_id']); 58 $items[] = $item; 59 } 60 } 61 } 62 return $items; 63}

https://zhuanlan.zhihu.com/p/51839804

MongoDB实现附近的人

1往数据库中批量插入数据,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 },但官方推荐数组。 2 3db.user.insertMany([ 4 {'name':'杨帅哥', 'address':'江西省南昌市青山湖区市场和质量监督管理局', 'gender':1, loc:[115.993121,28.676436]}, 5 {'name':'王美眉', 'address':'江西省南昌市青山湖区创新一路职位小厨', 'gender':0, loc:[116.000093,28.679402]}, 6 {'name':'张美眉', 'address':'江西省南昌市青山湖区紫阳大道1916号', 'gender':0, loc:[115.999967,28.679743]}, 7 {'name':'李美眉', 'address':'江西省南昌市青山湖区云中城', 'gender':0, loc:[115.995593,28.681632]}, 8 {'name':'彭美眉', 'address':'江西省南昌市青山湖区北京东路1666号', 'gender':0, loc:[115.975543,28.679509]}, 9 {'name':'赵美眉', 'address':'江西省南昌市青山湖区市场一路大润发', 'gender':0, loc:[115.968428,28.669368]}, 10 {'name':'廖美眉', 'address':'江西省南昌市南昌县奥林匹克中心', 'gender':0, loc:[116.035262,28.677037]}, 11 {'name':'余帅哥', 'address':'江西省南昌市南昌县科技学院瑶湖校区', 'gender':1, loc:[116.02477,28.68667]}, 12 {'name':'吴帅哥', 'address':'江西省南昌市青山湖区创新一路母婴店', 'gender':1, loc:[116.002384,28.683865]}, 13 {'name':'何帅哥', 'address':'江西省南昌市青山湖区紫阳大道2999号', 'gender':1, loc:[116.000821,28.68129]}, 14])

设置2d索引

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

六、查询附近200米的人

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

1db.user.aggregate({ 2 $geoNear:{ 3 near: [115.999567,28.681813], // 当前坐标 4 spherical: true, // 计算球面距离 5 distanceMultiplier: 6378137, // 地球半径,单位是米,那么的除的记录也是米 6 maxDistance: 2000/6378137, // 过滤条件2000米内,需要弧度 7 distanceField: "distance" // 距离字段别名 8 } 9}) 10 11public function CI_mongodb($data) 12 { 13 //near: [115.999567,28.681813], // 当前坐标 14 //spherical: true, // 计算球面距离 15 //distanceMultiplier: 6378137, // 地球半径,单位是米,那么的除的记录也是米 16 //maxDistance: 400/6378137, // 过滤条件2000米内,需要弧度 17 //distanceField: "distance" // 距离字段别名 18 19 $document = [ 20 'geoNear' => 'user', 21 'near' => [(float)'115.999567', (float)'28.681813'], 22 'spherical' => true, 23 'distanceMultiplier' => 6378137, 24 'maxDistance' => 400 / 6378137, 25 'num' => 2, 26 ]; 27 $res = $this>CI>lib_mongodb>command($document); 28 PE($res); 29 30 }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )