Google 地图 Android 显示白色方块的热图实用程序
Google Maps Android Heatmap Utility showing white tiles
我将 Google 地图 Android 热图实用程序 (https://developers.google.com/maps/documentation/android/utility/heatmap) 与 Google 地图 API v2 一起使用。这个实用程序基本上只是一个 class,实现了一个可以使用 map.addTileOverlay 添加到地图的 TileProvider。代码是 public GitHub:
现在,当我 运行 他们的演示应用程序 (https://developers.google.com/maps/documentation/android/utility/setup) 时,我遇到了一个奇怪的错误。基本上,当查看的数据显示在屏幕中间时,一切正常。但是,当您开始拖动屏幕并且数据到达屏幕边缘时,包含数据的磁贴变为白色。
一旦我将数据滚动回中心,一切看起来都很好。
我很确定这不是 TileProvider 的图块生成代码中的错误,因为它的 getTile-Method 实际上从未 returns 任何白色或其他不正确的图块(我已经检查过)。我让几个人试用了演示应用程序,他们都可以重现问题。
我的问题是:
- 可以安全地假设这是 Maps API v2 TileOverlay 中的错误吗?
- 以前有人遇到过这个问题吗?有什么解决办法吗?
我从 here also, and surely encounter the issue, you can report the issue here 克隆并厌倦了演示,Google 的工程师可能会提供帮助。
这是 GoogleMap 的问题。 android-maps-utils 方法 getTile returns TileProvider.NO_TILE 中的 HeatmapTileProvider 当您滚动地图时,GoogleMap 会使用 Heats 清除所有图块。
我向项目添加了一个 android-maps-utils 库(none gradle 依赖项)并添加了此代码
private final static Tile BLANK_TILE = new Tile(0, 0, new byte[0]);
public Tile getTile(int x, int y, int zoom) {
boolean skipImage = false;
...
if (!tileBounds.intersects(paddedBounds)) {
// return TileProvider.NO_TILE;
skipImage = true;
}
...
if (points.isEmpty()) {
// return TileProvider.NO_TILE;
skipImage = true;
}
if (!skipImage) {
// Quantize points
double[][] intensity = new double[TILE_DIM + mRadius * 2][TILE_DIM + mRadius * 2];
for (WeightedLatLng w : points) {
Point p = w.getPoint();
int bucketX = (int) ((p.x - minX) / bucketWidth);
int bucketY = (int) ((p.y - minY) / bucketWidth);
intensity[bucketX][bucketY] += w.getIntensity();
}
// Quantize wraparound points (taking xOffset into account)
for (WeightedLatLng w : wrappedPoints) {
Point p = w.getPoint();
int bucketX = (int) ((p.x + xOffset - minX) / bucketWidth);
int bucketY = (int) ((p.y - minY) / bucketWidth);
intensity[bucketX][bucketY] += w.getIntensity();
}
// Convolve it ("smoothen" it out)
double[][] convolved = convolve(intensity, mKernel);
// Color it into a bitmap
bitmap = colorize(convolved, mColorMap, mMaxIntensity[zoom]);
// Convert bitmap to tile and return
return convertBitmap(bitmap);
} else {
return BLANK_TILE;
}
我将 Google 地图 Android 热图实用程序 (https://developers.google.com/maps/documentation/android/utility/heatmap) 与 Google 地图 API v2 一起使用。这个实用程序基本上只是一个 class,实现了一个可以使用 map.addTileOverlay 添加到地图的 TileProvider。代码是 public GitHub:
现在,当我 运行 他们的演示应用程序 (https://developers.google.com/maps/documentation/android/utility/setup) 时,我遇到了一个奇怪的错误。基本上,当查看的数据显示在屏幕中间时,一切正常。但是,当您开始拖动屏幕并且数据到达屏幕边缘时,包含数据的磁贴变为白色。
一旦我将数据滚动回中心,一切看起来都很好。
我很确定这不是 TileProvider 的图块生成代码中的错误,因为它的 getTile-Method 实际上从未 returns 任何白色或其他不正确的图块(我已经检查过)。我让几个人试用了演示应用程序,他们都可以重现问题。
我的问题是:
- 可以安全地假设这是 Maps API v2 TileOverlay 中的错误吗?
- 以前有人遇到过这个问题吗?有什么解决办法吗?
我从 here also, and surely encounter the issue, you can report the issue here 克隆并厌倦了演示,Google 的工程师可能会提供帮助。
这是 GoogleMap 的问题。 android-maps-utils 方法 getTile returns TileProvider.NO_TILE 中的 HeatmapTileProvider 当您滚动地图时,GoogleMap 会使用 Heats 清除所有图块。 我向项目添加了一个 android-maps-utils 库(none gradle 依赖项)并添加了此代码
private final static Tile BLANK_TILE = new Tile(0, 0, new byte[0]);
public Tile getTile(int x, int y, int zoom) {
boolean skipImage = false;
...
if (!tileBounds.intersects(paddedBounds)) {
// return TileProvider.NO_TILE;
skipImage = true;
}
...
if (points.isEmpty()) {
// return TileProvider.NO_TILE;
skipImage = true;
}
if (!skipImage) {
// Quantize points
double[][] intensity = new double[TILE_DIM + mRadius * 2][TILE_DIM + mRadius * 2];
for (WeightedLatLng w : points) {
Point p = w.getPoint();
int bucketX = (int) ((p.x - minX) / bucketWidth);
int bucketY = (int) ((p.y - minY) / bucketWidth);
intensity[bucketX][bucketY] += w.getIntensity();
}
// Quantize wraparound points (taking xOffset into account)
for (WeightedLatLng w : wrappedPoints) {
Point p = w.getPoint();
int bucketX = (int) ((p.x + xOffset - minX) / bucketWidth);
int bucketY = (int) ((p.y - minY) / bucketWidth);
intensity[bucketX][bucketY] += w.getIntensity();
}
// Convolve it ("smoothen" it out)
double[][] convolved = convolve(intensity, mKernel);
// Color it into a bitmap
bitmap = colorize(convolved, mColorMap, mMaxIntensity[zoom]);
// Convert bitmap to tile and return
return convertBitmap(bitmap);
} else {
return BLANK_TILE;
}