其他分享
首页 > 其他分享> > android-OSMDroid-放大而不更改图块,有可能吗?

android-OSMDroid-放大而不更改图块,有可能吗?

作者:互联网

我正在使用OSMDroid(v 4.3)开发一个android移动地图应用程序.我已使用arcgisonline作为图块服务器建立了底图.

    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;
            }
    });

切片服务器效果很好.但是,当放大(级别14)时,带有卫星图像的图块集具有部分覆盖地面的云彩,因此我想知道是否可以在不更改图块集的情况下进行放大.

satellite imagery with cloud cover

真实等级13

zoom13

假变焦模拟(gimp)
digital/fake zoom

注意:我会通过“放大”切片图像(这是给定的)而失去定义.由于我需要在某些土地上添加标记(通过点击屏幕),并且在zoom13中变得太不精确,或者无法在具有云覆盖率的zoom 14中确定正确的边缘,因此数字变焦中的像素化不是问题,完全可以接受.

解决方法:

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

但是,有一种方法可以从技术上为所提供的每个切片集提供一个更高的缩放级别,而无需使用源代码.

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

mapView.setBuiltInZoomControls(false);

创建完新按钮后再回来.

使用新按钮,您需要跟踪所处的缩放级别.在正常缩放级别(在这种情况下,是在乌云之前的级别),请设置“放大”按钮来代替.

mapView.setTilesScaledToDpi(true);

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

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

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

离开此缩放级别时,别忘了将其设置回false.

缺点是,它只能为您提供一个无法确定结果的缩放级别,缩放分辨率可能因设备而异,因此不打算以这种方式使用,滥用此方法可能会导致混乱的结果.

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

编辑2:好吧,因为您说setTilesScaledToDpi对您不起作用,所以我将尽力解释另一种解决方案,该解决方案将具有与先前解决方案相同的效果.

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

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

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

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来决定屏幕上瓦片的大小,这并不是最有效的方法,但是先前的答案也是如此.您也可以自己对值进行硬编码.

您可能应该在official gitHub page上提出您需要的问题,因为目前只有解决方法,而事实并非如此.

标签:osmdroid,android
来源: https://codeday.me/bug/20191118/2030053.html