用户登陆的时候会获取到该用户的经纬度,数据库中存有所有用户的经纬度,如何进行由近到远进行排序,并算出距离

可以考虑用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做附近的人,根据距离由近到远进行排序相关推荐

  1. 没事做做题之棋盘上的距离

    这是<程序设计引导及在线实践>上的题目,其实题目是北京大学程序在线评测系统里面的题目. 题目描述: 国际象棋的棋盘是黑白相间的 8 * 8 的方格,棋子放在格子中间. 王.后.车.象的走子 ...

  2. 靠自学算法进入大厂和做算法带队人的就是他!

    很多老读者都知道王老湿目前做工作方向是推荐系统相关,实不相瞒,在我当初入门学习推荐系统的时候,碰到了很多的问题,后来通过寻找各种渠道相关的资料,一点点查缺补漏,慢慢地将推荐系统相关的知识补齐了,总之过 ...

  3. 自学算法的那么多人,凭什么他能去大厂和做算法带队人!

    今天要给大家推荐的是一个推荐系统领域的算法大牛:Thinkgamer.首先我们回答标题中的问题: 自学算法的那么多人,凭什么他能去大厂和做算法带队人! 他在校期间,自学了Hadoop,Spark和算法 ...

  4. mysql 排序后 下一条记录_什么是MySQL InnoDB 二级索引的排序?|附实例详解

    概述 今天主要给大家介绍了关于MySQL InnoDB 二级索引的排序的相关资料,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值. 每个InnoDB表具有一个特殊的索引称为聚簇 ...

  5. 并归排序(看别人的看不懂,自己写了一个),排序思想是一样的

    public int[] intArray = {8,5,10,55,88,22,14,36,82,54,10,74,22};@RequestMapping(value="hello&quo ...

  6. java map 值排序_使用Java8 Stream API对Map类型按照键或值进行排序

    在这篇文章中,您将学习如何使用Java对Map按照键或值进行排序.前几日有位朋友面试遇到了这个问题,看似很简单的问题,但是如果不仔细研究一下也是很容易让人懵圈的面试题.所以我决定写这样一篇文章.在Ja ...

  7. 不愿意和别人打交道_始终和人保持距离,最不合群的3星座,孤僻却有真本事,能成大事...

    始终和人保持距离,最不合群的3星座,孤僻却有真本事,能成大事 巨蟹座 巨蟹座的人真的是天生孤僻,他们始终和人保持距离,也不喜欢跟别人打交道,最怕就是应酬的事,看起来很不合群,但是巨蟹座却可以把自己的事 ...

  8. 反距离加权matlab算法,ImageWarping变形算法研究---反距离加权插值(IDW)

    参考论文:Image Warping with Scattered Data Interpolation Inverse distance weighted interpolation算法(IDW)实 ...

  9. 算法013:二维数组中的查找-在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断中是否存在

    题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.示例: 现有 ...

最新文章

  1. Spark Streaming 编程新手入门指南
  2. 特征工程(1):特征提取、特征构建、特征选择的区别
  3. scala学习 之 环境搭建(一)
  4. 这些焊接不良,你遇见过吗?
  5. OpenGL, GLSL, DirectX, HLSL中的矩阵存储形式
  6. 复合辛普森求积公式原理_辛普森法则:公式及其原理
  7. java 工厂模式_软件设计工厂模式使用场景介绍及java举例(附源码)
  8. category和extension的区别
  9. oracle 多路径 SAN,前言 - Oracle Solaris 管理:SAN 配置和多路径
  10. Helix Streaming Server 简单配置
  11. css3中的文字效果
  12. 广州技能入户计算机证书,广州技能入户申请的条件和工种有哪些
  13. 【嵌入式模块】DS18B20 数字温度传感器
  14. 软件测试中的测不准原理
  15. 暮拾晨花,回望流年——我的2016
  16. 商汤内推:2023届(AI先锋/校园招聘)
  17. Groundhog Looking Dowdy(尺取大法)
  18. android 广播的插件化
  19. 电脑计算机窗口不见了怎么调出来,电脑桌面上的任务栏不见了怎么办
  20. 通过QQ邮件短信提醒

热门文章

  1. 电脑主机启动不了是什么原因
  2. dwa轨迹规划,局部路径规划
  3. ros_tools.prompt 断点调试
  4. springBoot跨域注解@CrossOrigin
  5. SpringMVC多种参数接收
  6. r语言插补法_R语言用多重插补法估算相对风险
  7. linux内核维护者,Linux 内核维护者封杀明尼苏达大学(转载) - 优秀的Free OS(Linux)版 - 北大未名BBS...
  8. [NOIP2015]金币
  9. 利用函数求两个数的最大值
  10. MySQL多个条件更新多个字段