Java调用百度/高德地图API实现根据经纬度查地名

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就行

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值