package com.nutiteq.advancedmap3; import java.io.File; import java.io.FileFilter; import android.os.Bundle; import android.util.DisplayMetrics; import com.nutiteq.core.MapBounds; import com.nutiteq.core.MapPos; import com.nutiteq.core.MapRange; import com.nutiteq.core.ScreenBounds; import com.nutiteq.core.ScreenPos; import com.nutiteq.datasources.MBTilesTileDataSource; import com.nutiteq.filepicker.FilePickerActivity; import com.nutiteq.layers.RasterTileLayer; import com.nutiteq.layers.VectorTileLayer; import com.nutiteq.utils.AssetUtils; import com.nutiteq.utils.Log; import com.nutiteq.vectortiles.MBVectorTileDecoder; import com.nutiteq.vectortiles.MBVectorTileStyleSet; import com.nutiteq.vectortiles.VectorTileDecoder; import com.nutiteq.wrappedcommons.StringMap; import com.nutiteq.wrappedcommons.UnsignedCharVector; /** * A sample that uses a specified MBTiles file for the base layer. * The sample assumes that the file name is specified using the Intent "selectedFile" extra field. */ public class MbtilesActivity extends MapSampleBaseActivity implements FilePickerActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // read filename from extras Bundle b = getIntent().getExtras(); String filePath = b.getString("selectedFile"); // Create tile data source. Min/max zoom will be automatically detected. MBTilesTileDataSource tileDataSource = new MBTilesTileDataSource(filePath); // Now check if we need to use vector layer or raster layer, based on mbtiles metadata StringMap metaData = tileDataSource.getMetaData(); String format = "png";// default; if(metaData.has_key("format")){ format = tileDataSource.getMetaData().get("format"); } if ("pbf".equals(format) || "ntvt".equals(format)) { UnsignedCharVector styleBytes = AssetUtils.loadBytes("nutibright-v2a.zip"); MBVectorTileStyleSet vectorTileStyleSet = new MBVectorTileStyleSet(styleBytes); VectorTileDecoder vectorTileDecoder = new MBVectorTileDecoder(vectorTileStyleSet); baseLayer = new VectorTileLayer(tileDataSource, vectorTileDecoder); } else { baseLayer = new RasterTileLayer(tileDataSource); } mapView.getLayers().add(baseLayer); mapView.getOptions().setZoomRange(new MapRange(0, 23)); // Fit to bounds DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); int height = displaymetrics.heightPixels; int width = displaymetrics.widthPixels; if (metaData.has_key("bounds")) { String[] bounds = tileDataSource.getMetaData().get("bounds").split(","); if (bounds.length == 4) { float minLon = Float.parseFloat(bounds[0]); float minLat = Float.parseFloat(bounds[1]); float maxLon = Float.parseFloat(bounds[2]); float maxLat = Float.parseFloat(bounds[3]); MapBounds dataBounds = new MapBounds(baseProjection.fromWgs84(new MapPos(minLon, minLat)), baseProjection.fromWgs84(new MapPos(maxLon, maxLat))); mapView.moveToFitBounds(dataBounds, new ScreenBounds(new ScreenPos(0, 0), new ScreenPos(width, height)), false, 0.0f); Log.debug("moved to metadata bounds " + dataBounds); } } else { MapBounds dataBounds = tileDataSource.getDataExtent(); mapView.moveToFitBounds(dataBounds, new ScreenBounds(new ScreenPos(0, 0), new ScreenPos(width, height)), false, 0.0f); Log.debug("No bounds found from metadata, detected bounds" + dataBounds); } } @Override public String getFileSelectMessage() { return "Select MBTiles file (raster or vector)"; } @Override public FileFilter getFileFilter() { return new FileFilter() { @Override public boolean accept(File file) { // accept only readable files if (file.canRead()) { if (file.isDirectory()) { // allow to select any directory return true; } else if (file.isFile() && file.getName().endsWith(".mbtiles")) { // accept files with given extension return true; } } return false; }; }; } }