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