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