google和百度map都提供了范围搜索的功能:比如搜索指定位置指定范围内的所有kfc店铺,它们使用的都是自己的店铺数据,可有时候我们只需要在地图上显示我们自己存储的店铺,并把它们标注在地图上,同样只给定两个参数:指定位置(某一处的经纬度lnglat)和搜索半径(r)。 每个地图API都提供了计算两个坐标之间距离的方法,我们可以从库中拿出所有的店铺的经纬度(slnglat),然后逐一计算出lnglat到slnglat距离s,若s<r,则这个店铺就是我们想要的可以直接返回给前端标注在地图上。呃...这种方法当然不可行,不过当然也不是绝对的啦...^_^ 前段时间写了个例子,主要通过java实现(计算距离经纬度范围之类的) 1. 建立模型:半径r的范围表示一个圆,不过一般情况下我们完全可以把它看作是一正方形...呀呀呀,还是用代码说话吧,下面是一个pojo: /** * 类Bounds.java的实现描述:用户当前位置半径x米的经纬度范围 * * @author zjb 2011-3-30 下午04:56:13 */public class Bounds { /** * 当前位置正北方向x米处 纬度 */ PRivate Double latN; /** * 当前位置正南方向x米处 纬度 */ private Double latS; /** * 当前位置正东方向x米处 经度 */ private Double lagE; /** * 当前位置正西方向x米处 经度 */ private Double lagW; //getters or setters} /** * @param lat 纬度 * @param lag 经度 * @param r 半径 * @return Boolean */ public static Boolean check(Company company, Double lat, Double lag, Integer r) { double R = 6371;//地球半径 double distance = 0.0; double dLat = Double.valueOf(new BigDecimal(String.valueOf((company.getLat() - lat))) .multiply(new BigDecimal(String.valueOf(Math.PI))) .divide(new BigDecimal(String.valueOf(180)), DEFAULT_DIV_SCALE,BigDecimal.ROUND_HALF_EVEN).toString()); double dLon = Double.valueOf(new BigDecimal(String.valueOf((company.getLag() - lag))) .multiply(new BigDecimal(String.valueOf(Math.PI))) .divide(new BigDecimal(String.valueOf(180)), DEFAULT_DIV_SCALE,BigDecimal.ROUND_HALF_EVEN).toString()); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(company.getLat() * Math.PI / 180) * Math.cos(lat * Math.PI / 180) * Math.sin(dLon / 2) * Math.sin(dLon / 2); distance = (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))) * R * 1000; System.out.println(distance); if (distance > Double.valueOf(String.valueOf(r))){ return false; } return true; } //company 里面存放经纬度SELECT * FROM company where lat >= #{latS} and lat <= #{latN} and lag >= #{lagW} and lag <= #{lagE} 3. 拿到Bounds,就能获取指定位置(lnglat)正东西南北距离r处的经纬度,然后再去查询数据库 |