package org.osmdroid.google.wrapper.v2; import java.util.HashMap; import java.util.List; import java.util.Random; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.PolylineOptions; import org.osmdroid.api.IGeoPoint; import org.osmdroid.api.IMap; import org.osmdroid.api.IPosition; import org.osmdroid.api.IProjection; import org.osmdroid.api.Marker; import org.osmdroid.api.OnCameraChangeListener; import org.osmdroid.api.Polyline; import android.text.TextUtils; class MapWrapper implements IMap { private GoogleMap mGoogleMap; private HashMap<Integer, com.google.android.gms.maps.model.Polyline> mPolylines; private static final Random random = new Random(); MapWrapper(final GoogleMap aGoogleMap) { mGoogleMap = aGoogleMap; } @Override public float getZoomLevel() { final CameraPosition cameraPosition = mGoogleMap.getCameraPosition(); return cameraPosition.zoom; } @Override public void setZoom(final float aZoomLevel) { mGoogleMap.moveCamera(CameraUpdateFactory.zoomTo(aZoomLevel)); } @Override public IGeoPoint getCenter() { return new org.osmdroid.google.wrapper.v2.GeoPoint(mGoogleMap.getCameraPosition().target); } @Override public void setCenter(final double aLatitude, final double aLongitude) { final LatLng latLng = new LatLng(aLatitude, aLongitude); mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); } @Override public float getBearing() { return mGoogleMap.getCameraPosition().bearing; } @Override public void setBearing(final float aBearing) { final CameraPosition position = mGoogleMap.getCameraPosition(); final CameraPosition newPosition = new CameraPosition(position.target, position.zoom, position.tilt, aBearing); final CameraUpdate update = CameraUpdateFactory.newCameraPosition(newPosition); mGoogleMap.moveCamera(update); } @Override public void setPosition(final IPosition aPosition) { final CameraPosition position = mGoogleMap.getCameraPosition(); final LatLng latLng = new LatLng(aPosition.getLatitude(), aPosition.getLongitude()); final float bearing = aPosition.hasBearing() ? aPosition.getBearing() : position.bearing; final float zoom = aPosition.hasZoomLevel() ? aPosition.getZoomLevel() : position.zoom; final CameraPosition newPosition = new CameraPosition(latLng, zoom, position.tilt, bearing); final CameraUpdate update = CameraUpdateFactory.newCameraPosition(newPosition); mGoogleMap.moveCamera(update); } @Override public boolean zoomIn() { final CameraPosition cameraPosition = mGoogleMap.getCameraPosition(); final float maxZoom = mGoogleMap.getMaxZoomLevel(); if (cameraPosition.zoom < maxZoom) { mGoogleMap.moveCamera(CameraUpdateFactory.zoomIn()); return true; } return false; } @Override public boolean zoomOut() { final CameraPosition cameraPosition = mGoogleMap.getCameraPosition(); final float minZoom = mGoogleMap.getMinZoomLevel(); if (cameraPosition.zoom > minZoom) { mGoogleMap.moveCamera(CameraUpdateFactory.zoomOut()); return true; } return false; } @Override public void setMyLocationEnabled(final boolean aEnabled) { mGoogleMap.setMyLocationEnabled(aEnabled); } @Override public boolean isMyLocationEnabled() { return mGoogleMap.isMyLocationEnabled(); } @Override public IProjection getProjection() { return new Projection(mGoogleMap.getProjection()); } @Override public void addMarker(final Marker aMarker) { final MarkerOptions marker = new MarkerOptions(); marker.position(new LatLng(aMarker.latitude, aMarker.longitude)); if (!TextUtils.isEmpty(aMarker.title)) { marker.title(aMarker.title); } if (!TextUtils.isEmpty(aMarker.snippet)) { marker.snippet(aMarker.snippet); } if (aMarker.bitmap != null) { marker.icon(BitmapDescriptorFactory.fromBitmap(aMarker.bitmap)); } else { if (aMarker.icon != 0) { marker.icon(BitmapDescriptorFactory.fromResource(aMarker.icon)); } } if (aMarker.anchor == Marker.Anchor.CENTER) { marker.anchor(0.5f, 0.5f); } mGoogleMap.addMarker(marker); } @Override public int addPolyline(final Polyline aPolyline) { if (mPolylines == null) { mPolylines = new HashMap<Integer, com.google.android.gms.maps.model.Polyline>(); } final PolylineOptions polylineOptions = new PolylineOptions().color(aPolyline.color).width(aPolyline.width); for(IGeoPoint point : aPolyline.points) { polylineOptions.add(new LatLng(point.getLatitude(), point.getLongitude())); } final com.google.android.gms.maps.model.Polyline polyline = mGoogleMap.addPolyline(polylineOptions); final int id = random.nextInt(); mPolylines.put(id, polyline); return id; } @Override public void addPointsToPolyline(final int id, final IGeoPoint... aPoints) { final com.google.android.gms.maps.model.Polyline polyline = getPolyline(id); final List<LatLng> points = polyline.getPoints(); for(final IGeoPoint point : aPoints) { points.add(new LatLng(point.getLatitude(), point.getLongitude())); } polyline.setPoints(points); } @Override public void clearPolyline(final int id) { getPolyline(id).remove(); } private com.google.android.gms.maps.model.Polyline getPolyline(final int id) { if (mPolylines == null) { throw new IllegalArgumentException("No such id"); } final com.google.android.gms.maps.model.Polyline polyline = mPolylines.get(id); if (polyline == null) { throw new IllegalArgumentException("No such id"); } return polyline; } @Override public void clear() { mGoogleMap.clear(); } @Override public void setOnCameraChangeListener(final OnCameraChangeListener aListener) { if (aListener == null) { mGoogleMap.setOnCameraChangeListener(null); } else { mGoogleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { @Override public void onCameraChange(final CameraPosition aCameraPosition) { aListener.onCameraChange(null); // TODO set the parameter } }); } } }