代码之家  ›  专栏  ›  技术社区  ›  Ahamed Yasir

android中的加权热图

  •  4
  • Ahamed Yasir  · 技术社区  · 6 年前

    我正在尝试为我的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 = {
    
    };
    

    我需要填写startpoints数组。

    1 回复  |  直到 6 年前
        1
  •  5
  •   user2711811 user2711811    6 年前

    以下是一些假设:

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

    以下是有助于讨论的图表:

    HeatMap ColorMap

    颜色贴图

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

    colorMap中的颜色值受2个生成颜色的控件的影响 间隔:起始点数组和颜色数组。在你的例子中 是6个颜色间隔。

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

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

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

    对于所有剩余的已定义颜色,将生成一个间隔-再次使用 起始颜色贴图槽,起始颜色(前一个颜色结束), 以及结束颜色(表中的当前颜色)和范围。

    如果最后一个起始点不是1.0,则最后一种颜色用于开始 然后停下来。在本例中,1.0可能是最好的。

    (不透明度应用于整个层,仅影响颜色的alpha通道。)

    瓷砖

    这是“强度”得到重视的地方,加权latlng的效果也可以发挥作用。

    生成地图时,它会将可视区域划分为多个分幅,即 平铺数量是缩放级别的函数。缩放级别为0时,有1个平铺, 任意缩放级别的平铺计数为2^n(其中n是缩放级别)。

    每一块瓷砖都被进一步划分为桶。桶的数量是一个函数 缩放级别和半径(模糊)。每个桶对应一个地理位置 瓷砖内面积- 思考矩形网格

    当前磁贴内的点是从数据集获取的。

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

    统计完强度桶后,强度值将使用 在第一节中确定的颜色贴图。请注意,强度值的范围将缩放到颜色贴图的大小,以便最大强度值映射到最后一种颜色。

    然后将桶应用于磁贴,并将磁贴制作成位图 并进行渲染。

    实例

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

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

    Non-Weighted Weighted

    例如,第一个起始点[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
    };
    

    间隔开始时间

    好的,您可能已经注意到,每个颜色贴图间隔的开始都是从一个很好的整数(0,50100…)开始的这与您的要求(51101…301)不太匹配。我认为你的评论范围不正确,因为这意味着有501种可能的颜色,这有点奇怪。但如果你真的想要指定的范围,那么你必须做一些数学运算,得出一个备用的起始点数组:(51/501101/501151/501201/501301/501501/501)=(.101796407、.201596806、.301397206、.401197605、.600798403、1.0)

    半径

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

    由于热图旨在传达信息的含义,因此真正让数据呈现者来评估什么是最佳半径效果。例如,在犯罪数据的情况下,作为数据的消费者,我可能会通过以下方式从数据中获得更多价值 一些 变得模糊不清另一方面,如果数据显示的是消防站,那么太多的模糊很可能会让人认为消防站被覆盖了,而消防站没有被覆盖。

    enter image description here

    圆点

    仅使用点(圆)就可以比热图讲述更准确的故事,在更大的缩放级别上,热图会像热图一样在视觉上模糊,尽管没有颜色。例如,这里有两个点渲染,未加权和加权。加权偏差适用于毒品犯罪(NCIC代码[35003600]),这表明毒品犯罪在这一领域占主导地位。

    enter image description here enter image description here

    热图琐事

    参考书(3)中:

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

    参考文献