Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android中的加权热图_Android_Google Maps_Android Studio_Google Maps Api 3_Heatmap - Fatal编程技术网

android中的加权热图

android中的加权热图,android,google-maps,android-studio,google-maps-api-3,heatmap,Android,Google Maps,Android Studio,Google Maps Api 3,Heatmap,我正在尝试为我的android应用程序项目创建一个加权热图。我看了一下谷歌的文档。我不明白如何使用颜色数组和起点数组创建新的渐变。起始数组表示为 每种颜色的起点,以最大强度的百分比表示 这是什么意思?如何将颜色数组与起始点数组关联 int[] colors = { Color.GREEN, // green(0-50) Color.YELLOW, // yellow(51-100) Color.rgb(255,165,0), //Ora

我正在尝试为我的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数组。

以下是一些假设:

  • 渐变颜色贴图大小为1000(默认值),但应设置为500
  • 颜色值长度为6
  • 起始点长度为6(必须与颜色长度相同)
  • 颜色数组在OP中指定
  • 起始点数组应为{0.1F、0.2F、0.3F、0.4F、0.6F、1.0F}
以下是有助于讨论的图表:

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

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

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

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

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

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

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

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

瓷砖 这就是“强度”被重视的地方,加权板条的效果也可以发挥作用

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

每一块瓷砖都被进一步分成桶。桶的数量是一个函数 缩放级别和半径的比例(模糊)。每个桶对应一个地理位置 平铺中的区域-考虑矩形网格

当前磁贴内的点是从数据集中获得的

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

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

然后将存储桶应用于磁贴,并将磁贴制作成位图 并被渲染

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

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

以及第一个起始点[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
};
public void onMapReady(谷歌地图谷歌地图){
mMap=谷歌地图;
mMap.getUiSettings().setZoomControlsEnabled(true);
//在Sydney添加一个标记并移动相机
悉尼LatLng=新LatLng(-34151);
mMap.addMarker(新MarkerOptions().position(sydney.title)(“悉尼的标记”);
mMap.moveCamera(CameraUpdateFactory.newLatLng(悉尼));
addHeatMapWeighted();
//addHeatMap();
}
public void addHeatMapWeighted(){
渐变渐变=新渐变(颜色、起始点);
List wDat=new CrimeData().getWeightedPositions();
HeatmapTileProvider=新的HeatmapTileProvider.Builder().weightedData(wDat).gradient(gradient.build();
mMap.addTileOverlay(新的TileOverlayOptions().tileProvider(提供程序));
}
public void addHeatMap(){
渐变渐变=新渐变(颜色、起始点);
List cDat=new CrimeData().getPositions();
HeatmapTileProvider=新的HeatmapTileProvider.Builder().data(cDat).gradient(gradient.build();
mMap.addTileOverlay(新的TileOverlayOptions().tileProvider(提供程序));
}
int[]颜色={
Color.GREEN,//绿色(0-50)
Color.YELLOW,//黄色(51-100)
颜色。rgb(255165,0)/