diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 75caa964..f53e1c7c 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -3,8 +3,8 @@ - - + + PBMAP_READER diff --git a/src/org/mapsforge/android/Compass.java b/src/org/mapsforge/android/Compass.java index b702fcc7..38f77f1a 100644 --- a/src/org/mapsforge/android/Compass.java +++ b/src/org/mapsforge/android/Compass.java @@ -1,5 +1,5 @@ /* - * Copyright 2010, 2011, 2012 mapsforge.org + * Copyright 2012 Hannes Janetzek * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software @@ -21,12 +21,10 @@ import android.hardware.SensorEventListener; import android.hardware.SensorManager; public class Compass { + private final SensorEventListener mListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { - // if (true) Log.d(TAG, - // "sensorChanged (" + event.values[0] + ", " + event.values[1] + ", " + event.values[2] + ")"); - // mValues = event.values; if (Math.abs(event.values[0] - mAngle) > 0.25) { mAngle = event.values[0]; @@ -48,12 +46,11 @@ public class Compass { private SensorManager mSensorManager; private Sensor mSensor; - // private float[] mValues; - public Compass(MapActivity mapActivity, MapView mapView) { mMapView = mapView; mSensorManager = (SensorManager) mapActivity .getSystemService(Context.SENSOR_SERVICE); + mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); } diff --git a/src/org/mapsforge/android/MapActivity.java b/src/org/mapsforge/android/MapActivity.java index 2ae83af0..6e540127 100644 --- a/src/org/mapsforge/android/MapActivity.java +++ b/src/org/mapsforge/android/MapActivity.java @@ -48,46 +48,8 @@ public abstract class MapActivity extends Activity { && sharedPreferences.contains(KEY_ZOOM_LEVEL); } - /** - * Internal list which contains references to all running MapView objects. - */ private MapView mMapView; - private void restoreMapView(MapView mapView) { - SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCES_FILE, - MODE_PRIVATE); - - if (containsMapViewPosition(sharedPreferences)) { - - if (sharedPreferences.contains(KEY_MAP_FILE)) { - // get and set the map file - mapView.setMapFile(sharedPreferences.getString(KEY_MAP_FILE, null)); - } - - // get and set the map position and zoom level - int latitudeE6 = sharedPreferences.getInt(KEY_LATITUDE, 0); - int longitudeE6 = sharedPreferences.getInt(KEY_LONGITUDE, 0); - int zoomLevel = sharedPreferences.getInt(KEY_ZOOM_LEVEL, -1); - - GeoPoint geoPoint = new GeoPoint(latitudeE6, longitudeE6); - MapPosition mapPosition = new MapPosition(geoPoint, (byte) zoomLevel, 1); - mapView.setCenterAndZoom(mapPosition); - } - - String theme = sharedPreferences.getString(KEY_THEME, - InternalRenderTheme.OSMARENDER.name()); - - if (theme.startsWith("/")) { - try { - mapView.setRenderTheme(theme); - } catch (FileNotFoundException e) { - mapView.setRenderTheme(InternalRenderTheme.OSMARENDER); - } - } else { - mapView.setRenderTheme(InternalRenderTheme.valueOf(theme)); - } - } - @Override protected void onDestroy() { super.onDestroy(); @@ -111,10 +73,10 @@ public abstract class MapActivity extends Activity { editor.putInt(KEY_ZOOM_LEVEL, mapPosition.zoomLevel); } - if (mMapView.getMapFile() != null) { - // save the map file - editor.putString(KEY_MAP_FILE, mMapView.getMapFile()); - } + // if (mMapView.getMapFile() != null) { + // // save the map file + // editor.putString(KEY_MAP_FILE, mMapView.getMapFile()); + // } editor.putString(KEY_THEME, mMapView.getRenderTheme()); @@ -134,10 +96,40 @@ public abstract class MapActivity extends Activity { * the calling MapView. */ final void registerMapView(MapView mapView) { - if (mMapView != null) - return; - mMapView = mapView; - restoreMapView(mapView); + + SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCES_FILE, + MODE_PRIVATE); + + if (containsMapViewPosition(sharedPreferences)) { + // + // if (sharedPreferences.contains(KEY_MAP_FILE)) { + // // get and set the map file + // mapView.setMapFile(sharedPreferences.getString(KEY_MAP_FILE, null)); + // } + + // get and set the map position and zoom level + int latitudeE6 = sharedPreferences.getInt(KEY_LATITUDE, 0); + int longitudeE6 = sharedPreferences.getInt(KEY_LONGITUDE, 0); + int zoomLevel = sharedPreferences.getInt(KEY_ZOOM_LEVEL, -1); + + GeoPoint geoPoint = new GeoPoint(latitudeE6, longitudeE6); + MapPosition mapPosition = new MapPosition(geoPoint, (byte) zoomLevel, 1); + + mapView.setMapCenter(mapPosition); + } + + String theme = sharedPreferences.getString(KEY_THEME, + InternalRenderTheme.OSMARENDER.name()); + + if (theme.startsWith("/")) { + try { + mapView.setRenderTheme(theme); + } catch (FileNotFoundException e) { + mapView.setRenderTheme(InternalRenderTheme.OSMARENDER); + } + } else { + mapView.setRenderTheme(InternalRenderTheme.valueOf(theme)); + } } } diff --git a/src/org/mapsforge/android/MapView.java b/src/org/mapsforge/android/MapView.java index 5ff30721..f8a50122 100644 --- a/src/org/mapsforge/android/MapView.java +++ b/src/org/mapsforge/android/MapView.java @@ -14,11 +14,11 @@ */ package org.mapsforge.android; -import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Map; import javax.xml.parsers.ParserConfigurationException; @@ -39,10 +39,9 @@ import org.mapsforge.android.utils.GlConfigChooser; import org.mapsforge.core.GeoPoint; import org.mapsforge.core.MapPosition; import org.mapsforge.core.Tile; -import org.mapsforge.database.FileOpenResult; import org.mapsforge.database.IMapDatabase; -import org.mapsforge.database.MapFileInfo; -import org.mapsforge.database.mapfile.MapDatabase; +import org.mapsforge.database.MapInfo; +import org.mapsforge.database.OpenResult; import org.xml.sax.SAXException; import android.content.Context; @@ -53,16 +52,7 @@ import android.view.MotionEvent; /** * A MapView shows a map on the display of the device. It handles all user input and touch gestures to move and zoom the - * map. This MapView also includes a scale bar and zoom controls. - *

- * This implementation supports offline map rendering as well as downloading map images (tiles) over an Internet - * connection. The operation mode of a MapView can be set in the constructor and changed at runtime with the - * {@link #setMapDatabase(MapDatabases)} method. Some MapView parameters depend on the selected operation mode. - *

- * In offline rendering mode a special database file is required which contains the map data. Map files can be stored in - * any folder. The current map file is set by calling {@link #setMapFile(String)}. To retrieve the current - * {@link MapDatabase}, use the {@link #getMapDatabase()} method. - *

+ * map. */ public class MapView extends GLSurfaceView { @@ -74,7 +64,7 @@ public class MapView extends GLSurfaceView { public static final InternalRenderTheme DEFAULT_RENDER_THEME = InternalRenderTheme.OSMARENDER; // private static final float DEFAULT_TEXT_SCALE = 1; - private static final Byte DEFAULT_START_ZOOM_LEVEL = Byte.valueOf((byte) 16); + // private static final Byte DEFAULT_START_ZOOM_LEVEL = Byte.valueOf((byte) 16); public final static boolean debugFrameTime = false; @@ -95,7 +85,7 @@ public class MapView extends GLSurfaceView { private MapWorker mMapWorkers[]; private int mNumMapWorkers = 4; private DebugSettings debugSettings; - private String mMapFile; + private String mRenderTheme; /** * @param context @@ -178,47 +168,26 @@ public class MapView extends GLSurfaceView { mMapWorkers[i].start(); } - setMapFile("default"); - - initMapStartPosition(); - mapActivity.registerMapView(this); - // if (!setRenderTheme(DEFAULT_RENDER_THEME)) { - // Log.d(TAG, "X could not parse theme"); - // // FIXME show init error dialog - // } + if (!mMapDatabase.isOpen()) { + Log.d(TAG, "open database with defaults"); + setMapOptions(null); + } + if (!mMapViewPosition.isValid()) { + Log.d(TAG, "set default start position"); + setMapCenter(getStartPosition()); + } setEGLConfigChooser(new GlConfigChooser()); setEGLContextClientVersion(2); + // setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS); setRenderer(mMapRenderer); if (!debugFrameTime) setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); - - // mCompass.enable(); - } - - private void initMapStartPosition() { - GeoPoint startPoint = getStartPoint(); - if (startPoint != null) { - mMapViewPosition.setMapCenter(startPoint); - Log.d(TAG, "got start"); - - Byte startZoomLevel = getStartZoomLevel(); - if (startZoomLevel != null) { - mMapViewPosition.setZoomLevel(startZoomLevel.byteValue()); - Log.d(TAG, "got zoom"); - } else - mMapViewPosition.setZoomLevel((byte) 2); - } - else { - startPoint = new GeoPoint(0, 0); - mMapViewPosition.setMapCenter(startPoint); - mMapViewPosition.setZoomLevel((byte) 4); - } } /** @@ -242,13 +211,6 @@ public class MapView extends GLSurfaceView { return mMapDatabase; } - /** - * @return the currently used map file. - */ - public String getMapFile() { - return mMapFile; - } - /** * @return the current position and zoom level of this MapView. */ @@ -275,63 +237,37 @@ public class MapView extends GLSurfaceView { * Calculates all necessary tiles and adds jobs accordingly. */ public void redrawTiles() { - if (getWidth() <= 0 || getHeight() <= 0) - return; - mMapRenderer.updateMap(false); } - private void clearAndRedrawMapView() { - if (getWidth() <= 0 || getHeight() <= 0) - return; - - mMapRenderer.updateMap(true); - } - - /** - * Sets the center of the MapView and triggers a redraw. - * - * @param geoPoint - * the new center point of the map. - */ - public void setCenter(GeoPoint geoPoint) { - MapPosition mapPosition = new MapPosition(geoPoint, - mMapViewPosition.getZoomLevel(), 1); - - setCenterAndZoom(mapPosition); - } - /** * @param debugSettings * the new DebugSettings for this MapView. */ public void setDebugSettings(DebugSettings debugSettings) { this.debugSettings = debugSettings; + mMapRenderer.updateMap(true); + } - clearAndRedrawMapView(); + private Map mMapOptions; + + public Map getMapOptions() { + return mMapOptions; } /** * Sets the map file for this MapView. * - * @param mapFile - * the path to the map file. + * @param mapOptions + * ... * @return true if the map file was set correctly, false otherwise. */ - public boolean setMapFile(String mapFile) { - FileOpenResult fileOpenResult = null; - - Log.i(TAG, "set mapfile " + mapFile); - - if (mapFile != null && mapFile.equals(mMapFile)) { - // same map file as before - return false; - } + public boolean setMapOptions(Map mapOptions) { + OpenResult openResult = null; boolean initialized = false; mJobQueue.clear(); - mapWorkersPause(true); for (MapWorker mapWorker : mMapWorkers) { @@ -339,59 +275,49 @@ public class MapView extends GLSurfaceView { IMapGenerator mapGenerator = mapWorker.getMapGenerator(); IMapDatabase mapDatabase = mapGenerator.getMapDatabase(); - mapDatabase.closeFile(); + mapDatabase.close(); + openResult = mapDatabase.open(null); - if (mapFile != null) - fileOpenResult = mapDatabase.openFile(new File(mapFile)); - else - fileOpenResult = mapDatabase.openFile(null); - - if (fileOpenResult != null && fileOpenResult.isSuccess()) { - mMapFile = mapFile; - - if (!initialized) - initialized = true; + if (openResult != null && openResult.isSuccess()) { + mMapOptions = mapOptions; + initialized = true; } } mapWorkersProceed(); if (initialized) { - clearAndRedrawMapView(); - Log.i(TAG, "mapfile set"); + mMapRenderer.updateMap(true); + Log.i(TAG, "MapDatabase ready"); return true; } - mMapFile = null; - Log.i(TAG, "loading mapfile failed"); + mMapOptions = null; + Log.i(TAG, "Opening MapDatabase failed"); return false; } - private GeoPoint getStartPoint() { - if (mMapDatabase != null && mMapDatabase.hasOpenFile()) { - MapFileInfo mapFileInfo = mMapDatabase.getMapFileInfo(); + private MapPosition getStartPosition() { + if (mMapDatabase == null) + return new MapPosition(); - if (mapFileInfo.startPosition != null) { - return mapFileInfo.startPosition; - } else if (mapFileInfo.mapCenter != null) { - return mapFileInfo.mapCenter; - } - } + MapInfo mapInfo = mMapDatabase.getMapInfo(); + if (mapInfo == null) + return new MapPosition(); - return null; - } + GeoPoint startPos = mapInfo.startPosition; - private Byte getStartZoomLevel() { - if (mMapDatabase != null && mMapDatabase.hasOpenFile()) { - MapFileInfo mapFileInfo = mMapDatabase.getMapFileInfo(); + if (startPos == null) + startPos = mapInfo.mapCenter; - if (mapFileInfo.startZoomLevel != null) { - return mapFileInfo.startZoomLevel; - } - } + if (startPos == null) + startPos = new GeoPoint(0, 0); - return DEFAULT_START_ZOOM_LEVEL; + if (mapInfo.startZoomLevel != null) + return new MapPosition(startPos, (mapInfo.startZoomLevel).byteValue(), 1); + + return new MapPosition(startPos, (byte) 1, 1); } /** @@ -425,15 +351,13 @@ public class MapView extends GLSurfaceView { mJobQueue.clear(); - String mapFile = mMapFile; - mMapFile = null; - setMapFile(mapFile); + // String mapFile = mMapFile; + // mMapFile = null; + setMapOptions(null); mapWorkersProceed(); } - private String mRenderTheme; - public String getRenderTheme() { return mRenderTheme; } @@ -456,8 +380,7 @@ public class MapView extends GLSurfaceView { if (ret) { mRenderTheme = internalRenderTheme.name(); } - - clearAndRedrawMapView(); + mMapRenderer.updateMap(true); return ret; } @@ -480,8 +403,7 @@ public class MapView extends GLSurfaceView { if (ret) { mRenderTheme = renderThemePath; } - - clearAndRedrawMapView(); + mMapRenderer.updateMap(true); } private boolean setRenderTheme(Theme theme) { @@ -515,16 +437,51 @@ public class MapView extends GLSurfaceView { return false; } - /** - * Sets the text scale for the map rendering. Has no effect in downloading mode. - * - * @param textScale - * the new text scale for the map rendering. - */ - // public void setTextScale(float textScale) { - // mJobParameters = new JobParameters(mJobParameters.theme, textScale); - // clearAndRedrawMapView(); - // } + @Override + protected synchronized void onSizeChanged(int width, int height, + int oldWidth, int oldHeight) { + + mJobQueue.clear(); + mapWorkersPause(true); + + super.onSizeChanged(width, height, oldWidth, oldHeight); + + mapWorkersProceed(); + } + + void destroy() { + for (MapWorker mapWorker : mMapWorkers) { + mapWorker.pause(); + mapWorker.interrupt(); + + try { + mapWorker.join(); + } catch (InterruptedException e) { + // restore the interrupted status + Thread.currentThread().interrupt(); + } + IMapDatabase mapDatabase = mapWorker.getMapGenerator().getMapDatabase(); + mapDatabase.close(); + } + } + + @Override + public void onPause() { + super.onPause(); + mapWorkersPause(false); + + if (this.enableCompass) + mCompass.disable(); + } + + @Override + public void onResume() { + super.onResume(); + mapWorkersProceed(); + + if (this.enableCompass) + mCompass.enable(); + } /** * Zooms in or out by the given amount of zoom levels. @@ -550,42 +507,11 @@ public class MapView extends GLSurfaceView { } mMapViewPosition.setZoomLevel((byte) z); - redrawTiles(); return true; } - @Override - protected synchronized void onSizeChanged(int width, int height, int oldWidth, - int oldHeight) { - - mJobQueue.clear(); - mCompass.disable(); - mapWorkersPause(true); - - super.onSizeChanged(width, height, oldWidth, oldHeight); - - mapWorkersProceed(); - mCompass.enable(); - } - - void destroy() { - for (MapWorker mapWorker : mMapWorkers) { - mapWorker.pause(); - mapWorker.interrupt(); - - try { - mapWorker.join(); - } catch (InterruptedException e) { - // restore the interrupted status - Thread.currentThread().interrupt(); - } - IMapDatabase mapDatabase = mapWorker.getMapGenerator().getMapDatabase(); - mapDatabase.closeFile(); - } - } - /** * @return the maximum possible zoom level. */ @@ -599,13 +525,16 @@ public class MapView extends GLSurfaceView { * @return true if the current center position of this MapView is valid, false otherwise. */ boolean hasValidCenter() { - if (!mMapViewPosition.isValid()) { + MapInfo mapInfo; + + if (!mMapViewPosition.isValid()) return false; - } else if (!mMapDatabase.hasOpenFile() - || !mMapDatabase.getMapFileInfo().boundingBox.contains(getMapPosition() - .getMapCenter())) { + + if ((mapInfo = mMapDatabase.getMapInfo()) == null) + return false; + + if (!mapInfo.boundingBox.contains(getMapPosition().getMapCenter())) return false; - } return true; } @@ -615,38 +544,33 @@ public class MapView extends GLSurfaceView { mMapZoomControls.getZoomLevelMin()); } - @Override - public void onPause() { - super.onPause(); - mapWorkersPause(false); - - if (this.enableCompass) - mCompass.disable(); - } - - @Override - public void onResume() { - super.onResume(); - mapWorkersProceed(); - - if (this.enableCompass) - mCompass.enable(); - } - /** * Sets the center and zoom level of this MapView and triggers a redraw. * * @param mapPosition * the new map position of this MapView. */ - void setCenterAndZoom(MapPosition mapPosition) { - Log.d(TAG, "setCenterAndZoom " + public void setMapCenter(MapPosition mapPosition) { + Log.d(TAG, "setMapCenter " + " lat: " + mapPosition.lat + " lon: " + mapPosition.lon); - mMapViewPosition.setMapCenterAndZoomLevel(mapPosition); + mMapViewPosition.setMapCenter(mapPosition); redrawTiles(); } + /** + * Sets the center of the MapView and triggers a redraw. + * + * @param geoPoint + * the new center point of the map. + */ + public void setCenter(GeoPoint geoPoint) { + MapPosition mapPosition = new MapPosition(geoPoint, + mMapViewPosition.getZoomLevel(), 1); + + setMapCenter(mapPosition); + } + /** * @return MapPosition */ @@ -696,9 +620,8 @@ public class MapView extends GLSurfaceView { public void enableRotation(boolean enable) { enableRotation = enable; - if (enable && this.enableCompass) { - this.enableCompass = false; - mCompass.disable(); + if (enable) { + enableCompass(false); } } @@ -709,7 +632,7 @@ public class MapView extends GLSurfaceView { this.enableCompass = enable; if (enable) - this.enableRotation = false; + enableRotation(false); if (enable) mCompass.enable(); @@ -729,6 +652,17 @@ public class MapView extends GLSurfaceView { // // } + // /** + // * Sets the text scale for the map rendering. Has no effect in downloading mode. + // * + // * @param textScale + // * the new text scale for the map rendering. + // */ + // public void setTextScale(float textScale) { + // mJobParameters = new JobParameters(mJobParameters.theme, textScale); + // clearAndRedrawMapView(); + // } + // public final int // public Handler messageHandler = new Handler() { // diff --git a/src/org/mapsforge/android/MapViewPosition.java b/src/org/mapsforge/android/MapViewPosition.java index 922febd7..eec83e50 100644 --- a/src/org/mapsforge/android/MapViewPosition.java +++ b/src/org/mapsforge/android/MapViewPosition.java @@ -19,6 +19,7 @@ import org.mapsforge.core.MapPosition; import org.mapsforge.core.MercatorProjection; import android.util.FloatMath; +import android.util.Log; /** * A MapPosition stores the latitude and longitude coordinate of a MapView together with its zoom level. @@ -140,6 +141,7 @@ public class MapViewPosition { public synchronized void rotateMap(float angle, float cx, float cy) { moveMap(cx, cy); + Log.d("MapViewPosition", "rotate:" + angle + " " + (mRotation - angle)); mRotation -= angle; } @@ -152,7 +154,7 @@ public class MapViewPosition { mLongitude = MercatorProjection.limitLongitude(geoPoint.getLongitude()); } - synchronized void setMapCenterAndZoomLevel(MapPosition mapPosition) { + synchronized void setMapCenter(MapPosition mapPosition) { mLatitude = MercatorProjection.limitLatitude(mapPosition.lat); mLongitude = MercatorProjection.limitLongitude(mapPosition.lon); mZoomLevel = mMapView.limitZoomLevel(mapPosition.zoomLevel); diff --git a/src/org/mapsforge/android/TouchHandler.java b/src/org/mapsforge/android/TouchHandler.java index ee3a4b2a..6db817d7 100644 --- a/src/org/mapsforge/android/TouchHandler.java +++ b/src/org/mapsforge/android/TouchHandler.java @@ -19,6 +19,7 @@ import org.mapsforge.core.Tile; import android.content.Context; import android.os.CountDownTimer; import android.os.SystemClock; +import android.util.Log; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; @@ -41,7 +42,7 @@ public class TouchHandler { private boolean mRotationStart; private float mPosX; private float mPosY; - private float mAngle; + private double mAngle; private int mActivePointerId; @@ -125,24 +126,27 @@ public class TouchHandler { double dy = y1 - y2; double rad = Math.atan2(dy, dx); - float angle = (float) Math.toDegrees(rad); // focus point relative to center double cx = (mMapView.getWidth() >> 1) - (x1 + x2) / 2; double cy = (mMapView.getHeight() >> 1) - (y1 + y2) / 2; - double r = Math.toRadians(angle - mAngle); + double r = rad - mAngle; + + double rsin = Math.sin(r); + double rcos = Math.cos(r); + + float x = (float) (cx * rcos + cy * -rsin - cx); + float y = (float) (cx * rsin + cy * rcos - cy); - double x = cx * Math.cos(r) + cy * -Math.sin(r) - cx; - double y = cx * Math.sin(r) + cy * Math.cos(r) - cy; // Log.d("...", "move " + x + " " + y + " " + cx + " " + cy); if (!mRotationStart) { - if (Math.abs(angle - mAngle) > 3.0) + if (Math.abs(rad - mAngle) > 0.001) mRotationStart = true; } else { - mMapPosition.rotateMap(angle - mAngle, (float) x, (float) y); - mAngle = angle; + mMapPosition.rotateMap((float) Math.toDegrees(rad - mAngle), x, y); + mAngle = rad; mMapView.redrawTiles(); } } @@ -170,10 +174,8 @@ public class TouchHandler { if (multi == 1) { double dx = event.getX(0) - event.getX(1); double dy = event.getY(0) - event.getY(1); - double rad = Math.atan2(dy, dx); - mAngle = (float) Math.toDegrees(rad); + mAngle = Math.atan2(dy, dx); } - return true; } @@ -326,10 +328,57 @@ public class TouchHandler { private DecelerateInterpolator mBounce = new DecelerateInterpolator(); + private boolean mZooutOut = true; + @Override public void onLongPress(MotionEvent e) { - // mMapView.zoom((byte) 1); - // Log.d("mapsforge", "long press"); + Log.d("mapsforge", "long press"); + + // mMapView.zoom((byte) -1); + + mPrevScale = 0; + + mTimer = new CountDownTimer((int) mScaleDuration, 30) { + @Override + public void onTick(long tick) { + scale2(tick); + } + + @Override + public void onFinish() { + scale2(0); + + } + }.start(); + + } + + boolean scale2(long tick) { + + if (mPrevScale >= 1) { + mTimer = null; + return false; + } + + float adv = (mScaleDuration - tick) / mScaleDuration; + adv = mBounce.getInterpolation(adv); + + float scale = adv - mPrevScale; + mPrevScale += scale; + + if (mZooutOut) { + mMapPosition.scaleMap(1 - scale, 0, 0); + } + // } else { + // mMapPosition.scaleMap(1 + scale, mFocusX, mFocusY); + // } + + mMapView.redrawTiles(); + + if (tick == 0) + mTimer = null; + + return true; } private final float mScaleDuration = 300; diff --git a/src/org/mapsforge/android/glrenderer/MapRenderer.java b/src/org/mapsforge/android/glrenderer/MapRenderer.java index 09f9b25b..8b1b638e 100644 --- a/src/org/mapsforge/android/glrenderer/MapRenderer.java +++ b/src/org/mapsforge/android/glrenderer/MapRenderer.java @@ -131,6 +131,9 @@ public class MapRenderer implements org.mapsforge.android.IMapRenderer { */ @Override public void updateMap(boolean clear) { + if (mWidth <= 0 || mHeight <= 0) + return; + TileLoader.updateMap(clear); } diff --git a/src/org/mapsforge/android/glrenderer/TextRenderer.java b/src/org/mapsforge/android/glrenderer/TextRenderer.java index cfada51a..e065d6cb 100644 --- a/src/org/mapsforge/android/glrenderer/TextRenderer.java +++ b/src/org/mapsforge/android/glrenderer/TextRenderer.java @@ -34,7 +34,7 @@ public class TextRenderer { private final static int TEXTURE_HEIGHT = 256; private final static float SCALE = 8.0f; private final static int LBIT_MASK = 0xfffffffe; - private final static int L2BIT_MASK = 0xfffffffc; + // private final static int L2BIT_MASK = 0xfffffffc; final static int INDICES_PER_SPRITE = 6; final static int VERTICES_PER_SPRITE = 4; diff --git a/src/org/mapsforge/android/mapgenerator/JobQueue.java b/src/org/mapsforge/android/mapgenerator/JobQueue.java index 1695f0f7..31aaaf1e 100644 --- a/src/org/mapsforge/android/mapgenerator/JobQueue.java +++ b/src/org/mapsforge/android/mapgenerator/JobQueue.java @@ -14,6 +14,8 @@ */ package org.mapsforge.android.mapgenerator; +//import static org.mapsforge.android.mapgenerator.JobTile.LOADING; + import java.util.ArrayList; import java.util.PriorityQueue; @@ -40,6 +42,7 @@ public class JobQueue { // mPriorityQueue.addAll(tiles); for (int i = 0, n = tiles.size(); i < n; i++) { JobTile tile = tiles.get(i); + // tile.state = LOADING; tile.isLoading = true; mPriorityQueue.offer(tile); } @@ -51,6 +54,7 @@ public class JobQueue { public synchronized void clear() { for (int i = 0, n = mPriorityQueue.size(); i < n; i++) { JobTile tile = mPriorityQueue.poll(); + // tile.state = 0; tile.isLoading = false; } mPriorityQueue.clear(); diff --git a/src/org/mapsforge/android/rendertheme/RenderTheme.java b/src/org/mapsforge/android/rendertheme/RenderTheme.java index e40e04b6..2b916534 100644 --- a/src/org/mapsforge/android/rendertheme/RenderTheme.java +++ b/src/org/mapsforge/android/rendertheme/RenderTheme.java @@ -172,8 +172,8 @@ public class RenderTheme { } - private int missCnt = 0; - private int hitCnt = 0; + // private int missCnt = 0; + // private int hitCnt = 0; private MatchingCacheKey mCacheKey = new MatchingCacheKey(); /** diff --git a/src/org/mapsforge/android/swrenderer/MapGenerator.java b/src/org/mapsforge/android/swrenderer/MapGenerator.java index 0f1d689d..d12feab5 100644 --- a/src/org/mapsforge/android/swrenderer/MapGenerator.java +++ b/src/org/mapsforge/android/swrenderer/MapGenerator.java @@ -458,10 +458,6 @@ public class MapGenerator implements IMapGenerator, IRenderCallback, // WayDecorator.renderText(this, paint, outline, mCoords, mWayDataContainer, mWayNames); } - String getWayName() { - return mMapDatabase.readString(mWayDataContainer.textPos[0]); - } - @Override public void setMapDatabase(IMapDatabase mapDatabase) { mMapDatabase = mapDatabase; diff --git a/src/org/mapsforge/android/swrenderer/WayDecorator.java b/src/org/mapsforge/android/swrenderer/WayDecorator.java index e83481ac..b96359ea 100644 --- a/src/org/mapsforge/android/swrenderer/WayDecorator.java +++ b/src/org/mapsforge/android/swrenderer/WayDecorator.java @@ -189,9 +189,9 @@ final class WayDecorator { if (wayNameWidth < 0) { if (text == null) { - text = mapGenerator.getWayName(); - if (text == null) - text = "blub"; + // text = mapGenerator.getWayName(); + // if (text == null) + text = "blub"; } wayNameWidth = (paint.measureText(text) + 10); diff --git a/src/org/mapsforge/app/TileMap.java b/src/org/mapsforge/app/TileMap.java index 60251b3b..f59e091d 100755 --- a/src/org/mapsforge/app/TileMap.java +++ b/src/org/mapsforge/app/TileMap.java @@ -2,8 +2,6 @@ package org.mapsforge.app; import java.io.FileFilter; import java.io.FileNotFoundException; -import java.text.DateFormat; -import java.util.Date; import org.mapsforge.android.DebugSettings; import org.mapsforge.android.MapActivity; @@ -16,9 +14,8 @@ import org.mapsforge.app.filefilter.ValidMapFile; import org.mapsforge.app.filefilter.ValidRenderTheme; import org.mapsforge.app.filepicker.FilePicker; import org.mapsforge.app.preferences.EditPreferences; -import org.mapsforge.core.BoundingBox; import org.mapsforge.core.GeoPoint; -import org.mapsforge.database.MapFileInfo; +import org.mapsforge.core.MapPosition; import android.annotation.TargetApi; import android.app.ActionBar; @@ -56,7 +53,7 @@ import android.widget.Toast; */ public class TileMap extends MapActivity { // implements ActionBar.OnNavigationListener { - private static final String BUNDLE_CENTER_AT_FIRST_FIX = "centerAtFirstFix"; + // private static final String BUNDLE_CENTER_AT_FIRST_FIX = "centerAtFirstFix"; private static final String BUNDLE_SHOW_MY_LOCATION = "showMyLocation"; private static final String BUNDLE_SNAP_TO_LOCATION = "snapToLocation"; private static final int DIALOG_ENTER_COORDINATES = 0; @@ -156,7 +153,7 @@ public class TileMap extends MapActivity { mLocation.disableSnapToLocation(true); mMapView.setCenter(mMapView.getMapDatabase() - .getMapFileInfo().mapCenter); + .getMapInfo().mapCenter); return true; case R.id.menu_preferences: @@ -282,21 +279,22 @@ public class TileMap extends MapActivity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { - if (requestCode == SELECT_MAP_FILE) { - if (resultCode == RESULT_OK) { - - mLocation.disableSnapToLocation(true); - - if (intent != null) { - if (intent.getStringExtra(FilePicker.SELECTED_FILE) != null) { - mMapView.setMapFile(intent - .getStringExtra(FilePicker.SELECTED_FILE)); - } - } - } else if (resultCode == RESULT_CANCELED) { - startActivity(new Intent(this, EditPreferences.class)); - } - } else if (requestCode == SELECT_RENDER_THEME_FILE && resultCode == RESULT_OK + // if (requestCode == SELECT_MAP_FILE) { + // if (resultCode == RESULT_OK) { + // + // mLocation.disableSnapToLocation(true); + // + // if (intent != null) { + // if (intent.getStringExtra(FilePicker.SELECTED_FILE) != null) { + // mMapView.setMapFile(intent + // .getStringExtra(FilePicker.SELECTED_FILE)); + // } + // } + // } else if (resultCode == RESULT_CANCELED) { + // startActivity(new Intent(this, EditPreferences.class)); + // } + // } else + if (requestCode == SELECT_RENDER_THEME_FILE && resultCode == RESULT_OK && intent != null && intent.getStringExtra(FilePicker.SELECTED_FILE) != null) { try { @@ -380,14 +378,16 @@ public class TileMap extends MapActivity { .toString()); double longitude = Double.parseDouble(longitudeView.getText() .toString()); - GeoPoint geoPoint = new GeoPoint(latitude, longitude); - TileMap.this.mMapView.setCenter(geoPoint); + SeekBar zoomLevelView = (SeekBar) view .findViewById(R.id.zoomLevel); - TileMap.this.mMapView.zoom((byte) (zoomLevelView - .getProgress() - mMapView.getMapPosition() - .getZoomLevel())); + byte zoom = (byte) (zoomLevelView.getProgress()); + + MapPosition mapPosition = new MapPosition(latitude, + longitude, zoom, 1, 0); + + TileMap.this.mMapView.setMapCenter(mapPosition); } }); builder.setNegativeButton(R.string.cancel, null); @@ -443,62 +443,62 @@ public class TileMap extends MapActivity { final TextView textView = (TextView) dialog.findViewById(R.id.zoomlevelValue); textView.setText(String.valueOf(zoomlevel.getProgress())); zoomlevel.setOnSeekBarChangeListener(new SeekBarChangeListener(textView)); - } else if (id == DIALOG_INFO_MAP_FILE) { - MapFileInfo mapFileInfo = mMapView.getMapDatabase().getMapFileInfo(); - - TextView textView = (TextView) dialog.findViewById(R.id.infoMapFileViewName); - textView.setText(mMapView.getMapFile()); - - textView = (TextView) dialog.findViewById(R.id.infoMapFileViewSize); - textView.setText(FileUtils.formatFileSize(mapFileInfo.fileSize, - getResources())); - - textView = (TextView) dialog.findViewById(R.id.infoMapFileViewVersion); - textView.setText(String.valueOf(mapFileInfo.fileVersion)); - - // textView = (TextView) dialog.findViewById(R.id.infoMapFileViewDebug); - // if (mapFileInfo.debugFile) { - // textView.setText(R.string.info_map_file_debug_yes); + // } else if (id == DIALOG_INFO_MAP_FILE) { + // MapInfo mapInfo = mMapView.getMapDatabase().getMapInfo(); + // + // TextView textView = (TextView) dialog.findViewById(R.id.infoMapFileViewName); + // textView.setText(mMapView.getMapFile()); + // + // textView = (TextView) dialog.findViewById(R.id.infoMapFileViewSize); + // textView.setText(FileUtils.formatFileSize(mapInfo.fileSize, + // getResources())); + // + // textView = (TextView) dialog.findViewById(R.id.infoMapFileViewVersion); + // textView.setText(String.valueOf(mapInfo.fileVersion)); + // + // // textView = (TextView) dialog.findViewById(R.id.infoMapFileViewDebug); + // // if (mapFileInfo.debugFile) { + // // textView.setText(R.string.info_map_file_debug_yes); + // // } else { + // // textView.setText(R.string.info_map_file_debug_no); + // // } + // + // textView = (TextView) dialog.findViewById(R.id.infoMapFileViewDate); + // Date date = new Date(mapInfo.mapDate); + // textView.setText(DateFormat.getDateTimeInstance().format(date)); + // + // textView = (TextView) dialog.findViewById(R.id.infoMapFileViewArea); + // BoundingBox boundingBox = mapInfo.boundingBox; + // textView.setText(boundingBox.getMinLatitude() + ", " + // + boundingBox.getMinLongitude() + " - \n" + // + boundingBox.getMaxLatitude() + ", " + boundingBox.getMaxLongitude()); + // + // textView = (TextView) dialog.findViewById(R.id.infoMapFileViewStartPosition); + // GeoPoint startPosition = mapInfo.startPosition; + // if (startPosition == null) { + // textView.setText(null); // } else { - // textView.setText(R.string.info_map_file_debug_no); + // textView.setText(startPosition.getLatitude() + ", " + // + startPosition.getLongitude()); // } - - textView = (TextView) dialog.findViewById(R.id.infoMapFileViewDate); - Date date = new Date(mapFileInfo.mapDate); - textView.setText(DateFormat.getDateTimeInstance().format(date)); - - textView = (TextView) dialog.findViewById(R.id.infoMapFileViewArea); - BoundingBox boundingBox = mapFileInfo.boundingBox; - textView.setText(boundingBox.getMinLatitude() + ", " - + boundingBox.getMinLongitude() + " - \n" - + boundingBox.getMaxLatitude() + ", " + boundingBox.getMaxLongitude()); - - textView = (TextView) dialog.findViewById(R.id.infoMapFileViewStartPosition); - GeoPoint startPosition = mapFileInfo.startPosition; - if (startPosition == null) { - textView.setText(null); - } else { - textView.setText(startPosition.getLatitude() + ", " - + startPosition.getLongitude()); - } - - textView = (TextView) dialog.findViewById(R.id.infoMapFileViewStartZoomLevel); - Byte startZoomLevel = mapFileInfo.startZoomLevel; - if (startZoomLevel == null) { - textView.setText(null); - } else { - textView.setText(startZoomLevel.toString()); - } - - textView = (TextView) dialog - .findViewById(R.id.infoMapFileViewLanguagePreference); - textView.setText(mapFileInfo.languagePreference); - - textView = (TextView) dialog.findViewById(R.id.infoMapFileViewComment); - textView.setText(mapFileInfo.comment); - - textView = (TextView) dialog.findViewById(R.id.infoMapFileViewCreatedBy); - textView.setText(mapFileInfo.createdBy); + // + // textView = (TextView) dialog.findViewById(R.id.infoMapFileViewStartZoomLevel); + // Byte startZoomLevel = mapInfo.startZoomLevel; + // if (startZoomLevel == null) { + // textView.setText(null); + // } else { + // textView.setText(startZoomLevel.toString()); + // } + // + // textView = (TextView) dialog + // .findViewById(R.id.infoMapFileViewLanguagePreference); + // textView.setText(mapInfo.languagePreference); + // + // textView = (TextView) dialog.findViewById(R.id.infoMapFileViewComment); + // textView.setText(mapInfo.comment); + // + // textView = (TextView) dialog.findViewById(R.id.infoMapFileViewCreatedBy); + // textView.setText(mapInfo.createdBy); } else { super.onPrepareDialog(id, dialog); } @@ -595,12 +595,12 @@ public class TileMap extends MapActivity { mMapView.setDebugSettings(debugSettings); - if (mMapDatabase == MapDatabases.MAP_READER) { - if (mMapView.getMapFile() == null) - startMapFilePicker(); - } else { - mMapView.setMapFile(mMapView.getMapFile()); - } + // if (mMapDatabase == MapDatabases.MAP_READER) { + // if (mMapView.getMapFile() == null) + // startMapFilePicker(); + // } else { + // mMapView.setMapFile(mMapView.getMapFile()); + // } if (Build.VERSION.SDK_INT >= 11) { VersionHelper.refreshActionBarMenu(this); diff --git a/src/org/mapsforge/app/filefilter/ValidFileFilter.java b/src/org/mapsforge/app/filefilter/ValidFileFilter.java index 6c6ee690..c7a6e062 100644 --- a/src/org/mapsforge/app/filefilter/ValidFileFilter.java +++ b/src/org/mapsforge/app/filefilter/ValidFileFilter.java @@ -16,7 +16,7 @@ package org.mapsforge.app.filefilter; import java.io.FileFilter; -import org.mapsforge.database.FileOpenResult; +import org.mapsforge.database.OpenResult; /** * An extension of the {@link FileFilter} interface. @@ -25,5 +25,5 @@ public interface ValidFileFilter extends FileFilter { /** * @return the result of the last {@link #accept} call (might be null). */ - FileOpenResult getFileOpenResult(); + OpenResult getFileOpenResult(); } diff --git a/src/org/mapsforge/app/filefilter/ValidMapFile.java b/src/org/mapsforge/app/filefilter/ValidMapFile.java index d7a44e89..11a46d57 100644 --- a/src/org/mapsforge/app/filefilter/ValidMapFile.java +++ b/src/org/mapsforge/app/filefilter/ValidMapFile.java @@ -15,27 +15,32 @@ package org.mapsforge.app.filefilter; import java.io.File; +import java.util.HashMap; -import org.mapsforge.database.FileOpenResult; import org.mapsforge.database.IMapDatabase; +import org.mapsforge.database.OpenResult; import org.mapsforge.database.mapfile.MapDatabase; /** * Accepts all valid map files. */ public final class ValidMapFile implements ValidFileFilter { - private FileOpenResult fileOpenResult; + private OpenResult openResult; @Override public boolean accept(File file) { IMapDatabase mapDatabase = new MapDatabase(); - this.fileOpenResult = mapDatabase.openFile(file); - mapDatabase.closeFile(); - return this.fileOpenResult.isSuccess(); + HashMap options = new HashMap(); + options.put("mapfile", file.getAbsolutePath()); + + this.openResult = mapDatabase.open(options); + + mapDatabase.close(); + return this.openResult.isSuccess(); } @Override - public FileOpenResult getFileOpenResult() { - return this.fileOpenResult; + public OpenResult getFileOpenResult() { + return this.openResult; } } diff --git a/src/org/mapsforge/app/filefilter/ValidRenderTheme.java b/src/org/mapsforge/app/filefilter/ValidRenderTheme.java index d9158f41..5f396811 100644 --- a/src/org/mapsforge/app/filefilter/ValidRenderTheme.java +++ b/src/org/mapsforge/app/filefilter/ValidRenderTheme.java @@ -23,7 +23,7 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; import org.mapsforge.android.rendertheme.RenderThemeHandler; -import org.mapsforge.database.FileOpenResult; +import org.mapsforge.database.OpenResult; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; @@ -32,7 +32,7 @@ import org.xml.sax.XMLReader; * Accepts all valid render theme XML files. */ public final class ValidRenderTheme implements ValidFileFilter { - private FileOpenResult fileOpenResult; + private OpenResult openResult; @Override public boolean accept(File file) { @@ -44,28 +44,28 @@ public final class ValidRenderTheme implements ValidFileFilter { XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader(); xmlReader.setContentHandler(renderThemeHandler); xmlReader.parse(new InputSource(inputStream)); - this.fileOpenResult = FileOpenResult.SUCCESS; + this.openResult = OpenResult.SUCCESS; } catch (ParserConfigurationException e) { - this.fileOpenResult = new FileOpenResult(e.getMessage()); + this.openResult = new OpenResult(e.getMessage()); } catch (SAXException e) { - this.fileOpenResult = new FileOpenResult(e.getMessage()); + this.openResult = new OpenResult(e.getMessage()); } catch (IOException e) { - this.fileOpenResult = new FileOpenResult(e.getMessage()); + this.openResult = new OpenResult(e.getMessage()); } finally { try { if (inputStream != null) { inputStream.close(); } } catch (IOException e) { - this.fileOpenResult = new FileOpenResult(e.getMessage()); + this.openResult = new OpenResult(e.getMessage()); } } - return this.fileOpenResult.isSuccess(); + return this.openResult.isSuccess(); } @Override - public FileOpenResult getFileOpenResult() { - return this.fileOpenResult; + public OpenResult getFileOpenResult() { + return this.openResult; } } diff --git a/src/org/mapsforge/core/MapPosition.java b/src/org/mapsforge/core/MapPosition.java index 0ebcfbd3..158ca9af 100644 --- a/src/org/mapsforge/core/MapPosition.java +++ b/src/org/mapsforge/core/MapPosition.java @@ -41,6 +41,16 @@ public class MapPosition { public final double x; public final double y; + public MapPosition() { + this.zoomLevel = (byte) 1; + this.scale = 1; + this.lat = 0; + this.lon = 0; + this.angle = 0; + this.x = MercatorProjection.longitudeToPixelX(this.lon, zoomLevel); + this.y = MercatorProjection.latitudeToPixelY(this.lat, zoomLevel); + } + /** * @param geoPoint * the map position. @@ -49,7 +59,6 @@ public class MapPosition { * @param scale * ... */ - public MapPosition(GeoPoint geoPoint, byte zoomLevel, float scale) { // this.geoPoint = geoPoint; this.zoomLevel = zoomLevel; diff --git a/src/org/mapsforge/database/IMapDatabase.java b/src/org/mapsforge/database/IMapDatabase.java index 53adaa91..24841129 100644 --- a/src/org/mapsforge/database/IMapDatabase.java +++ b/src/org/mapsforge/database/IMapDatabase.java @@ -14,7 +14,7 @@ */ package org.mapsforge.database; -import java.io.File; +import java.util.Map; import org.mapsforge.android.mapgenerator.JobTile; @@ -24,11 +24,6 @@ import org.mapsforge.android.mapgenerator.JobTile; */ public interface IMapDatabase { - /** - * Closes the map file and destroys all internal caches. Has no effect if no map file is currently opened. - */ - public abstract void closeFile(); - /** * Starts a database query with the given parameters. * @@ -46,33 +41,32 @@ public interface IMapDatabase { * @throws IllegalStateException * if no map is currently opened. */ - public abstract MapFileInfo getMapFileInfo(); + public abstract MapInfo getMapInfo(); /** - * @return true if a map file is currently opened, false otherwise. + * @return true if a map database is currently opened, false otherwise. */ - public abstract boolean hasOpenFile(); + public abstract boolean isOpen(); /** - * Opens the given map file, reads its header data and validates them. + * Opens MapDatabase * - * @param mapFile - * the map file. - * @return a FileOpenResult containing an error message in case of a failure. - * @throws IllegalArgumentException - * if the given map file is null. + * @param options + * the options. + * @return a OpenResult containing an error message in case of a failure. */ - public abstract FileOpenResult openFile(File mapFile); + public abstract OpenResult open(Map options); + + /** + * Closes the map file and destroys all internal caches. Has no effect if no map file is currently opened. + */ + public abstract void close(); public abstract String getMapProjection(); /** - * @param position - * .... - * @return ... + * Cancel loading */ - public abstract String readString(int position); - public abstract void cancel(); } diff --git a/src/org/mapsforge/database/MapFileInfo.java b/src/org/mapsforge/database/MapInfo.java similarity index 95% rename from src/org/mapsforge/database/MapFileInfo.java rename to src/org/mapsforge/database/MapInfo.java index 0213666e..a842db04 100644 --- a/src/org/mapsforge/database/MapFileInfo.java +++ b/src/org/mapsforge/database/MapInfo.java @@ -21,9 +21,9 @@ import org.mapsforge.database.mapfile.MapDatabase; /** * Contains the immutable metadata of a map file. * - * @see MapDatabase#getMapFileInfo() + * @see MapDatabase#getMapInfo() */ -public class MapFileInfo { +public class MapInfo { /** * The bounding box of the map file. */ @@ -101,7 +101,7 @@ public class MapFileInfo { * @param createdBy * ... */ - public MapFileInfo(BoundingBox bbox, Byte zoom, GeoPoint start, String projection, + public MapInfo(BoundingBox bbox, Byte zoom, GeoPoint start, String projection, long date, long size, int version, String language, String comment, String createdBy) { this.startZoomLevel = zoom; diff --git a/src/org/mapsforge/database/FileOpenResult.java b/src/org/mapsforge/database/OpenResult.java similarity index 91% rename from src/org/mapsforge/database/FileOpenResult.java rename to src/org/mapsforge/database/OpenResult.java index 5662db7b..5c4994ca 100644 --- a/src/org/mapsforge/database/FileOpenResult.java +++ b/src/org/mapsforge/database/OpenResult.java @@ -18,11 +18,11 @@ package org.mapsforge.database; /** * A FileOpenResult is a simple DTO which is returned by IMapDatabase#openFile(File). */ -public class FileOpenResult { +public class OpenResult { /** * Singleton for a FileOpenResult instance with {@code success=true}. */ - public static final FileOpenResult SUCCESS = new FileOpenResult(); + public static final OpenResult SUCCESS = new OpenResult(); private final String errorMessage; private final boolean success; @@ -31,7 +31,7 @@ public class FileOpenResult { * @param errorMessage * a textual message describing the error, must not be null. */ - public FileOpenResult(String errorMessage) { + public OpenResult(String errorMessage) { if (errorMessage == null) { throw new IllegalArgumentException("error message must not be null"); } @@ -43,7 +43,7 @@ public class FileOpenResult { /** * */ - public FileOpenResult() { + public OpenResult() { this.success = true; this.errorMessage = null; } diff --git a/src/org/mapsforge/database/mapfile/MapDatabase.java b/src/org/mapsforge/database/mapfile/MapDatabase.java index 335fba34..8b701201 100644 --- a/src/org/mapsforge/database/mapfile/MapDatabase.java +++ b/src/org/mapsforge/database/mapfile/MapDatabase.java @@ -17,15 +17,16 @@ package org.mapsforge.database.mapfile; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; +import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.mapsforge.android.mapgenerator.JobTile; import org.mapsforge.core.MercatorProjection; import org.mapsforge.core.Tag; -import org.mapsforge.database.FileOpenResult; import org.mapsforge.database.IMapDatabase; import org.mapsforge.database.IMapDatabaseCallback; +import org.mapsforge.database.OpenResult; import org.mapsforge.database.QueryResult; import org.mapsforge.database.mapfile.header.MapFileHeader; import org.mapsforge.database.mapfile.header.MapFileInfo; @@ -242,7 +243,7 @@ public class MapDatabase implements IMapDatabase { * @see org.mapsforge.map.reader.IMapDatabase#getMapFileInfo() */ @Override - public MapFileInfo getMapFileInfo() { + public MapFileInfo getMapInfo() { if (sMapFileHeader == null) { throw new IllegalStateException("no map file is currently opened"); } @@ -259,7 +260,7 @@ public class MapDatabase implements IMapDatabase { * @see org.mapsforge.map.reader.IMapDatabase#hasOpenFile() */ @Override - public boolean hasOpenFile() { + public boolean isOpen() { return mInputFile != null; } @@ -268,54 +269,56 @@ public class MapDatabase implements IMapDatabase { * @see org.mapsforge.map.reader.IMapDatabase#openFile(java.io.File) */ @Override - public FileOpenResult openFile(File mapFile) { + public OpenResult open(Map options) { try { - if (mapFile == null) { + if (options == null || options.get("mapfile") == null) { // throw new IllegalArgumentException("mapFile must not be null"); - return new FileOpenResult("no file!"); + return new OpenResult("no file!"); } // make sure to close any previously opened file first - closeFile(); + close(); + + File file = new File(options.get("mapfile")); // check if the file exists and is readable - if (!mapFile.exists()) { - return new FileOpenResult("file does not exist: " + mapFile); - } else if (!mapFile.isFile()) { - return new FileOpenResult("not a file: " + mapFile); - } else if (!mapFile.canRead()) { - return new FileOpenResult("cannot read file: " + mapFile); + if (!file.exists()) { + return new OpenResult("file does not exist: " + file); + } else if (!file.isFile()) { + return new OpenResult("not a file: " + file); + } else if (!file.canRead()) { + return new OpenResult("cannot read file: " + file); } // open the file in read only mode - mInputFile = new RandomAccessFile(mapFile, READ_ONLY_MODE); + mInputFile = new RandomAccessFile(file, READ_ONLY_MODE); mFileSize = mInputFile.length(); mReadBuffer = new ReadBuffer(mInputFile); if (instances > 0) { instances++; - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } sMapFileHeader = new MapFileHeader(); - FileOpenResult fileOpenResult = sMapFileHeader.readHeader(mReadBuffer, + OpenResult openResult = sMapFileHeader.readHeader(mReadBuffer, mFileSize); - if (!fileOpenResult.isSuccess()) { - closeFile(); - return fileOpenResult; + if (!openResult.isSuccess()) { + close(); + return openResult; } prepareExecution(); instances++; - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } catch (IOException e) { LOG.log(Level.SEVERE, null, e); // make sure that the file is closed - closeFile(); - return new FileOpenResult(e.getMessage()); + close(); + return new OpenResult(e.getMessage()); } } @@ -324,7 +327,7 @@ public class MapDatabase implements IMapDatabase { * @see org.mapsforge.map.reader.IMapDatabase#closeFile() */ @Override - public void closeFile() { + public void close() { instances--; if (instances > 0) { mReadBuffer = null; @@ -627,7 +630,8 @@ public class MapDatabase implements IMapDatabase { // check if the POI has a house number if ((featureByte & POI_FEATURE_HOUSE_NUMBER) != 0) { // mReadBuffer.getPositionAndSkip(); - String str = mReadBuffer.readUTF8EncodedString(); + // String str = + mReadBuffer.readUTF8EncodedString(); } // check if the POI has an elevation @@ -772,15 +776,6 @@ public class MapDatabase implements IMapDatabase { private int stringOffset = -1; - /* - * (non-Javadoc) - * @see org.mapsforge.map.reader.IMapDatabase#readString(int) - */ - @Override - public String readString(int position) { - return mReadBuffer.readUTF8EncodedStringAt(stringOffset + position); - } - /** * Processes the given number of ways. * diff --git a/src/org/mapsforge/database/mapfile/header/MapFileHeader.java b/src/org/mapsforge/database/mapfile/header/MapFileHeader.java index 8b01980d..0614735f 100644 --- a/src/org/mapsforge/database/mapfile/header/MapFileHeader.java +++ b/src/org/mapsforge/database/mapfile/header/MapFileHeader.java @@ -16,7 +16,7 @@ package org.mapsforge.database.mapfile.header; import java.io.IOException; -import org.mapsforge.database.FileOpenResult; +import org.mapsforge.database.OpenResult; import org.mapsforge.database.mapfile.ReadBuffer; /** @@ -89,79 +89,79 @@ public class MapFileHeader { * @throws IOException * if an error occurs while reading the file. */ - public FileOpenResult readHeader(ReadBuffer readBuffer, long fileSize) throws IOException { - FileOpenResult fileOpenResult = RequiredFields.readMagicByte(readBuffer); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + public OpenResult readHeader(ReadBuffer readBuffer, long fileSize) throws IOException { + OpenResult openResult = RequiredFields.readMagicByte(readBuffer); + if (!openResult.isSuccess()) { + return openResult; } - fileOpenResult = RequiredFields.readRemainingHeader(readBuffer); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = RequiredFields.readRemainingHeader(readBuffer); + if (!openResult.isSuccess()) { + return openResult; } MapFileInfoBuilder mapFileInfoBuilder = new MapFileInfoBuilder(); - fileOpenResult = RequiredFields.readFileVersion(readBuffer, mapFileInfoBuilder); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = RequiredFields.readFileVersion(readBuffer, mapFileInfoBuilder); + if (!openResult.isSuccess()) { + return openResult; } - fileOpenResult = RequiredFields.readFileSize(readBuffer, fileSize, mapFileInfoBuilder); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = RequiredFields.readFileSize(readBuffer, fileSize, mapFileInfoBuilder); + if (!openResult.isSuccess()) { + return openResult; } - fileOpenResult = RequiredFields.readMapDate(readBuffer, mapFileInfoBuilder); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = RequiredFields.readMapDate(readBuffer, mapFileInfoBuilder); + if (!openResult.isSuccess()) { + return openResult; } - fileOpenResult = RequiredFields.readBoundingBox(readBuffer, mapFileInfoBuilder); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = RequiredFields.readBoundingBox(readBuffer, mapFileInfoBuilder); + if (!openResult.isSuccess()) { + return openResult; } - fileOpenResult = RequiredFields.readTilePixelSize(readBuffer, mapFileInfoBuilder); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = RequiredFields.readTilePixelSize(readBuffer, mapFileInfoBuilder); + if (!openResult.isSuccess()) { + return openResult; } - fileOpenResult = RequiredFields.readProjectionName(readBuffer, mapFileInfoBuilder); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = RequiredFields.readProjectionName(readBuffer, mapFileInfoBuilder); + if (!openResult.isSuccess()) { + return openResult; } - fileOpenResult = OptionalFields.readOptionalFields(readBuffer, mapFileInfoBuilder); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = OptionalFields.readOptionalFields(readBuffer, mapFileInfoBuilder); + if (!openResult.isSuccess()) { + return openResult; } - fileOpenResult = RequiredFields.readPoiTags(readBuffer, mapFileInfoBuilder); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = RequiredFields.readPoiTags(readBuffer, mapFileInfoBuilder); + if (!openResult.isSuccess()) { + return openResult; } - fileOpenResult = RequiredFields.readWayTags(readBuffer, mapFileInfoBuilder); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = RequiredFields.readWayTags(readBuffer, mapFileInfoBuilder); + if (!openResult.isSuccess()) { + return openResult; } - fileOpenResult = readSubFileParameters(readBuffer, fileSize, mapFileInfoBuilder); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = readSubFileParameters(readBuffer, fileSize, mapFileInfoBuilder); + if (!openResult.isSuccess()) { + return openResult; } this.mapFileInfo = mapFileInfoBuilder.build(); - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - private FileOpenResult readSubFileParameters(ReadBuffer readBuffer, long fileSize, + private OpenResult readSubFileParameters(ReadBuffer readBuffer, long fileSize, MapFileInfoBuilder mapFileInfoBuilder) { // get and check the number of sub-files (1 byte) byte numberOfSubFiles = readBuffer.readByte(); if (numberOfSubFiles < 1) { - return new FileOpenResult("invalid number of sub-files: " + numberOfSubFiles); + return new OpenResult("invalid number of sub-files: " + numberOfSubFiles); } mapFileInfoBuilder.numberOfSubFiles = numberOfSubFiles; @@ -176,33 +176,33 @@ public class MapFileHeader { // get and check the base zoom level (1 byte) byte baseZoomLevel = readBuffer.readByte(); if (baseZoomLevel < 0 || baseZoomLevel > BASE_ZOOM_LEVEL_MAX) { - return new FileOpenResult("invalid base zooom level: " + baseZoomLevel); + return new OpenResult("invalid base zooom level: " + baseZoomLevel); } subFileParameterBuilder.baseZoomLevel = baseZoomLevel; // get and check the minimum zoom level (1 byte) byte zoomLevelMin = readBuffer.readByte(); if (zoomLevelMin < 0 || zoomLevelMin > 22) { - return new FileOpenResult("invalid minimum zoom level: " + zoomLevelMin); + return new OpenResult("invalid minimum zoom level: " + zoomLevelMin); } subFileParameterBuilder.zoomLevelMin = zoomLevelMin; // get and check the maximum zoom level (1 byte) byte zoomLevelMax = readBuffer.readByte(); if (zoomLevelMax < 0 || zoomLevelMax > 22) { - return new FileOpenResult("invalid maximum zoom level: " + zoomLevelMax); + return new OpenResult("invalid maximum zoom level: " + zoomLevelMax); } subFileParameterBuilder.zoomLevelMax = zoomLevelMax; // check for valid zoom level range if (zoomLevelMin > zoomLevelMax) { - return new FileOpenResult("invalid zoom level range: " + zoomLevelMin + SPACE + zoomLevelMax); + return new OpenResult("invalid zoom level range: " + zoomLevelMin + SPACE + zoomLevelMax); } // get and check the start address of the sub-file (8 bytes) long startAddress = readBuffer.readLong(); if (startAddress < HEADER_SIZE_MIN || startAddress >= fileSize) { - return new FileOpenResult("invalid start address: " + startAddress); + return new OpenResult("invalid start address: " + startAddress); } subFileParameterBuilder.startAddress = startAddress; @@ -216,7 +216,7 @@ public class MapFileHeader { // get and check the size of the sub-file (8 bytes) long subFileSize = readBuffer.readLong(); if (subFileSize < 1) { - return new FileOpenResult("invalid sub-file size: " + subFileSize); + return new OpenResult("invalid sub-file size: " + subFileSize); } subFileParameterBuilder.subFileSize = subFileSize; @@ -236,7 +236,7 @@ public class MapFileHeader { this.subFileParameters[zoomLevel] = subFileParameter; } } - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } private void updateZoomLevelInformation(SubFileParameter subFileParameter) { diff --git a/src/org/mapsforge/database/mapfile/header/MapFileInfo.java b/src/org/mapsforge/database/mapfile/header/MapFileInfo.java index 180663f0..91fa4dc5 100644 --- a/src/org/mapsforge/database/mapfile/header/MapFileInfo.java +++ b/src/org/mapsforge/database/mapfile/header/MapFileInfo.java @@ -20,9 +20,9 @@ import org.mapsforge.database.mapfile.MapDatabase; /** * Contains the immutable metadata of a map file. * - * @see MapDatabase#getMapFileInfo() + * @see MapDatabase#getMapInfo() */ -public class MapFileInfo extends org.mapsforge.database.MapFileInfo { +public class MapFileInfo extends org.mapsforge.database.MapInfo { /** * True if the map file includes debug information, false otherwise. diff --git a/src/org/mapsforge/database/mapfile/header/OptionalFields.java b/src/org/mapsforge/database/mapfile/header/OptionalFields.java index bb39d12e..8b70ae22 100644 --- a/src/org/mapsforge/database/mapfile/header/OptionalFields.java +++ b/src/org/mapsforge/database/mapfile/header/OptionalFields.java @@ -15,7 +15,7 @@ package org.mapsforge.database.mapfile.header; import org.mapsforge.core.GeoPoint; -import org.mapsforge.database.FileOpenResult; +import org.mapsforge.database.OpenResult; import org.mapsforge.database.mapfile.ReadBuffer; final class OptionalFields { @@ -59,15 +59,15 @@ final class OptionalFields { */ private static final int START_ZOOM_LEVEL_MAX = 22; - static FileOpenResult readOptionalFields(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { + static OpenResult readOptionalFields(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { OptionalFields optionalFields = new OptionalFields(readBuffer.readByte()); mapFileInfoBuilder.optionalFields = optionalFields; - FileOpenResult fileOpenResult = optionalFields.readOptionalFields(readBuffer); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + OpenResult openResult = optionalFields.readOptionalFields(readBuffer); + if (!openResult.isSuccess()) { + return openResult; } - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } String comment; @@ -91,63 +91,63 @@ final class OptionalFields { this.hasCreatedBy = (flags & HEADER_BITMASK_CREATED_BY) != 0; } - private FileOpenResult readLanguagePreference(ReadBuffer readBuffer) { + private OpenResult readLanguagePreference(ReadBuffer readBuffer) { if (this.hasLanguagePreference) { String countryCode = readBuffer.readUTF8EncodedString(); if (countryCode.length() != LANGUAGE_PREFERENCE_LENGTH) { - return new FileOpenResult("invalid language preference: " + countryCode); + return new OpenResult("invalid language preference: " + countryCode); } this.languagePreference = countryCode; } - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - private FileOpenResult readMapStartPosition(ReadBuffer readBuffer) { + private OpenResult readMapStartPosition(ReadBuffer readBuffer) { if (this.hasStartPosition) { // get and check the start position latitude (4 byte) int mapStartLatitude = readBuffer.readInt(); if (mapStartLatitude < RequiredFields.LATITUDE_MIN || mapStartLatitude > RequiredFields.LATITUDE_MAX) { - return new FileOpenResult("invalid map start latitude: " + mapStartLatitude); + return new OpenResult("invalid map start latitude: " + mapStartLatitude); } // get and check the start position longitude (4 byte) int mapStartLongitude = readBuffer.readInt(); if (mapStartLongitude < RequiredFields.LONGITUDE_MIN || mapStartLongitude > RequiredFields.LONGITUDE_MAX) { - return new FileOpenResult("invalid map start longitude: " + mapStartLongitude); + return new OpenResult("invalid map start longitude: " + mapStartLongitude); } this.startPosition = new GeoPoint(mapStartLatitude, mapStartLongitude); } - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - private FileOpenResult readMapStartZoomLevel(ReadBuffer readBuffer) { + private OpenResult readMapStartZoomLevel(ReadBuffer readBuffer) { if (this.hasStartZoomLevel) { // get and check the start zoom level (1 byte) byte mapStartZoomLevel = readBuffer.readByte(); if (mapStartZoomLevel < 0 || mapStartZoomLevel > START_ZOOM_LEVEL_MAX) { - return new FileOpenResult("invalid map start zoom level: " + mapStartZoomLevel); + return new OpenResult("invalid map start zoom level: " + mapStartZoomLevel); } this.startZoomLevel = Byte.valueOf(mapStartZoomLevel); } - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - private FileOpenResult readOptionalFields(ReadBuffer readBuffer) { - FileOpenResult fileOpenResult = readMapStartPosition(readBuffer); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + private OpenResult readOptionalFields(ReadBuffer readBuffer) { + OpenResult openResult = readMapStartPosition(readBuffer); + if (!openResult.isSuccess()) { + return openResult; } - fileOpenResult = readMapStartZoomLevel(readBuffer); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = readMapStartZoomLevel(readBuffer); + if (!openResult.isSuccess()) { + return openResult; } - fileOpenResult = readLanguagePreference(readBuffer); - if (!fileOpenResult.isSuccess()) { - return fileOpenResult; + openResult = readLanguagePreference(readBuffer); + if (!openResult.isSuccess()) { + return openResult; } if (this.hasComment) { @@ -158,6 +158,6 @@ final class OptionalFields { this.createdBy = readBuffer.readUTF8EncodedString(); } - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } } diff --git a/src/org/mapsforge/database/mapfile/header/RequiredFields.java b/src/org/mapsforge/database/mapfile/header/RequiredFields.java index 1648011d..52cfa463 100644 --- a/src/org/mapsforge/database/mapfile/header/RequiredFields.java +++ b/src/org/mapsforge/database/mapfile/header/RequiredFields.java @@ -18,7 +18,7 @@ import java.io.IOException; import org.mapsforge.core.BoundingBox; import org.mapsforge.core.Tag; -import org.mapsforge.database.FileOpenResult; +import org.mapsforge.database.OpenResult; import org.mapsforge.database.mapfile.ReadBuffer; final class RequiredFields { @@ -72,93 +72,93 @@ final class RequiredFields { */ static final int LONGITUDE_MIN = -180000000; - static FileOpenResult readBoundingBox(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { + static OpenResult readBoundingBox(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { // get and check the minimum latitude (4 bytes) int minLatitude = readBuffer.readInt(); if (minLatitude < LATITUDE_MIN || minLatitude > LATITUDE_MAX) { - return new FileOpenResult("invalid minimum latitude: " + minLatitude); + return new OpenResult("invalid minimum latitude: " + minLatitude); } // get and check the minimum longitude (4 bytes) int minLongitude = readBuffer.readInt(); if (minLongitude < LONGITUDE_MIN || minLongitude > LONGITUDE_MAX) { - return new FileOpenResult("invalid minimum longitude: " + minLongitude); + return new OpenResult("invalid minimum longitude: " + minLongitude); } // get and check the maximum latitude (4 bytes) int maxLatitude = readBuffer.readInt(); if (maxLatitude < LATITUDE_MIN || maxLatitude > LATITUDE_MAX) { - return new FileOpenResult("invalid maximum latitude: " + maxLatitude); + return new OpenResult("invalid maximum latitude: " + maxLatitude); } // get and check the maximum longitude (4 bytes) int maxLongitude = readBuffer.readInt(); if (maxLongitude < LONGITUDE_MIN || maxLongitude > LONGITUDE_MAX) { - return new FileOpenResult("invalid maximum longitude: " + maxLongitude); + return new OpenResult("invalid maximum longitude: " + maxLongitude); } // check latitude and longitude range if (minLatitude > maxLatitude) { - return new FileOpenResult("invalid latitude range: " + minLatitude + SPACE + maxLatitude); + return new OpenResult("invalid latitude range: " + minLatitude + SPACE + maxLatitude); } else if (minLongitude > maxLongitude) { - return new FileOpenResult("invalid longitude range: " + minLongitude + SPACE + maxLongitude); + return new OpenResult("invalid longitude range: " + minLongitude + SPACE + maxLongitude); } mapFileInfoBuilder.boundingBox = new BoundingBox(minLatitude, minLongitude, maxLatitude, maxLongitude); - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - static FileOpenResult readFileSize(ReadBuffer readBuffer, long fileSize, MapFileInfoBuilder mapFileInfoBuilder) { + static OpenResult readFileSize(ReadBuffer readBuffer, long fileSize, MapFileInfoBuilder mapFileInfoBuilder) { // get and check the file size (8 bytes) long headerFileSize = readBuffer.readLong(); if (headerFileSize != fileSize) { - return new FileOpenResult("invalid file size: " + headerFileSize); + return new OpenResult("invalid file size: " + headerFileSize); } mapFileInfoBuilder.fileSize = fileSize; - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - static FileOpenResult readFileVersion(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { + static OpenResult readFileVersion(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { // get and check the file version (4 bytes) int fileVersion = readBuffer.readInt(); if (fileVersion != SUPPORTED_FILE_VERSION) { - return new FileOpenResult("unsupported file version: " + fileVersion); + return new OpenResult("unsupported file version: " + fileVersion); } mapFileInfoBuilder.fileVersion = fileVersion; - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - static FileOpenResult readMagicByte(ReadBuffer readBuffer) throws IOException { + static OpenResult readMagicByte(ReadBuffer readBuffer) throws IOException { // read the the magic byte and the file header size into the buffer int magicByteLength = BINARY_OSM_MAGIC_BYTE.length(); if (!readBuffer.readFromFile(magicByteLength + 4)) { - return new FileOpenResult("reading magic byte has failed"); + return new OpenResult("reading magic byte has failed"); } // get and check the magic byte String magicByte = readBuffer.readUTF8EncodedString(magicByteLength); if (!BINARY_OSM_MAGIC_BYTE.equals(magicByte)) { - return new FileOpenResult("invalid magic byte: " + magicByte); + return new OpenResult("invalid magic byte: " + magicByte); } - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - static FileOpenResult readMapDate(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { + static OpenResult readMapDate(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { // get and check the the map date (8 bytes) long mapDate = readBuffer.readLong(); // is the map date before 2010-01-10 ? if (mapDate < 1200000000000L) { - return new FileOpenResult("invalid map date: " + mapDate); + return new OpenResult("invalid map date: " + mapDate); } mapFileInfoBuilder.mapDate = mapDate; - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - static FileOpenResult readPoiTags(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { + static OpenResult readPoiTags(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { // get and check the number of POI tags (2 bytes) int numberOfPoiTags = readBuffer.readShort(); if (numberOfPoiTags < 0) { - return new FileOpenResult("invalid number of POI tags: " + numberOfPoiTags); + return new OpenResult("invalid number of POI tags: " + numberOfPoiTags); } Tag[] poiTags = new Tag[numberOfPoiTags]; @@ -166,53 +166,53 @@ final class RequiredFields { // get and check the POI tag String tag = readBuffer.readUTF8EncodedString(); if (tag == null) { - return new FileOpenResult("POI tag must not be null: " + currentTagId); + return new OpenResult("POI tag must not be null: " + currentTagId); } poiTags[currentTagId] = new Tag(tag); } mapFileInfoBuilder.poiTags = poiTags; - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - static FileOpenResult readProjectionName(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { + static OpenResult readProjectionName(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { // get and check the projection name String projectionName = readBuffer.readUTF8EncodedString(); if (!MERCATOR.equals(projectionName)) { - return new FileOpenResult("unsupported projection: " + projectionName); + return new OpenResult("unsupported projection: " + projectionName); } mapFileInfoBuilder.projectionName = projectionName; - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - static FileOpenResult readRemainingHeader(ReadBuffer readBuffer) throws IOException { + static OpenResult readRemainingHeader(ReadBuffer readBuffer) throws IOException { // get and check the size of the remaining file header (4 bytes) int remainingHeaderSize = readBuffer.readInt(); if (remainingHeaderSize < HEADER_SIZE_MIN || remainingHeaderSize > HEADER_SIZE_MAX) { - return new FileOpenResult("invalid remaining header size: " + remainingHeaderSize); + return new OpenResult("invalid remaining header size: " + remainingHeaderSize); } // read the header data into the buffer if (!readBuffer.readFromFile(remainingHeaderSize)) { - return new FileOpenResult("reading header data has failed: " + remainingHeaderSize); + return new OpenResult("reading header data has failed: " + remainingHeaderSize); } - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - static FileOpenResult readTilePixelSize(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { + static OpenResult readTilePixelSize(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { // get and check the tile pixel size (2 bytes) int tilePixelSize = readBuffer.readShort(); // if (tilePixelSize != Tile.TILE_SIZE) { // return new FileOpenResult("unsupported tile pixel size: " + tilePixelSize); // } mapFileInfoBuilder.tilePixelSize = tilePixelSize; - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } - static FileOpenResult readWayTags(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { + static OpenResult readWayTags(ReadBuffer readBuffer, MapFileInfoBuilder mapFileInfoBuilder) { // get and check the number of way tags (2 bytes) int numberOfWayTags = readBuffer.readShort(); if (numberOfWayTags < 0) { - return new FileOpenResult("invalid number of way tags: " + numberOfWayTags); + return new OpenResult("invalid number of way tags: " + numberOfWayTags); } Tag[] wayTags = new Tag[numberOfWayTags]; @@ -221,12 +221,12 @@ final class RequiredFields { // get and check the way tag String tag = readBuffer.readUTF8EncodedString(); if (tag == null) { - return new FileOpenResult("way tag must not be null: " + currentTagId); + return new OpenResult("way tag must not be null: " + currentTagId); } wayTags[currentTagId] = new Tag(tag); } mapFileInfoBuilder.wayTags = wayTags; - return FileOpenResult.SUCCESS; + return OpenResult.SUCCESS; } private RequiredFields() { diff --git a/src/org/mapsforge/database/pbmap/MapDatabase.java b/src/org/mapsforge/database/pbmap/MapDatabase.java index 7625d0c8..d9f2ad4c 100644 --- a/src/org/mapsforge/database/pbmap/MapDatabase.java +++ b/src/org/mapsforge/database/pbmap/MapDatabase.java @@ -58,10 +58,10 @@ import org.mapsforge.core.BoundingBox; import org.mapsforge.core.GeoPoint; import org.mapsforge.core.Tag; import org.mapsforge.core.Tile; -import org.mapsforge.database.FileOpenResult; import org.mapsforge.database.IMapDatabase; import org.mapsforge.database.IMapDatabaseCallback; -import org.mapsforge.database.MapFileInfo; +import org.mapsforge.database.MapInfo; +import org.mapsforge.database.OpenResult; import org.mapsforge.database.QueryResult; import android.os.Environment; @@ -75,8 +75,8 @@ import android.util.Log; public class MapDatabase implements IMapDatabase { private static final String TAG = "MapDatabase"; - private static final MapFileInfo mMapInfo = - new MapFileInfo(new BoundingBox(-180, -90, 180, 90), + private static final MapInfo mMapInfo = + new MapInfo(new BoundingBox(-180, -90, 180, 90), new Byte((byte) 4), new GeoPoint(53.11, 8.85), null, 0, 0, 0, "de", "comment", "author"); @@ -268,12 +268,12 @@ public class MapDatabase implements IMapDatabase { } @Override - public MapFileInfo getMapFileInfo() { + public MapInfo getMapInfo() { return mMapInfo; } @Override - public boolean hasOpenFile() { + public boolean isOpen() { return mOpenFile; } @@ -303,7 +303,7 @@ public class MapDatabase implements IMapDatabase { } @Override - public FileOpenResult openFile(File mapFile) { + public OpenResult open(Map options) { if (USE_APACHE_HTTP) createClient(); @@ -322,11 +322,11 @@ public class MapDatabase implements IMapDatabase { } } - return new FileOpenResult(); + return new OpenResult(); } @Override - public void closeFile() { + public void close() { mOpenFile = false; if (USE_APACHE_HTTP) { if (mClient != null) { @@ -350,11 +350,6 @@ public class MapDatabase implements IMapDatabase { } } - @Override - public String readString(int position) { - return null; - } - private static File createDirectory(String pathName) { File file = new File(pathName); if (!file.exists() && !file.mkdirs()) { diff --git a/src/org/mapsforge/database/postgis/MapDatabase.java b/src/org/mapsforge/database/postgis/MapDatabase.java index 7ce17e93..f975789a 100644 --- a/src/org/mapsforge/database/postgis/MapDatabase.java +++ b/src/org/mapsforge/database/postgis/MapDatabase.java @@ -14,13 +14,13 @@ */ package org.mapsforge.database.postgis; -import java.io.File; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; +import java.util.Map; import java.util.Map.Entry; import java.util.Properties; @@ -29,10 +29,10 @@ import org.mapsforge.core.BoundingBox; import org.mapsforge.core.GeoPoint; import org.mapsforge.core.Tag; import org.mapsforge.core.WebMercator; -import org.mapsforge.database.FileOpenResult; import org.mapsforge.database.IMapDatabase; import org.mapsforge.database.IMapDatabaseCallback; -import org.mapsforge.database.MapFileInfo; +import org.mapsforge.database.MapInfo; +import org.mapsforge.database.OpenResult; import org.mapsforge.database.QueryResult; import org.postgresql.PGConnection; @@ -56,8 +56,8 @@ public class MapDatabase implements IMapDatabase { private Tag[] mTags; - private final MapFileInfo mMapInfo = - new MapFileInfo(new BoundingBox(-180, -85, 180, 85), + private final MapInfo mMapInfo = + new MapInfo(new BoundingBox(-180, -85, 180, 85), new Byte((byte) 14), new GeoPoint(53.11, 8.85), WebMercator.NAME, 0, 0, 0, "de", "comment", "author"); @@ -125,12 +125,12 @@ public class MapDatabase implements IMapDatabase { byte[] b = null; PGHStore h = null; - int cnt = 0; + // int cnt = 0; try { while (r != null && r.next()) { mIndexPos = 0; mCoordPos = 0; - cnt++; + // cnt++; try { Object obj = r.getObject(1); h = null; @@ -200,27 +200,27 @@ public class MapDatabase implements IMapDatabase { } @Override - public MapFileInfo getMapFileInfo() { + public MapInfo getMapInfo() { return mMapInfo; } @Override - public boolean hasOpenFile() { + public boolean isOpen() { return mOpenFile; } @Override - public FileOpenResult openFile(File mapFile) { + public OpenResult open(Map options) { mOpenFile = true; if (mCoords == null) { mCoords = new float[100000]; mIndex = new short[100000]; } - return new FileOpenResult(); + return new OpenResult(); } @Override - public void closeFile() { + public void close() { if (connection != null) { try { connection.close(); @@ -235,11 +235,6 @@ public class MapDatabase implements IMapDatabase { mOpenFile = false; } - @Override - public String readString(int position) { - return null; - } - // taken from postgis-java private static ValueGetter valueGetterForEndian(byte[] bytes) { @@ -258,6 +253,7 @@ public class MapDatabase implements IMapDatabase { * * @param value * ... + * @return ... */ private boolean parse(byte[] value) { return parseGeometry(valueGetterForEndian(value)); diff --git a/src/org/mapsforge/database/test/MapDatabase.java b/src/org/mapsforge/database/test/MapDatabase.java index c62afb0d..6fd2eafb 100644 --- a/src/org/mapsforge/database/test/MapDatabase.java +++ b/src/org/mapsforge/database/test/MapDatabase.java @@ -14,17 +14,17 @@ */ package org.mapsforge.database.test; -import java.io.File; +import java.util.Map; import org.mapsforge.android.mapgenerator.JobTile; import org.mapsforge.core.BoundingBox; import org.mapsforge.core.MercatorProjection; import org.mapsforge.core.Tag; import org.mapsforge.core.Tile; -import org.mapsforge.database.FileOpenResult; import org.mapsforge.database.IMapDatabase; import org.mapsforge.database.IMapDatabaseCallback; -import org.mapsforge.database.MapFileInfo; +import org.mapsforge.database.MapInfo; +import org.mapsforge.database.OpenResult; import org.mapsforge.database.QueryResult; /** @@ -40,8 +40,8 @@ public class MapDatabase implements IMapDatabase { private Tag[] mTags = { new Tag("natural", "water") }; private Tag[] mNameTags; - private final MapFileInfo mMapInfo = - new MapFileInfo(new BoundingBox(-180, -90, 180, 90), + private final MapInfo mMapInfo = + new MapInfo(new BoundingBox(-180, -90, 180, 90), new Byte((byte) 0), null, PROJECTION, 0, 0, 0, "de", "yo!", "by me"); private boolean mOpenFile = false; @@ -163,31 +163,26 @@ public class MapDatabase implements IMapDatabase { } @Override - public MapFileInfo getMapFileInfo() { + public MapInfo getMapInfo() { return mMapInfo; } @Override - public boolean hasOpenFile() { + public boolean isOpen() { return mOpenFile; } @Override - public FileOpenResult openFile(File mapFile) { + public OpenResult open(Map options) { mOpenFile = true; - return new FileOpenResult(); + return new OpenResult(); } @Override - public void closeFile() { + public void close() { mOpenFile = false; } - @Override - public String readString(int position) { - return null; - } - @Override public void cancel() { // TODO Auto-generated method stub