【问题标题】:OSMdroid change TileSource at RuntimeOSMdroid 在运行时更改 TileSource
【发布时间】:2012-01-16 14:52:58
【问题描述】:

我正在使用 osmdroid,我想在运行时更改 TileSource(通过菜单项)。例如,我可以在 OSM TileSource 和 GoogleTileSource 之间切换。

问题:一切正常,但是当我在 mapview 在后台加载 Tile 时更改 TileSource 时,它​​会更改 TileSource,但一两个瓷砖来自之前的 TileSource。所以我看到了一个混合 MapView 与 OSMTiles 和一两个 GoogleTiles。

每次更改 TileSource 后都会清除 tileCache。但是后台加载的瓦片此时不在缓存中,所以他把这个瓦片放到缓存中,清除后。

有解决此问题的想法吗?都是基于osmdroid,我只用setTileSource(ITileSource)

感谢和问候

【问题讨论】:

  • 您从哪里获得 Google 磁贴?我不认为这是 TileSourceFactory 常量中的一个选项。
  • @NickT:我猜他正在切换 mapview 活动(而不是 tilesource)
  • 不不,我只切换 TileSources 并为 Google 创建了我自己的 TileSource ;-)
  • 一个有趣的方法,问题是谷歌许可证中没有缓存的原因。我有一个框架,里面有一个谷歌和一个 Osmroid 视图。
  • 我在教程中读到过,不允许离线使用谷歌地图。但他告诉它允许缓存,所以他缓存了几年的瓷砖:) datamoil.blogspot.com/2011/05/…

标签: android tiles osmdroid openstreetmap


【解决方案1】:

对我来说似乎是一个适当的错误。我认为你应该这样报告。我在issues 列表中看不到类似的东西。看起来坏磁贴甚至进入了 sd 卡上的错误缓存,这很糟糕,因为它会存在一段时间。

【讨论】:

    【解决方案2】:

    如果您使用的是 osmdroid3.0.6.jar(我认为您是,因为如果我使用 3.0.6 构建,我可以重现此错误)。我认为这是我提出osmdroid-android-3.0.6.jar, tile loading slow or fails 的问题的另一种表现形式。作者已接受此错误。

    我建议您重新使用 3.0.5 jar。我对此没有任何问题。 (我仍然对你如何在 Osmdroid 中使用 Google 磁贴感到困惑)

    【讨论】:

    • 谢谢,我也认为这是一个错误。 (对于谷歌瓷砖你只需要这个页面mt3.google.com/vt/v=w2.97&x=74327&y=50500&z=17并为osmdroid创建你的oun TileSource)
    • 我认为这是一个不同的问题,我刚刚在我的应用中回到 3.0.5 并看到了相同的效果。
    • 就我而言,它也不慢。我查看了osmdroid的src。在 setTileSource() 方法中,它会清除缓存,但不会停止当前下载或其他内容。所以缓存是干净的,但下载正在加载,当它完成时,它会将图块放入缓存中。因此,他有可能将 1 或 2 个旧 TileSource 切片放入缓存,然后再放入新切片。我找到了一个解决方法,但不是很好,我会把它作为答案
    【解决方案3】:

    我想我们都认为这是一个错误(或者它可能不想在运行时切换 TileSource)。

    我创建了一个小 Workarround。它有效,但不是很好或推荐。

    我创建了一个新的 mapView 并扩展了 osm MapView。比创建一个 RequestCompleteHandler,所以我可以看到瓦片何时完成加载并保存到缓存中。比我计算每个缓存的图块,并且只允许在加载 15 个图块后切换 tileSource。 (在应用程序开始时 osmdroid 将加载 15 个图块,仅在移动地图后才加载更多)

    class RequestCompleteHandler extends SimpleInvalidationHandler{
        private LbsMapView mMapView;
    
        public RequestCompleteHandler(LbsMapView pView) {
            super(pView);
            mMapView = pView;
        }
    
        @Override
        public void dispatchMessage(Message msg) {
            super.dispatchMessage(msg);
            Log.d("DEBUG", "HANDLER HAT GERUFEN! BACKE BACKE KUCHEN!! " + tileCount);
            tileCount++;
        }
    
    }
    

    然后重写 setTileSource 方法:

    @Override
    public void setTileSource(ITileSource aTileSource) {
        if(tileCount <= 15){
            Toast.makeText(mContext, "Jetz eher nich", Toast.LENGTH_SHORT).show();
        } else {
            tileCount = 0;
            super.setTileSource(aTileSource);
        }
    
    }
    

    并且需要在构造函数中设置并初始化Handler:

    mHandler = new RequestCompleteHandler(this);
        getTileProvider().setTileRequestCompleteHandler(mHandler);
    

    完成。现在您只能在 tileSource 已加载 15 个图块时切换它。 一个小问题:如果源不工作并且不加载任何瓷砖,那么你就有问题了:D

    但重要的是:不推荐,它的代码真的很丑

    【讨论】:

    • 你确定它总是 15 块吗?我以为缓存从 9 开始,然后增长到 16,至少我在 logcat 中看到的情况是这样。
    • 我不是 100% 确定,在启动应用程序后我只数了 15,而没有移动地图。但是,如果您移动地图并切换 TileSource,也会发生瓷砖混合的情况。但用户需要快速。
    • 我将其发布为 osmdroid 的问题...他们需要在您使用 setTileSource 后清除下载队列,所以我认为我们需要等待新版本 :)
    • 我遇到了完全相同的问题。是否为此记录了问题?如果可以,能发个链接吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2011-04-10
    • 2011-01-01
    • 2010-12-05
    相关资源
    最近更新 更多