AdSense

網頁

2026/1/14

Java Google Map Platform Maps Static API 範例

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。

  • size - 必填,設定圖片大小,例如size=640x640
  • markers - 選填,設定位置標記。
  • path - 選填,設定路徑圖層。

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);
        }
    }

}

github



測試

執行印出地圖的url,可直接貼到瀏覽器查看,同時會把地圖存放在專根目錄中的map.png



沒有留言:

AdSense