且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

android中的加权热图

更新时间:2023-08-29 16:25:34

以下是一些假设:

  • 渐变 colorMapSize 为 1000(默认),但应设置为 500
  • 颜色值长度为 6
  • startPoints 的长度为 6(必须与颜色的长度相同)
  • 颜色数组在 OP 中指定
  • 起始点数组应该是 { 0.1F, 0.2F, 0.3F, 0.4F, 0.6F, 1.0F }

这是一个有助于讨论的图表:

颜色图

首先要了解的是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 年被取消.

参考资料