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


由於工作需要,需要根據經緯度獲得地址,或者根據地址獲得經緯度,使用百度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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM