JAVA获取高德地图信息


前言

获取地图信息可能前端操作得的比较多点,那后台服务端能访问高德地图得开放平台接口吗?当然是可以的,下面笔者详细演示下操作步骤,展示如何使用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的方式不同,感兴趣的朋友可以自己试着做一下!

<think>好的,我现在需要帮助用户了解如何使用Java调用高德地图API。用户明确要求示例和教程,所以我得整理出一个清晰的步骤指南。首先,我需要回忆一下高德地图API的基本流程。根据用户提供的引用内容,特别是引用[1]和[2],调用流程大致分为创建应用获取Key、查看接口文档、使用HttpClient调用接口这三个步骤。 第一步,创建应用获取Key。用户需要到高德开放平台注册账号,创建应用,然后获取Key。这部分需要详细说明,因为Key是调用API的必要凭证。引用[2]中的链接已经给出,可能需要指导用户如何找到创建应用的页面,以及如何生成Key。例如,在控制台中选择应用管理,添加新应用,然后生成Key。这里需要提醒用户注意选择正确的服务平台,比如Web服务API,否则Key可能无法使用。 第二步,查看接口文档。不同的API有不同的参数和返回格式。用户提到的行政区查询接口(district)是一个例子,但用户可能对其他接口如地理编码、路径规划等也有兴趣。需要说明如何根据需求查找对应的文档,并理解请求参数和响应结构。比如,地理编码接口需要地址作为参数,返回经纬度信息。这里可能需要提到高德API文档的结构,帮助用户快速定位所需信息。 第三步,使用HttpClient调用接口。这里需要给出具体的Java代码示例。根据引用[2]和[3],用户需要引入HttpClient库,比如Apache HttpClient,构造请求URL,发送GET请求,并处理返回的JSON数据。代码示例需要包括添加依赖、编写工具类、解析响应等步骤。需要注意的是,高德API通常返回JSON格式的数据,所以需要处理JSON解析,可能使用像org.json库或者Jackson等。 现在要检查是否有遗漏的步骤或者需要注意的事项。例如,异常处理、参数编码、安全性(如HTTPS)、Key的保密等。比如,在构造URL时,参数中的地址需要进行URL编码,否则可能因为特殊字符导致请求失败。此外,高德API可能有调用频率限制,需要提醒用户注意。 另外,用户提供的引用[3]中提到了从JSON响应中获取location字段,这可能在解析响应时是一个关键点。所以代码示例中需要展示如何解析JSON对象,提取所需数据。例如,使用JSONObject和JSONArray来处理嵌套结构。 可能还需要考虑不同接口的具体参数。例如,地理编码接口需要address和city参数,而行政区查询可能需要keywords等。因此,在示例中选择一个具体的接口进行演示会更清晰,比如地理编码,这样用户更容易理解如何替换其他接口。 最后,确保步骤清晰,代码示例正确,并且符合用户的中文要求。同时,需要生成相关问题,帮助用户进一步学习,比如如何处理异常、优化请求性能、其他常用接口等。这些问题应该基于教程中的内容,引导用户深入探索。</think>### Java调用高德地图API的步骤与示例 以下是基于高德地图Web服务API的调用流程,以**地理编码接口**为例(将地址转换为经纬度): --- #### 1. **创建应用并获取Key** - 注册高德开放平台账号:[高德开放平台](https://lbs.amap.com/) - 进入控制台 → 创建新应用 → 选择「Web服务」类型 → 生成Key(记录`key=your_api_key`)[^2] --- #### 2. **添加HttpClient依赖** 使用Apache HttpClient发送HTTP请求(Maven项目): ```xml <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> ``` --- #### 3. **编写工具类发送请求** ```java import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.json.JSONObject; public class AMapUtils { // 地理编码接口示例:地址转经纬度 public static String geocodeAddress(String address, String apiKey) { String url = "https://restapi.amap.com/v3/geocode/geo?address=" + URLEncoder.encode(address, StandardCharsets.UTF_8) + "&key=" + apiKey; try (CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpGet request = new HttpGet(url); CloseableHttpResponse response = httpClient.execute(request); HttpEntity entity = response.getEntity(); String result = EntityUtils.toString(entity); // 解析JSON响应 JSONObject json = new JSONObject(result); if (json.getString("status").equals("1")) { JSONObject location = json.getJSONArray("geocodes") .getJSONObject(0) .getString("location"); return location; // 格式如 "116.480881,39.989410" } } catch (Exception e) { e.printStackTrace(); } return null; } } ``` --- #### 4. **调用示例** ```java public static void main(String[] args) { String apiKey = "your_api_key"; // 替换为你的Key String location = AMapUtils.geocodeAddress("北京市朝阳区阜通东大街6号", apiKey); System.out.println("经纬度:" + location); } ``` --- ### 关键注意事项 1. **参数编码**:地址需使用`URLEncoder.encode()`处理特殊字符[^3]。 2. **错误处理**:检查响应中的`status`字段(1为成功,0为失败)。 3. **频率限制**:免费版每日调用上限需查看高德API文档[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值