您已全部設定完成!

若要開始開發,請參閱我們的開發人員文件

啟用 Google Maps Android API

為協助您開始,我們將先引導您使用 Google Developers Console 來執行一些動作:

  1. 建立或選擇專案
  2. 啟用 Google Maps Android API
  3. 建立適當的金鑰
繼續

Google Maps Android 熱度圖公用程式

熱度圖很適合用來呈現地圖上的資料點分布與密度。

簡介

Google Maps Android API 公用程式庫包括熱度圖公用程式,可以用來對您應用程式的 Google 地圖新增一或多個熱度圖。

本影片討論當您的資料需要在地圖放置大量資料點時,可將熱度圖替代標記來使用。

熱度圖能讓觀看者輕易瞭解地圖上的資料點分布與相對強度。熱度圖不會在每個位置放置標記,而是使用色彩來呈現資料分布。

在下面的範例中,紅色代表澳洲維多利亞州警察局集中度高的區域。

以熱度圖顯示警察局位置的地圖
地圖上的熱度圖

如果您尚未設定 Google Maps Android API 公用程式庫,請先依照設定指南執行,再閱讀此頁面其餘的部分。

新增簡單的熱度圖

若要將熱度圖新增至您的地圖,您會需要包含每個搜尋位置座標的資料集。先建立 HeatmapTileProvider,再向它傳遞 LatLng 物件集合。接著,建立新的 TileOverlay,再向它傳遞熱度圖地圖方塊供應程式,然後將地圖方塊疊加層新增至地圖。

公用程式提供 HeatmapTileProvider 類別,此類別實作 TileProvider 介面以提供熱度圖的地圖方塊影像。HeatmapTileProvider 接受 LatLng 物件 (或 WeightedLatLng 物件,如下所述) 集合。它會根據提供的半徑、漸層與不透明度選項,建立各種縮放層級的地圖方塊影像。您可以變更這些選項的預設值

進一步詳細查看步驟:

  1. 使用 HeatmapTileProvider.Builder(),再向它傳遞 LatLng 物件集合,以新增 HeatmapTileProvider
  2. 搭配相關選項 (包括 HeatmapTileProvider) 建立新的 TileOverlayOptions 物件。
  3. 呼叫 GoogleMap.addTileOverlay(),以將疊加層新增至地圖。
private void addHeatMap() {
    List<LatLng> list = null;

    // Get the data: latitude/longitude positions of police stations.
    try {
        list = readItems(R.raw.police_stations);
    } catch (JSONException e) {
        Toast.makeText(this, "Problem reading list of locations.", Toast.LENGTH_LONG).show();
    }

    // Create a heat map tile provider, passing it the latlngs of the police stations.
    mProvider = new HeatmapTileProvider.Builder()
        .data(list)
        .build();
    // Add a tile overlay to the map, using the heat map tile provider.
    mOverlay = mMap.addTileOverlay(new TileOverlayOptions().tileProvider(mProvider));
}

private ArrayList<LatLng> readItems(int resource) throws JSONException {
    ArrayList<LatLng> list = new ArrayList<LatLng>();
    InputStream inputStream = getResources().openRawResource(resource);
    String json = new Scanner(inputStream).useDelimiter("\\A").next();
    JSONArray array = new JSONArray(json);
    for (int i = 0; i < array.length(); i++) {
        JSONObject object = array.getJSONObject(i);
        double lat = object.getDouble("lat");
        double lng = object.getDouble("lng");
        list.add(new LatLng(lat, lng));
    }
    return list;
}

對於此範例,資料是儲存在 JSON 檔案 police_stations.json 中。以下是檔案摘錄:

[
{"lat" : -37.1886, "lng" : 145.708 } ,
{"lat" : -37.8361, "lng" : 144.845 } ,
{"lat" : -38.4034, "lng" : 144.192 } ,
{"lat" : -38.7597, "lng" : 143.67 } ,
{"lat" : -36.9672, "lng" : 141.083 }
]

使用權重式緯度/經度點

建立 HeatmapTileProvider 時,您可以向它傳遞權重式緯度/經度座標集合。這在您想要展示一組特定位置的重要性時非常實用。

將權重套用到特定位置:

  1. 為每個需要權重的位置,建立新的 WeightedLatLng。傳入 LatLng 和代表所需強度的 double。強度指出此位置的相對重要性或值。值越高,在熱度圖漸層中產生的色彩濃度越高。根據預設,濃度最高的色彩為紅色。
  2. 呼叫 HeatmapTileProvider.Builder().weightedData() (而非 HeatmapTileProvider.Builder().data())以建立熱度圖。

自訂熱度圖

您可以自訂熱度圖的一些屬性。您可以透過 Builder 函式,在建立時設定選項。或者,隨時透過呼叫 HeatmapTileProvider 上的相關 setter 以變更選項,然後清除疊加層的地圖方塊快取,以新選項重新繪製所有地圖方塊。

以下是可用的選項:

  1. 半徑:套用至熱度圖的高斯模糊大小(單位為像素)。預設值為 20。必須介於 10 到 50 之間。您可以在建立熱度圖時,使用製作工具的 radius() 設定該值,或之後再使用 setRadius() 來變更該值。
  2. 漸層:熱度圖用來產生彩色地圖的色彩範圍,範圍從最低濃度至最高濃度。漸層是使用兩個陣列建立:包含色彩的整數陣列,以及指出每種色彩起點的浮點數陣列,指定為最大濃度的百分比,並以介於 0 至 1 之間的分數來表示。對於單色漸層,您只需要指定一種色彩;對於多色漸層,至少需要指定兩種色彩。彩色地圖是使用這些色彩之間的內插補點產生。預設漸層會有兩種色彩。您可以在建立熱度圖時,使用製作工具的 gradient() 設定該值,或之後再使用 setGradient() 來變更該值。
  3. 不透明度:這是指整個熱度圖圖層的不透明度,且範圍介於 0 到 1 之間。預設值為 0.7。您可以在建立熱度圖時,使用製作工具的 opacity() 設定該值,或之後再使用 setOpacity() 來變更該值。

例如,先建立 Gradient 以設定漸層,然後再新增熱度圖:

// Create the gradient.
int[] colors = {
    Color.rgb(102, 225, 0), // green
    Color.rgb(255, 0, 0)    // red
};

float[] startPoints = {
    0.2f, 1f
};

Gradient gradient = new Gradient(colors, startPoints);

// Create the tile provider.
mProvider = new HeatmapTileProvider.Builder()
     .data(mList)
     .gradient(gradient)
     .build();

// Add the tile overlay to the map.
mOverlay = mMap.addTileOverlay(new TileOverlayOptions().tileProvider(mProvider));

變更現有熱度圖的不透明度:

  mProvider.setOpacity(0.7);
  mOverlay.clearTileCache();

變更資料集

如果要變更用以建置熱度圖的資料集,您可以使用 HeatmapTileProvider.setData(),或對 WeightedLatLng 點使用 HeatmapTileProvider.setWeightedData()。注意:如果要將點加到熱度圖,或將點從熱度圖中移除,可以更新您的資料集合,然後使用 setData()setWeightedData()

  ArrayList<WeightedLatLng> data = new ArrayList<WeightedLatLng>();
  mProvider.setData(data);
  mOverlay.clearTileCache();

移除熱度圖

假設您已經新增此熱度圖:
mProvider = new HeatmapTileProvider.Builder.data(data).build();
mOverlay = mMap.addTileOverlay(new
    TileOverlayOptions().tileProvider(mProvider));

您需要將地圖方塊疊加層移除,才能移除熱度圖:

mOverlay.remove();

參閱示範應用程式

如需另一個熱度圖實作範例,請參閱公用程式庫所隨附示範應用程式中的 HeatmapsDemoActivity設定指南說明如何執行示範應用程式。

傳送您對下列選項的寶貴意見...

這個網頁
Google Maps Android API
Google Maps Android API
需要協助嗎?請前往我們的支援網頁