最近做一个项目:需要查询一个站点(已知该站点经纬度)500米范围内的其它站点。所以,我首先想到的是,对每条记录,去进行遍历,跟数据库中的每一个点进行距离计算,当距离小于500米时,认为匹配。这样做确实能够得到结果,但是效率极其低下,因为每条记录都要去循环匹配n条数据,其消耗的时间可想而知。

于是我就想到一个先过滤出大概的经纬度范围再进行计算。比方说正方形的四个点,于是我在网上搜索,意外的,查询到了一个关于这个计算附近地点搜索初探,里面使用Python实现了这个想法。所以参考了一下原文中的算法,使用Java进行了实现。

实现原理也是很相似的,先算出该点周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录。

思路:首先算出“给定坐标附近500米”这个范围的坐标范围。 虽然它是个圆,但我们可以先求出该圆的外接正方形,然后拿正方形的经纬度范围去搜索数据库。

先来求东西两侧的的范围边界。在haversin公式中令φ1 = φ2,可得

用Java代码写就是

[java] view plain copy
  1. //先计算查询点的经纬度范围<span style="font-family: 微软雅黑, Helvetica, Times, Arial, serif;">lat已知纬度,lng已知经度</span>
  2. double r = 6371;//地球半径千米
  3. double dis = 0.5;//0.5千米距离
  4. double dlng =  2*Math.asin(Math.sin(dis/(2*r))/Math.cos(lat*Math.PI/180));
  5. dlng = dlng*180/Math.PI;//角度转为弧度
  6. double dlat = dis/r;
  7. dlat = dlat*180/Math.PI;

最后,就可以得出四个点的坐标:
left-top : (lat + dlat, lng – dlng)
right-top : (lat + dlat, lng + dlng)
left-bottom : (lat – dlat, lng – dlng)
right-bottom: (lat – dlat, lng + dlng)
综合也就是这样进行筛选查询

[java] view plain copy
  1. public List<Property> findNeighPosition(double longitude,double latitude){
  2. //先计算查询点的经纬度范围
  3. double r = 6371;//地球半径千米
  4. double dis = 0.5;//0.5千米距离
  5. double dlng =  2*Math.asin(Math.sin(dis/(2*r))/Math.cos(latitude*Math.PI/180));
  6. dlng = dlng*180/Math.PI;//角度转为弧度
  7. double dlat = dis/r;
  8. dlat = dlat*180/Math.PI;
  9. double minlat =latitude-dlat;
  10. double maxlat = latitude+dlat;
  11. double minlng = longitude -dlng;
  12. double maxlng = longitude + dlng;
  13. String hql = "from Property where longitude>=? and longitude =<? and latitude>=? latitude=<? and state=0";
  14. Object[] values = {minlng,maxlng,minlat,maxlat};
  15. List<Property> list = find(hql, values);
  16. return list;
  17. }

根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法相关推荐

  1. Java进阶(五十)根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法

    文章目录 一.前言 二.原理 三.思路 四.Java实现 一.前言 最近做一个项目:需要查询一个站点(已知该站点经纬度)1km-10km范围内的其它站点.所以,我首先想到的是,对每条记录,去进行遍历, ...

  2. PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍...

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

  3. php 输入经纬度查询位置,PHP根据一个给定经纬度的点,进行附近地点查询–合理利用算法...

    实现原理先算出该点周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录. //获取周围坐标 public function returnSquarePoint($lng, $lat,$dista ...

  4. GPS定位,经纬度附近地点查询–C 实现方法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 目前的工 ...

  5. 给定经纬度定位某个城市

    方案1 通过GEO HASH,抓取每个格子里的点的地址信息,然后把这个地址信息作为GEO中点坐标的一个信息,当查询给定经纬度是在哪个城市的时候,查询过程是查询距离这个经纬度最近的带有地址的点,认为给定 ...

  6. 给定经纬度,计算附近多少公里范围内的地点

    场景:当时我们项目用的是spring-data-jpa, 用hql实现的话,实在是不知道怎么搞,所以想出这么个方法.这样做的就是避免直接在数据查询语句中去计算该点附近多少公里范围内的点,将sql语句的 ...

  7. 程序实现:由给定几个数确定凸组合系数,组成一个给定的数

    问题描述 给定几个数xix_ixi​确定凸组合系数λi\lambda_iλi​,组成一个给定的数xxx. ∑λixi=x\sum \lambda_ix_i=x∑λi​xi​=x s.t.∑λi=1s. ...

  8. php二维数组按照自定义方式对键值排序,PHP 对一个给定的二维数组按照指定的键值进行排序...

    $v){ $keysvalue[$k] = $v[$keys]; } if($type == 'asc'){ asort($keysvalue); }else{ arsort($keysvalue); ...

  9. 剑指offer:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S="abc ...

最新文章

  1. 多级缓存中的一级缓存全网流量分发CDN
  2. 排队器拦截_过滤器(Filter)和拦截器(Interceptor)的执行顺序和区别
  3. plsql如何执行存储过程_如何理解Spark应用的执行过程
  4. python编程快速上手-----让繁琐工作自动化_Python编程快速上手让繁琐工作自动化--逗号代码和字符图网格...
  5. VS2013+VSVIM
  6. 大数据整型的加减乘除
  7. Rtsp之rtp包解析
  8. dnf服务器的ini配置文件,dnf分辨率配置文件在哪 | 手游网游页游攻略大全
  9. 瀚高数据库开启Oracle兼容模块
  10. Validation and Data leakages
  11. Python Scapy(2.3.1)文档学习(四):高级用法
  12. 由浅入深 学习 Android Binder(一)- AIDL
  13. mdk5(keil 5) 中间库emwin 图形库移植
  14. ubuntu 100M 到 10M
  15. muduo---C++网络编程库
  16. 英语影视台词---三、Cinema Paradiso
  17. 超级好用的C++万能头文件
  18. 八、鼎捷T100生产管理之委外管理篇
  19. .mypage打破传统html文档结构
  20. 云端数据库安全问题分析

热门文章

  1. 转让权利,可以同时转移风险吗?
  2. BMP位图格式详解二--转载
  3. 科技的成就(二十五)
  4. vue中使用axios跨域请求
  5. 计算机图形学求亮度级别数,计算机图形学复习笔记
  6. Chrome学习整理
  7. 线性表的实验——湖北理工学院
  8. linux使用apache搭建http服务器(文件服务器)
  9. Qt Quick里的图形效果——颜色(Color)
  10. python进行聚类分析:鸢尾花(iris)代码