
利用高德地图key实现位置转换经纬度,并计算两地距离
B.对于异常处理,如果 geocodes 数组为空,则抛出 RuntimeException,表示没有找到与地址匹配的地理编码。2.如果是第一次使用高德地图第三方SDK,务必申请一个开发者账号(先注册,然后填写相关信息,扫码进行实名认证即可);②getDistance方法是通过Haversine公式(半正矢公式),根据经纬度计算两个位置之间的距离,具体可参考。,方法将地址字符串进行URL编码,确保
步骤:
1.浏览器地址栏输入:申请配置Key-创建工程-开发指南-云图服务API | 高德地图API,点右上角控制台;
2.如果是第一次使用高德地图第三方SDK,务必申请一个开发者账号(先注册,然后填写相关信息,扫码进行实名认证即可);
3.左侧栏:应用管理
->我的应用
进行创建
4.右上角创建新应用,输入应用名称和类型
5.添加key,输入key名称和服务平台。这里我们要选中Web服务。可不用添加域名白名单,勾选同意政策
6.提交后,会生成一个key,后面写代码要用到
7.代码如下:
public class AddressToLocationUtil {
//高德地图Key
private static String KEY="";//高德key
//访问地址
public static String GD_URL="https://restapi.amap.com/v3/geocode/geo?address=%s&key=%s";
//标识成功数据
private static String SUCCESS_FLAG="1";
/**
* 根据地址获取对应的经纬度信息
* @param address
* @return
*/
public static String getLonAndLatByAddress(String address) throws UnsupportedEncodingException {
String location="";
GD_URL = String.format(GD_URL, URLEncoder.encode(address, "UTF-8"), KEY); // 对地址进行URL编码
//高德接口返回的是JSON格式的字符串
String queryResult = getResponse(GD_URL);
JSONObject obj = JSONObject.parseObject(queryResult);
if(String.valueOf(obj.get("status")).equals(SUCCESS_FLAG)){
JSONArray geocodes = obj.getJSONArray("geocodes"); // 获取geocodes数组
if (!geocodes.isEmpty()) {
JSONObject firstGeocode = geocodes.getJSONObject(0);
location = firstGeocode.getString("location"); // 直接获取location字段
} else {
throw new RuntimeException("没有找到与地址匹配的地理编码");
}
} else {
throw new RuntimeException("地址转换经纬度失败,错误码:" + obj.getString("infocode"));
}
return location;
}
/**
* 发送请求
*
* @param serverUrl 请求地址
*/
private static String getResponse(String serverUrl) {
// 用JAVA发起http请求,并返回json格式的结果
StringBuffer result = new StringBuffer();
try {
URL url = new URL(serverUrl);
URLConnection conn = url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result.append(line);
}
in.close();
} catch (Exception e) {
e.printStackTrace();
}
return result.toString();
}
private static final double EARTH_RADIUS = 6371.393; // 地球平均半径,单位为公里
public static double getDistance(double lon1, double lat1, double lon2, double lat2) {
double radLat1 = Math.toRadians(lat1);
double radLat2 = Math.toRadians(lat2);
double a = radLat1 - radLat2;
double b = Math.toRadians(lon1) - Math.toRadians(lon2);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = Math.round(s * 10) / 10.0; // 保留一位小数
return s;
}
public static void main(String[] args) throws UnsupportedEncodingException {
String address="广州软件学院";
String location=getLonAndLatByAddress(address);
System.out.println(address+"的经纬度:" + location);
System.out.println("-------------------------");
String[] split = location.split(",");
System.out.println(getDistance(Double.parseDouble(split[0]),Double.parseDouble(split[1]),120.0,22.5));
}
}
说明:
①getLonAndLatByAddress 方法接收一个地址字符串 address 作为参数,并通过调用高德地图的地理编码(Geocoding)API 将该地址转换为经纬度坐标。
A.通过 URLEncoder.encode(address, "UTF-8")
,方法将地址字符串进行URL编码,确保地址中的特殊字符(如空格、标点符号等)在URL中正确表示。KEY
是高德地图API的密钥。
B.对于异常处理,如果 geocodes 数组为空,则抛出 RuntimeException,表示没有找到与地址匹配的地理编码。 如果状态码表示失败,则抛出 RuntimeException,并包含错误码(从 infocode 字段获取)
②getDistance方法是通过Haversine公式(半正矢公式),根据经纬度计算两个位置之间的距离,具体可参考根据经纬度计算两地之间的距离_经纬度计算距离-CSDN博客
运行结果:
根据网上的在线经纬度距离计算,也可以得出相同结果:
更多推荐
所有评论(0)