android - OSMDroid - 放大而不改变瓷砖,这可能吗?

标签 android osmdroid

我正在使用 OSMDroid (v 4.3) 开发一个安卓手机 map 应用。我已经使用 arcgisonline 作为我的切片服务器建立了 basemap 。

    String[] urlArray = {"http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/"};
    mapView.setTileSource(new OnlineTileSourceBase("ArcGisOnline", null, 0, 16, 256, "",
            urlArray) {
            @Override
            public String getTileURLString(MapTile aTile) {
                String mImageFilenameEnding = ".png";
                return getBaseUrl() + aTile.getZoomLevel() + "/" + aTile.getY() + "/" + aTile.getX()
                        + mImageFilenameEnding;
            }
    });

Tile 服务器运行良好。但是当放大(14 级以上)时,带有卫星图像的图 block 集有部分覆盖地面的云,所以我想知道是否可以在不更改图 block 集的情况下进行放大。

satellite imagery with cloud cover

真正的 13 级

zoom13

FAKE 缩放模拟(gimp) digital/fake zoom

注意:我会通过“炸毁”瓷砖图像来失去定义,这是给定的。因为,我需要在一些地 block 周围添加标记(通过点击屏幕),并且它在 zoom13 中变得太不精确,或者在云覆盖的 zoom 14+ 中无法确定正确的边缘,数字变焦中的像素化不是问题并且是完美的可以接受。

最佳答案

不,如果不修改 OSMdroid 源代码,就无法做到这一点。

但是,有一种方法可以在技术上为提供的每个 tileset 增加一个缩放级别,而无需进入源代码。

您需要创建自己的缩放按钮,而不是使用提供的缩放按钮。禁用默认缩放按钮。

mapView.setBuiltInZoomControls(false);

创建新按钮后回来。

使用新按钮时,您需要跟踪所处的缩放级别。在正常缩放级别(在本例中为云前级别)时,设置“放大”按钮来执行此操作相反。

mapView.setTilesScaledToDpi(true);

这会将您的 map 缩放为每英寸点数,从而为您提供所需的结果。这是一个例子。

当设置为 True 时。 mapView.setTilesScaledToDpi(true);

当设置为 false 时。 mapView.setTilesScaledToDpi(false);

离开此缩放级别时不要忘记设置回 false。

这样做的缺点是,它只给你一个缩放级别,你无法决定结果,缩放分辨率可能因设备而异,它不打算以这种方式使用,滥用可能会导致困惑的结果。

编辑:您还可以像此处那样更改 Tilesource 中的图 block 缩放比例。 https://stackoverflow.com/a/25761055/6263209但它会在所有缩放级别上缩放图 block ,我认为这不是您想要的。

编辑 2:好吧,既然你说 setTilesScaledToDpi 对你不起作用,我将尝试解释另一种与之前的解决方案具有相同效果的解决方案。

您可以尝试的另一种解决方案是使用一个新函数来更改 tileSource,除 TileSizePixels 参数外,每个参数都相同,这是下一行中的第五个参数。

mapView.setTileSource(new OnlineTileSourceBase("ArcGisOnline", null, 0, 16, *Here*->256, "",
        urlArray)

你可以做的是在你的应用程序中设置一行,用户可以根据每个像素的图 block 大小输入他们想要在图 block 集上放大多少,当他们确认选择时你可以调用一个函数看起来像这样:

public Void setNewTilesPixels(int tileSizePixels) {
    String[] urlArray = {"http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/"};
    mapView.setTileSource(new OnlineTileSourceBase("ArcGisOnline", null, 0, 16, tileSizePixels, "",
        urlArray) {
            @Override
            public String getTileURLString(MapTile aTile) {
                String mImageFilenameEnding = ".png";
                return getBaseUrl() + aTile.getZoomLevel() + "/" + aTile.getY() + "/" + aTile.getX()
                    + mImageFilenameEnding;
        }
    });
}

基本上它只会让用户通过创建一个新的 TileSource 来决定他屏幕上的图 block 的大小,这不是最有效的方法,但以前的答案也是如此。您也可以自己对值进行硬编码。

您可能应该根据需要在 official gitHub page 上提交问题因为现在只有不应该出现的变通解决方案。

关于android - OSMDroid - 放大而不改变瓷砖,这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37116054/

相关文章:

java - 两个线程访问同一个链表

java - 在 Android 上隐藏鼠标指针

android - 无法在 Android Studio 中点击 XML 预览

android - Osmdroid 滚动和缩放限制

java - 遵循 osmbonuspack "Hello, Routing World!"教程时出错

android - Osmdroid:渲染具有透明度的图 block

javascript - 单击 Javascript 中的按钮显示 android DatePicker

java - 如何通过在布局中使用更多 ListView 来克服这个问题

android - Osmdroid 在 Android 6.0 上运行不佳

java - 将 OSMDroid 的 map 图 block 提供程序更改回默认值