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

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

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

原理

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

思路

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

红色部分为要求的搜索范围,绿色部分我们能间接得到的结果范围

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

Java实现

	/**
	 * 药店选择
	 * @param longitude	经度
	 * @param latitude	纬度
	 * @param distance	搜索范围
	 * @return	搜索结果
	 */
	private static List<String> findNeighDrugstore(double longitude,
			double latitude, double distance) {

		double minlat = 0;
		double maxlat = 0;
		double minlng = 0;
		double maxlng = 0;

		// 先计算查询点的经纬度范围
		double r = 6371;// 地球半径千米
		double dis = distance;// 距离(单位:千米)
		double dlng = 2 * Math.asin(Math.sin(dis / (2 * r))
				/ Math.cos(longitude * Math.PI / 180));
		dlng = dlng * 180 / Math.PI;// 角度转为弧度
		double dlat = dis / r;
		dlat = dlat * 180 / Math.PI;
		if (dlng < 0) {
			minlng = longitude + dlng;
			maxlng = longitude - dlng;
		} else {
			minlng = longitude - dlng;
			maxlng = longitude + dlng;
		}
		if (dlat < 0) {
			minlat = latitude + dlat;
			maxlat = latitude - dlat;
		} else {
			minlat = latitude - dlat;
			maxlat = latitude + dlat;
		}

		System.out.println("dlng------------------>" + dlng);
		System.out.println("dlat------------------>" + dlat);
		System.out.println("minlat------------------>" + minlat);
		System.out.println("maxlat------------------>" + maxlat);
		System.out.println("minlng------------------>" + minlng);
		System.out.println("maxlng------------------>" + maxlng);

		Lm_user lm_user = new Lm_user();

		lm_user.setSelectedFields("uid");

		List<String> ulist = new ArrayList<String>();

		// 降序排序
		lm_user.dec_upd("utype='1' AND addr_x BETWEEN " + minlng + " AND "
				+ maxlng + " AND addr_y BETWEEN " + minlat + " AND " + maxlat
				+ " ORDER BY weight DESC");
		while (lm_user.fet_upd()) {
			ulist.add(lm_user.get_uid());
		}
		return ulist;
	}

Java实现附近地点搜索的更多相关文章

  1. 百度地图API地点搜索-获取经纬度

    分享一下地图上的地点搜索和鼠标点击获取地点经纬度,这些都是地图比较基本和实用的代码,其中还包括了根据用户IP进行地图的显示.改变地图上的鼠标样式.启用滚轮缩放等,算是半入门吧,其他的一些可以自己参考百 ...

  2. geohash:用字符串实现附近地点搜索

    转自:http://blog.charlee.li/geohash-intro/ geohash:用字符串实现附近地点搜索 上回说到了用经纬度范围实现附近地点搜索.一些小型应用中这样做没问题,但在大型 ...

  3. Elasticsearch 5.4.3实战--Java API调用:搜索

    ES有多种查询方式,我自己的业务是需要对多个字段进行查询,具体实现类代码如下. package com.cs99lzzs.elasticsearch.service.imp; import java. ...

  4. java线程池 多线程 搜索包含关键字的文件路径

    package org.jimmy.searchfile20180807.main; public class ThreadMain implements Runnable{ private int ...

  5. java线程池 多线程搜索文件包含关键字所在的文件路径

    文件读取和操作类 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; publi ...

  6. [ElasticSearch]Java API 之 滚动搜索(Scroll API)

    一般搜索请求都是返回一"页"数据,无论数据量多大都一起返回给用户,Scroll API可以允许我们检索大量数据(甚至全部数据).Scroll API允许我们做一个初始阶段搜索并且持 ...

  7. 【java】企业级分布式搜索平台Solr视频教程

    课程背景为了满足高可用.可扩展并容错的分布式搜索引擎.Solr是一个高性能,采用Java5开发, 基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现 ...

  8. Elasticsearch 5.4.3实战--Java API调用:搜索建议

    通常的搜索引擎,都会根据用户的输入,实时给予匹配的提示. 那么这个功能在elasticsearch中如何实现呢? Elasticsearch里设计了4种类别的Suggester,分别是: Term S ...

  9. Java实现 LeetCode 240 搜索二维矩阵 II(二)

    240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. ...

随机推荐

  1. 安卓高级2 swipeReferenceLayout 使用案例 和完善其自定义上拉

    swipeReferenceLayout 无法完成上来加载数据所以自定义了一个类 Activity.java package qianfeng.com.swipelayoutdemo; import ...

  2. Apache Curator入门实战

    Apache Curator入门实战 Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeep ...

  3. Android-Tab

    SmartTabLayout 我的地址:https://github.com/kongqw/Android-Tab 开源地址:https://github.com/ogaclejapan/SmartT ...

  4. Sublime text 添加lua

    tools ->build system->new build system... 输入: { "cmd": ["C:\\lua\\lua53.exe&quo ...

  5. [Django]bulk_create 探究

    使用django orm大批量插入的时候我们可以不使用for循环对一个一个的save而是使用 bulk_create来批量插入,可是使用了这个方法还需要在自己添加一个事务吗? 还是django本身对这 ...

  6. 使用java命令重启tomcat

    public static void restartMyTomcat() { String location=ConfigUtil.getRestartLocation(); createCmdFil ...

  7. Springmvc注解注入的简单demo

    今天看了注解注入觉得确实简化了xml配置,一般情况下Spring容器要成功启动的三大要件分别是:Bean定义信息,Bean实现类,以及spring本身.如果采取基于XML的配置,Bean信息和Bean ...

  8. Servlet编程实例-servlet学习之旅(三)

    LoginServlet代码: public class LoginServlet extends HttpServlet{ @Override protected void service(Http ...

  9. Android Device Administration 设备管理器——实现一键锁屏

    Android Device Administration 设备管理器--实现一键锁屏 最近研究了一下安全这一块的内容,当然,我是比较水的,所以也拿不出什么好知识点,但是有一些冷门的东西我还是可以聊聊 ...

  10. Servlet3.0注解@WebInitParam和@WebServlet

    在以前的servlet中我们初始化一些参数都是配置在web.xml中的,自从servlet3.0之后给我们提供了注解@WebServlet和@WebInitParam,@WebServlet是用来配置 ...