Java程式呼叫Google Map Platform Maps Static API的簡單範例
Maps Static API可用來取得地圖影像。
事前要求
需要有Google Cloud Platform(GCP)帳號,並啟用Maps Static API,取得API金鑰(API key)。
參考「Java Google Map Platform Routes API簡單範例」。
範例
getRouteEncodedPolyline方法中呼叫Routes API的computeRoute方法,取得兩地點路徑資訊的encodedPolyline。
buildMapUri方法產生Maps Static API的url。Maps API的url格式為https://maps.googleapis.com/maps/api/staticmap?[parameters],[parameters]為以下參數部分組成的query string。
Maps API參數中有中文和URL保留字,所以要用URLEncoder.encode編碼為合法的url,例如把空格變成%20、把|變成%7C。
最後調用saveStaticMapImage方法發出請求取得地圖影像的輸入串流(InputStream),然後把串流輸出為maps.png檔放在專案根目錄。
package com.abc.demo;
import java.io.InputStream;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.Map;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class MyApp {
public static void main(String[] args) throws Exception {
String apiKey = "API_KEY";
String origin = "桃園市桃園區大同路100號";
String destination = "台北市內湖區瑞光路515號";
String encodedPolyline = getRouteEncodedPolyline(origin, destination, apiKey);
String url = buildMapUri(origin, destination, encodedPolyline, apiKey);
System.out.println("url: " + url);
saveStaticMapImage(url);
}
private static String getRouteEncodedPolyline(String origin, String destination, String apiKey) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String requestBody = mapper.writeValueAsString(Map.of(
"origin", Map.of("address", origin),
"destination", Map.of("address", destination),
"travelMode", "DRIVE"));
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://routes.googleapis.com/directions/v2:computeRoutes"))
.header("Content-Type", "application/json")
.header("X-Goog-Api-Key", apiKey)
.header("X-Goog-FieldMask", String.join(",", "routes.polyline"))
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
JsonNode root = mapper.readTree(response.body());
String encodedPolyline = root.path("routes")
.path(0)
.path("polyline")
.path("encodedPolyline")
.asText("");
return encodedPolyline;
}
private static String buildMapUri(String origin, String destination, String encodedPolyline, String apiKey)
throws Exception {
String markerA = URLEncoder.encode(
"color:red|label:A|" + origin,
StandardCharsets.UTF_8);
String markerB = URLEncoder.encode(
"color:blue|label:B|" + destination,
StandardCharsets.UTF_8);
String path = URLEncoder.encode(
"enc:" + encodedPolyline,
StandardCharsets.UTF_8);
String url = "https://maps.googleapis.com/maps/api/staticmap?"
+ "size=640x640"
+ "&markers=" + markerA
+ "&markers=" + markerB
+ "&path=" + path
+ "&key=" + apiKey;
return url;
}
private static void saveStaticMapImage(String staticMapUrl) throws Exception {
HttpRequest imgReq = HttpRequest.newBuilder()
.uri(URI.create(staticMapUrl))
.GET()
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<InputStream> imgRes = client.send(imgReq, HttpResponse.BodyHandlers.ofInputStream());
try (InputStream is = imgRes.body()) {
Files.copy(
is,
Path.of("map.png"),
StandardCopyOption.REPLACE_EXISTING);
}
}
}
測試
執行印出地圖的url,可直接貼到瀏覽器查看,同時會把地圖存放在專根目錄中的map.png。
沒有留言:
張貼留言