您现在的位置: 河北经济网 >> ASP.NET >> 文章正文
河北经济日报 河北经济网 热线电话:0311-88606065

google map或百度map 应用

来源:
2014-8-6 16:58:03
编辑:晓枫
0

关于map的具体用法请参考各自官方API(感觉有点标题党o_O)

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处的经纬度坐标,具体方法如下:

/**     * @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}
4. 以上获取到的是以lnglat为中心,2r为长宽的正方形区域内的所有已存储店铺,我这里进行了过滤(遍历上面的数据,计算它到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处的经纬度,然后再去查询数据库

河北经济日报社版权所有 未经允许不得复制或镜像 
本站由河北经济日报社全资子公司——河北易联文化传媒有限公司运营 
Email: h88606065@163.com qq:2015517 电话:0311-88606065
冀ICP备字05029190号 冀新网备 132006008
河北经济日报社网络信息部设计制作
地址:石家庄市裕华西路186号
建议使用1024x768分辨率