Google Maps API提供了距离矩阵API(Distance Matrix API),可以用来计算两个或多个地点之间的距离和行程时间。这个API可以返回基于推荐路线的实际道路距离,而不仅仅是直线距离。
首先需要在Google Cloud Platform控制台启用Distance Matrix API并获取API密钥。
在Java项目中,可以使用HttpClient来发送请求:
<!-- 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>
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();
}
}
}
Google Maps API有每日请求配额限制。解决方案:
可能原因:
解决方案:
解决方案:
可能原因:
解决方案:
通过合理使用Google Maps Distance Matrix API,可以轻松实现各种基于地理位置的距离计算需求。
没有搜到相关的文章