OSMDroid - 如何在不更改瓦片的情况下进行缩放?

3

我正在使用OSMDroid(v 4.3)开发一个安卓移动地图应用。我已经使用ArcGIS Online作为我的瓦片服务器建立了底图。

    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

模拟 FAKE 缩放 (gimp) 数字/假缩放

注意:通过“放大”瓦片图像,我将失去一些清晰度,这是必然的。由于我需要在某些土地区块周围添加标记(通过点击屏幕),在缩放13中变得过于不精确或在云覆盖下无法确定正确边缘,在数字缩放中像素化并不是问题,并且完全可以接受。

1个回答

3

不,没有办法在不修改OSMdroid源代码的情况下做到这一点。

但是,有一种方法可以在不进入源代码的情况下为每个瓷砖集提供一个更高的缩放级别。

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

mapView.setBuiltInZoomControls(false);

当你创建了新按钮后,请回来。有了新按钮,您需要跟踪您所处的缩放级别。在正常缩放级别下(在这种情况下是云层之前的级别),将“放大”按钮设置为执行此操作。
mapView.setTilesScaledToDpi(true);

这将按英寸点数缩放您的地图,从而给您想要的结果。这是一个例子。
当设置为True时。 mapView.setTilesScaledToDpi(true); 当设置为false时。 mapView.setTilesScaledToDpi(false); 不要忘记在离开此缩放级别时将其设置回false。
其中的缺点是,它只提供了一个缩放级别,您无法决定结果,缩放分辨率可能因设备而异,它不是用于这种方式的,滥用可能会产生混乱的结果。
编辑:您也可以像这样更改Tilesource中的瓷砖缩放比例。 https://dev59.com/3GEh5IYBdhLWcg3wjEDn#25761055 但是,它会对所有缩放级别的瓷砖进行缩放,我认为这不是您想要的。
编辑2:好的,既然您说setTilesScaledToDpi对您没有用,我将尝试解释另一种解决方案,它将具有与先前解决方案相同的效果。

另一个解决方案是创建一个函数,使用与下面一行相同的所有参数更改tileSource为新的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来决定屏幕上瓷砖的大小,这不是最有效的方法,但先前的答案也是如此。您还可以自己硬编码该值。 您应该在官方gitHub页面上为您的需求提交问题,因为现在只有解决方法,这不应该是情况。

在此期间,我将尝试实现这些内容。感谢您的时间。在所有缩放级别上缩放瓦片可能不是什么问题。我的关键问题在于14和15级缩放。这是一个“手指粗大”的问题(意思是您无法在13级以下的缩放级别上以足够的精度单击地图)。 - tony gil
1
哦,如果只是“手指太粗”的问题,那么你可以默认使用setTilesScaledToDpi(true)。这个方法正是为了解决这个问题而创建的,因此它应该能够解决每个设备上的问题。 - M. Haché
1
@tonygil 那么?你解决了你的问题吗?如果没有,我可能有一个最后的解决方案,需要从一个瓷砖源切换到另一个。 - M. Haché
1
我还没有成功实现这个。但可能只是我的代码问题。 - tony gil
1
@tonygil 我已经编辑了答案并提供更多帮助。如果你在尝试我的解决方案时遇到任何问题,我们可以在这里简要地讨论一下。但是对于代码帮助,你需要提出一个新的问题。同时,你应该在OSMdroid gitHub页面上提交一个问题,我相信他们会很乐意实现这个功能。 - M. Haché
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接