JAVA获取高德地图信息

发布于:2024-12-22 ⋅ 阅读:(14) ⋅ 点赞:(0)


前言

获取地图信息可能前端操作得的比较多点,那后台服务端能访问高德地图得开放平台接口吗?当然是可以的,下面笔者详细演示下操作步骤,展示如何使用JAVA语言访问高德开放平台接口。


一、注册API key

高德开放平台地址:https://console.amap.com/dev/message/inbox

  1. 添加新应用

在这里插入图片描述

在这里插入图片描述
2. 添加key
在这里插入图片描述

注意了这里的key得名字我们不要乱改,名称就叫key,后面代码里调用的时候API key入参就叫key,服务平台一定要选择 Web服务,因为我们是要在服务端调用的,如果是Web前端,那就选 Web端(JS API)

在这里插入图片描述
提交后会生成一个key,这个就是我们需要用的 API key
在这里插入图片描述

二、高德地图工具 GEOService

package com.zlbc.common.core.utils;

import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @author hulei
 * 高德地图工具
 * 高德开放平台地址:<a href="https://lbs.amap.com/">...</a>
 */
@Component
@Slf4j
public class GEOService {

    @Value("${amap.key}")
    private String amapKey;

    private static final String API_URL = "https://restapi.amap.com/v3/geocode/geo";

    private static final String REVERSE_GEO_API = "https://restapi.amap.com/v3/geocode/regeo?key=%s&location=%s";


    /**
     * 根据地址获取经纬度
     *
     * @param address 地址
     * @return 经纬度字符串,格式为"经度,纬度"
     */

    public String getGeocode(String address,String city) {
        String url = API_URL + "?key=" + amapKey + "&address=" + address + "&city=" + city;
        String location = null;
        try {
            URL apiUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) apiUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
                reader.close();
                JSONObject json = JSONObject.parseObject(response.toString());
                String status = json.getString("status");
                if (status.equals("1")) {
                    JSONObject geocode = json.getJSONArray("geocodes").getJSONObject(0);
                    location = geocode.getString("location");
                } else {
                    log.error("查询失败:{}" , json.getString("info"));
                }
            } else {
                System.out.println();
                log.error("HTTP请求失败:{}" , responseCode);
            }
        } catch (Exception e) {
           log.error("获取经纬度异常");
        }
        return location;
    }

    /**
     * 根据经纬度获取详细地址信息
     * @param longitude 经度
     * @param latitude 纬度
     */
    public String getAddressFromCoordinates(double longitude, double latitude) {
        String address = "";
        try {
            String urlString = String.format(REVERSE_GEO_API, amapKey, longitude + "," + latitude);
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String inputLine;
            StringBuilder response = new StringBuilder();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            JSONObject jsonResponse = JSONObject.parseObject(response.toString());
            address = jsonResponse.getJSONObject("regeocode").getString("formatted_address");
        } catch (Exception e) {
            log.error("获取地址异常:{}",e.getMessage(),e);
        }
        return address;
    }

}

这个工具类主要提供了两个方法,一个是根据地址和城市获取其经纬度,另一个是根据经纬度获取详细地址信息

amapKey:就是之前注册的API key,笔者这里放在了Nacos配置文件中读取了,也可以直接在代码中写死,如果不会变得话。


三、代码测试

笔者这里偷懒直接在Sping Boot启动类中测试了

        ApplicationContext applicationContext = SpringApplication.run(ZlbcParkingApplication.class, args);
        GEOService geoservice = applicationContext.getBean(GEOService.class);
        System.out.println(geoservice.getGeocode("清华大学", "北京市"));
        System.out.println(geoservice.getAddressFromCoordinates(116.326936,40.003213));

下面是测试结果

第一行信息是根据地址名及其所在城市名获取其经纬度
第二行是根据其经纬度反推其详细地址

在这里插入图片描述

总结

到这里笔者完整展示了如何使用高德开放平台,在服务端调用获取经纬度和地址信息的 方法,当然这里只提供了java语言相关的写法,其他服务端语言比如Python等也是一样的方法,可能是构建URL的方式不同,感兴趣的朋友可以自己试着做一下!