我正在尝试为我的Android应用程序项目创建加权热图。我看了一下google文档。我不了解如何使用颜色数组和起始点数组创建新渐变。起始数组表示为
每种颜色的起点,以最大强度的百分比给出。
这是什么意思?如何将颜色数组与起始点数组相关联?
"\n"
我需要填充这个起点数组。
答案 0 :(得分:2)
以下是一些假设:
这是帮助讨论的图表:
首先要了解的是colorMap。这是由...生成的 渐变生成器。这是一个' int'数组大小默认为1000但是 可在其中一个构造函数中自定义 - 在您的示例中推荐500。所以这个数组中的每个值都是一个颜色值。 (大小会影响渐变的分辨率。)
colorMap中的颜色值受2个产生颜色的控件的影响 interval:startPoints数组和colors数组。在你的例子中 是6色间隔。
颜色间隔定义为起始颜色和结束颜色以及数字 ' colorMap'范围内的插槽。任何给定间隔的所有colorMap值 使用该范围的开始/结束颜色进行插值。
如果startPoints数组的第一个值是0,那么第一个颜色间隔 假设是实心的 - 非零意味着从透明到第一种颜色的过渡似乎是最理想的。 (参见startPoints设置为0的示例,并注意外部区域的锯齿状。)
如果startPoints数组的第一个值不是0,那么第一个颜色 interval定义为从第一种颜色(colors [0])和范围开始 colorMapSize *的第一个起始点,例如500 * 0.1 = 50 并以相同的颜色结束。
对于所有剩余的定义颜色,会生成一个间隔 - 再次使用a 启动colorMap槽,一个起始颜色(前一个颜色结束), 和结束颜色(表中的当前颜色)和范围。
如果最后一个起始点不是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有点武断,实际上取决于数据以及您尝试传达的内容。
非加权/加权(通过车辆盗窃)
第一个startPoint [0]为0.0的示例 - 显示缺少从透明颜色到初始颜色的转换:
以下是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的HeatMap(最简单的是半径50)。
由于热图旨在传达信息的意义,因此它确实留给数据展示者来评估最佳半径效应。因此,例如,在犯罪数据的情况下,作为寻找居住地的数据的消费者,我可能通过某些模糊从数据中获得更多价值。另一方面,如果数据显示的是消防站,那么过多的模糊很可能导致人们相信它们不会被覆盖。
使用圆点(圆圈)可以比热图更准确地讲故事,并且在更广泛的缩放级别下,视觉上模糊,就像热图一样,虽然没有颜色。例如,这里有两个点渲染,未加权和加权。加权偏见是针对毒品犯罪(NCIC代码[3500,3600]),表明毒品犯罪占据了这一领域的主导地位。
参考书(3):
术语&#34;热图&#34; 1991年由软件开发商注册商标 科马克金尼。然后由SS&amp; C Technologies,Inc。收购 他们没有延长许可证,并于2006年取消。
参考