前言
获取地图信息可能前端操作得的比较多点,那后台服务端能访问高德地图得开放平台接口吗?当然是可以的,下面笔者详细演示下操作步骤,展示如何使用JAVA语言访问高德开放平台接口。
一、注册API key
高德开放平台地址:https://console.amap.com/dev/message/inbox
- 添加新应用
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的方式不同,感兴趣的朋友可以自己试着做一下!