package com.nutiteq.advancedmap3; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import com.nutiteq.core.MapRange; import com.nutiteq.datasources.CompressedCacheTileDataSource; import com.nutiteq.datasources.NutiteqOnlineTileDataSource; import com.nutiteq.datasources.PersistentCacheTileDataSource; import com.nutiteq.datasources.TileDataSource; import com.nutiteq.layers.VectorTileLayer; import com.nutiteq.utils.AssetUtils; import com.nutiteq.vectortiles.MBVectorTileDecoder; import com.nutiteq.vectortiles.MBVectorTileStyleSet; import com.nutiteq.wrappedcommons.UnsignedCharVector; /** * Base activity for vector map samples. Adds menu with multiple style choices. */ public class VectorMapSampleBaseActivity extends MapSampleBaseActivity { public static final String MAIN_STYLE = "nutibright-v3"; protected TileDataSource vectorTileDataSource; protected MBVectorTileDecoder vectorTileDecoder; protected boolean persistentTileCache = false; // Style parameters protected String vectorStyleName = MAIN_STYLE + ":default"; // default style name, each style has corresponding .zip asset protected String vectorStyleLang = "en"; // default map language @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Update options mapView.getOptions().setZoomRange(new MapRange(0, 20)); // Set default base map - online vector with persistent caching updateBaseLayer(); } @Override public boolean onCreateOptionsMenu(Menu menu) { Menu langMenu = menu.addSubMenu("Language"); addLanguageMenuOption(langMenu, "English", "en"); addLanguageMenuOption(langMenu, "German", "de"); addLanguageMenuOption(langMenu, "Spanish", "es"); addLanguageMenuOption(langMenu, "Italian", "it"); addLanguageMenuOption(langMenu, "French", "fr"); addLanguageMenuOption(langMenu, "Russian", "ru"); addLanguageMenuOption(langMenu, "Chinese", "zh"); Menu styleMenu = menu.addSubMenu("Style"); addStyleMenuOption(styleMenu, "Basic", "basic"); addStyleMenuOption(styleMenu, "NutiBright 2D", MAIN_STYLE + ":default"); addStyleMenuOption(styleMenu, "Nutiteq Dark", MAIN_STYLE + ":nutiteq_dark"); addStyleMenuOption(styleMenu, "Nutiteq Grey", MAIN_STYLE + ":nutiteq_grey"); addStyleMenuOption(styleMenu, "NutiBright 3D", "nutibright3d"); addStyleMenuOption(styleMenu, "Loose Leaf", "looseleaf"); return true; } private void addLanguageMenuOption(final Menu menu, String text, final String value) { MenuItem menuItem = menu.add(text).setOnMenuItemClickListener(new OnMenuItemClickListener(){ @Override public boolean onMenuItemClick (MenuItem item){ for (int i = 0; i < menu.size(); i++) { MenuItem otherItem = menu.getItem(i); if (otherItem == item) { otherItem.setIcon(android.R.drawable.checkbox_on_background); } else { otherItem.setIcon(null); } } vectorStyleLang = value; updateBaseLayer(); return true; } }); if (vectorStyleLang.equals(value)) { menuItem.setIcon(android.R.drawable.checkbox_on_background); } } private void addStyleMenuOption(final Menu menu, String text, final String value) { MenuItem menuItem = menu.add(text).setOnMenuItemClickListener(new OnMenuItemClickListener(){ @Override public boolean onMenuItemClick (MenuItem item){ for (int i = 0; i < menu.size(); i++) { MenuItem otherItem = menu.getItem(i); if (otherItem == item) { otherItem.setIcon(android.R.drawable.checkbox_on_background); } else { otherItem.setIcon(null); } } vectorStyleName = value; updateBaseLayer(); return true; } }); if (vectorStyleName.equals(value)) { menuItem.setIcon(android.R.drawable.checkbox_on_background); } } private void updateBaseLayer() { boolean styleBuildings3D = false; if (vectorStyleName.contains(":")) { String[] split = vectorStyleName.split(":"); String fileName = split[0]; String styleName = split[1]; MBVectorTileStyleSet vectorTileStyleSet = getStyleSet(fileName); vectorTileDecoder = new MBVectorTileDecoder(vectorTileStyleSet, styleName); } else { if (vectorStyleName.equals("nutibright3d")) { vectorStyleName = MAIN_STYLE; styleBuildings3D = true; } MBVectorTileStyleSet vectorTileStyleSet = getStyleSet(vectorStyleName); vectorTileDecoder = new MBVectorTileDecoder(vectorTileStyleSet); } // Set language, language-specific texts from vector tiles will be used vectorTileDecoder.setStyleParameter("lang", vectorStyleLang); // OSM Bright style set supports choosing between 2d/3d buildings. Set corresponding parameter. vectorTileDecoder.setStyleParameter("buildings3d", styleBuildings3D ? "1" : "0"); vectorTileDecoder.setStyleParameter("markers3d",styleBuildings3D ? "1" : "0"); vectorTileDecoder.setStyleParameter("texts3d",styleBuildings3D ? "1" : "0"); // Create tile data source for vector tiles if (vectorTileDataSource == null) { vectorTileDataSource = createTileDataSource(); } // Remove old base layer, create new base layer if (baseLayer != null) { mapView.getLayers().remove(baseLayer); } baseLayer = new VectorTileLayer(vectorTileDataSource, vectorTileDecoder); mapView.getLayers().insert(0, baseLayer); } protected MBVectorTileStyleSet getStyleSet(String fileName) { String styleAssetName = fileName + ".zip"; UnsignedCharVector styleBytes = AssetUtils.loadBytes(styleAssetName); return new MBVectorTileStyleSet(styleBytes); } protected TileDataSource createTileDataSource() { TileDataSource vectorTileDataSource = new NutiteqOnlineTileDataSource("nutiteq.osm"); // We don't use vectorTileDataSource directly (this would be also option), // but via caching to cache data locally persistently/non-persistently // Note that persistent cache requires WRITE_EXTERNAL_STORAGE permission TileDataSource cacheDataSource = vectorTileDataSource; if (persistentTileCache) { String cacheFile = getExternalFilesDir(null)+"/mapcache.db"; Log.i(Const.LOG_TAG,"cacheFile = "+cacheFile); cacheDataSource = new PersistentCacheTileDataSource(vectorTileDataSource, cacheFile); } else { cacheDataSource = new CompressedCacheTileDataSource(vectorTileDataSource); } return cacheDataSource; } }