此页面介绍了实用程序中提供的热图实用程序 适用于 Maps SDK for iOS。 热图非常适合用来表示 地图上数据点的密度。
这段视频介绍了当数据较多,需要在地图上显示大量数据点时,如何将热图用作标记的替代方案。
热图便于查看者了解分布情况和 地图上数据点的强度。你无需在每个网页上放置标记 位置,热图会使用颜色来表示数据的分布情况。
在下例中,红色代表警察高度集中的区域 的电台。
![一幅包含警察局位置热图的地图](https://developers.google.cn/static/maps/documentation/ios-sdk/images/heatmap-ios.png?authuser=9&hl=sr)
如果您尚未安装该库,请按照 指南,然后再阅读 此页面。
添加简单的热图
要向您的地图添加热图,您需要一个数据集,其中包含
每个关注地点的坐标。首先,创建一个
GMUHeatmapTileLayer
实例,将 map
属性设置为 GMSMapView
。
请在应用的 viewDidLoad()
函数中执行此操作,以确保基本地图
。然后传递一组
将 GMUWeightedLatLng
对象分配给 GMUHeatmapTileLayer
实例。
该实用程序提供 GMUHeatmapTileLayer
类,该类接受
GMUWeightedLatLng
对象的集合。该函数会为
根据半径、渐变和不透明度选项设置各种缩放级别
。
以下列出了更详细的步骤:
- 创建一个
GMUHeatmapTileLayer
实例,将map
属性设置为GMSMapView
(在应用的viewDidLoad()
函数中执行此操作)。 - 将
GMUWeightedLatLng
对象集合传递给GMUHeatmapTileLayer
实例。 - 调用
GMUHeatmapTileLayer.map
,传递地图视图。Swift
class Heatmap: UIViewController { private var mapView: GMSMapView! private var heatmapLayer: GMUHeatmapTileLayer! override func viewDidLoad() { super.viewDidLoad() heatmapLayer = GMUHeatmapTileLayer() heatmapLayer.map = mapView } // ... func addHeatmap() { // Get the data: latitude/longitude positions of police stations. guard let path = Bundle.main.url(forResource: "police_stations", withExtension: "json") else { return } guard let data = try? Data(contentsOf: path) else { return } guard let json = try? JSONSerialization.jsonObject(with: data, options: []) else { return } guard let object = json as? [[String: Any]] else { print("Could not read the JSON.") return } var list = [GMUWeightedLatLng]() for item in object { let lat = item["lat"] as! CLLocationDegrees let lng = item["lng"] as! CLLocationDegrees let coords = GMUWeightedLatLng( coordinate: CLLocationCoordinate2DMake(lat, lng), intensity: 1.0 ) list.append(coords) } // Add the latlngs to the heatmap layer. heatmapLayer.weightedData = list } }
Objective-C
@implementation Heatmap { GMSMapView *_mapView; GMUHeatmapTileLayer *_heatmapLayer; } - (void)viewDidLoad { [super viewDidLoad]; _heatmapLayer = [[GMUHeatmapTileLayer alloc] init]; _heatmapLayer.map = _mapView; } // ... - (void) addHeatmap { // Get the data: latitude/longitude positions of police stations. NSURL *path = [NSBundle.mainBundle URLForResource:@"police_stations" withExtension:@"json"]; NSData *data = [NSData dataWithContentsOfURL:path]; NSArray *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSMutableArray<GMUWeightedLatLng *> *list = [[NSMutableArray alloc] init]; [json enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { NSDictionary *item = (NSDictionary *)obj; CLLocationDegrees lat = [(NSNumber *) [item valueForKey:@"lat"] doubleValue]; CLLocationDegrees lng = [(NSNumber *) [item valueForKey:@"lng"] doubleValue]; GMUWeightedLatLng *coords = [[GMUWeightedLatLng alloc] initWithCoordinate:CLLocationCoordinate2DMake(lat, lng) intensity:1.0]; [list addObject:coords]; }]; // Add the latlngs to the heatmap layer. _heatmapLayer.weightedData = list; } @end
在此示例中,数据存储在 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 }
]
自定义热图
热图有多个可自定义的属性。您可以在设置选项时
最初创建 GMUHeatmapTileLayer
实例时创建,也可以随时通过
为选项设置新值
提供的选项如下:
半径:应用于热图的高斯模糊的大小,以表示 (以像素为单位)。默认值为 20。必须介于 10 至 50 之间。使用
GMUHeatmapTileLayer.radius
,用于设置半径。渐变:热图生成其颜色时所用的一系列颜色 地图。
GMUGradient
是使用 一个包含颜色的整数数组,以及一个表示 每种颜色的起点,以占最大颜色强度的百分比表示, 并表示为 0 到 1 之间的分数。您只需为 单色渐变,或至少使用两种颜色的多色渐变 渐变。色表是利用这些颜色之间的插值生成的。 默认渐变有两种颜色。colorMapSize
参数定义了 梯度的步数。数值越大,数据越平滑 而数值越小,转换效果越清晰,这类似于 轮廓图。使用GMUHeatmapTileLayer.gradient
设置渐变。不透明度:这是指整个热图图层以及范围的不透明度 从 0 到 1。默认值为 0.7。使用
GMUHeatmapTileLayer.opacity
设置 不透明度值。
例如,创建一个 Gradient
:
Swift
let gradientColors: [UIColor] = [.green, .red] let gradientStartPoints: [NSNumber] = [0.2, 1.0] heatmapLayer.gradient = GMUGradient( colors: gradientColors, startPoints: gradientStartPoints, colorMapSize: 256 )
Objective-C
NSArray<UIColor *> *gradientColors = @[UIColor.greenColor, UIColor.redColor]; NSArray<NSNumber *> *gradientStartPoints = @[@0.2, @1.0]; _heatmapLayer.gradient = [[GMUGradient alloc] initWithColors:gradientColors startPoints:gradientStartPoints colorMapSize:256];
如需更改现有热图的不透明度,请执行以下操作:
Swift
heatmapLayer.opacity = 0.7
Objective-C
_heatmapLayer.opacity = 0.7;
更新现有选项
如需更新已设置的选项,请按以下步骤操作:
- 将选项更新为所需的值。
- 欢迎致电
GMUHeatmapTileLayer.clearTileCache()
。
更改数据集
如需更改用于构建热图的数据集,请执行以下操作:
- 更新您的数据收集。使用
GMUHeatmapTileLayer.weightedData
,传递GMUWeightedLatLng
的数组。 - 欢迎致电
GMUHeatmapTileLayer.clearTileCache()
。
移除热图
如需移除热图,请调用 GMUHeatmapTileLayer.map
并传递 nil
。
Swift
heatmapLayer.map = nil
Objective-C
_heatmapLayer.map = nil;
观摩演示版应用
有关热图实现的另一个示例,请查看
HeatmapViewController
。
设置指南介绍了如何
运行演示版应用