Java调用百度地图API实现根据经纬度查地名
功能:需要根据经纬度来查询所属的乡镇地址
我们选择了百度地图的逆地理编码来解决
首先要申请自己的密钥:密钥
@Slf4j
@Service
public class AreaServiceImpl implements AreaService {
//这里是把百度地图的ak密钥写在了配置文件,可以直接写死在这里
//final String ak="xxxxxx";
@Value("${baiduapi.ak}")
private String AK;
//备用AK,如果用的yml建议直接baiduapi.beiyong
@Value("${baiduapi.ak.beiyong}")
private String deAK;
/**
* 通过告警经纬度返回所在客户id,name
* @param lat 纬度
* @param lng 经度
* @return
*/
@Override
public String getDeptByLocation(String lng, String lat){
if (lng == null || "".equals(lng) || lat == null || "".equals(lat)){
return null;
}
return getDeptByLocation(lng, lat, AK);
}
public String getDeptByLocation(String lng, String lat, String ak) {
final String URL = "http://api.map.baidu.com/reverse_geocoding/v3/" +
"?ak=" + ak +
"&output=json&coordtype=wgs84ll&extensions_town=true&" +
"location=" + lat + "," + lng;
String areaCode = "";
String addressName = "";
//调百度地图API,通过经纬度查areaCode
URL myURL = null;
URLConnection httpsConn = null;
//进行转码
try {
myURL = new URL(URL);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
httpsConn = (URLConnection) myURL.openConnection();
if (httpsConn != null) {
InputStreamReader insr = new InputStreamReader(
httpsConn.getInputStream(), "UTF-8");
BufferedReader br = new BufferedReader(insr);
String data = null;
if ((data = br.readLine()) != null) {
JSONObject jsonObject = JSON.parseObject(data);
//状态码
String status = jsonObject.get("status")+"";
//配额超限
if ("301".equals(status) || "302".equals(status) || "401".equals(status) || "402".equals(status)){
if (ak.equals(deAK)){
log.error("百度地图api调用配额超限: "+lat+","+lng);
return null;
}
return getDeptByLocation(lng, lat, deAK); //更换AK
}
//其他错误
if (!"0".equals(status)) {
log.error("百度地图api调用失败: "+lat+","+lng);
return null;
}
//使用alibaba的JSON工具类取自己想要的内容
areaCode = jsonObject.getJSONObject("result").getJSONObject("addressComponent").get("town_code") + "";
addressName = jsonObject.getJSONObject("result").getJSONObject("addressComponent").get("town") + "";
//区域编码
System.out.println(areaCode);
System.out.println(addressName);
}
insr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return addressName;
}
}
返回的是这样的JSON串,想要什么直接拿就可以,我这里用的是alibaba的JSONObject取的
更:建议高德地图
改改url就行,经纬度和百度是反着的,然后看看错误码和返回json中的key就行