Java 集成高德地图(源码复制即用)实现地址转经纬度,经纬度转地址,计算两点间距离

步骤

  1. (更改方法返回值类型为基本类型可省去这步) copy 封装好的返回对象
  2. 导入工具类所需枚举类(避免出现魔法值)
  3. 导入工具类(将高德应用Key改为自己申请的key)
  4. 导入 controller 层即可
  5. postman测试

目录

1. 以下代码块缺少返回对象类,直接copy我之前发布博客里的封装返回对象过来即可

2. 导入工具类所需枚举类(避免出现魔法值)

3. 进入 高德开放平台 | 高德地图API  控制台->应用管理->我的应用->创建新应用 拿到key

4.导入controller层

5.postman测试:



1. 以下代码块缺少返回对象类,直接copy我之前发布博客里的封装返回对象过来即可

https://blog.csdn.net/weixin_52156647/article/details/122695641?spm=1001.2014.3001.5501https://blog.csdn.net/weixin_52156647/article/details/122695641?spm=1001.2014.3001.5501

2. 导入工具类所需枚举类(避免出现魔法值)

属性详情请看: 概述-Web服务 API | 高德地图API

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * @Description: 高德地图枚举类
 * @Author: isymikasan
 * @Date: 2022-01-26 09:36:55
 */
@AllArgsConstructor
@Getter
public enum GaoDeEnum {

    // 高德地图固定字段
    STATUS("status"),
    INT_ONE("1"),
    RE_GEO_CODE("regeocode"),
    GEO_CODES("geocodes"),
    LOCATION("location"),
    FORMATTED_ADDRESS("formatted_address"),
    RESULTS("results"),
    DISTANCE("distance");

    private String code;
}

3. 进入 高德开放平台 | 高德地图API  控制台->应用管理->我的应用->创建新应用 拿到key

导入工具类并将key替换

private static final String GAO_DE_KEY = "e226b2************4fddd91d8d9";

工具类:

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * @Description: 高德地图工具类
 * @Author: isymikasan
 * @Date: 2021-12-22 09:19:02
 */
@Component
@Slf4j
public class GaoDeMapUtil {

    /**
     * 功能描述: 高德地图Key 
     *
     * @param null
     * @return
     * @author 周兆宇
     * @date 2022-01-26 09:13:40
     */
    private static final String GAO_DE_KEY = "e226b2************4fddd91d8d9";

    //申请的账户Key

    /**
     * 功能描述: 根据地址名称得到两个地址间的距离
     *
     * @param start 起始位置
     * @param end   结束位置
     * @return long 两个地址间的距离
     * @author isymikasan
     * @date 2022-01-26 09:16:04
     */
    public Long getDistanceByAddress(String start, String end) {
        String startLonLat = getLonLat(start).getDatas().toString();
        String endLonLat = getLonLat(end).getDatas().toString();
        Long distance = Long.valueOf(getDistance(startLonLat, endLonLat).getDatas().toString());
        return distance;
    }

    /**
     * 功能描述: 地址转换为经纬度
     *
     * @param address 地址
     * @return java.lang.String 经纬度
     * @author isymikasan
     * @date 2022-01-26 09:17:13
     */
    public Result getLonLat(String address) {
        try {
            // 返回输入地址address的经纬度信息, 格式是 经度,纬度
            String queryUrl = "http://restapi.amap.com/v3/geocode/geo?key=" + GAO_DE_KEY + "&address=" + address;
            // 高德接口返回的是JSON格式的字符串
            String queryResult = getResponse(queryUrl);
            JSONObject job = JSONObject.parseObject(queryResult);
            JSONObject jobJSON = JSONObject
                    .parseObject(
                            job.get("geocodes").toString().substring(1, job.get("geocodes").toString().length() - 1));
            String LngAndLat = jobJSON.get("location").toString();
            log.info("经纬度为:" + LngAndLat);
            return Result.succeed(LngAndLat, "经纬度转换成功!");
        } catch (Exception e) {
            return Result.failed(e.toString());
        }
    }

    /**
     * 将经纬度 转换为 地址
     *
     * @param longitude 经度
     * @param latitude  纬度
     * @return 地址名称
     * @throws Exception
     */
    public Result getAddress(String longitude, String latitude) throws Exception {
        String url;
        try {
            url = "http://restapi.amap.com/v3/geocode/regeo?output=JSON&location=" + longitude + "," + latitude
                    + "&key=" + GAO_DE_KEY + "&radius=0&extensions=base";

            log.info("经度" + longitude);
            log.info("纬度:" + latitude);
            log.info("url:" + url);

            // 高德接口返回的是JSON格式的字符串
            String queryResult = getResponse(url);
            if (ObjectUtils.isNull(queryResult)) {
                return Result.failed("查询结果为空");
            }

            // 将获取结果转为json 数据
            JSONObject obj = JSONObject.parseObject(queryResult);
            if (obj.get(GaoDeEnum.STATUS.getCode()).toString().equals(GaoDeEnum.INT_ONE.getCode())) {
                // 如果没有返回-1
                JSONObject reGeoCode = obj.getJSONObject(GaoDeEnum.RE_GEO_CODE.getCode());
                if (reGeoCode.size() > 0) {
                    // 在regeocode中拿到 formatted_address 具体位置
                    String formatted = reGeoCode.get("formatted_address").toString();
                    return Result.succeed(formatted, "地址获取成功!");

                } else {
                    return Result.failed("未找到相匹配的地址!");
                }
            } else {
                return Result.failed("请求错误!");
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return Result.failed("系统未知异常,请稍后再试");
        }
    }

    /**
     * 功能描述: 根据两个定位点的经纬度算出两点间的距离
     *
     * @param startLonLat 起始经纬度
     * @param endLonLat   结束经纬度(目标经纬度)
     * @return java.lang.Long 两个定位点之间的距离
     * @author isymikasan
     * @date 2022-01-26 09:47:42
     */
    public Result getDistance(String startLonLat, String endLonLat) {
        try {
            // 返回起始地startAddr与目的地endAddr之间的距离,单位:米
            Long result = new Long(0);
            String queryUrl =
                    "http://restapi.amap.com/v3/distance?key=" + GAO_DE_KEY + "&origins=" + startLonLat
                            + "&destination="
                            + endLonLat;
            String queryResult = getResponse(queryUrl);
            JSONObject job = JSONObject.parseObject(queryResult);
            JSONArray ja = job.getJSONArray("results");
            JSONObject jobO = JSONObject.parseObject(ja.getString(0));
            result = Long.parseLong(jobO.get("distance").toString());
            log.info("距离:" + result);
            return Result.succeed(result, "距离计算成功!");
        } catch (Exception e) {
            return Result.failed(e.toString());
        }


    }

    /**
     * 功能描述: 发送请求
     *
     * @param serverUrl 请求地址
     * @return java.lang.String
     * @author isymikasan
     * @date 2022-01-26 09:15:01
     */
    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 (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result.toString();
    }

}

4.导入controller层

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


/**
 * @Description: 地图控制层
 * @Author: isymikasan
 * @Date: 2022-01-26 09:36:55
 */
@RestController
@Api(tags = "地图")
@RequestMapping("/point")
public class GaoDeMapController {

    @Resource
    private GaoDeMapUtil gaoDeMapUtil;

    public static final Logger log = LoggerFactory.getLogger(GaoDeMapController.class);


    @ApiOperation(value = "根据经纬度获取地址")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "longitude", value = "经度"),
            @ApiImplicitParam(name = "latitude", value = "纬度")
    })
    @PostMapping("/getAddress")
    public Result getAddress(@RequestParam("longitude") String longitude, @RequestParam("latitude") String latitude) {
        try {
            return gaoDeMapUtil.getAddress(longitude, latitude);
        } catch (Exception e) {
            return Result.failed(e.toString());
        }

    }

    @ApiOperation(value = "根据地址获取经纬度")
    @ApiImplicitParam(name = "address", value = "地理位置")
    @PostMapping("/getLonLat")
    public Result getLonLat(String address) {
        return gaoDeMapUtil.getLonLat(address);
    }

    @ApiOperation(value = "根据两个定位点的经纬度算出两点间的距离(单位:米)")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "startLonLat", value = "起始经纬度"),
            @ApiImplicitParam(name = "endLonLat", value = "结束经纬度")
    })
    @PostMapping("/getDistance")
    public Result getDistance(String startLonLat, String endLonLat) {
        return gaoDeMapUtil.getDistance(startLonLat, endLonLat);
    }
}

5.postman测试:

根据经纬度获取地址: 

 根据地址获取经纬度:

根据两点计算距离 :

 这套方法很基础,可以由此拓展出很多其他业务功能

如根据两点距离判断是否进入签到打卡范围等等

如有错误评论指正洗耳恭听,觉得有用的的话帮忙点个免费的赞吧!我会开心一整天的!

  • 21
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mikasa_akm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值