一切就绪!

着手开发前,请先阅读我们的开发者文档

激活 Google Maps Android API

为帮助您起步,我们将引导您在 Google Developers Console 中先完成几项任务:

  1. 创建或选择项目
  2. 激活 Google Maps Android API
  3. 创建相应密钥
继续

Google Maps Android Heatmap Utility

热图用于表示地图上数据点的分布和密度。

简介

Google Maps Android API Utility Library 包括一个热图实用程序,您可以利用它向您的应用内的 Google 地图添加一个或多个热图。

这段视频介绍了当您的数据要求地图上包含大量数据点时,如何利用热图这一标记以外的替代方案。

热图便于查看者了解地图上数据点的分布和相对密度。热图不是在每个位置放置标记,而是利用颜色来表示数据的分布。

在下例中,红色表示澳大利亚维多利亚省警察局密度较高的区域。

一幅包含显示警察局位置的热图的地图
地图上的热图

如果您尚未安装 Google Maps Android API 实用程序库,请按照安装指南操作,然后再阅读本页面的其余内容。

添加简单热图

如需向您的地图添加热图,您需要一个数据集,其中包含每个关注位置的坐标。先创建一个 HeatmapTileProvider,并向其传递 LatLng 对象集。然后新建一个 TileOverlay,向其传递热图图块提供程序,然后向地图添加图块叠层。

实用程序提供了 HeatmapTileProvider 类,该类会实现 TileProvider 接口,为热图提供图块图像。HeatmapTileProvider 接受 LatLng 对象集(或 WeightedLatLng 对象集,如下文所述)。它会根据提供的半径、渐变和不透明度选项创建各种缩放比例的图块图像。您可以更改这些选项的默认值

以下列出了更详细的步骤:

  1. 使用 HeatmapTileProvider.Builder(),向其传递 LatLng 对象集,以添加新的 HeatmapTileProvider
  2. 新建一个 TileOverlayOptions 对象,其中包含相关选项,包括 HeatmapTileProvider
  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;
}

在此示例中,数据存储在 police_stations.json 这个 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 调用相关资源库来更改选项,然后清除叠层的图块缓存,令其使用新选项重新绘制所有图块。

提供的选项如下:

  1. Radius:应用于热图的高斯模糊的大小,以像素表示。默认值为 20。必须在 10 至 50 之间。可以在创建热图时使用 Builder 的 radius() 设置该值,或者稍后通过 setRadius() 更改该值。
  2. Gradient:热图生成其色表时使用的一系列颜色,范围从最低密度颜色至最高密度颜色。渐变使用两个数组创建:一个是包含颜色的整型数组,一个是表示各颜色起点的浮点型数组,以占最大密度的百分比表示,范围是 0 至 1 的分数。对于单色渐变,您只需指定一种颜色;对于多色渐变,则至少需要指定两种颜色。色表是利用这些颜色之间的插值生成的。默认渐变有两种颜色。可以在创建热图时使用 Builder 的 gradient() 设置该值,或者稍后通过 setGradient() 更改该值。
  3. Opacity:这是指整个热图层的不透明度,范围是 0 至 1。默认值为 0.7。可以在创建热图时使用 Builder 的 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
需要帮助?请访问我们的支持页面