/*------------------------------------------------------------------------------
** Ident: Innovation en Inspiration > Google Android
** Author: rene
** Copyright: (c) Jan 22, 2009 Sogeti Nederland B.V. All Rights Reserved.
**------------------------------------------------------------------------------
** Sogeti Nederland B.V. | No part of this file may be reproduced
** Distributed Software Engineering | or transmitted in any form or by any
** Lange Dreef 17 | means, electronic or mechanical, for the
** 4131 NJ Vianen | purpose, without the express written
** The Netherlands | permission of the copyright holder.
*------------------------------------------------------------------------------
*
* This file is part of OpenGPSTracker.
*
* OpenGPSTracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenGPSTracker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenGPSTracker. If not, see <http://www.gnu.org/licenses/>.
*
*/
package nl.sogeti.android.gpstracker.viewer;
import nl.sogeti.android.gpstracker.db.GPStracking.Waypoints;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.CornerPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.Shader;
import android.net.Uri;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
/**
* Creates an overlay that can draw a single segment of connected waypoints
*
* @version $Id: TrackingOverlay.java 155 2009-11-08 15:07:18Z rcgroot@gmail.com $
* @author rene (c) Jan 11, 2009, Sogeti B.V.
*/
public class TrackingOverlay extends Overlay
{
public static final String TAG = TrackingOverlay.class.getName();
public static final int DRAW_GREEN = 0;
public static final int DRAW_RED = 1;
public static final int DRAW_MEASURED = 2;
public static final int DRAW_CALCULATED = 3;
public static final int DRAW_DOTS = 4;
public static final String TRACKCOLORING = "trackcoloring";
private int trackColoringMethod = DRAW_CALCULATED;
private ContentResolver mResolver;
private Projection mProjection;
private Uri mWaypointsUri;
private Path mPath;
private Canvas mCanvas;
private Shader mShader;
private Point mScreenPoint;
TrackingOverlay( Context cxt, ContentResolver resolver, Uri waypointsUri, int color, double avgSpeed, MapView mapView )
{
super();
this.trackColoringMethod = color;
this.mPath = new Path();
this.mResolver = resolver;
this.mWaypointsUri = waypointsUri;
}
@Override
public void draw( Canvas canvas, MapView mapView, boolean shadow )
{
drawPath( canvas, mapView, shadow );
}
/**
*
* @param canvas
* @param mapView
* @param shadow
*
* @see TrackingOverlay#draw(Canvas, MapView, boolean)
*/
public void drawPath( Canvas canvas, MapView mapView, boolean shadow )
{
this.mCanvas = canvas;
this.mScreenPoint = new Point();
mProjection = mapView.getProjection();
this.mPath.rewind();
this.mShader = null;
transformSegmentToPath();
// Just the rendering bits left to do
Paint routePaint = new Paint();
routePaint.setPathEffect( new CornerPathEffect( 10 ) );
// Log.d( TAG, "Drawing color is "+trackColoringMethod );
switch (trackColoringMethod)
{
case ( DRAW_CALCULATED ):
case ( DRAW_MEASURED ):
routePaint.setShader( this.mShader );
break;
case ( DRAW_RED ):
routePaint.setColor( Color.RED );
break;
case ( DRAW_GREEN ):
default:
routePaint.setColor( Color.GREEN );
break;
}
routePaint.setStyle( Paint.Style.STROKE );
routePaint.setStrokeWidth( 8 );
routePaint.setAntiAlias( true );
this.mCanvas.drawPath( this.mPath, routePaint );
super.draw( this.mCanvas, mapView, shadow );
this.mCanvas = null;
}
/**
* Convert the cursor from the GPSTracking provider into Points on the Path
*
* @see Cursor Cursor used as input
* @see Point Point used as transformation target
* @see Path Path used as drawable line
*/
private void transformSegmentToPath()
{
Cursor trackCursor = null;
try
{
trackCursor = this.mResolver.query( this.mWaypointsUri, new String[] { Waypoints.LATITUDE, Waypoints.LONGITUDE, Waypoints.SPEED, Waypoints.TIME }, null, null, null );
if( trackCursor.moveToFirst() )
{
GeoPoint mStartPoint = extractGeoPoint( trackCursor );
moveToGeoPoint( mStartPoint );
}
int points = trackCursor.getCount();
for( int i=1; i<points ; i++ )
{
trackCursor.moveToPosition( i );
GeoPoint geoPoint = extractGeoPoint( trackCursor );
lineToGeoPoint( geoPoint, -1d );
}
}
finally
{
if( trackCursor != null )
{
trackCursor.close();
}
}
}
private GeoPoint extractGeoPoint( Cursor trackCursor )
{
int microLatitude = (int) ( trackCursor.getDouble( 0 ) * 1E6d );
int microLongitude = (int) ( trackCursor.getDouble( 1 ) * 1E6d );
return new GeoPoint( microLatitude, microLongitude );
}
/**
* Of this line a path part to the given geopoint
*
* @param geoPoint
* @param speed
*/
private void lineToGeoPoint( GeoPoint geoPoint, double speed )
{
this.mProjection.toPixels( geoPoint, this.mScreenPoint );
this.mPath.lineTo( this.mScreenPoint.x, this.mScreenPoint.y );
}
private void moveToGeoPoint( GeoPoint geoPoint )
{
this.mProjection.toPixels( geoPoint, this.mScreenPoint );
this.mPath.moveTo( this.mScreenPoint.x, this.mScreenPoint.y );
}
}