如何按距离排序 php,php做附近的人,根据距离由近到远进行排序
用户登陆的时候会获取到该用户的经纬度,数据库中存有所有用户的经纬度,如何进行由近到远进行排序,并算出距离
可以考虑用GeoHASH实现,效率更高,参考这篇http://www.cnblogs.com/LBSer/p/3310455.html
我觉得是时候把这个地址贴上来了。
https://segmentfault.com/q/1010000000345194
用php+redis可以实现 可以参考这个 http://www.wubiao.info/401
PHP安装GeoIP扩展和数据库根据IP获取访客所在国家/城市/经纬度等信息
然后就可以用
geoip_record_by_name($_SERVER['REMOTE_ADDR'])
获取用户经纬度.
注意:geoip_record_by_name()返回的西经和南纬是负数.
5000米转成经纬度:
纬度 Latitude: 1 deg = 110852 m
经度 Longitude: 1 deg = 111320*cos(lat) m
同一经线上,相差一纬度约为 110852 米
同一纬线上,相差一经度约为 111320*cos(lat) 米 (lat为该纬线的纬度)
<?php
//以当前用户经纬度为中心,查询5000米内的其他用户
$y = 5000 / 110852; //纬度的范围
$x = 5000 / (111320*cos($lat)); //经度的范围
$sql = '
select * from user where
lat > ($lat-$y) and lat < ($lat+$y) and
lon > ($lon-$x) and lon < ($lon+$x);
';
这个范围是一个粗略的范围,后面距离计算后把超过5公里的用户筛掉即可.
根据上面查询出来的用户的经纬度,
用半正矢公式根据经纬度计算两点间距离:
<?php
function distance($lat1, $lon1, $lat2, $lon2) {
$R = 6371393; //地球平均半径,单位米
$dlat = deg2rad($lat2-$lat1);
$dlon = deg2rad($lon2-$lon1);
$a = pow(sin($dlat/2), 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * pow(sin($dlon/2), 2);
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
$d = $R * $c;
return round($d);
}
echo distance(0, 0, -1, 0); // 111202米
elasticsearch 得距离搜索,获取最近的20公里数据
GET test/test/_search
{
“query”: {
"filtered": {
"query" : {
"match_all" : {}
},
"filter": {
"geo_distance": {
"distance": 20,
"distance_unit": "km",
"location": {
"lat" : 40.11116,
"lon" : -71.34115
}
}
}
}
}
}
如何按距离排序 php,php做附近的人,根据距离由近到远进行排序相关推荐
- 没事做做题之棋盘上的距离
这是<程序设计引导及在线实践>上的题目,其实题目是北京大学程序在线评测系统里面的题目. 题目描述: 国际象棋的棋盘是黑白相间的 8 * 8 的方格,棋子放在格子中间. 王.后.车.象的走子 ...
- 靠自学算法进入大厂和做算法带队人的就是他!
很多老读者都知道王老湿目前做工作方向是推荐系统相关,实不相瞒,在我当初入门学习推荐系统的时候,碰到了很多的问题,后来通过寻找各种渠道相关的资料,一点点查缺补漏,慢慢地将推荐系统相关的知识补齐了,总之过 ...
- 自学算法的那么多人,凭什么他能去大厂和做算法带队人!
今天要给大家推荐的是一个推荐系统领域的算法大牛:Thinkgamer.首先我们回答标题中的问题: 自学算法的那么多人,凭什么他能去大厂和做算法带队人! 他在校期间,自学了Hadoop,Spark和算法 ...
- mysql 排序后 下一条记录_什么是MySQL InnoDB 二级索引的排序?|附实例详解
概述 今天主要给大家介绍了关于MySQL InnoDB 二级索引的排序的相关资料,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值. 每个InnoDB表具有一个特殊的索引称为聚簇 ...
- 并归排序(看别人的看不懂,自己写了一个),排序思想是一样的
public int[] intArray = {8,5,10,55,88,22,14,36,82,54,10,74,22};@RequestMapping(value="hello&quo ...
- java map 值排序_使用Java8 Stream API对Map类型按照键或值进行排序
在这篇文章中,您将学习如何使用Java对Map按照键或值进行排序.前几日有位朋友面试遇到了这个问题,看似很简单的问题,但是如果不仔细研究一下也是很容易让人懵圈的面试题.所以我决定写这样一篇文章.在Ja ...
- 不愿意和别人打交道_始终和人保持距离,最不合群的3星座,孤僻却有真本事,能成大事...
始终和人保持距离,最不合群的3星座,孤僻却有真本事,能成大事 巨蟹座 巨蟹座的人真的是天生孤僻,他们始终和人保持距离,也不喜欢跟别人打交道,最怕就是应酬的事,看起来很不合群,但是巨蟹座却可以把自己的事 ...
- 反距离加权matlab算法,ImageWarping变形算法研究---反距离加权插值(IDW)
参考论文:Image Warping with Scattered Data Interpolation Inverse distance weighted interpolation算法(IDW)实 ...
- 算法013:二维数组中的查找-在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断中是否存在
题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.示例: 现有 ...
最新文章
- Spark Streaming 编程新手入门指南
- 特征工程(1):特征提取、特征构建、特征选择的区别
- scala学习 之 环境搭建(一)
- 这些焊接不良,你遇见过吗?
- OpenGL, GLSL, DirectX, HLSL中的矩阵存储形式
- 复合辛普森求积公式原理_辛普森法则:公式及其原理
- java 工厂模式_软件设计工厂模式使用场景介绍及java举例(附源码)
- category和extension的区别
- oracle 多路径 SAN,前言 - Oracle Solaris 管理:SAN 配置和多路径
- Helix Streaming Server 简单配置
- css3中的文字效果
- 广州技能入户计算机证书,广州技能入户申请的条件和工种有哪些
- 【嵌入式模块】DS18B20 数字温度传感器
- 软件测试中的测不准原理
- 暮拾晨花,回望流年——我的2016
- 商汤内推:2023届(AI先锋/校园招聘)
- Groundhog Looking Dowdy(尺取大法)
- android 广播的插件化
- 电脑计算机窗口不见了怎么调出来,电脑桌面上的任务栏不见了怎么办
- 通过QQ邮件短信提醒
热门文章
- 电脑主机启动不了是什么原因
- dwa轨迹规划,局部路径规划
- ros_tools.prompt 断点调试
- springBoot跨域注解@CrossOrigin
- SpringMVC多种参数接收
- r语言插补法_R语言用多重插补法估算相对风险
- linux内核维护者,Linux 内核维护者封杀明尼苏达大学(转载) - 优秀的Free OS(Linux)版 - 北大未名BBS...
- [NOIP2015]金币
- 利用函数求两个数的最大值
- MySQL多个条件更新多个字段