我正在尝试为我的android应用程序项目创建加权热图。我看看它的谷歌文档。我不明白如何使用颜色数组和起点数组创建新的渐变。起始数组表示为


每种颜色的起点,以最大强度的百分比表示。


这是什么意思?如何将颜色阵列与起点阵列联系起来?

int[] colors = {
        Color.GREEN,    // green(0-50)
        Color.YELLOW,    // yellow(51-100)
        Color.rgb(255,165,0), //Orange(101-150)
        Color.RED,              //red(151-200)
        Color.rgb(153,50,204), //dark orchid(201-300)
        Color.rgb(165,42,42) //brown(301-500)
};

float[] startpoints = {

};


我需要填充此起点数组。

最佳答案

以下是一些假设:


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


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

android - Android中的加权热图-LMLPHP

色彩图

首先要了解的是colorMap。这是由
渐变生成器。它是一个'int'数组,默认大小为1000,但
可在其中一个构造函数中自定义-在您的示例中建议500。因此,此数组中的每个值都是一个颜色值。 (大小会影响渐变的分辨率。)

colorMap中的颜色值受2个产生颜色的控件的影响
interval:startPoints数组和colors数组。在你的例子中
是6个颜色间隔。

颜色间隔定义为开始颜色和结束颜色以及数字
范围内的“ colorMap”广告位。任何给定间隔的所有colorMap值
使用该范围的开始/结束颜色进行插值。

如果startPoints数组的第一个值为0,则第一个颜色间隔
假定为纯色-非零表示从透明到最希望的第一种颜色的过渡。 (请参见将startPoints设置为0并注意外部区域的锯齿状的示例。)

如果startPoints数组的第一个值不为0,则第一个颜色
间隔定义为从第一种颜色(colors [0])和范围开始
colorMapSize *的第一个起点,例如500 * 0.1 = 50
并以相同的颜色结束。

对于所有剩余的定义颜色,将生成一个间隔-再次使用
起始colorMap插槽,起始颜色(即先前的颜色末端),
和结束颜色(这是表格中的当前颜色)和范围。

如果最后的startingPoint不是1.0,则使用最后的颜色作为开始
停下来在此示例中,最好是1.0。

(不透明度适用于整个图层,并且仅影响颜色的Alpha通道。)

瓷砖

这是欣赏“强度”的地方,而WeightedLatLng可以发挥作用。

生成地图时,它将可视区域划分为图块-
瓦片数是缩放级别的函数。缩放级别为0时有1个图块,
并且任意缩放级别的瓦片数为2 ^ n(其中n是缩放级别)。

每个磁贴进一步划分为存储桶。桶数是一个函数
缩放级别和半径(模糊)。每个存储桶对应一个地理区域
磁贴内的区域-考虑矩形网格。

当前图块内部的点是从数据集中获得的。

对于图块地理范围内的所有点,将点的强度值添加到其对应的存储桶中。默认情况下,一个点的强度值为1。WeightedLatLng允许您通过将该值从1更改为某个数字来偏斜一个点(更大以增加重要性,较小以减少重要性)。因此,结果是铲斗强度计数受到了LatLngs的影响。

计算强度桶后,使用
在第一部分中确定的colorMap。请注意,强度值的范围按比例缩放到colorMap的大小,以使最大强度值映射到最后一种颜色。

然后将存储桶应用于图块,并将图块制作为位图
并被渲染。



例如,我使用了萨克拉曼多的一些犯罪数据。我首先创建了一个非加权热图。然后创建加权热图,通过将NCIC代码为2404(车辆盗窃)的犯罪强度指定为5.0(针对任何点,默认值为1.0)来增强自动盗窃的重要性。 5.0有点随意,实际上取决于数据和您要传达的内容。

非加权/加权(通过车辆盗窃)

android - Android中的加权热图-LMLPHP
android - Android中的加权热图-LMLPHP

还有一个示例,其中第一个startPoint [0]为0.0-表明缺少从透明到初始颜色的过渡:

android - Android中的加权热图-LMLPHP

以下是MapActivity的相关部分:

public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    mMap.getUiSettings().setZoomControlsEnabled(true);
    // Add a marker in Sydney and move the camera
    LatLng sydney = new LatLng(-34, 151);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    addHeatMapWeighted();
    //addHeatMap();
}

public void addHeatMapWeighted() {
    Gradient gradient = new Gradient(colors,startpoints);
    List<WeightedLatLng> wDat = new CrimeData().getWeightedPositions();
    HeatmapTileProvider provider = new HeatmapTileProvider.Builder().weightedData(wDat).gradient(gradient).build();
    mMap.addTileOverlay(new TileOverlayOptions().tileProvider(provider));
}

public void addHeatMap() {
    Gradient gradient = new Gradient(colors,startpoints);
    List<LatLng> cDat = new CrimeData().getPositions();
    HeatmapTileProvider provider = new HeatmapTileProvider.Builder().data(cDat).gradient(gradient).build();
    mMap.addTileOverlay(new TileOverlayOptions().tileProvider(provider));
}

int[] colors = {
        Color.GREEN,    // green(0-50)
        Color.YELLOW,    // yellow(51-100)
        Color.rgb(255,165,0), //Orange(101-150)
        Color.RED,              //red(151-200)
        Color.rgb(153,50,204), //dark orchid(201-300)
        Color.rgb(165,42,42) //brown(301-500)
};

float[] startpoints = {
        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的Gaussian Blur实现的输入。有时,图片是最好的解释:这是一个动画Gif,它以10为步长在半径20到50的热图之间循环(最模糊的是半径50)。

由于热图旨在传达信息的含义,因此实际上由数据呈现者来评估什么是最佳半径效果。因此,例如,在犯罪数据的情况下,当数据的消费者在寻找居住地时,我可能会从数据中获得更多的价值,但会有些模糊。另一方面,如果数据显示的是消防局,那么太多的模糊很可能会使人们相信,如果没有,它们就会被掩盖。

android - Android中的加权热图-LMLPHP



仅仅使用点(圆圈)可以比热图讲出更准确的故事,并且在更宽的缩放级别上,视觉效果像热图一样模糊,尽管没有颜色。例如,这是两个点渲染,未加权和加权。加权偏见针对毒品犯罪(NCIC代码[3500,3600]),表明毒品犯罪在这一领域占主导地位。

android - Android中的加权热图-LMLPHP android - Android中的加权热图-LMLPHP

HeatMap琐事

从参考书(3):


术语“热图”是1991年由软件开发人员注册的商标。
科马克·金尼。然后被SS&C Technologies,Inc.收购,但
他们没有延长许可证,于2006年被废除了。


参考资料


犯罪数据:https://support.spatialkey.com/spatialkey-sample-csv-data/
Android代码:
https://github.com/googlemaps/android-maps-utils/blob/master/library/src/com/google/maps/android/heatmaps/
HeatMap商标:https://books.google.com/books?id=clIWDAAAQBAJ&pg=PA219&lpg=PA219&dq=is+heatmap+trademarked&source=bl&ots=XfcTsOc2pG&sig=EPaHG95M8uXiI5WAAwpa-e3zHXE&hl=en&sa=X&ved=0ahUKEwijtKSl2IfaAhUNy1kKHdBUAdsQ6AEIlwEwCg#v=onepage&q=is%20heatmap%20trademarked&f=false

09-25 22:30