利用高德地图key实现位置转换经纬度,并计算两地距离

步骤:

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博客

运行结果:

根据网上的在线经纬度距离计算,也可以得出相同结果:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值