google map 、经纬度

             google map或百度map 应用

 

关于map的具体用法请参考各自官方API。

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

}

 

 

2. 计算所需要的经纬度范围Bounds,表示该点(lnglat)处正东西南北距离r处的经纬度坐标,具体方法如下:

//注意BigDecimal类

private static final int DEFAULT_DIV_SCALE = 6;

/**
* 1000表示1公里,111表示同经度时,纬度相差一度,距离就相差111公里
*
* @param lat 当前位置纬度
* @param lag 当前位置经度
* @param r 半径,单位M(附近rM)
* @return Bounds
*/
public static Bounds conversion(Double lat, Double lag, Integer r) {
String l = String.valueOf(1000 * 111);
String latx = new BigDecimal(String.valueOf(r)).divide(new BigDecimal(l), DEFAULT_DIV_SCALE,
BigDecimal.ROUND_HALF_EVEN).toString();
String lagx = new BigDecimal(latx).divide(new BigDecimal(String.valueOf(Math.cos(lat))), DEFAULT_DIV_SCALE,
BigDecimal.ROUND_HALF_EVEN).toString();
Double latN = lat + Math.abs(Double.valueOf(latx));
Double latS = lat - Math.abs(Double.valueOf(latx));
Double lagE = lag + Math.abs(Double.valueOf(lagx));
Double lagW = lag - Math.abs(Double.valueOf(lagx));
Bounds bounds = new Bounds();
bounds.setLagE(lagE);
bounds.setLagW(lagW);
bounds.setLatN(latN);
bounds.setLatS(latS);
return bounds;
}

 

 

 

3. 拿到Bounds,就能获取指定位置(lnglat)正东西南北距离r处的经纬度,然后再去查询数据库,sql如下(mybatis):

//company 里面存放经纬度
SELECT * FROM company where lat >= #{latS} and lat <= #{latN} and lag >= #{lagW} and lag <= #{lagE}

4. 以上获取到的是以lnglat为中心,2r为长宽的正方形区域内的所有已存储店铺,我这里进行了过滤(遍历上面的数据,计算它到lnglat的距离,大于r则剔除)保证取到的是在圆形区域:

 

 

/**
* @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;
}

 

 

好了,拿到圆形区域内的所有店铺了,根据其经纬度标注到地图上吧。

 

 

 

Google Map根据经纬度解析地址的原理是通过地理编码技术实现的。当我们输入一对经纬度坐标时,Google Map会使用地理编码算法将该坐标转换为具体的地址。 地理编码技术是将地球上的经纬度坐标转换为描述地理位置的具体地址的过程。Google Map通过使用自身的庞大地理数据库和先进的算法,将用户提供的经纬度与数据库中的地址进行匹配。 具体而言,Google Map经纬度解析过程包含以下几个主要步骤: 1. 获取经纬度:用户在Google Map上标记或输入经纬度坐标,或通过其他途径获取经纬度信息。 2. 发送请求:Google Map接收到用户提交的经纬度坐标后,会向服务器发送请求,请求解析该坐标对应的地址。 3. 数据匹配:服务器接收到请求后,会在庞大的地理数据库中进行搜索,寻找与用户提供的经纬度坐标最匹配的地址数据。 4. 地址解析:一旦找到了匹配的地址数据,服务器会对该数据进行解析和处理,提取出具体的地址信息,例如街道名称、城市、国家等。 5. 返回结果:最后,服务器将解析后的地址信息返回给Google Map,并展示在用户界面上,使用户能够直观地了解该经纬度所对应的具体地址。 通过以上步骤,Google Map实现了根据经纬度解析地址的功能。这使得用户可以方便地使用经纬度坐标来查找和定位目标地址,提供了丰富的地理信息服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值