Android 中的加权热图

2023-12-12

我正在尝试为我的 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(必须与颜色长度相同)
  • 颜色数组在OP中指定
  • 起始点数组应为 { 0.1F, 0.2F, 0.3F, 0.4F, 0.6F, 1.0F }

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

HeatMap ColorMap

ColorMap

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

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

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

如果 startPoints 数组的第一个值为 0,则第一个颜色间隔 假设为实心 - 非零意味着从透明到第一种颜色的过渡,这似乎是最理想的。 (参见 startPoints 设置为 0 的示例,并注意外部区域的锯齿状。)

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

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

如果最后一个起始点不是1.0,则使用最后一个颜色作为开始 并停止。在此示例中,1.0 可能是最好的。

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

Tiles

这就是“强度”被重视的地方,也是 WeightedLatLng 可以发挥作用的地方。

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

每个图块进一步分为多个桶。桶的数量是一个函数 缩放级别和半径(模糊)。每个桶对应一个地理区域 瓷砖内的面积 -认为矩形网格.

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

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

一旦对强度桶进行计数,强度值就会使用以下方法进行着色 第一节中确定的 colorMap。请注意,强度值的范围会缩放为 colorMap 的大小,以便最大强度值映射到最后一种颜色。

然后将桶应用到图块并将图块制作成位图 并被渲染。

Example

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

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

Non-Weighted Weighted

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

No transparent transition on edges

以下是 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)

Radius

半径值是热图的输入高斯模糊执行。有时图片是最好的解释:这是一个动画 Gif,它以 10 为步长在半径 20 到 50 的热图中循环(最模糊的是半径 50)。

由于热图旨在传达信息的含义,因此实际上需要数据呈现者来评估什么是最佳半径效果。例如,就犯罪数据而言,作为寻找居住地的数据消费者,我可能会从数据中获得更多价值some模糊。另一方面,如果数据显示的是消防站,那么太多的模糊很可能会导致人们相信它们已被覆盖,但实际上并未被覆盖。

enter image description here

Dots

仅使用点(圆圈)就能比热图讲述更准确的故事,并且在更广泛的缩放级别下,尽管没有颜色,但在视觉上就像热图一样模糊。例如,这里有两个点渲染,未加权和加权。加权偏差针对毒品犯罪(NCIC 代码[3500,3600)),这表明毒品犯罪在该领域占主导地位。

enter image description here enter image description here

热图琐事

摘自参考书(3):

“热图”一词由软件开发商于 1991 年注册商标 科马克·金尼.随后它被 SS&C Technologies, Inc. 收购,但 他们没有延长许可证,并于 2006 年被废除。

参考

  • 犯罪数据:https://support.spatialkey.com/spatialkey-sample-csv-data/
  • 安卓代码:https://github.com/googlemaps/android-maps-utils/blob/master/library/src/com/google/maps/android/heatmaps/
  • 热图商标:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 中的加权热图 的相关文章

随机推荐

  • 使用 Facebook iOS SDK 在用户墙上发布照片

    我正在尝试将相机中的照片上传到用户的 Facebook 墙上 我不完全确定正确的策略是什么 但从周围阅读来看 似乎要做的事情是将照片上传到相册 然后有人在墙上发布该相册 照片的链接 理想情况下 这将涉及对话 但据我所知这是不可能的 我已成功
  • BlackBerry ObjectChoiceField 不接受带空格的国家/地区名称

    我正在黑莓应用程序中开发一个注册页面 我将输入的所有字段发送到本地服务器 国家 地区是表单字段之一 位于 ObjectChoiceField 中 每当用户选择一个具有多个单词的国家 地区 例如 美利坚合众国 时 就会显示注册失败 当用户选择
  • v-model 并选择多个

    我认为有以下代码 div class item editor line div
  • 如何使用最新的 MinGW 将 qmake 设置为 C++14?

    I know there are many 重复项 这是我的测试版 CONFIG c 14 SOURCES main cpp 和我的 main cpp int main 根据许多重复 这应该给我 C 14 但是 当我使用构建项目时Qt 创建
  • iOS 6.0 限制导航控制器内的自动旋转?

    我还应该做什么 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation toInterfaceOrientation return toInterfaceOrie
  • 如何执行ajax输出脚本

    我收到 ajax 输出成功数据 其中数据包含一些 html 文本和脚本 但脚本没有执行 我该如何执行脚本 假设 Ajax 响应 obj 是 div something div 上面的代码是我的 Ajax 响应 div 正在渲染 但警报不起作
  • 按字典键的整数对字典进行排序

    假设我有一本这样的字典 thedict 1 the 2 2 3 five 10 orange 我想按键对这本字典进行排序 如果我执行以下操作 for key value in sorted thedict iteritems print k
  • 在堆积条形图上按列显示百分比

    我正在尝试绘制一个堆积条形图 显示列中每个组的相对百分比 这是我的问题的说明 使用默认的 mpg 数据集 mpg gt ggplot aes x manufacturer group class geom bar aes fill clas
  • 如何在android中找到两条折线之间的交点?

    如何在android中找到两条折线之间的交点 我尝试了以下所有选项 PolyUtil isLocationOnPath RectF rectPathBounds new RectF path computeBounds rectPathBo
  • 如何更改 Bootstrap 列的顺序?

    如何更改 Bootstrap 4 的 Flexbox 网格系统的列顺序 我有代码 div class contents div class row row 1 div class col sm 6 Content Left div div
  • 如何将图像设置为圆形

    我怎样才能将图像设置在一个圆圈中 有没有更好的方法来设置带有圆圈框的图像 特别是 Windows 10 登录屏幕上的图像框架 Circle cir2 new Circle 250 200 80 cir2 setStroke Color SE
  • 这些对象的引用是在栈上还是在堆上?

    如果有人能告诉我我是否理解得很好 我将不胜感激 class X A a1 new A reference on the stack object value on the heap a1 VarA 5 on the stack value
  • 自定义形状的边框

    在这里摆弄 我正在尝试设置一些不规则形状的边框颜色 箭头ish 我做到了 问题是 为了实现这些形状 我必须已经操纵边框 所以我不能这样做border color red 我想将每个形状的边框颜色设置为2px HTML div class m
  • 未报告的异常UnknownHostException;必须被抓住或宣布被扔出

    我有下面给出的代码 但是 当我尝试编译代码时 出现以下错误 MyClient java 12 error unreported exception UnknownHostException must be caught or declare
  • 如何在java中从图像中获取光栅?

    我正在尝试将 gif 图像从 url 加载到 java util image Raster 中 以便我可以操作它 我能找到的加载和解压缩图像的唯一方法是 Toolkit getImage 它返回 java awt Image 我需要将其转换
  • 如何在您的网站中使用长轮询或 Ajax 推送

    我想知道如何使用ajax推送 我从各种网络文章中了解到 Ajax推送可以通过使用一些程序来获得 例如COMET APE AJAX PUSH ENGINE 等 但我想知道是否有更简单的使用方法以及使用什么语言实现ajax推送 因为在我看过的文
  • Ruby on Rails 中多对多的正确实现?

    新手提问 请注意 我想在 Rails 中实现基本的多对多关系 并且我试图找出哪种方法被认为是其中最 Rails 方式 在传统的非 ActiveRecord 数据库中 我刚刚创建了两个表和一个联结表 并编写了一堆逻辑 以确保在对其中任何一个表
  • PHP:根据季节设置图像?

    大家好 你对此有何看法 我想根据是冬季还是夏季在我的网站上设置一个标题图像 一个用于冬季 一个用于夏季 所以我想知道最简单的方法是什么 我想到使用 date n 并查询返回的值对于冬季或夏季月份是否为真 你会怎么办 谢谢你的提示 谷歌搜索并
  • 片段之间的通信

    我有默认的主从流程 该流程是在创建新项目时自动创建的 我的问题是 当我向详细信息侧添加按钮时 有没有办法通过按该按钮来更新我的列表面 换句话说 ItemDetailFragment 和 ItemListFragment 可以通信吗 是的 只
  • Android 中的加权热图

    我正在尝试为我的 Android 应用程序项目创建一个加权热图 我查看了谷歌文档 我不明白如何使用颜色数组和起点数组创建新的渐变 起始数组表示为 每种颜色的起点 以最大强度的百分比形式给出 这是什么意思 如何将颜色数组与起点数组关联起来 i