OpenWeatherMap自定义TileProvider无法在谷歌地图显示降水瓦片
修复OpenWeatherMap降水瓦片在Google Map上不显示的问题
我仔细看了你的代码,发现几个关键问题导致降水瓦片无法正常加载,咱们一步步来解决:
1. 修正OpenWeatherMap瓦片URL的格式错误
你的OWM_TILE_URL里,appid参数前面缺少了问号?,这会导致API密钥无法被服务器正确识别,返回的可能是无效或空白的瓦片图片。
修改这个常量:
private static String OWM_TILE_URL = "http://tile.openweathermap.org/map/%s/%d/%d/%d.png?appid=ffe8e3ec39ae79c82c32ebba7059ab14";
2. 完善onMapReady的异步初始化逻辑
getMapAsync是异步加载地图的方法,你原来的setUpMapIfNeeded里直接判断mMap != null不会生效——因为地图还没加载完成。必须在onMapReady回调里完成地图和瓦片的初始化:
@Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; setUpMap(); // 地图准备就绪后再添加瓦片 }
同时调整setUpMapIfNeeded方法,去掉无效的setUpMap调用:
private void setUpMapIfNeeded() { if (mMap == null) { ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) .getMapAsync(this); } }
3. 检查自定义TransparentTileOwm的实现
你当前使用的是自定义的TransparentTileOwm作为TileProvider,但没有给出这个类的代码。如果前两步修复后还是无法显示,需要确保这个类:
- 正确拼接了修正后的瓦片URL
- 能正常发起网络请求并返回有效的
Tile对象(比如从输入流读取图片字节数据)
可以先临时切换回createTilePovider()(注意方法名拼写错误,建议改成createTileProvider())测试,确认基础瓦片加载逻辑正常后,再调试透明瓦片的实现。
4. 修复Spinner选中事件的空指针风险
在onItemSelected方法里,移除瓦片前要先判断tileOver是否为null,避免空指针异常:
if (mMap != null && tileOver != null) { tileOver.remove(); setUpMap(); }
完成这些修改后,重新运行应用,降水瓦片应该就能正常显示在Google Map上了。
内容的提问来源于stack exchange,提问作者Edgarjon Komilov




