使用百度地图计算地址间距离

用Java简单演示了如何使用百度地图提供的接口计算地址间距离

使用百度地图计算地址间距离

首先要登录百度地图开发平台:百度地图-百万开发者首选的地图服务商,提供专属的行业解决方案

登录首页后打开右上角控制台(若为认证则会自动跳转认证页面)

进入控制台后点击左侧“应用管理-我的应用-创建应用”即可创建一个应用,获取到对应的AK

要计算地址将距离需要用到地址编码接口和路线规划接口

地址编码接口文档:地理编码 | 百度地图API SDK

路线规划接口文档:轻量级路线规划 | 百度地图API SDK

文档里都有使用说明

我的代码示例:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sky.utils.HttpClientUtil;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.LinkedHashMap;
import java.util.Map;

@SpringBootTest
public class BaiduMapTest {

    public static String AK = "输入自己的AK";

    @Test
    public void DemoTest() throws Exception {
        String locationOri = getLocation("上海静安嘉里中心-南区商场", AK);
        String locationDes = getLocation("上海市浦东新区上海图书馆", AK);

        int distance = getDistance(locationOri, locationDes, AK);
        System.out.println(distance);
    }

    /**
     * 获取经纬度,返回格式:纬度,经度
     * @param address
     * @param ak
     * @return
     * @throws Exception
     */
    private String getLocation(String address, String ak) throws Exception {
        String url = "https://api.map.baidu.com/geocoding/v3/?";
        // 创建请求参数
        Map params = new LinkedHashMap<String, String>();
        params.put("address", address);
        params.put("output", "json");
        params.put("ak", ak);

        // 发送GET请求
        String jsonStr = HttpClientUtil.doGet(url, params);

        // 创建ObjectMapper实例
        ObjectMapper objectMapper = new ObjectMapper();
        // 解析JSON字符串为JsonNode对象
        JsonNode rootNode = objectMapper.readTree(jsonStr);

        // 逐层获取节点
        // 判断访问状态是否成功
        int status = rootNode.get("status").asInt();
        if (status != 0) {
            throw new OrderBusinessException(MessageConstant.ADDRESS_PARSING_FAILED);
        }
        JsonNode resultNode = rootNode.get("result");
        JsonNode locationNode = resultNode.get("location");

        // 获取lng和lat的值
        double lat = locationNode.get("lat").asDouble();
        double lng = locationNode.get("lng").asDouble();

        return lat + "," + lng;
    }

    /**
     * 获取距离
     * @param origin
     * @param destination
     * @param ak
     * @return
     * @throws Exception
     */
    private int getDistance(String origin, String destination, String ak) throws Exception {
        String url = "https://api.map.baidu.com/directionlite/v1/riding?";
        // 创建请求参数
        Map params = new LinkedHashMap<String, String>();
        params.put("origin", origin);
        params.put("destination", destination);
        params.put("output", "json");
        params.put("ak", ak);

        // 发送请求
        String jsonStr = HttpClientUtil.doGet(url, params);

        // 创建ObjectMapper实例
        ObjectMapper objectMapper = new ObjectMapper();
        // 解析JSON字符串为JsonNode对象
        JsonNode rootNode = objectMapper.readTree(jsonStr);

        // 逐层获取节点
        // 判断访问状态是否成功
        int status = rootNode.get("status").asInt();
        if (status != 0) {
            throw new OrderBusinessException(MessageConstant.ADDRESS_PARSING_FAILED);
        }
        // 获取距离
        JsonNode resultNode = rootNode.get("result");
        JsonNode routesNode = resultNode.get("routes");
        String distance = routesNode.get(0).get("distance").toString();

        return Integer.parseInt(distance);
    }

}

其中的HttpClientUtil工具类如下:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
package com.sky.utils;

import com.alibaba.fastjson.JSONObject;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Http工具类
 */
public class HttpClientUtil {

    static final  int TIMEOUT_MSEC = 5 * 1000;

    /**
     * 发送GET方式请求
     * @param url
     * @param paramMap
     * @return
     */
    public static String doGet(String url,Map<String,String> paramMap){
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        String result = "";
        CloseableHttpResponse response = null;

        try{
            URIBuilder builder = new URIBuilder(url);
            if(paramMap != null){
                for (String key : paramMap.keySet()) {
                    builder.addParameter(key,paramMap.get(key));
                }
            }
            URI uri = builder.build();

            //创建GET请求
            HttpGet httpGet = new HttpGet(uri);

            //发送请求
            response = httpClient.execute(httpGet);

            //判断响应状态
            if(response.getStatusLine().getStatusCode() == 200){
                result = EntityUtils.toString(response.getEntity(),"UTF-8");
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                response.close();
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return result;
    }

    /**
     * 发送POST方式请求
     * @param url
     * @param paramMap
     * @return
     * @throws IOException
     */
    public static String doPost(String url, Map<String, String> paramMap) throws IOException {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";

        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);

            // 创建参数列表
            if (paramMap != null) {
                List<NameValuePair> paramList = new ArrayList();
                for (Map.Entry<String, String> param : paramMap.entrySet()) {
                    paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
                }
                // 模拟表单
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
                httpPost.setEntity(entity);
            }

            httpPost.setConfig(builderRequestConfig());

            // 执行http请求
            response = httpClient.execute(httpPost);

            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
        } catch (Exception e) {
            throw e;
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return resultString;
    }

    /**
     * 发送POST方式请求
     * @param url
     * @param paramMap
     * @return
     * @throws IOException
     */
    public static String doPost4Json(String url, Map<String, String> paramMap) throws IOException {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";

        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);

            if (paramMap != null) {
                //构造json格式数据
                JSONObject jsonObject = new JSONObject();
                for (Map.Entry<String, String> param : paramMap.entrySet()) {
                    jsonObject.put(param.getKey(),param.getValue());
                }
                StringEntity entity = new StringEntity(jsonObject.toString(),"utf-8");
                //设置请求编码
                entity.setContentEncoding("utf-8");
                //设置数据类型
                entity.setContentType("application/json");
                httpPost.setEntity(entity);
            }

            httpPost.setConfig(builderRequestConfig());

            // 执行http请求
            response = httpClient.execute(httpPost);

            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
        } catch (Exception e) {
            throw e;
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return resultString;
    }
    private static RequestConfig builderRequestConfig() {
        return RequestConfig.custom()
                .setConnectTimeout(TIMEOUT_MSEC)
                .setConnectionRequestTimeout(TIMEOUT_MSEC)
                .setSocketTimeout(TIMEOUT_MSEC).build();
    }
}
本站于2025年3月26日建立
使用 Hugo 构建
主题 StackJimmy 设计