1. 利用GeoHash封装成内置数据库函数的简易方案;

A:Mysql 内置函数方案,适合于已有业务,新增加LBS功能,增加经纬度字段方可,避免数据迁移

B:Mongodb 内置函数方案,适合中小型应用,快速实现LBS功能,性能优于A(推荐)

方案A: (MySQL Spatial)

1、先简历一张表:(MySQL 5.0 以上 仅支持 MyISAM 引擎)

CREATE TABLE address (address CHAR(80) NOT NULL,address_loc POINT NOT NULL,PRIMARY KEY(address));

空间索引:

ALTER TABLE address ADD SPATIAL INDEX(address_loc);

插入数据:(注:此处Point(纬度,经度) 标准写法)

INSERT INTO address VALUES('Foobar street 12', GeomFromText('POINT(30.620076 104.067221)'));INSERT INTO address VALUES('Foobar street 13', GeomFromText('POINT(31.720076 105.167221)'));

查询: 查找(30.620076,104.067221)附近 10 公里

SELECT  *FROM    addressWHERE   MBRContains(LineString(Point(30.620076 + 10 / ( 111.1 / COS(RADIANS(104.067221))),104.067221 + 10 / 111.1),Point(30.620076 - 10 / ( 111.1 / COS(RADIANS(104.067221))),104.067221 - 10 / 111.1) ),address_loc)

方案B:

1、先建立一张简单的表user,两条数据如下:

{"_id": ObjectId("518b1f1a83ba88ca60000001"),"account": "simplephp1@163.com","gps": [104.067221,30.620076]
}{"_id": ObjectId("518b1dae83ba88d660000000"),"account": "simplephp6@163.com","gps": [104.07958,30.653936]
}

其中,gps为二维数组,分别为经度,纬度

(注:此处必须按照(经度,纬度)顺序存储。我们平时表示经纬度,都是(纬度,精度),此处这种方式有木有很亲民)

2、使用之前,先建立二维索引

//建立索引 最大范围在经度-180~180

db.user.ensureIndex({"gps":"2d"},{"min":-180,"max":180})

//删除索引

db.user.dropIndex({"gps":"2d"})

3、Mongodb有两中方式可以查找附近的XXX;其中方案2)会返回距离(推荐)

1)标准查询,为地球经纬度查询内置;参数一为查询条件利用$near查找附近,参数二$maxDistance为经纬弧度(1° latitude = 111.12 kilometers)即 1/111.12,表示查找附近一公里。

db.user.find({ gps :{ $near : [104.065847, 30.657554] , $maxDistance : 1/111.12} })

2)执行命名方式,模拟成一个圆球;参数一指定geoNear方式和表名;参数二坐标,参数三是否为球形,参数四弧度(弧度=弧长/半径 一千米的弧度1000/6378000),参数五指定球形半径(地球半径)

db.runCommand({geoNear:'user', near:[104.065847, 30.657554], spherical:true, maxDistance:1000/6378000, distanceMultiplier:6378000});

转自:http://stackoverflow.com/a/1006668/4484798

2 利用谷歌方案

The SQL statement that will find the closest 20 locations that are within a radius of 30 miles to the 78.3232, 65.3234 coordinate. It calculates the distance based on the latitude/longitude of that row and the target latitude/longitude, and then asks for only rows where the distance value is less than 30 miles, orders the whole query by distance, and limits it to 20 results. To search by kilometers instead of miles, replace 3959 with 6371.

3959是地球半径的英里,6371是地球半径的千米:http://baike.baidu.com/view/758812.htm

SELECTid, (3959 * acos (cos ( radians(78.3232) )* cos( radians( lat ) )* cos( radians( lng ) - radians(65.3234) )+ sin ( radians(78.3232) )* sin( radians( lat ) ))) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;

This is using the Google Maps API v3 with a MySQL backend which your already have.

https://developers.google.com/maps/articles/phpsqlsearch_v3#findnearsql

转自:http://gis.stackexchange.com/a/31629

3 其他

Anyways, here’s the PHP formula for calculating the distance between two points (along with Mile vs. Kilometer conversion) rounded to two decimal places:

function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi') {$theta = $longitude1 - $longitude2;$distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));$distance = acos($distance);$distance = rad2deg($distance);$distance = $distance * 60 * 1.1515; switch($unit) {case 'Mi': break; case 'Km' : $distance = $distance * 1.609344;}return (round($distance,2));}

It’s also possible to use MySQL to do a calculation to find all records within a specific distance. In this example, I’m going to query MyTable to find all the records that are less than or equal to variable $distance (in Miles) to my location at $latitude and $longitude:

$qry = "SELECT *,(((acos(sin((".$latitude."*pi()/180)) * sin((`Latitude`*pi()/180))+cos((".$latitude."*pi()/180)) * cos((`Latitude`*pi()/180)) * cos(((".$longitude."- `Longitude`)*pi()/180))))*180/pi())*60*1.1515) as distanceFROM `MyTable`WHERE distance >= ".$distance."

For Kilometers:

$qry = "SELECT *,(((acos(sin((".$latitude."*pi()/180)) * sin((`Latitude`*pi()/180))+cos((".$latitude."*pi()/180)) * cos((`Latitude`*pi()/180)) * cos(((".$longitude."- `Longitude`)*pi()/180))))*180/pi())*60*1.1515*1.609344) as distance
FROM `MyTable`
WHERE distance >= ".$distance."

转自:http://stackoverflow.com/a/8599305/4484798  & https://www.marketingtechblog.com/calculate-distance/

本文:Mysql: LBS实现查找附近的人 (两经纬度之间的距离)

Mysql: LBS实现查找附近的人 (两经纬度之间的距离)相关推荐

  1. 两经纬度之间的距离计算

    以下是计算两经纬度之间距离的代码,分为:头文件.源代码和测试代码三部分. 具体如下: 1 // LatLonDistanceDlg.h : 头文件 2 // 3 4 #pragma once 5 6 ...

  2. java计算两个经纬度之间的距离

    前一阵项目中,有一个需求:是查找附近的人,其实就是查询某个距离内有多少用户.实现方式还是比较简单的,之前使用GeodeticCalculator计算经纬度误差在高德上与腾讯有点偏差,首先用户在APP上 ...

  3. OSChina 周五乱弹 ——什么情况下两个人之间的距离能成为负数

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @亚麻仔 :分享 Cotton Jones Basket ... 的歌曲 ...

  4. 高德经纬度距离计算php,计算两个经纬度之间的距离 单位(m)

    /** * 计算两个经纬度之间的距离 单位(m) * * @param lat1 * @param lng1 * @param lat2 * @param lng2 * @return */ publ ...

  5. CV之FR:DIY脚本通过人脸图像得到人脸特征向量并输出多张人脸图片之两两图片之间的距离

    CV之FR:DIY脚本通过人脸图像得到人脸特征向量并输出多张人脸图片之两两图片之间的距离 目录 输出结果 设计思路 实现代码 计算过程 输出结果 设计思路 实现代码 from scipy import ...

  6. H5 移动端 获取腾讯地图计算两经纬度的实际距离(可批量)_多地打卡

    文章目录 一.H5移动端 1. 安装vue-jsonp 2. 引入腾讯sdk 3. 实例化 4. 二点求距离 5. 多点求距离 文档地址: https://lbs.qq.com/service/web ...

  7. 小程序 获取腾讯地图计算两经纬度的实际距离(可批量)_多地打卡

    文章目录 一.小程序 1. 安装vue-jsonp 2. 引入腾讯sdk 3. 实例化 4. 二点求距离 5. 多点求距离 文档地址: https://lbs.qq.com/service/webSe ...

  8. mysql 下 计算 两点 经纬度 之间的距离 含具体sql语句

    mysql取字段逗号分隔的第一个 cover字段为:(admin/LUpiEMD1Pk6U6B,admin/LUpiEMD1Pk6U6B,admin/LUpiEMD1Pk6U6B) 取逗号分隔第一个词 ...

  9. hive 计算两个经纬度之间的距离

    select 6378137*2*ASIN(SQRT(POWER(SIN((lat1-lat2)*ACOS(-1)/360),2) + COS(lat1*ACOS(-1)/180)*COS(lat2* ...

最新文章

  1. 19 java程序员面试宝典视频课程之正则表达式
  2. Python标准库:内置函数tuple([iterable])
  3. appium简明教程(7)——Desired Capabilities详解
  4. “面试不败计划”:集合总结
  5. java中String的比较符
  6. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1123:图像相似度
  7. 通过串口来控制网管型交换机的操作步骤详解
  8. 计算机创建文档教案,计算机基础知识教案
  9. 如何在面试中脱颖而出?
  10. python学习笔记之列表(list)
  11. 虚拟系统管理VSM提高服务器整合率
  12. Java程序设计基础
  13. java练习题-猜数字游戏
  14. openslide安装问题
  15. java正则表达式控制格式_“如果Java受到一两个大型供应商的控制,则可能会遭受挫折”...
  16. 进程和线程的区别 进程间的通信方式
  17. [学习笔记] 《精准营销:社会化媒体时代企业传播实战指南》
  18. 数据库SDB数据缓冲层(TBL数据缓冲层)向ODB数据贴源层(QSL近源模型层)拉链算法脚本【SQL部分】
  19. PID算法在STM32上的实现
  20. 学习QCustomPlot【4】库官方examples之plots解读

热门文章

  1. 图论 —— 图的遍历 —— 欧拉通路与欧拉回路问题
  2. 理论基础 —— 排序 —— 桶排序
  3. 你的飞碟在这儿(洛谷-P1200 )
  4. php mongo in 查询语句,PHP 怎么执行mongodb 的 $in 和$size查询
  5. 修改mysql用户家目录,Linux 更改MySQL目录
  6. pytorch1.7教程实验——DCGAN生成对抗网络
  7. spss 卡方检验_SPSS篇—卡方检验
  8. “CSDN开发助手”:【必备插件 · 安装与使用教程】
  9. 仿无名云易支付首页模板
  10. centos 6.8安装git_搭建一个开源项目3两种方式安装git