【发布时间】:2014-01-16 15:10:19
【问题描述】:
我想使用 google maps api v2,但在后台只显示一个虚拟地图。 这是我正在使用的 PNG 文件的示例,名为“dummy_map_tile.png”。我将它放在资产文件夹中,位于名为“images”的目录下。它的大小是 256x256 像素。还尝试了 JPG 类似的文件。
这是我的虚拟地图瓦片提供者的代码,当然应该离线工作:
public class DummyTileProvider implements TileProvider {
protected Tile mDummyTile = null;
public DummyTileProvider(Context context) {
InputStream inputStream = null;
ByteArrayOutputStream outputStream = null;
try {
String tileFilename = "images/dummy_map_tile.png";
inputStream = context.getResources().getAssets().open(tileFilename);
outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[2048];
int count;
while((count = inputStream.read(buffer)) != -1)
outputStream.write(buffer, 0, count);
outputStream.flush();
mDummyTile = new Tile(256, 256, outputStream.toByteArray());
}
catch (IOException e) {
mDummyTile = null;
}
finally {
if (inputStream != null)
try {inputStream.close();} catch (IOException e) {}
if (outputStream != null)
try {outputStream.close();} catch (IOException e) {}
}
}
@Override
public Tile getTile(int x, int y, int zoom) {
return mDummyTile;
}
}
一些日志记录(未在上面的代码中显示)使我能够确保虚拟 tile 提供程序正确构造,即没有发生 IOException,并且 mDummyTile 不为空。
这是我在地图设置中设置图块提供程序的方式(mMap 是我的 GoogleMap 对象,已正确初始化):
mMap.setMapType(GoogleMap.MAP_TYPE_NONE);
DummyTileProvider tileProvider = new DummyTileProvider(this);
mMap.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider));
很遗憾,地图根本没有显示。 永远不会调用 getTile 方法。 不过,我在地图上绘制的所有标记和其他东西都可以正常工作。 如果我删除上面的三行代码,从而使用默认的图块提供程序,一切正常,显示标准的谷歌地图(仅在在线模式下)。 谁能给我一个有用的提示?
【问题讨论】:
-
我已经从头开始,删除了许多向地图添加功能的代码(漂亮的指南针,地图比例指示器,指示最后位置的面板等......)现在它作品!!现在我将把额外的组件和代码一一添加回来,所以我希望我能很快发现缺陷在哪里。
-
通过一次添加所有额外代码的一部分,我发现了导致问题的原因:在地图上调用方法“clear”。我的意图是在从头开始插入新的标记之前摆脱任何以前添加的标记和类似的东西,从而确保有一个干净的情况。但正如文档所述,此方法“从地图中删除所有标记、折线、多边形、叠加层等”。所以它也删除了瓷砖覆盖!!换句话说,瓦片提供者实现本身并没有错。