【问题标题】:OSM map, custom tile source is not usedOSM 地图,未使用自定义瓦片源
【发布时间】:2015-07-22 13:13:03
【问题描述】:

我有以下代码:

public class MainActivity extends Activity {
    MapView map;
    XYTileSource customTileSource;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        map = (MapView) findViewById(R.id.mapView);
        map.setMultiTouchControls(true);
        map.setMapListener(new MyMapListener());
        ITileSource tileSource = TileSourceFactory.MAPNIK;
        String tileUrl[] = {"https://bla_bla_bla__don't wanna show this here"};
        customTileSource = new MyXYTileSource("Point", null, 8, 18, 256, ".png", tileUrl);
        map.setTileSource(customTileSource);

        GeoPoint startPoint = new GeoPoint(47.021461, 28.86383);
        IMapController mapController = map.getController();
        mapController.setCenter(startPoint);
        mapController.setZoom(10);

        MapEventsOverlay eventsOverlay = new MapEventsOverlay(this, new MyMapEventsListener());
        map.getOverlays().add(eventsOverlay);

    }

    private class MyMapListener implements MapListener {

        @Override
        public boolean onScroll(ScrollEvent event) {
            return false;
        }

        @Override
        public boolean onZoom(ZoomEvent event) {
            Log.d("atf", "Zoom level is: " + event.getZoomLevel());
            return true;
        }
    }

    private class MyMapEventsListener implements MapEventsReceiver {

        @Override
        public boolean singleTapConfirmedHelper(GeoPoint p) {
            Log.d("atf", "Taped on long="+p.getLongitude()+"  lat="+p.getLatitude());
            return true;
        }

        @Override
        public boolean longPressHelper(GeoPoint p) {
            return false;
        }
    }

    private class MyXYTileSource extends XYTileSource {

        public MyXYTileSource(String aName, ResourceProxy.string aResourceId, int aZoomMinLevel, int aZoomMaxLevel, int aTileSizePixels, String aImageFilenameEnding, String[] aBaseUrl) {
            super(aName, aResourceId, aZoomMinLevel, aZoomMaxLevel, aTileSizePixels, aImageFilenameEnding, aBaseUrl);
        }

        @Override
        public String getTileURLString(MapTile aTile) {
            String tileUrl = super.getTileURLString(aTile);
            Log.d("atf", "Tile url String: "+tileUrl);
            return tileUrl;
        }
    }
}

这样做的目的是使用自定义图块来显示地图。 这实际上工作正常。 除了这个代码在“Samsung galaxy Ace 3”上运行的情况。也许还有其他设备有同样的问题。

对于低于 17 的缩放级别,它不会加载自定义图块。当缩放超过 17 时,它开始加载它们。

谁能解释一下为什么?

抱歉,我忘了说明: 未加载新图块时,将加载旧图块(从默认图块源)。所以地图不是完全空白的。

【问题讨论】:

  • 你能澄清一下吗?缩放 > 17 负载或缩放
  • 您是否尝试过将自定义平铺源的最大缩放比例提高到更高?试试 19 或 20 看看是否有区别

标签: java android osmdroid


【解决方案1】:

查看logcat是否有异常,可能有很多OutOfMemoryError。如果是这样,您需要微调您的应用内存使用情况。

【讨论】:

    【解决方案2】:

    虽然解决方案比我简单。这仅仅是因为缓存。在问题中指定的设备上,我有另一个似乎使用相同库“OSM Bonus Pack”的应用程序。两个应用程序都使用来自外部存储的相同目录进行切片缓存。我只是删除了那个目录(/storage/emulated/0/osmdroid),然后新的磁贴开始从我的应用程序中加载。

    也许更好的解决方案是为我的应用程序指定另一个目录以进行切片缓存。当然,我需要一些时间才能找到如何做到这一点,但我认为这不会很复杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多