1

我想问一下渲染在线瓦片和离线地图有什么区别。

我有以下代码,当我使用离线地图中的切片渲染层时,它运行成功。但是,如果我使用 tileDownloadLayer,它就不起作用。

下面是它不起作用的代码。使用 tileDownloadLayer 仅显示灰色图层而不是地图图块。

    private static final String MAP_FILE = "hongkong_cycle.map";  // name of the map file in the external storage
    private static MapDataStore mapDataStore = new MapFile(Environment.getExternalStoragePublicDirectory("lab.geospatial.maps").toString() + "/" + MAP_FILE);
    private MapView mapView;
    private TileRendererLayer tileRendererLayer;
    private TileCache tileCache;
    private Layer sketchLayer;
    private MyLocationOverlay myLocationOverlay;
    private LatLong MY_INIT_ZOOM_CENTER = new LatLong(22.305, 114.1793);
    private byte MY_INIT_ZOOM_LEVEL = 13;
    private LatLong currentHotSpot = MY_INIT_ZOOM_CENTER;
    private TappableMarker positionMarker;
    private String inputGeo;
    private boolean enableLongPressInfo = false;
    private boolean enableSketch = false;
    private PaintView paintView;
    public View rootView;
    protected TileDownloadLayer downloadLayer;



protected void createMapViews() {
    mapView = getMapView();
    findViewById(R.id.rotateView).setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    mapView.getModel().frameBufferModel.setOverdrawFactor(1.0d);
    mapView.setClickable(true);
    mapView.getMapScaleBar().setVisible(false);
    mapView.getModel().displayModel.setFixedTileSize(256);

    mapView.setBuiltInZoomControls(false);
    mapView.setZoomLevelMin((byte) 10);
    mapView.setZoomLevelMax((byte) 18);

    // create a tile cache of suitable size
    tileCache = AndroidUtil.createTileCache(this, "mapcache", mapView.getModel().displayModel.getTileSize(), 1f, mapView.getModel().frameBufferModel.getOverdrawFactor());

    OnlineTileSource onlineTileSource = new OnlineTileSource(new String[]{
            "a.tile.thunderforest.com", "b.tile.thunderforest.com", "c.tile.thunderforest.com"},
            80);
    onlineTileSource.setName("openCycle").setAlpha(false)
            .setBaseUrl("/cycle/")
            .setParallelRequestsLimit(8).setProtocol("http").setTileSize(256)
            .setZoomLevelMax((byte) 25).setZoomLevelMin((byte) 0);
    onlineTileSource.setUserAgent("Mapsforge Samples");

    downloadLayer = new TileDownloadLayer(tileCache,
            mapView.getModel().mapViewPosition, onlineTileSource,
            AndroidGraphicFactory.INSTANCE);

    mapView.getLayerManager().getLayers().add(downloadLayer);

    mapView.setCenter(MY_INIT_ZOOM_CENTER);
    mapView.setZoomLevel(MY_INIT_ZOOM_LEVEL);


}

但是,如果我将 tileRenderLayer 与示例离线地图一起使用,它可以正常显示地图。

    private static final String MAP_FILE = "hongkong_cycle.map";  // name of the map file in the external storage
    private static MapDataStore mapDataStore = new MapFile(Environment.getExternalStoragePublicDirectory("lab.geospatial.maps").toString() + "/" + MAP_FILE);
    private MapView mapView;
    private TileRendererLayer tileRendererLayer;
    private TileCache tileCache;
    private Layer sketchLayer;
    private MyLocationOverlay myLocationOverlay;
    private LatLong MY_INIT_ZOOM_CENTER = new LatLong(22.305, 114.1793);
    private byte MY_INIT_ZOOM_LEVEL = 13;
    private LatLong currentHotSpot = MY_INIT_ZOOM_CENTER;
    private TappableMarker positionMarker;
    private String inputGeo;
    private boolean enableLongPressInfo = false;
    private boolean enableSketch = false;
    private PaintView paintView;
    public View rootView;
    protected TileDownloadLayer downloadLayer;



protected void createMapViews() {
    mapView = getMapView();
    findViewById(R.id.rotateView).setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    mapView.getModel().frameBufferModel.setOverdrawFactor(1.0d);
    mapView.setClickable(true);
    mapView.getModel().displayModel.setFixedTileSize(256);

    mapView.setBuiltInZoomControls(false);
    mapView.setZoomLevelMin((byte) 10);
    mapView.setZoomLevelMax((byte) 18);

    // create a tile cache of suitable size
    tileCache = AndroidUtil.createTileCache(this, "mapcache", mapView.getModel().displayModel.getTileSize(), 1f, mapView.getModel().frameBufferModel.getOverdrawFactor());

    // tile renderer layer using internal render theme
    tileRendererLayer = new TileRendererLayer(
            tileCache,
            mapDataStore,
            mapView.getModel().mapViewPosition,
            AndroidGraphicFactory.INSTANCE) {
        @Override
        public boolean onLongPress(LatLong tapLatLong, Point thisXY, Point tapXY) {
            CycleProject.this.onLongPress(tapLatLong, tapXY);
            return true;
        }
    };
    tileRendererLayer.setXmlRenderTheme(InternalRenderTheme.DEFAULT);

    // only once a layer is associated with a mapView the rendering starts
    mapView.getLayerManager().getLayers().add(tileRendererLayer);
    mapView.setCenter(MY_INIT_ZOOM_CENTER);
    mapView.setZoomLevel(MY_INIT_ZOOM_LEVEL);

}

因为我想使用 opencycle 地图作为不提供离线版本的底图。因此,需要在线瓷砖。想知道它是否适用于 tileRender 但不适用于 TileDownload 类是否有任何关键区别?我已经检查并确认 TileDownloadLayer 部分在 Mapsforge 示例“DownloadCustomLayerViewer”上工作正常

非常感谢您的建议。

4

0 回答 0