百度地图地址解析/逆地址解析

Posted hujunmin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百度地图地址解析/逆地址解析相关的知识,希望对你有一定的参考价值。

由于工作需要,需要根据经纬度获得地址,或者根据地址获得经纬度,使用百度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
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;
}

 

以上是关于百度地图地址解析/逆地址解析的主要内容,如果未能解决你的问题,请参考以下文章

百度地图地址解析/逆地址解析

百度地图 逆地址解析

好久好久没写,,百度API逆地址解析以及删除指定marker

高德地图逆地址解析 设置和应用

SQL SERVER 使用 高德地图逆地址解析

H5 腾讯地图地址逆解析