zoukankan      html  css  js  c++  java
  • 百度地图地址解析/逆地址解析

    由于工作需要,需要根据经纬度获得地址,或者根据地址获得经纬度,使用百度api

    类清单

    1.ReverseGeocodingRequest.java     逆地址解析的请求类

    2.Location.java             经纬度类

    3.ReverseGeocodingResponse.java   逆地址响应封装类

    4.ReverseGeocodingResult.java      逆地址解析相关数据类

    5.AddressComponent.java        逆地址解析相关的地址信息类

    6.GeocodingRequest.java         地址解析的请求类

    7.GeocodingResponse.java         地址解析的响应封装类

    8.GeocodingResult.java         地址解析的相关响应数据类

    具体代码如下:

    BaiduMapUtils.java
    import com.alibaba.fastjson.TypeReference;
    import com.dimpt.common.util.HttpClientUtils;
    import com.dimpt.common.util.JsonUtils;
    import com.dimpt.common.util.baidu.map.geo.GeocodingRequest;
    import com.dimpt.common.util.baidu.map.geo.GeocodingResponse;
    import com.dimpt.common.util.baidu.map.geo.ReverseGeocodingRequest;
    import com.dimpt.common.util.baidu.map.geo.ReverseGeocodingResponse;
    import org.springframework.util.StringUtils;
    
    import java.io.IOException;
    
    /**
     * @author: 
     * @data: 
     * @version:
     */
    public class BaiduMapUtils {
        /**
         * 百度地图请求秘钥,注意:需要是服务度app的秘钥
         */
        private static final String KEY = "PemGxiMCQ********";
        /**
         * 返回值类型
         */
        private static final String OUTPUT = "json";
        /**
         * 根据地名获取经纬度
         */
        private static final String GET_LNG_LAT_URL = "http://api.map.baidu.com/geocoder/v3/";
        /**
         * 根据经纬度获取地名
         */
        private static final String GET_ADDRESS_URL = "http://api.map.baidu.com/reverse_geocoding/v3/";
    
        /**
         * 逆地址解析
         * 根据经纬度获得地址信息
         * 仓考地址 http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad
         * @return
         */
        public static ReverseGeocodingResponse reverseGeocoding(ReverseGeocodingRequest reverseGeocodingRequest) {
            if(StringUtils.isEmpty(reverseGeocodingRequest.getAk()))
            {
                reverseGeocodingRequest.setAk(KEY);
            }
            try {
                String url = joinUrl(reverseGeocodingRequest);
                String jsonString = HttpClientUtils.doGet(url);
    
                ReverseGeocodingResponse response = JsonUtils.toObject(jsonString,new TypeReference<ReverseGeocodingResponse>(){});
                return response;
            }catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static GeocodingResponse geocoding(GeocodingRequest geocodingRequest)
        {
            if(StringUtils.isEmpty(geocodingRequest.getAk()))
            {
                geocodingRequest.setAk(KEY);
            }
            try {
                String url = joinUrl(geocodingRequest);
                String jsonString = HttpClientUtils.doGet(url);
    
                GeocodingResponse response = JsonUtils.toObject(jsonString,new TypeReference<GeocodingResponse>(){});
                return response;
            }catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 拼接url字符串
         * @return
         * @throws IOException
         */
        private static String joinUrl(ReverseGeocodingRequest reverseGeocodingRequest) throws IOException {
            //拼装url
            StringBuilder baseUrl = new StringBuilder();
            String location = reverseGeocodingRequest.getLocation().getLat() + "," + reverseGeocodingRequest.getLocation().getLng();
    
            baseUrl.append(reverseGeocodingRequest.getUrl()).append("?ak=").append(reverseGeocodingRequest.getAk())
                    .append("&output=").append(reverseGeocodingRequest.getOutput())
                    .append("&coordtype=").append(reverseGeocodingRequest.getCoordtype())
                    .append("&location=").append(location);
    
    
            if(!StringUtils.isEmpty(reverseGeocodingRequest.getRet_coordtype()) && !"bd09ll".equals(reverseGeocodingRequest.getRet_coordtype()))
                baseUrl.append("&ret_coordtype=").append(reverseGeocodingRequest.getRet_coordtype());
    
            if(reverseGeocodingRequest.getRadius()!=1000)
                baseUrl.append("&radius=").append(reverseGeocodingRequest.getRadius());
    
            if(!StringUtils.isEmpty(reverseGeocodingRequest.getSn()))
                baseUrl.append("&sn=").append(reverseGeocodingRequest.getSn());
    
            if(!StringUtils.isEmpty(reverseGeocodingRequest.getCallback()))
                baseUrl.append("&callback=").append(reverseGeocodingRequest.getCallback());
    
            if(!StringUtils.isEmpty(reverseGeocodingRequest.getPoi_types()))
                baseUrl.append("&poi_types=").append(reverseGeocodingRequest.getPoi_types());
    
            if(!StringUtils.isEmpty(reverseGeocodingRequest.getExtensions_poi()))
                baseUrl.append("&extensions_poi=").append(reverseGeocodingRequest.getExtensions_poi());
    
            if(!StringUtils.isEmpty(reverseGeocodingRequest.getExtensions_road()) && "true".equals(reverseGeocodingRequest.getExtensions_road()))
                baseUrl.append("&extensions_road=").append(reverseGeocodingRequest.getExtensions_road());
    
            if(!StringUtils.isEmpty(reverseGeocodingRequest.getExtensions_town()))
                baseUrl.append("&extensions_town=").append(reverseGeocodingRequest.getExtensions_town());
    
            if(!StringUtils.isEmpty(reverseGeocodingRequest.getLanguage()) && "zh-CN".equals(reverseGeocodingRequest.getLanguage()))
                baseUrl.append("&language=").append(reverseGeocodingRequest.getLanguage());
    
            if(reverseGeocodingRequest.getLanguage_auto()==1)
                baseUrl.append("&language_auto=").append(reverseGeocodingRequest.getLanguage_auto());
    
            return baseUrl.toString();
        }
    
        /**
         * 拼接url字符串
         * @return
         * @throws IOException
         */
        private static String joinUrl(GeocodingRequest geocodingRequest) throws IOException {
            //拼装url
            StringBuilder baseUrl = new StringBuilder();
    
            baseUrl.append(geocodingRequest.getUrl()).append("?ak=").append(geocodingRequest.getAk())
                    .append("&output=").append(geocodingRequest.getOutput())
            .append("&address=").append(geocodingRequest.getAddress());
    
            if(!StringUtils.isEmpty(geocodingRequest.getCity()))
                baseUrl.append("&city=").append(geocodingRequest.getCity());
    
            if(!StringUtils.isEmpty(geocodingRequest.getRet_coordtype()) && !"bd09ll".equals(geocodingRequest.getRet_coordtype()))
                baseUrl.append("&ret_coordtype=").append(geocodingRequest.getRet_coordtype());
    
            if(!StringUtils.isEmpty(geocodingRequest.getSn()))
                baseUrl.append("&sn=").append(geocodingRequest.getSn());
    
            if(!StringUtils.isEmpty(geocodingRequest.getCallback()))
                baseUrl.append("&callback=").append(geocodingRequest.getCallback());
    
            return baseUrl.toString();
        }
    
        public static void main(String[] args) {
            ReverseGeocodingRequest reverseGeocodingRequest = new ReverseGeocodingRequest(116.639661,23.38616);
            ReverseGeocodingResponse data = BaiduMapUtils.reverseGeocoding(reverseGeocodingRequest);
            System.out.println(data.toString());
    
            GeocodingRequest geocodingRequest = new GeocodingRequest("北京市海淀区上地十街10号");
            GeocodingResponse data2 = BaiduMapUtils.geocoding(geocodingRequest);
            System.out.println(data2.toString());
        }
    }
    ReverseGeocodingResult.java
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    public class ReverseGeocodingResult {
        Location location;
        String formatted_address;
        AddressComponent addressComponent;
    }
    ReverseGeocodingRequest.java
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    /**
     * http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad
     */
    public class ReverseGeocodingRequest {
        public ReverseGeocodingRequest(){}
    
        String url="http://api.map.baidu.com/reverse_geocoding/v3/";
        /**
         *
         * @param lng 经度
         * @param lat 纬度
         */
        public ReverseGeocodingRequest(double lng,double lat){
            location = new Location(lng,lat);
        }
        /**
         *
         * @param lng 经度
         * @param lat 纬度
         * @param ak
         */
        public ReverseGeocodingRequest(double lng,double lat,String ak){
            location = new Location(lng,lat);
            this.ak=ak;
        }
    
        /**
         * 根据经纬度坐标获取地址
         */
        Location location;
    
        /**
         * 坐标的类型,目前支持的坐标类型包括:bd09ll(百度经纬度坐标)、bd09mc(百度米制坐标)、gcj02ll(国测局经纬度坐标,仅限中国)、wgs84ll( GPS经纬度)
         * http://lbsyun.baidu.com/index.php?title=coordinate
         */
        String coordtype="bd09ll";
    
        /**
         * 可选参数,添加后返回国测局经纬度坐标或百度米制坐标
         * 举例:gcj02ll(国测局坐标,仅限中国) ,bd09mc(百度墨卡托坐标)
         * http://lbsyun.baidu.com/index.php?title=coordinate
         */
        String ret_coordtype="bd09ll";
    
        /**
         * poi召回半径,允许设置区间为0-1000米,超过1000米按1000米召回。
         */
        int radius=1000;
    
        /**
         * 用户申请注册的key,自v2开始参数修改为“ak”,之前版本参数为“key”
         * 申请ak:http://lbsyun.baidu.com/apiconsole/key/create
         */
        String ak;
    
        /**
         * 若用户所用ak的校验方式为sn校验时该参数必须
         * sn生成 http://lbsyun.baidu.com/index.php?title=lbscloud/api/appendix
         */
        String sn;
    
        /**
         * 输出格式为json或者xml
         */
        String output="json";
    
        /**
         * 将json格式的返回值通过callback函数返回以实现jsonp功能
         * 举例:callback=showLocation(JavaScript函数名)
         */
        String callback;
    
        /**
         * 可以选择poi类型召回不同类型的poi,例如poi_types=酒店,如想召回多个POI类型数据,可以‘|’分割
         * 例如poi_types=酒店|房地产
         * 不添加该参数则默认召回全部POI分类数据
         * poi分类:http://lbsyun.baidu.com/index.php?title=lbscloud/poitags
         */
        String poi_types;
    
        /**
         * extensions_poi=0,不召回pois数据。
         * extensions_poi=1,返回pois数据,默认显示周边1000米内的poi。
         * 注意:若需访问境外POI,需申请「逆地理编码境外POI」服务权限,请提交工单申请。 http://lbsyun.baidu.com/apiconsole/fankui#?typeOne=%E4%BA%A7%E5%93%81%E9%9C%80%E6%B1%82&typeTwo=%E6%96%B0%E6%9C%8D%E5%8A%A1%2F%E5%8A%9F%E8%83%BD%E9%9C%80%E6%B1%82
         */
        String extensions_poi;
    
        /**
         * 当取值为true时,召回坐标周围最近的3条道路数据。区别于行政区划中的street参数(street参数为行政区划中的街道,和普通道路不对应)
         * 值范围 false、true
         */
        String extensions_road="false";
    
        /**
         * 当取值为true时,召回坐标周围最近的3条道路数据。区别于行政区划中的street参数(street参数为行政区划中的街道,和普通道路不对应)。
         * false、true
         */
        String extensions_town;
    
        /**
         * 指定召回的新政区划语言类型。
         * 召回行政区划语言list(全量支持的语言见示例)。
         * 当language=local时,根据请求中坐标所对应国家的母语类型,自动选择对应语言类型的行政区划召回。
         * 目前支持多语言的行政区划区划包含country、province、city、district
         * 注意:多语言需申请「逆地理编码境外POI」服务权限,请提交工单申请。
         * http://lbsyun.baidu.com/apiconsole/fankui#?typeOne=%E4%BA%A7%E5%93%81%E9%9C%80%E6%B1%82&typeTwo=%E6%96%B0%E6%9C%8D%E5%8A%A1%2F%E5%8A%9F%E8%83%BD%E9%9C%80%E6%B1%82
         */
        String language="zh-CN";
        /**
         * 是否自动填充行政区划。
         * 1填充,0不填充。
         * 填充:当服务按某种语言类别召回时,若某一行政区划层级数据未覆盖,则按照“英文→中文→本地语言”类别行政区划数据对该层级行政区划进行填充,保证行政区划数据召回完整性。
         * 注意:多语言需申请「逆地理编码境外POI」服务权限,请提交工单申请。
         */
        int language_auto;
    }
    View Code
    ReverseGeocodingResponse.java
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    public class ReverseGeocodingResponse {
        int status;
        ReverseGeocodingResult result;
    }
    ReverseGeocodingResult.java
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    public class ReverseGeocodingResult {
        Location location;
        String formatted_address;
        AddressComponent addressComponent;
    }
    AddressComponent.java
    @Getter
    @Setter
    public class AddressComponent {
        String country;
        String country_code;
        String country_code_iso;
        String country_code_iso2;
        String province;
        String city;
        String district;
        String street;
        String street_number;
        int city_level;
        String town;
        String town_code;
        String adcode;
        String direction;
        String distance;
    }
    

      

    ReverseGeocodingResult.java
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    public class ReverseGeocodingResult {
        Location location;
        String formatted_address;
        AddressComponent addressComponent;
    }
    Location.java
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    public class Location {
        public Location(){}
    
        /**
         *
         * @param lng 经度
         * @param lat 纬度
         */
        public Location(double lng,double lat)
        {
            this.lng=lng;
            this.lat=lat;
        }
        /**
         * 纬度
         */
        double lng;
        /**
         * 经度
         */
        double lat;
    }
    GeocodingRequest.java
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    /**
     * http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
     */
    public class GeocodingRequest {
    
        public GeocodingRequest(){}
        public GeocodingRequest(String address)
        {
            this.address=address;
        }
        public GeocodingRequest(String city,String address)
        {
            this.city=city;
            this.address=address;
        }
    
        public GeocodingRequest(String city,String address,String ak)
        {
            this.city=city;
            this.address=address;
            this.ak=ak;
        }
    
        String url="http://api.map.baidu.com/geocoding/v3/";
    
        /**
         * 待解析的地址。最多支持84个字节。
         * 可以输入两种样式的值,分别是:
         * 1、标准的结构化地址信息,如北京市海淀区上地十街十号 【推荐,地址结构越完整,解析精度越高】
         * 2、支持“*路与*路交叉口”描述方式,如北一环路和阜阳路的交叉路口
         * 第二种方式并不总是有返回结果,只有当地址库中存在该地址描述时才有返回。
         */
        String address;
    
        /**
         * 地址所在的城市名。用于指定上述地址所在的城市,当多个城市都有上述地址时,该参数起到过滤作用,但不限制坐标召回城市。
         */
        String city;
    
        /**
         * 可选参数,添加后返回国测局经纬度坐标或百度米制坐标
         * 举例:gcj02ll(国测局坐标,仅限中国) ,bd09mc(百度墨卡托坐标)
         * http://lbsyun.baidu.com/index.php?title=coordinate
         */
        String ret_coordtype="bd09ll";
        /**
         * 用户申请注册的key,自v2开始参数修改为“ak”,之前版本参数为“key”
         * 申请ak:http://lbsyun.baidu.com/apiconsole/key/create
         */
        String ak;
    
        /**
         * 若用户所用ak的校验方式为sn校验时该参数必须
         * sn生成 http://lbsyun.baidu.com/index.php?title=lbscloud/api/appendix
         */
        String sn;
    
        /**
         * 输出格式为json或者xml
         */
        String output="json";
    
        /**
         * 将json格式的返回值通过callback函数返回以实现jsonp功能
         * 举例:callback=showLocation(JavaScript函数名)
         */
        String callback;
    }
    View Code
    GeocodingResponse.java
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    public class GeocodingResponse {
        int status;
        GeocodingResult result;
    }
    GeocodingResult.java
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    public class GeocodingResult {
        Location location;
        int precise;
        int confidence;
        int comprehension;
        String level;
    }
  • 相关阅读:
    pat乙级1034
    getline()读入一整行
    c++ 输入split
    13.缓存、三级缓存、内存溢出、AsyncTask
    12、json、GridView、缓存
    11.webview、shareSDK
    10.下拉刷新、加载更多、标记已读、轮播条、缓存
    9.indicate、xutils、json
    8.滑动事件处理
    7.ViewPagerIndicator
  • 原文地址:https://www.cnblogs.com/hujunmin/p/12986492.html
Copyright © 2011-2022 走看看