Mapsforge, используя DownlaodLayer для OpenCycleMap - PullRequest
0 голосов
/ 02 июня 2018

Я хотел бы спросить, есть ли какая-либо разница между рендерингом онлайн-плитки и автономной карты.

У меня есть следующий код, он успешно работает, когда я использую слой рендеринга плитки из автономной карты.Тем не менее, он не работает, если я использую 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);

}

Как яхотите использовать открытую карту в качестве базовой карты, которая не предлагает автономную версию.Поэтому онлайн-плитка необходима.Хотите знать, если есть какая-то критическая разница, что он работает на tileRender, но не работает на классе TileDownload, пожалуйста?Я проверил и подтвердил, что часть TileDownloadLayer отлично работает на образце Mapsforge "DownloadCustomLayerViewer"

Большое спасибо за ваш совет.

...