百度地图地址解析/逆地址解析
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; }
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; }
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; }
以上是关于百度地图地址解析/逆地址解析的主要内容,如果未能解决你的问题,请参考以下文章