首页
学习
活动
专区
圈层
工具
发布

Java - Google maps API - 两个地址之间的距离

Java中使用Google Maps API计算两个地址之间的距离

基础概念

Google Maps API提供了距离矩阵API(Distance Matrix API),可以用来计算两个或多个地点之间的距离和行程时间。这个API可以返回基于推荐路线的实际道路距离,而不仅仅是直线距离。

优势

  1. 准确性:基于实际道路网络计算距离
  2. 灵活性:可以计算多种交通方式(驾车、步行、骑行等)的距离
  3. 批量处理:可以一次性计算多组地点之间的距离
  4. 实时数据:考虑实时交通状况(如果请求时指定)

实现步骤

1. 获取API密钥

首先需要在Google Cloud Platform控制台启用Distance Matrix API并获取API密钥。

2. 添加依赖

在Java项目中,可以使用HttpClient来发送请求:

代码语言:txt
复制
<!-- Maven依赖 -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

3. Java实现代码示例

代码语言:txt
复制
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class GoogleMapsDistanceCalculator {
    private static final String API_KEY = "YOUR_API_KEY";
    private static final String BASE_URL = "https://maps.googleapis.com/maps/api/distancematrix/json";

    public static DistanceResult calculateDistance(String origin, String destination) throws IOException {
        String encodedOrigin = URLEncoder.encode(origin, StandardCharsets.UTF_8);
        String encodedDestination = URLEncoder.encode(destination, StandardCharsets.UTF_8);
        
        String url = String.format("%s?origins=%s&destinations=%s&key=%s", 
                BASE_URL, encodedOrigin, encodedDestination, API_KEY);
        
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpGet request = new HttpGet(url);
            
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    String result = EntityUtils.toString(entity);
                    return parseResponse(result);
                }
            }
        }
        return null;
    }
    
    private static DistanceResult parseResponse(String jsonResponse) {
        JsonObject jsonObject = JsonParser.parseString(jsonResponse).getAsJsonObject();
        
        String status = jsonObject.get("status").getAsString();
        if (!"OK".equals(status)) {
            throw new RuntimeException("API request failed: " + status);
        }
        
        JsonObject element = jsonObject.getAsJsonArray("rows")
                .get(0).getAsJsonObject()
                .getAsJsonArray("elements")
                .get(0).getAsJsonObject();
        
        String distanceText = element.getAsJsonObject("distance").get("text").getAsString();
        int distanceValue = element.getAsJsonObject("distance").get("value").getAsInt();
        String durationText = element.getAsJsonObject("duration").get("text").getAsString();
        int durationValue = element.getAsJsonObject("duration").get("value").getAsInt();
        
        return new DistanceResult(distanceText, distanceValue, durationText, durationValue);
    }
    
    public static class DistanceResult {
        private final String distanceText;
        private final int distanceValue; // in meters
        private final String durationText;
        private final int durationValue; // in seconds
        
        public DistanceResult(String distanceText, int distanceValue, String durationText, int durationValue) {
            this.distanceText = distanceText;
            this.distanceValue = distanceValue;
            this.durationText = durationText;
            this.durationValue = durationValue;
        }
        
        // Getters
        public String getDistanceText() { return distanceText; }
        public int getDistanceValue() { return distanceValue; }
        public String getDurationText() { return durationText; }
        public int getDurationValue() { return durationValue; }
    }

    public static void main(String[] args) {
        try {
            String origin = "1600 Amphitheatre Parkway, Mountain View, CA";
            String destination = "1 Infinite Loop, Cupertino, CA";
            
            DistanceResult result = calculateDistance(origin, destination);
            
            System.out.println("Distance: " + result.getDistanceText());
            System.out.println("Duration: " + result.getDurationText());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

常见问题及解决方案

1. API请求限制

Google Maps API有每日请求配额限制。解决方案:

  • 缓存结果避免重复请求
  • 考虑升级API套餐
  • 实现请求批处理减少调用次数

2. 地址解析不准确

可能原因:

  • 地址格式不规范
  • 地址不完整

解决方案:

  • 使用更详细的地址
  • 先使用Geocoding API将地址转换为经纬度

3. 响应时间慢

解决方案:

  • 实现异步请求
  • 考虑使用本地缓存
  • 检查网络连接

4. 认证失败

可能原因:

  • API密钥无效
  • API密钥未启用
  • 请求未包含API密钥

解决方案:

  • 检查API密钥是否正确
  • 确保已启用Distance Matrix API
  • 检查密钥是否有IP限制

应用场景

  1. 物流配送:计算配送路线距离和时间
  2. 出行应用:估算行程时间和距离
  3. 房地产:计算房产与关键地点(学校、医院等)的距离
  4. 运动应用:记录跑步或骑行路线距离
  5. 商业分析:分析客户分布与店铺位置关系

高级用法

  1. 多目的地计算:可以一次请求计算一个起点到多个终点的距离
  2. 交通模式选择:可以指定驾车、步行、骑行或公共交通
  3. 出发/到达时间:可以指定出发时间或到达时间,获取考虑交通状况的预估
  4. 单位选择:可以选择公制或英制单位
  5. 区域偏重:可以指定结果偏向某个地区

通过合理使用Google Maps Distance Matrix API,可以轻松实现各种基于地理位置的距离计算需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券