// Map View manipulation handlers
  @Override
  public void onMapClicked(final double x, final double y, final boolean longClick) {
    // x and y are in base map projection, we convert them to the familiar
    // WGS84
    Log.debug(
        "onMapClicked "
            + (new EPSG3857()).toWgs84(x, y).x
            + " "
            + (new EPSG3857()).toWgs84(x, y).y
            + " longClick: "
            + longClick);

    MutableMapPos tilePos = new MutableMapPos();
    MapTile clickedTile = mapView.worldToMapTile(x, y, tilePos);

    Log.debug("clicked tile " + clickedTile + " pos:" + tilePos);

    if (layer instanceof UtfGridLayerInterface) {

      Map<String, String> toolTips = layer.getUtfGridTooltips(clickedTile, tilePos, this.template);

      if (toolTips == null) {
        return;
      }
      Log.debug("utfGrid tooltip values: " + toolTips.size());
      updateMarker(new MapPos(x, y), toolTips);
    }
  }
Пример #2
0
  public StoredMapConfig readConfig(final FileSystem fs) {
    try {
      final String filename = path + "/" + CONFIG_FILENAME;
      final byte[] data = fs.readFile(filename);
      final String sdata = new String(data);
      final String[] lines = Utils.split(sdata, "\n");
      for (int i = 0; i < lines.length; i++) {
        // split into at most 2 tokens
        final String[] tokens = Tools.split(lines[i].trim(), '=', false, 2);
        if (tokens.length == 2) {
          final String name = tokens[0].trim().toLowerCase();
          final String value = tokens[1].trim();

          // ignore empty values
          if (value.length() == 0) {
            continue;
          }

          // ignore comments
          if (name.startsWith("#")) {
            continue;
          }

          if (name.equals("tiles_per_file")) {
            final int tpf = Integer.parseInt(value);
            if (tpf > 0 && (tpf & (-tpf)) == tpf) {
              setTilesPerFile(tpf);
            } else {
              throw new IOException("Invalid tiles_per_file");
            }
          } else if (name.equals("hash_size")) {
            final int hs = Integer.parseInt(value);
            if (hs >= 1 && hs < 100) {
              setHashSize(hs);
            } else {
              throw new IOException("Invalid hash_size");
            }
          } else if (name.equals("center")) {
            try {
              final String[] xyz = Tools.split(value.trim(), ',', false, 4);
              double lat = Float.parseFloat(xyz[0].trim());
              double lon = Float.parseFloat(xyz[1].trim());
              int zoom = Integer.parseInt(xyz[2].trim());
              Log.debug("center zoom found = " + lat + " " + lon + " " + zoom);
              setCenterLocation(new WgsPoint(lon, lat), zoom);
            } catch (final Exception ex) {

              throw new IOException("invalid center location");
            }
          }
        }
      }
    } catch (final IOException ex) {
      Log.error("Error reading " + CONFIG_FILENAME);
      Log.printStackTrace(ex);
      return null;
    }
    return new StoredMapConfig(tilesPerFile, tpfx, tpfy, hashSize);
  }
Пример #3
0
  public void loadData(Envelope envelope, int zoom) {

    long timeStart = System.currentTimeMillis();

    // TODO: use fromInternal(Envelope) here
    MapPos minPos = projection.fromInternal(envelope.getMinX(), envelope.getMinY());
    MapPos maxPos = projection.fromInternal(envelope.getMaxX(), envelope.getMaxY());

    String sqlBbox = "" + minPos.x + "," + minPos.y + "," + maxPos.x + "," + maxPos.y;

    // load geometries
    List<Geometry> newVisibleElementsList = new LinkedList<Geometry>();

    try {
      Uri.Builder uri =
          Uri.parse("http://kaart.maakaart.ee/poiexport/roads.php?output=gpoly&").buildUpon();
      uri.appendQueryParameter("bbox", sqlBbox);
      uri.appendQueryParameter("max", String.valueOf(maxObjects));
      Log.debug("Vector API url:" + uri.build().toString());

      JSONObject jsonData = NetUtils.getJSONFromUrl(uri.build().toString());

      if (jsonData == null) {
        Log.debug("No CartoDB data");
        return;
      }

      JSONArray rows = jsonData.getJSONArray("res");

      for (int i = 0; i < rows.length(); i++) {
        JSONObject row = rows.getJSONObject(i);

        String the_geom_encoded = row.getString("g");
        String name = row.getString("n");
        String type = row.getString("t");

        Vector<MapPos> mapPos = GeoUtils.decompress(the_geom_encoded, 5, projection);

        Geometry newObject = new Line(mapPos, new DefaultLabel(name, type), lineStyleSet, null);

        newObject.attachToLayer(this);
        newObject.setActiveStyle(zoom);
        newVisibleElementsList.add(newObject);
      }
    } catch (ParseException e) {
      Log.error("Error parsing data " + e.toString());
    } catch (JSONException e) {
      Log.error("Error parsing JSON data " + e.toString());
    }

    long timeEnd = System.currentTimeMillis();
    Log.debug(
        "OnlineVector loaded N:"
            + newVisibleElementsList.size()
            + " time ms:"
            + (timeEnd - timeStart));
    setVisibleElements(newVisibleElementsList);
  }
Пример #4
0
  @Override
  protected void onStop() {
    super.onStop();
    Log.debug("x " + getMapView().getFocusPoint().x);
    Log.debug("y " + getMapView().getFocusPoint().y);
    Log.debug("tilt " + getMapView().getTilt());
    Log.debug("rotation " + getMapView().getRotation());
    Log.debug("zoom " + getMapView().getZoom());

    mapView.stopMapping();
  }
Пример #5
0
  @Override
  public void fetchTile(MapTile tile) {
    if (db == null) {
      return;
    }
    if (tile.zoom < minZoom || tile.zoom > maxZoom) {
      return;
    }

    MapTile flippedTile;
    if (!tmsY) {
      flippedTile = new MapTile(tile.x, tile.y, tile.zoom, tile.id);
    } else {
      // flip Y coordinate for standard TMS
      flippedTile = new MapTile(tile.x, (1 << (tile.zoom)) - 1 - tile.y, tile.zoom, tile.id);
    }

    Log.debug(
        "DbMapLayer: Start loading "
            + " zoom="
            + flippedTile.zoom
            + " x="
            + flippedTile.x
            + " y="
            + flippedTile.y);
    executeFetchTask(new DbFetchTileTask(flippedTile, components, tileIdOffset, db));
  }
  private void updateMarker(MapPos pos, Map<String, String> toolTips) {

    if (clickMarker != null) {

      String text = "";
      if (toolTips.containsKey(UtfGridHelper.TEMPLATED_TEASER_KEY)) {
        // strio HTML from the teaser, so it can be shown in normal
        //              String strippedTeaser =
        // android.text.Html.fromHtml(toolTips.get(UtfGridHelper.TEMPLATED_TEASER_KEY).replaceAll("\\<.*?>","")).toString().replaceAll("\\p{C}", "").trim();
        //              Toast.makeText(activity, strippedTeaser, Toast.LENGTH_SHORT).show();
        //                Log.debug("show label ")
        text = toolTips.get(UtfGridHelper.TEMPLATED_TEASER_KEY);
      } else if (toolTips.containsKey("ADMIN")) {
        text = toolTips.get("ADMIN");
      }

      clickMarker.setMapPos(pos);
      mapView.selectVectorElement(clickMarker);
      WebView webView = ((WebView) ((ViewLabel) clickMarker.getLabel()).getView());
      Log.debug("showing html: " + text);
      webView.loadDataWithBaseURL(
          "file:///android_asset/",
          UiUtils.HTML_HEAD + text + UiUtils.HTML_FOOT,
          "text/html",
          "UTF-8",
          null);

      clickMarker.userData = toolTips;
    }
  }
 private void updateMarker(MapPos pos, String text) {
   if (clickMarker != null) {
     clickMarker.setMapPos(pos);
     mapView.selectVectorElement(clickMarker);
     WebView webView = ((WebView) ((ViewLabel) clickMarker.getLabel()).getView());
     Log.debug("showing html: " + text);
     webView.loadDataWithBaseURL("file:///android_asset/", text, "text/html", "UTF-8", null);
   }
 }
Пример #8
0
    @Override
    public void run() {
      super.run();
      Log.debug("DbMapLayer task: Start loading " + " zoom=" + z + " x=" + x + " y=" + y);

      // y is flipped (origin=sw in mbtiles)
      finished(db.getTileImg(z, x, (1 << (z)) - 1 - y));
      cleanUp();
    }
 // Vector element (touch) handlers
 @Override
 public void onLabelClicked(VectorElement vectorElement, boolean longClick) {
   Log.debug("clicked on label");
   if (vectorElement.userData != null) {
     Map<String, String> toolTipData = (Map<String, String>) vectorElement.userData;
     if (toolTipData.containsKey(UtfGridHelper.TEMPLATED_LOCATION_KEY)) {
       //              String strippedTeaser =
       // android.text.Html.fromHtml(toolTips.get(UtfGridHelper.TEMPLATED_TEASER_KEY).replaceAll("\\<.*?>","")).toString().replaceAll("\\p{C}", "").trim();
       //              Toast.makeText(activity, strippedTeaser, Toast.LENGTH_SHORT).show();
       //                Log.debug("show label ")
       String url = toolTipData.get(UtfGridHelper.TEMPLATED_LOCATION_KEY);
       Log.debug("open url " + url);
       if (!url.equals("")) {
         Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
         activity.startActivity(i);
       } else {
         Log.debug("empty url/location");
       }
     }
   }
 }
  @Override
  public void routeResult(Route route) {

    if (route.getRouteResult() != Route.ROUTE_RESULT_OK) {
      Toast.makeText(this, "Route error", Toast.LENGTH_LONG).show();
      return;
    }

    routeLayer.clear();
    routeLayer.add(route.getRouteLine());
    Log.debug("route line points: " + route.getRouteLine().getVertexList().size());
    //        Log.debug("route line: "+route.getRouteLine().toString());
    markerLayer.addAll(
        CloudMadeDirections.getRoutePointMarkers(
            routeImages, MARKER_SIZE, route.getInstructions()));
    mapView.requestRender();
    Toast.makeText(this, "Route " + route.getRouteSummary(), Toast.LENGTH_LONG).show();
  }
  @Override
  public void showRoute(
      final double fromLat, final double fromLon, final double toLat, final double toLon) {

    Log.debug("calculating path " + fromLat + "," + fromLon + " to " + toLat + "," + toLon);

    Projection proj = mapView.getLayers().getBaseLayer().getProjection();
    stopMarker.setMapPos(proj.fromWgs84(toLon, toLat));

    CloudMadeDirections directionsService =
        new CloudMadeDirections(
            this,
            new MapPos(fromLon, fromLat),
            new MapPos(toLon, toLat),
            CloudMadeDirections.ROUTE_TYPE_CAR,
            CloudMadeDirections.ROUTE_TYPE_MODIFIER_FASTEST,
            CLOUDMADE_KEY,
            proj);
    directionsService.route();
  }
  // Map View manipulation handlers
  @Override
  public void onMapClicked(final double x, final double y, final boolean longClick) {
    // x and y are in base map projection, we convert them to the familiar
    // WGS84
    Log.debug(
        "onMapClicked "
            + (new EPSG3857()).toWgs84(x, y).x
            + " "
            + (new EPSG3857()).toWgs84(x, y).y
            + " longClick: "
            + longClick);

    MapPos wgs84Pos = mapView.getComponents().layers.getBaseProjection().toWgs84(x, y);
    final MapPos mapPos = dataSource.getProjection().fromWgs84(wgs84Pos.x, wgs84Pos.y);

    // perform network query to get feature info. This must be done in separate thread!
    new Thread(
            new Runnable() {
              @Override
              public void run() {
                final String featureInfo = dataSource.getFeatureInfo(mapPos);

                if (featureInfo == null) {
                  return;
                } else {
                  // update marker in UI thread
                  handler.post(
                      new Runnable() {
                        @Override
                        public void run() {
                          updateMarker(new MapPos(x, y), featureInfo);
                        }
                      });
                }
              }
            })
        .start();
  }
Пример #13
0
  /**
   * Vector datasource connector, based on general query
   *
   * @param proj layer projection. NB! data must be in the same projection
   * @param pointStyleSet styleset for point objects
   * @param lineStyleSet styleset for line objects
   * @param polygonStyleSet styleset for polygon objects
   * @throws IOException file not found or other problem opening OGR datasource
   */
  public OnlineVectorLayer(
      Projection proj,
      StyleSet<PointStyle> pointStyleSet,
      StyleSet<LineStyle> lineStyleSet,
      StyleSet<PolygonStyle> polygonStyleSet,
      int maxObjects) {
    super(proj);
    this.pointStyleSet = pointStyleSet;
    this.lineStyleSet = lineStyleSet;
    this.polygonStyleSet = polygonStyleSet;
    this.maxObjects = maxObjects;

    if (pointStyleSet != null) {
      minZoom = Math.min(minZoom, pointStyleSet.getFirstNonNullZoomStyleZoom());
    }
    if (lineStyleSet != null) {
      minZoom = Math.min(minZoom, lineStyleSet.getFirstNonNullZoomStyleZoom());
    }
    if (polygonStyleSet != null) {
      minZoom = Math.min(minZoom, polygonStyleSet.getFirstNonNullZoomStyleZoom());
    }
    Log.debug("OnlineVectorLayer minZoom = " + minZoom);
  }
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // spinner in status bar, for progress indication
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

    setContentView(R.layout.main);

    // enable logging for troubleshooting - optional
    Log.enableAll();
    Log.setTag("mapsforge");

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    dpi = metrics.density;

    // 1. Get the MapView from the Layout xml - mandatory
    mapView = (MapView) findViewById(R.id.mapView);

    // Optional, but very useful: restore map state during device rotation,
    // it is saved in onRetainNonConfigurationInstance() below
    Components retainObject = (Components) getLastNonConfigurationInstance();
    if (retainObject != null) {
      // just restore configuration, skip other initializations
      mapView.setComponents(retainObject);
      return;
    } else {
      // 2. create and set MapView components - mandatory
      Components components = new Components();
      // set stereo view: works if you rotate to landscape and device has
      // HTC 3D or LG Real3D
      mapView.setComponents(components);
    }

    // 3. Define map layer for basemap - mandatory.
    // read filename from extras
    Bundle b = getIntent().getExtras();
    String mapFilePath = b.getString("selectedFile");

    XmlRenderTheme renderTheme = InternalRenderTheme.OSMARENDER;
    // XmlRenderTheme renderTheme = new AssetsRenderTheme(this, "",
    // "renderthemes/assets_noname.xml");

    MapDatabase mapDatabase = new MapDatabase();
    mapDatabase.closeFile();
    File mapFile = new File("/" + mapFilePath);
    FileOpenResult fileOpenResult = mapDatabase.openFile(mapFile);
    if (fileOpenResult.isSuccess()) {
      Log.debug("MapsforgeRasterDataSource: MapDatabase opened ok: " + mapFilePath);
    }

    MapsforgeRasterDataSource dataSource =
        new MapsforgeRasterDataSource(
            new EPSG3857(), 0, 20, mapFile, mapDatabase, renderTheme, this.getApplication());
    RasterLayer mapLayer = new RasterLayer(dataSource, 1044);
    mapView.getLayers().setBaseLayer(mapLayer);

    // set initial map view camera from database
    MapFileInfo mapFileInfo = dataSource.getMapDatabase().getMapFileInfo();
    if (mapFileInfo != null) {
      if (mapFileInfo.startPosition != null && mapFileInfo.startZoomLevel != null) {
        // start position is defined
        MapPos mapCenter =
            new MapPos(
                mapFileInfo.startPosition.longitude,
                mapFileInfo.startPosition.latitude,
                mapFileInfo.startZoomLevel);
        Log.debug("center: " + mapCenter);
        mapView.setFocusPoint(
            mapView.getLayers().getBaseLayer().getProjection().fromWgs84(mapCenter.x, mapCenter.y));
        mapView.setZoom((float) mapCenter.z);
      } else if (mapFileInfo.boundingBox != null) {
        // start position not defined, but boundingbox is defined
        MapPos boxMin =
            mapView
                .getLayers()
                .getBaseLayer()
                .getProjection()
                .fromWgs84(
                    mapFileInfo.boundingBox.minLongitude, mapFileInfo.boundingBox.minLatitude);
        MapPos boxMax =
            mapView
                .getLayers()
                .getBaseLayer()
                .getProjection()
                .fromWgs84(
                    mapFileInfo.boundingBox.maxLongitude, mapFileInfo.boundingBox.maxLatitude);
        mapView.setBoundingBox(new Bounds(boxMin.x, boxMin.y, boxMax.x, boxMax.y), true);
      }
    }

    // if no fileinfo, startPosition or boundingBox, then remain to default
    // world view

    // rotation - 0 = north-up
    mapView.setMapRotation(0f);
    // tilt means perspective view. Default is 90 degrees for "normal" 2D
    // map view, minimum allowed is 30 degrees.
    mapView.setTilt(90.0f);

    // Activate some mapview options to make it smoother - optional
    mapView.getOptions().setPreloading(false);
    mapView.getOptions().setSeamlessHorizontalPan(true);
    mapView.getOptions().setTileFading(false);
    mapView.getOptions().setKineticPanning(true);
    mapView.getOptions().setDoubleClickZoomIn(true);
    mapView.getOptions().setDualClickZoomOut(true);

    // set sky bitmap - optional, default - white
    mapView.getOptions().setSkyDrawMode(Options.DRAW_BITMAP);
    mapView.getOptions().setSkyOffset(4.86f);
    mapView
        .getOptions()
        .setSkyBitmap(UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.sky_small));

    // Map background, visible if no map tiles loaded - optional, default -
    // white
    mapView.getOptions().setBackgroundPlaneDrawMode(Options.DRAW_BITMAP);
    mapView
        .getOptions()
        .setBackgroundPlaneBitmap(
            UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.background_plane));
    mapView.getOptions().setClearColor(Color.WHITE);

    // configure texture caching - optional, suggested
    mapView.getOptions().setTextureMemoryCacheSize(40 * 1024 * 1024);
    mapView.getOptions().setCompressedMemoryCacheSize(16 * 1024 * 1024);

    // define online map persistent caching - optional, suggested. Default -
    // no caching
    // mapView.getOptions().setPersistentCachePath(this.getDatabasePath("mapcache").getPath());
    // set persistent raster cache limit to 100MB
    mapView.getOptions().setPersistentCacheSize(100 * 1024 * 1024);

    mapView.getOptions().setRasterTaskPoolSize(1);

    // 4. zoom buttons using Android widgets - optional
    // get the zoomcontrols that was defined in main.xml
    ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomcontrols);
    // set zoomcontrols listeners to enable zooming
    zoomControls.setOnZoomInClickListener(
        new View.OnClickListener() {
          public void onClick(final View v) {
            mapView.zoomIn();
          }
        });
    zoomControls.setOnZoomOutClickListener(
        new View.OnClickListener() {
          public void onClick(final View v) {
            mapView.zoomOut();
          }
        });
  }
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    // enable logging for troubleshooting - optional
    Log.enableAll();
    Log.setTag("cartodb");

    // 1. Get the MapView from the Layout xml - mandatory
    mapView = (MapView) findViewById(R.id.mapView);

    // Optional, but very useful: restore map state during device rotation,
    // it is saved in onRetainNonConfigurationInstance() below
    Components retainObject = (Components) getLastNonConfigurationInstance();
    if (retainObject != null) {
      // just restore configuration, skip other initializations
      mapView.setComponents(retainObject);
      mapView.startMapping();
      return;
    } else {
      // 2. create and set MapView components - mandatory
      Components components = new Components();
      // set stereo view: works if you rotate to landscape and device has HTC 3D or LG Real3D
      mapView.setComponents(components);
    }

    // 3. Define map layer for basemap - mandatory.
    TMSMapLayer mapLayer =
        new TMSMapLayer(
            new EPSG3857(),
            0,
            18,
            3,
            //				"http://nutiteq.cartodb.com/tiles/tm_world_borders/", "/", ".png");
            "http://otile1.mqcdn.com/tiles/1.0.0/osm/",
            "/",
            ".png");

    mapView.getLayers().setBaseLayer(mapLayer);

    // set initial map view camera - optional. "World view" is default
    // Location: Estonia
    // mapView.setFocusPoint(mapView.getLayers().getBaseLayer().getProjection().fromWgs84(24.5f,
    // 58.3f));
    mapView.setFocusPoint(new MapPos(2745202.3f, 8269676.0f));
    // rotation - 0 = north-up
    mapView.setRotation(0f);
    // zoom - 0 = world, like on most web maps
    mapView.setZoom(9.0f);
    // tilt means perspective view. Default is 90 degrees for "normal" 2D map view, minimum allowed
    // is 30 degrees.
    mapView.setTilt(90.0f);

    // Activate some mapview options to make it smoother - optional
    mapView.getOptions().setPreloading(false);
    mapView.getOptions().setSeamlessHorizontalPan(true);
    mapView.getOptions().setTileFading(false);
    mapView.getOptions().setKineticPanning(true);
    mapView.getOptions().setDoubleClickZoomIn(true);
    mapView.getOptions().setDualClickZoomOut(true);

    // set sky bitmap - optional, default - white
    mapView.getOptions().setSkyDrawMode(Options.DRAW_BITMAP);
    mapView.getOptions().setSkyOffset(4.86f);
    mapView
        .getOptions()
        .setSkyBitmap(UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.sky_small));

    // Map background, visible if no map tiles loaded - optional, default - white
    mapView.getOptions().setBackgroundPlaneDrawMode(Options.DRAW_BITMAP);
    mapView
        .getOptions()
        .setBackgroundPlaneBitmap(
            UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.background_plane));
    mapView.getOptions().setClearColor(Color.WHITE);

    // configure texture caching - optional, suggested
    mapView.getOptions().setTextureMemoryCacheSize(20 * 1024 * 1024);
    mapView.getOptions().setCompressedMemoryCacheSize(8 * 1024 * 1024);

    // define online map persistent caching - optional, suggested. Default - no caching
    mapView.getOptions().setPersistentCachePath(this.getDatabasePath("mapcache").getPath());
    // set persistent raster cache limit to 100MB
    mapView.getOptions().setPersistentCacheSize(100 * 1024 * 1024);

    // 4. zoom buttons using Android widgets - optional
    // get the zoomcontrols that was defined in main.xml
    ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomcontrols);
    // set zoomcontrols listeners to enable zooming
    zoomControls.setOnZoomInClickListener(
        new View.OnClickListener() {
          public void onClick(final View v) {
            mapView.zoomIn();
          }
        });
    zoomControls.setOnZoomOutClickListener(
        new View.OnClickListener() {
          public void onClick(final View v) {
            mapView.zoomOut();
          }
        });

    // 5. Add CartoDB vector layer to map

    //  5.1 Define styles for all possible geometry types

    int minZoom = 5;
    int color = Color.BLUE;

    StyleSet<PointStyle> pointStyleSet = new StyleSet<PointStyle>();
    Bitmap pointMarker = UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.point);
    PointStyle pointStyle =
        PointStyle.builder()
            .setBitmap(pointMarker)
            .setSize(0.05f)
            .setColor(color)
            .setPickingSize(0.2f)
            .build();
    pointStyleSet.setZoomStyle(minZoom, pointStyle);

    StyleSet<LineStyle> lineStyleSet = new StyleSet<LineStyle>();
    LineStyle lineStyle = LineStyle.builder().setWidth(0.04f).setColor(Color.WHITE).build();
    lineStyleSet.setZoomStyle(minZoom, lineStyle);

    PolygonStyle polygonStyle =
        PolygonStyle.builder().setColor(0xFFFF6600 & 0x80FFFFFF).setLineStyle(lineStyle).build();
    StyleSet<PolygonStyle> polygonStyleSet = new StyleSet<PolygonStyle>(null);
    polygonStyleSet.setZoomStyle(minZoom, polygonStyle);

    StyleSet<LineStyle> roadLineStyleSet =
        new StyleSet<LineStyle>(LineStyle.builder().setWidth(0.07f).setColor(0xFFAAAAAA).build());

    //  5.2 Define layer and add to map

    String account = "nutiteq";
    String table = "tm_world_borders"; // kihelkonnad_1897, maakond_20120701
    String columns =
        "name,iso2,pop2005,area,"
            + CartoDbVectorLayer.TAG_WEBMERCATOR; // NB! always include the_geom_webmercator
    int limit = 5000; // max number of objects
    String sql =
        "SELECT "
            + columns
            + " FROM "
            + table
            + " WHERE "
            + CartoDbVectorLayer.TAG_WEBMERCATOR
            + " && ST_SetSRID('BOX3D(!bbox!)'::box3d, 3857) LIMIT "
            + limit;

    //      String sql2 = "SELECT name, type, oneway, osm_id, the_geom_webmercator FROM osm_roads
    // WHERE type in ('trunk','primary') AND the_geom_webmercator &&
    // ST_SetSRID('BOX3D(!bbox!)'::box3d, 3857) LIMIT 500";
    //      String sql2 = "SELECT name, type, oneway, osm_id, the_geom_webmercator FROM osm_roads
    // WHERE the_geom_webmercator && ST_SetSRID('BOX3D(!bbox!)'::box3d, 3857) LIMIT 500";
    CartoDbVectorLayer cartoLayerTrunk =
        new CartoDbVectorLayer(
            mapView.getLayers().getBaseLayer().getProjection(),
            account,
            sql,
            pointStyleSet,
            lineStyleSet,
            polygonStyleSet);
    mapView.getLayers().addLayer(cartoLayerTrunk);

    //		CartoDbVectorLayer cartoLayer = new
    // CartoDbVectorLayer(mapView.getLayers().getBaseLayer().getProjection(), account, sql,
    // pointStyleSet, lineStyleSet, polygonStyleSet);

    //      OnlineVectorLayer vectorLayer = new
    // OnlineVectorLayer(mapView.getLayers().getBaseLayer().getProjection(), pointStyleSet,
    // lineStyleSet, polygonStyleSet,2000);
    //		mapView.getLayers().addLayer(vectorLayer);
  }
Пример #16
0
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // spinner in status bar, for progress indication
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

    setContentView(R.layout.main);

    // enable logging for troubleshooting - optional
    Log.enableAll();
    Log.setTag("nml3d");

    // 1. Get the MapView from the Layout xml - mandatory
    mapView = (MapView) findViewById(R.id.mapView);

    // Optional, but very useful: restore map state during device rotation,
    // it is saved in onRetainNonConfigurationInstance() below
    Components retainObject = (Components) getLastNonConfigurationInstance();
    if (retainObject != null) {
      // just restore configuration, skip other initializations
      mapView.setComponents(retainObject);
      mapView.startMapping();
      return;
    } else {
      // 2. create and set MapView components - mandatory
      Components components = new Components();
      // set stereo view: works if you rotate to landscape and device has HTC 3D or LG Real3D
      mapView.setComponents(components);
    }

    // 3. Define map layer for basemap - mandatory.

    TMSMapLayer mapLayer =
        new TMSMapLayer(
            new EPSG3857(), 5, 18, 0, "http://otile1.mqcdn.com/tiles/1.0.0/osm/", "/", ".png");
    mapView.getLayers().setBaseLayer(mapLayer);

    // define style for 3D to define minimum zoom = 14
    ModelStyle modelStyle = ModelStyle.builder().build();
    StyleSet<ModelStyle> modelStyleSet = new StyleSet<ModelStyle>(null);
    modelStyleSet.setZoomStyle(14, modelStyle);

    // ** 3D Model layer
    try {
      Bundle b = getIntent().getExtras();
      String mapFile = b.getString("selectedFile");

      NMLModelDbLayer modelLayer = new NMLModelDbLayer(new EPSG3857(), mapFile, modelStyleSet);
      modelLayer.setMemoryLimit(20 * 1024 * 1024);
      mapView.getLayers().addLayer(modelLayer);

      // set initial map view camera from database
      Envelope extent = modelLayer.getDataExtent();

      DisplayMetrics metrics = new DisplayMetrics();
      getWindowManager().getDefaultDisplay().getMetrics(metrics);
      int screenHeight = metrics.heightPixels;
      int screenWidth = metrics.widthPixels;

      double zoom =
          Math.log(
                  (screenWidth * (Math.PI * 6378137.0f * 2.0f))
                      / ((extent.maxX - extent.minX) * 256.0))
              / Math.log(2);

      MapPos centerPoint =
          new MapPos((extent.maxX + extent.minX) / 2, (extent.maxY + extent.minY) / 2);
      Log.debug("found extent " + extent + ", zoom " + zoom + ", centerPoint " + centerPoint);

      mapView.setZoom((float) zoom);
      mapView.setFocusPoint(centerPoint);

    } catch (IOException e) {
      e.printStackTrace();
      return;
    }

    // rotation - 0 = north-up
    mapView.setRotation(0f);
    // tilt means perspective view. Default is 90 degrees for "normal" 2D map view, minimum allowed
    // is 30 degrees.
    mapView.setTilt(90.0f);

    // Activate some mapview options to make it smoother - optional
    mapView.getOptions().setPreloading(false);
    mapView.getOptions().setSeamlessHorizontalPan(true);
    mapView.getOptions().setTileFading(false);
    mapView.getOptions().setKineticPanning(true);
    mapView.getOptions().setDoubleClickZoomIn(true);
    mapView.getOptions().setDualClickZoomOut(true);

    // set sky bitmap - optional, default - white
    mapView.getOptions().setSkyDrawMode(Options.DRAW_BITMAP);
    mapView.getOptions().setSkyOffset(4.86f);
    mapView
        .getOptions()
        .setSkyBitmap(UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.sky_small));

    // Map background, visible if no map tiles loaded - optional, default - white
    mapView.getOptions().setBackgroundPlaneDrawMode(Options.DRAW_BITMAP);
    mapView
        .getOptions()
        .setBackgroundPlaneBitmap(
            UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.background_plane));
    mapView.getOptions().setClearColor(Color.WHITE);

    // configure texture caching - optional, suggested
    mapView.getOptions().setTextureMemoryCacheSize(20 * 1024 * 1024);
    mapView.getOptions().setCompressedMemoryCacheSize(8 * 1024 * 1024);

    // define online map persistent caching - optional, suggested. Default - no caching
    mapView.getOptions().setPersistentCachePath(this.getDatabasePath("mapcache").getPath());
    // set persistent raster cache limit to 100MB
    mapView.getOptions().setPersistentCacheSize(100 * 1024 * 1024);

    // 4. Start the map - mandatory
    mapView.startMapping();

    // 5. zoom buttons using Android widgets - optional
    // get the zoomcontrols that was defined in main.xml
    ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomcontrols);
    // set zoomcontrols listeners to enable zooming
    zoomControls.setOnZoomInClickListener(
        new View.OnClickListener() {
          public void onClick(final View v) {
            mapView.zoomIn();
          }
        });
    zoomControls.setOnZoomOutClickListener(
        new View.OnClickListener() {
          public void onClick(final View v) {
            mapView.zoomOut();
          }
        });
  }
Пример #17
0
 @Override
 public Object onRetainNonConfigurationInstance() {
   Log.debug("onRetainNonConfigurationInstance");
   return this.mapView.getComponents();
 }
Пример #18
0
 public int getCenterZoom() {
   Log.debug("returning centerZoom" + centerZoom);
   return centerZoom;
 }
Пример #19
0
 public WgsPoint getCenterLocation() {
   Log.debug("returning centerLocation " + centerLocation);
   return centerLocation;
 }
Пример #20
0
  @SuppressLint("NewApi")
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow()
        .setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_pieturas);

    // enable logging for troubleshooting - optional
    Log.enableAll();
    Log.setTag("rigassatiksme");

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
      KarteActivity.marsruta_nr = extras.getString("marsruta_nr");
      KarteActivity.transporta_tips = extras.getString("transporta_tips");
      KarteActivity.virziens = extras.getString("virziens");
      KarteActivity.pieturas_nosaukums = extras.getString("pieturas_nosaukums");

      setTitle("karte: " + PieturaActivity.pieturas_nosaukums);
    }

    // 1. Get the MapView from the Layout xml - mandatory
    mapView = (MapView) findViewById(R.id.mapView);

    // Optional, but very useful: restore map state during device rotation,
    // it is saved in onRetainNonConfigurationInstance() below
    Components retainObject = (Components) getLastNonConfigurationInstance();
    if (retainObject != null) {
      // just restore configuration and update listener, skip other initializations
      mapView.setComponents(retainObject);
      MapEventListener mapListener = (MapEventListener) mapView.getOptions().getMapListener();
      mapListener.reset(this, mapView);
      mapView.startMapping();
      return;
    } else {
      // 2. create and set MapView components - mandatory
      mapView.setComponents(new Components());
    }

    // 3. Define map layer for basemap - mandatory.
    // Here we use MapQuest open tiles
    // Almost all online tiled maps use EPSG3857 projection.
    TMSMapLayer mapLayer =
        new TMSMapLayer(
            new EPSG3857(), 0, 18, 0, "http://otile1.mqcdn.com/tiles/1.0.0/osm/", "/", ".png");

    mapView.getLayers().setBaseLayer(mapLayer);

    // set initial map view camera - optional. "World view" is default
    // Location: Pïavnieki
    // NB! it must be in base layer projection (EPSG3857), so we convert it from lat and long
    mapView.setFocusPoint(
        mapView.getLayers().getBaseLayer().getProjection().fromWgs84(24.1132, 56.9514));

    // rotation - 0 = north-up
    mapView.setRotation(0f);
    // zoom - 0 = world, like on most web maps
    mapView.setZoom(11.0f);
    // tilt means perspective view. Default is 90 degrees for "normal" 2D map view, minimum allowed
    // is 30 degrees.
    mapView.setTilt(80.0f);

    // Activate some mapview options to make it smoother - optional
    mapView.getOptions().setPreloading(true);
    mapView.getOptions().setSeamlessHorizontalPan(true);
    mapView.getOptions().setTileFading(true);
    mapView.getOptions().setKineticPanning(true);
    mapView.getOptions().setDoubleClickZoomIn(true);
    mapView.getOptions().setDualClickZoomOut(true);

    // set sky bitmap - optional, default - white
    mapView.getOptions().setSkyDrawMode(Options.DRAW_BITMAP);
    mapView.getOptions().setSkyOffset(4.86f);
    mapView
        .getOptions()
        .setSkyBitmap(UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.sky_small));

    // Map background, visible if no map tiles loaded - optional, default - white
    mapView.getOptions().setBackgroundPlaneDrawMode(Options.DRAW_BITMAP);
    mapView
        .getOptions()
        .setBackgroundPlaneBitmap(
            UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.background_plane));
    mapView.getOptions().setClearColor(Color.WHITE);

    // configure texture caching - optional, suggested
    mapView.getOptions().setTextureMemoryCacheSize(40 * 1024 * 1024);
    mapView.getOptions().setCompressedMemoryCacheSize(8 * 1024 * 1024);

    // define online map persistent caching - optional, suggested. Default - no caching
    mapView.getOptions().setPersistentCachePath(this.getDatabasePath("mapcache").getPath());
    // set persistent raster cache limit to 100MB
    mapView.getOptions().setPersistentCacheSize(100 * 1024 * 1024);

    // Bounds bounds = new Bounds(57.0750, 23.8799, 56.8219, 24.3743);
    // mapView.getConstraints().setMapBounds(bounds);

    Range zoomRange = new Range(8f, 16f);
    mapView.getConstraints().setZoomRange(zoomRange);
    // 4. Start the map - mandatory
    mapView.startMapping();

    Bitmap pointMarker = UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.pietura);
    MarkerLayer markerLayer = new MarkerLayer(mapLayer.getProjection());

    int rawResId =
        getResources()
            .getIdentifier(
                KarteActivity.transporta_tips
                    + "_"
                    + KarteActivity.marsruta_nr
                    + "_"
                    + KarteActivity.virziens,
                "raw",
                getPackageName());
    InputStream instream = getResources().openRawResource(rawResId);
    JSONObject routes = null;
    String sRawData = "";
    try {
      routes = Io.getJson(instream);
    } catch (JSONException e) {
      e.printStackTrace();
    }
    try {
      sRawData = routes.getString("raw_data");
    } catch (JSONException e) {
      e.printStackTrace();
    }
    Log.warning("sRawData: " + sRawData);
    String[] aRawData = sRawData.split(";");
    Log.warning("aRawData: " + aRawData);
    Log.warning("skaits:" + aRawData.length);
    int i;
    List<String> aPieturuId = new ArrayList<String>();
    for (i = 16; i <= aRawData.length - 1; i++ /*String sPieturasId: aRawData*/) {

      String sPieturasId = aRawData[i];
      Log.warning("id: " + sPieturasId);
      aPieturuId.add(sPieturasId);
    }
    Log.warning("pieturu id: " + aPieturuId.toString());
    // List<Pietura> pieturas = this.getStops2(aPieturuId);
    // Log.warning("pieturas: "+pieturas.toString());

    /*for (Pietura pietura : pieturas) {
    MarkerStyle markerStyle = MarkerStyle.builder().setBitmap(pointMarker).setSize(0.5f).setColor(Color.GREEN).build();
           Label markerLabel = new DefaultLabel(pietura.Name, pietura.Name);
           MapPos markerLocation = mapLayer.getProjection().fromWgs84(pietura.Lng, pietura.Lat);
           markerLayer.add(new Marker(markerLocation, markerLabel, markerStyle, null));
    }*/

    JSONObject pieturas = this.getStops3(aPieturuId);
    Iterator<String> iter = pieturas.keys();
    while (iter.hasNext()) {

      String pieturas_id = (String) iter.next();
      JSONObject pietura;
      try {
        pietura = pieturas.getJSONObject(pieturas_id);
        MarkerStyle markerStyle =
            MarkerStyle.builder().setBitmap(pointMarker).setSize(0.5f).build();
        Label markerLabel = new DefaultLabel(pietura.getString("name"));
        MapPos markerLocation =
            mapLayer.getProjection().fromWgs84(pietura.getDouble("lng"), pietura.getDouble("lat"));
        markerLayer.add(new Marker(markerLocation, markerLabel, markerStyle, null));
      } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }

    // add layer to the map
    mapView.getLayers().addLayer(markerLayer);

    // add event listener
    MapEventListener mapListener = new MapEventListener(this, mapView);
    mapView.getOptions().setMapListener(mapListener);

    // add GPS My Location functionality
    MyLocationCircle locationCircle = new MyLocationCircle();
    mapListener.setLocationCircle(locationCircle);
    initGps(locationCircle);
  }
Пример #21
0
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    // enable logging for troubleshooting - optional
    Log.enableAll();
    Log.setTag("online3d");

    // 1. Get the MapView from the Layout xml - mandatory
    mapView = (MapView) findViewById(R.id.mapView);

    // Optional, but very useful: restore map state during device rotation,
    // it is saved in onRetainNonConfigurationInstance() below
    Components retainObject = (Components) getLastNonConfigurationInstance();
    if (retainObject != null) {
      // just restore configuration, skip other initializations
      mapView.setComponents(retainObject);
      mapView.startMapping();
      return;
    } else {
      // 2. create and set MapView components - mandatory
      Components components = new Components();
      // set stereo view: works if you rotate to landscape and device has HTC 3D or LG Real3D
      mapView.setComponents(components);
    }

    // 3. Define map layer for basemap - mandatory.

    TMSMapLayer mapLayer =
        new TMSMapLayer(
            new EPSG3857(), 0, 18, 2, "http://otile1.mqcdn.com/tiles/1.0.0/osm/", "/", ".png");
    mapView.getLayers().setBaseLayer(mapLayer);

    // define style for 3D to define minimum zoom = 14
    ModelStyle modelStyle = ModelStyle.builder().build();
    StyleSet<ModelStyle> modelStyleSet = new StyleSet<ModelStyle>(null);
    modelStyleSet.setZoomStyle(14, modelStyle);

    // ** Online 3D Model layer

    NMLModelOnlineLayer modelLayer =
        new NMLModelOnlineLayer(
            new EPSG3857(),
            "http://aws-lb.nutiteq.ee/nml/nmlserver2.php?data=demo&",
            modelStyleSet);

    modelLayer.setMemoryLimit(20 * 1024 * 1024);

    modelLayer.setPersistentCacheSize(30 * 1024 * 1024);
    modelLayer.setPersistentCachePath(this.getDatabasePath("nmlcache").getPath());

    modelLayer.setLODResolutionFactor(0.3f);
    getMapView().getLayers().addLayer(modelLayer);

    // Tallinn
    mapView.setFocusPoint(new MapPos(2753845.7830863246f, 8275045.674995658f));

    // San Francisco
    // mapView.setFocusPoint(mapView.getLayers().getBaseLayer().getProjection().fromWgs84(-122.41666666667f, 37.76666666666f));

    mapView.setZoom(17.0f);

    // rotation - 0 = north-up
    mapView.setRotation(-96.140175f);
    // tilt means perspective view. Default is 90 degrees for "normal" 2D map view, minimum allowed
    // is 30 degrees.
    mapView.setTilt(30.0f);

    // Activate some mapview options to make it smoother - optional
    mapView.getOptions().setPreloading(false);
    mapView.getOptions().setSeamlessHorizontalPan(true);
    mapView.getOptions().setTileFading(false);
    mapView.getOptions().setKineticPanning(true);
    mapView.getOptions().setDoubleClickZoomIn(true);
    mapView.getOptions().setDualClickZoomOut(true);

    // set sky bitmap - optional, default - white
    mapView.getOptions().setSkyDrawMode(Options.DRAW_BITMAP);
    mapView.getOptions().setSkyOffset(4.86f);
    mapView
        .getOptions()
        .setSkyBitmap(UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.sky_small));

    // Map background, visible if no map tiles loaded - optional, default - white
    mapView.getOptions().setBackgroundPlaneDrawMode(Options.DRAW_BITMAP);
    mapView
        .getOptions()
        .setBackgroundPlaneBitmap(
            UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.background_plane));
    mapView.getOptions().setClearColor(Color.WHITE);

    // configure texture caching - optional, suggested
    mapView.getOptions().setTextureMemoryCacheSize(20 * 1024 * 1024);
    mapView.getOptions().setCompressedMemoryCacheSize(8 * 1024 * 1024);

    // define online map persistent caching - optional, suggested. Default - no caching
    mapView.getOptions().setPersistentCachePath(this.getDatabasePath("mapcache").getPath());
    // set persistent raster cache limit to 100MB
    mapView.getOptions().setPersistentCacheSize(100 * 1024 * 1024);

    // 4. Start the map - mandatory
    mapView.startMapping();

    // 5. zoom buttons using Android widgets - optional
    // get the zoomcontrols that was defined in main.xml
    ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomcontrols);
    // set zoomcontrols listeners to enable zooming
    zoomControls.setOnZoomInClickListener(
        new View.OnClickListener() {
          public void onClick(final View v) {
            mapView.zoomIn();
          }
        });
    zoomControls.setOnZoomOutClickListener(
        new View.OnClickListener() {
          public void onClick(final View v) {
            mapView.zoomOut();
          }
        });
  }
 // Vector element (touch) handlers
 @Override
 public void onLabelClicked(VectorElement vectorElement, boolean longClick) {
   Log.debug("clicked on label");
 }
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    Log.enableAll();
    Log.setTag("cloudmade");

    // 1. Get the MapView from the Layout xml - mandatory
    mapView = (MapView) findViewById(R.id.mapView);

    // Optional, but very useful: restore map state during device rotation,
    // it is saved in onRetainNonConfigurationInstance() below
    Components retainObject = (Components) getLastNonConfigurationInstance();
    if (retainObject != null) {
      // just restore configuration, skip other initializations
      mapView.setComponents(retainObject);
      // add event listener
      RouteMapEventListener mapListener = new RouteMapEventListener(this);
      mapView.getOptions().setMapListener(mapListener);

      mapView.startMapping();
      return;
    } else {
      // 2. create and set MapView components - mandatory
      Components components = new Components();
      mapView.setComponents(components);
      // add event listener
      RouteMapEventListener mapListener = new RouteMapEventListener(this);
      mapView.getOptions().setMapListener(mapListener);
    }

    // use special style for high-density devices
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    String cloudMadeStyle = "997";

    if (metrics.densityDpi >= DisplayMetrics.DENSITY_HIGH) {
      cloudMadeStyle = "997@2x";
    }

    TMSMapLayer mapLayer =
        new TMSMapLayer(
            new EPSG3857(),
            0,
            18,
            0,
            "http://b.tile.cloudmade.com/" + CLOUDMADE_KEY + "/" + cloudMadeStyle + "/256/",
            "/",
            ".png");
    mapView.getLayers().setBaseLayer(mapLayer);

    // Location: London
    mapView.setFocusPoint(
        mapView.getLayers().getBaseLayer().getProjection().fromWgs84(-0.1f, 51.51f));
    mapView.setZoom(14.0f);

    // routing layers
    routeLayer = new GeometryLayer(new EPSG3857());
    mapView.getLayers().addLayer(routeLayer);

    // create markers for start & end, and a layer for them
    Bitmap olMarker = UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.olmarker);
    StyleSet<MarkerStyle> startMarkerStyleSet =
        new StyleSet<MarkerStyle>(
            MarkerStyle.builder()
                .setBitmap(olMarker)
                .setColor(Color.GREEN)
                .setSize(MARKER_SIZE)
                .build());
    startMarker =
        new Marker(new MapPos(0, 0), new DefaultLabel("Start"), startMarkerStyleSet, null);

    StyleSet<MarkerStyle> stopMarkerStyleSet =
        new StyleSet<MarkerStyle>(
            MarkerStyle.builder()
                .setBitmap(olMarker)
                .setColor(Color.RED)
                .setSize(MARKER_SIZE)
                .build());
    stopMarker = new Marker(new MapPos(0, 0), new DefaultLabel("Stop"), stopMarkerStyleSet, null);

    markerLayer = new MarkerLayer(new EPSG3857());
    mapView.getLayers().addLayer(markerLayer);

    // make markers invisible until we need them
    //        startMarker.setVisible(false);
    //        stopMarker.setVisible(false);
    //
    markerLayer.add(startMarker);
    markerLayer.add(stopMarker);

    // define images for turns
    // source: http://mapicons.nicolasmollet.com/markers/transportation/directions/directions/
    // TODO: use better structure than plain array for this
    routeImages[CloudMadeDirections.IMAGE_ROUTE_START] =
        UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.direction_up);
    routeImages[CloudMadeDirections.IMAGE_ROUTE_RIGHT] =
        UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.direction_upthenright);
    routeImages[CloudMadeDirections.IMAGE_ROUTE_LEFT] =
        UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.direction_upthenleft);
    routeImages[CloudMadeDirections.IMAGE_ROUTE_STRAIGHT] =
        UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.direction_up);
    routeImages[CloudMadeDirections.IMAGE_ROUTE_END] =
        UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.direction_down);

    // rotation - 0 = north-up
    mapView.setRotation(0f);
    // tilt means perspective view. Default is 90 degrees for "normal" 2D map view, minimum allowed
    // is 30 degrees.
    mapView.setTilt(90.0f);

    // Activate some mapview options to make it smoother - optional
    mapView.getOptions().setPreloading(true);
    mapView.getOptions().setSeamlessHorizontalPan(true);
    mapView.getOptions().setTileFading(true);
    mapView.getOptions().setKineticPanning(true);
    mapView.getOptions().setDoubleClickZoomIn(true);
    mapView.getOptions().setDualClickZoomOut(true);

    // set sky bitmap - optional, default - white
    mapView.getOptions().setSkyDrawMode(Options.DRAW_BITMAP);
    mapView.getOptions().setSkyOffset(4.86f);
    mapView
        .getOptions()
        .setSkyBitmap(UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.sky_small));

    // Map background, visible if no map tiles loaded - optional, default - white
    mapView.getOptions().setBackgroundPlaneDrawMode(Options.DRAW_BITMAP);
    mapView
        .getOptions()
        .setBackgroundPlaneBitmap(
            UnscaledBitmapLoader.decodeResource(getResources(), R.drawable.background_plane));
    mapView.getOptions().setClearColor(Color.WHITE);

    // configure texture caching - optional, suggested
    mapView.getOptions().setTextureMemoryCacheSize(20 * 1024 * 1024);
    mapView.getOptions().setCompressedMemoryCacheSize(8 * 1024 * 1024);

    // define online map persistent caching - optional, suggested. Default - no caching
    mapView.getOptions().setPersistentCachePath(this.getDatabasePath("mapcache").getPath());
    // set persistent raster cache limit to 100MB
    mapView.getOptions().setPersistentCacheSize(100 * 1024 * 1024);

    // 4. zoom buttons using Android widgets - optional
    // get the zoomcontrols that was defined in main.xml
    ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomcontrols);
    // set zoomcontrols listeners to enable zooming
    zoomControls.setOnZoomInClickListener(
        new View.OnClickListener() {
          public void onClick(final View v) {
            mapView.zoomIn();
          }
        });
    zoomControls.setOnZoomOutClickListener(
        new View.OnClickListener() {
          public void onClick(final View v) {
            mapView.zoomOut();
          }
        });

    Toast.makeText(
            getApplicationContext(), "Click on map to set route start and end", Toast.LENGTH_SHORT)
        .show();
  }