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;
    }
  • 相关阅读:
    如何:为 Silverlight 客户端生成双工服务
    Microsoft Sync Framework 2.1 软件开发包 (SDK)
    Windows 下的安装phpMoAdmin
    asp.net安全检测工具 Padding Oracle 检测
    HTTP Basic Authentication for RESTFul Service
    Windows系统性能分析
    Windows Server AppFabric Management Pack for Operations Manager 2007
    Mongo Database 性能优化
    服务器未能识别 HTTP 标头 SOAPAction 的值
    TCP WAIT状态及其对繁忙的服务器的影响
  • 原文地址:https://www.cnblogs.com/hujunmin/p/12986492.html
Copyright © 2011-2022 走看看