更新时间:2023-08-29 16:25:34
以下是一些假设:
这是一个有助于讨论的图表:
首先要了解的是colorMap.这是由渐变生成器.它是一个默认大小为 1000 的int"数组,但是在其中一个构造函数中可自定义 - 在您的示例中推荐 500.所以这个数组中的每个值都是一个颜色值.(大小会影响渐变的分辨率.)
colorMap 中的颜色值受 2 个产生颜色的控件的影响间隔:startPoints 数组和颜色数组.在你的例子中有是 6 个颜色间隔.
颜色区间定义为起始颜色和结束颜色以及编号范围内的colorMap"插槽数.任何给定间隔的所有颜色映射值使用该范围的开始/结束颜色进行插值.
如果 startPoints 数组的第一个值是 0 那么第一个颜色区间假定为实心 - 非零意味着从透明到第一种颜色的过渡,这似乎是最理想的.(参见 startPoints 设置为 0 的示例,并注意外部区域的锯齿状.)
如果 startPoints 数组的第一个值不为 0 则第一个颜色间隔定义为从第一种颜色 (colors[0]) 和一个范围开始colorMapSize * 第一个起点,例如500 * 0.1 = 50并以相同的颜色结尾.
对于所有剩余的已定义颜色,会生成一个间隔 - 再次使用起始颜色映射槽,起始颜色(即上一个颜色结束),和结束颜色(即表格中的当前颜色)和范围.
如果最后一个startingPoint不是1.0,则用最后一个颜色作为start并停止.在这个例子中,1.0 可能是***的.
(不透明度适用于整个图层,只会影响颜色的 Alpha 通道.)
这是欣赏强度"以及 WeightedLatLng 可以发挥作用的地方.
当地图生成时,它将可视区域划分为瓦片——图块的数量是缩放级别的函数.在缩放级别 0 有 1 个图块,并且任意缩放级别的图块计数为 2^n(其中 n 是缩放级别).
每个瓦片被进一步划分成桶.桶的数量是一个函数缩放级别和半径(模糊).每个桶对应一个地理磁贴内的区域 - 想想矩形网格.
当前tile内的点是从数据集中获取的.
对于图块地理边界内的所有点,该点的强度值被添加到其对应的桶中.默认情况下,点的强度值为 1.WeightedLatLng 允许您通过将此值从 1 更改为某个数字(较大以增加重要性,较小以降低重要性)来偏置点.因此,结果是存储桶强度计数会受到 LatLngs 的影响.
一旦强度桶被计算出来,强度值就会使用在第一部分中确定的颜色映射.请注意,强度值的范围会缩放到 colorMap 的大小,以便最大强度值映射到最后一个颜色.
然后将桶应用到图块上,然后将图块制作成位图并被渲染.
例如,我使用了萨克拉门托的一些犯罪数据.我首先创建了一个非加权热图.然后创建一个加权热图,通过为 NCIC 代码为 2404(车辆盗窃)的犯罪指定 5.0 的强度(与任何点的默认值 1.0)来确定汽车盗窃的重要性.5.0 有点武断,实际上取决于数据和您要传达的内容.
非加权/加权(车辆盗窃)
还有一个例子,其中第一个 startPoint[0] 是 0.0 - 这表明缺少从透明到初始颜色的过渡:
以下是 MapActivity 的相关部分:
public void onMapReady(GoogleMap googleMap) {mMap = googleMap;mMap.getUiSettings().setZoomControlsEnabled(true);//在悉尼添加一个标记并移动相机LatLng 悉尼 = 新 LatLng(-34, 151);mMap.addMarker(new MarkerOptions().position(sydney).title("悉尼的标记"));mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));addHeatMapWeighted();//添加热图();}公共无效 addHeatMapWeighted() {渐变渐变 = 新渐变(颜色,起点);列表<WeightedLatLng>wDat = new CrimeData().getWeightedPositions();HeatmapTileProvider provider = new HeatmapTileProvider.Builder().weightedData(wDat).gradient(gradient).build();mMap.addTileOverlay(new TileOverlayOptions().tileProvider(provider));}公共无效 addHeatMap() {渐变渐变 = 新渐变(颜色,起点);列表<LatLng>cDat = new CrimeData().getPositions();HeatmapTileProvider provider = new HeatmapTileProvider.Builder().data(cDat).gradient(gradient).build();mMap.addTileOverlay(new TileOverlayOptions().tileProvider(provider));}int[] 颜色 = {Color.GREEN,//绿色(0-50)Color.YELLOW,//黄色(51-100)color.rgb(255,165,0),//橙色(101-150)Color.RED,//红色(151-200)color.rgb(153,50,204),//暗兰花(201-300)Color.rgb(165,42,42)//棕色(301-500)};浮动 [] 起点 = {0.1F、0.2F、0.3F、0.4F、0.6F、1.0F};
好的,所以您可能已经注意到,每个 colorMap 间隔的开始都以一个很好的整数 (0,50,100...) 开始,这与您的要求 (51, 101...301) 不太匹配.我认为您的评论范围不正确,因为这实际上意味着有 501 种可能的颜色,这有点奇怪.但是,如果您真的想要指定的范围,那么您必须进行一些数学计算才能得出一个替代的 startPoints 数组: (51/501,101/501,151/501,201/501,301/501,501/501) = (.101796407,.201596806,.301397206,.401197605,.600798403, 1.0)
半径值是 HeatMap 的
与热图相比,仅使用点(圆圈)就可以讲述更准确的故事,并且在更广泛的缩放级别下,虽然没有颜色,但在视觉上就像热图一样模糊.例如,这里有两个点渲染,未加权和加权.加权偏差针对毒品犯罪(NCIC 代码 [3500,3600)),表明毒品犯罪在该领域占主导地位.
来自参考书(3):
热图"一词于 1991 年由软件开发商注册商标科马克·金尼.它随后被 SS&C Technologies, Inc. 收购,但他们没有延长许可证,并于 2006 年被取消.
参考资料