查找附近的商家 算法

标签: 商家 算法 | 发表时间:2014-10-08 01:40 | 作者:wandejun1012
出处:http://www.iteye.com

 

 

思路:利用IOS所在位置坐标为圆心,以某个半径为圆的外切正方形的四个顶点为参照物,去和数据库中的商家坐标进行比较,从而找出符合条件的商家。

 

实质上,最本质的就是寻找四个顶点的过程。

 

Java实现:

 

 

private static double degrees(double d) {
		return d * (180 / Math.PI);
	}

	
	/**
	 * 获取四个顶点的list
	 * @param lgt
	 * @param lat
	 * @param distance
	 * @return
	 */
	public static List<LatlgtPoint> getPointsList(double lgt, double lat,
			double distance) {

		List<LatlgtPoint> pointsList = new ArrayList<LatlgtPoint>();

		double dlng = 2 * Math.asin(Math.sin(distance / (2 * EARTH_RADIUS))
				/ Math.cos(rad(lat)));
		dlng = degrees(dlng);// 一定转换成角度数 原PHP文章这个地方说的不清楚根本不正确 后来lz又查了很多资料终于搞定了

		double dlat = distance / EARTH_RADIUS;
		dlat = degrees(dlat);// 一定转换成角度数

		// 左上角的顶点
		LatlgtPoint leftUpPoint = new LatlgtPoint();
		leftUpPoint.setLat(lat + dlat);
		leftUpPoint.setLgt(lgt - dlng);
		pointsList.add(leftUpPoint);

		// 左下角的顶点
		LatlgtPoint leftDownPoint = new LatlgtPoint();
		leftDownPoint.setLat(lat - dlat);
		leftDownPoint.setLgt(lgt - dlng);
		pointsList.add(leftDownPoint);

		// 右上角的顶点
		LatlgtPoint rightUpPoint = new LatlgtPoint();
		rightUpPoint.setLat(lat + dlat);
		rightUpPoint.setLgt(lgt + dlng);
		pointsList.add(rightUpPoint);

		// 右下角的顶点
		LatlgtPoint rightDownPoint = new LatlgtPoint();
		rightDownPoint.setLat(lat - dlat);
		rightDownPoint.setLgt(lgt + dlng);
		pointsList.add(rightDownPoint);

		return pointsList;

	}

private static final double EARTH_RADIUS = 6378137;

	private static double rad(double d) {
		return d * Math.PI / 180.0;
	}


/**
	 * 传入经纬度计算距离,单位为km,保留2位小数
	 * 
	 * @param lng1
	 * @param lat1
	 * @param lng2
	 * @param lat2
	 * @return
	 */
	public static String calDistance(float lng1, float lat1, float lng2,
			float lat2) {
		double radLat1 = rad(lat1);
		double radLat2 = rad(lat2);
		double a = radLat1 - radLat2;
		double b = rad(lng1) - rad(lng2);
		double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
				+ Math.cos(radLat1) * Math.cos(radLat2)
				* Math.pow(Math.sin(b / 2), 2)));
		s = s * EARTH_RADIUS / 1000;
		return String.format("%.2f", s);
	}

 

 

Point类:

 

package com.chebaobao.api.common.test;

public class LatlgtPoint {
	private double lat;//纬度
	private double lgt;//经度
	public double getLat() {
		return lat;
	}
	public void setLat(double lat) {
		this.lat = lat;
	}
	public double getLgt() {
		return lgt;
	}
	public void setLgt(double lgt) {
		this.lgt = lgt;
	}
	@Override
	public String toString() {
		return "LatlgtPoint [lat=" + lat + ", lgt=" + lgt + "]";
	}
	
}

 

refurl:http://digdeeply.org/archives/06152067.html

 

http://www.cnblogs.com/cake/p/3240325.html

 

http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.html#creating-a-spatially-enabled-mysql-database   引申出来的mysql高版本的空间索引, 以及mongodb,sqlserver2008都有。

 

http://www.oschina.net/question/41761_132578 mongodb

 

http://bbs.csdn.net/topics/390346060?page=1#post-395973698 csdn网上人的解答也不错,比如写一个计算距离的函数,比如有专门的坐标字段

 

下面是通过GPS坐标计算直线距离的:

 

http://gooderlee.iteye.com/blog/1178163

 

http://blog.csdn.net/e_wsq/article/details/6151160

 

http://www.cnblogs.com/ycsfwhh/archive/2010/12/20/1911232.html

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [商家 算法] 推荐:

查找附近的商家 算法

- - 编程语言 - ITeye博客
思路:利用IOS所在位置坐标为圆心,以某个半径为圆的外切正方形的四个顶点为参照物,去和数据库中的商家坐标进行比较,从而找出符合条件的商家. 实质上,最本质的就是寻找四个顶点的过程. * 获取四个顶点的list. dlng = degrees(dlng);// 一定转换成角度数 原PHP文章这个地方说的不清楚根本不正确 后来lz又查了很多资料终于搞定了.

缓存算法

- lostsnow - 小彰
没有人能说清哪种缓存算法由于其他的缓存算法. (以下的几种缓存算法,有的我也理解不好,如果感兴趣,你可以Google一下  ). 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率. 我是LRU缓存算法,我把最近最少使用的缓存对象给踢走. 我总是需要去了解在什么时候,用了哪个缓存对象.

BFPRT算法

- zii - 小彰
BFPRT算法的作者是5位真正的大牛(Blum 、 Floyd 、 Pratt 、 Rivest 、 Tarjan),该算法入选了在StackExchange上进行的当今世界十大经典算法,而算法的简单和巧妙颇有我们需要借鉴学习之处. BFPRT解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分析,BFPRT可以保证在最坏情况下仍为线性时间复杂度.

贪心算法

- Shan - 博客园-首页原创精华区
顾名思义,贪心算法总是作出在当前看来最好的选择. 也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 当然,希望贪心算法得到的最终结果也是整体最优的. 虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解. 如单源最短路经问题,最小生成树问题等.

缓存算法

- 成 - FeedzShare
来自: 小彰 - FeedzShare  . 发布时间:2011年09月25日,  已有 2 人推荐. 没有人能说清哪种缓存算法由于其他的缓存算法. (以下的几种缓存算法,有的我也理解不好,如果感兴趣,你可以Google一下  ). 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率.

K-Means 算法

- - 酷壳 - CoolShell.cn
最近在学习一些数据挖掘的算法,看到了这个算法,也许这个算法对你来说很简单,但对我来说,我是一个初学者,我在网上翻看了很多资料,发现中文社区没有把这个问题讲得很全面很清楚的文章,所以,把我的学习笔记记录下来,分享给大家. k-Means 算法是一种  cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法.

查找算法:

- - CSDN博客推荐文章
从数组的第一个元素开始查找,并将其与查找值比较,如果相等则停止,否则继续下一个元素查找,直到找到匹配值. 注意:要求被查找的数组中的元素是无序的、随机的. 比如,对一个整型数组的线性查找代码:. // 遍历整个数组,并分别将每个遍历元素与查找值对比. 要查找的值在数组的第一个位置. 也就是说只需比较一次就可达到目的,因此最佳情况的大O表达式为:O(1).

排序算法

- - 互联网 - ITeye博客
排序算法有很多,所以在特定情景中使用哪一种算法很重要. 为了选择合适的算法,可以按照建议的顺序考虑以下标准: .     对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要.  一、冒泡(Bubble)排序——相邻交换 .  二、选择排序——每次最小/大排在相应的位置 .

联接算法

- - CSDN博客数据库推荐文章
本文摘自《锋利的SQL》: http://item.jd.com/10380652.html. 在Microsoft SQLServer Management Studio中执行查询时,如果选定工具栏中的 按钮,可以看到为查询生成的执行计划. 执行计划以图形方式显示了SQL Server查询优化器选择的数据检索方法,如表扫描、排序、哈希匹配等.

理解EM算法

- Chin - 我爱自然语言处理
EM(Expectation-Maximization)算法在机器学习和自然语言处理应用非常广泛,典型的像是聚类算法K-means和高斯混合模型以及HMM(Hidden Markov Model). 笔者觉得讲EM算法最好的就是斯坦福大学Andrew Ng机器学习课的讲课笔记和视频. 本文总结性的给出普遍的EM算法的推导和证明,希望能够帮助接触过EM算法但对它不是很明白的人更好地理解这一算法.