使用自定义 ARCGis 瓦片服务器的 OSMDroid 应用程序 - 瓦片被洗牌

OSMDroid app using custom ARCGis tile server - tiles are shuffled

我正在使用 OSMDroid 开发 android 地图应用程序。我正在尝试使用完全独立于 google and/or bing api 的免费自定义航拍图像。请不要提出任何使用其映射 api 的解决方案。

我已经通过包含此代码来显示卫星图像:

mapView.setTileSource(TileSourceFactory.MAPQUESTAERIAL);

但是,图块服务器不提供 11 倍以上的图块,我需要比那个更近一点(比如说 15-16?)。

使用 ARCGis 瓦片服务器,我设法将卫星图像显示到 16 层缩放级别,但瓦片被打乱了。

mapControl = (MapController) mapView.getController();
mapControl.setZoom(11);
String[] urlArray = {"http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/"};
mapView.setTileSource(new XYTileSource("ArcGisOnline", null, 0, 18, 256, ".png",urlArray ));

底图图块被打乱,不对应 lat/lon,但覆盖没问题。

图块服务器可能使用不同的方案来检索图块。尝试翻转 X 和 Y 坐标。 Slippy 地图服务器 (osm) 使用 Z/X/Y.ext 格式。 ArgGis 和其他几个使用 Z/Y/X.ext 格式。所有其他坐标都相同。这意味着解决方案很简单,覆盖 getTileURLString 方法并以服务器需要的任何格式提供坐标。

Osmdroid 有一个例子可以做到这一点。

https://github.com/osmdroid/osmdroid/blob/master/OpenStreetMapViewer/src/main/java/org/osmdroid/samplefragments/SampleCustomTileSource.java

相关位代码this

mMapView.setTileSource(new OnlineTileSourceBase("USGS Topo", 0, 18, 256, "", 
           new String[] { "http://basemap.nationalmap.gov/ArcGIS/rest/services/USGSTopo/MapServer/tile/" }) {
           @Override
           public String getTileURLString(MapTile aTile) {
                return getBaseUrl() + aTile.getZoomLevel() + "/" + aTile.getY() + "/" + aTile.getX()
            + mImageFilenameEnding;
           }
      });

您还需要在此更改后清除缓存,因为它的坐标有误