package org.moap.chart; import java.util.Date; import org.achartengine.chart.PointStyle; import org.achartengine.model.TimeSeries; import org.achartengine.model.XYMultipleSeriesDataset; import org.achartengine.model.XYSeries; import org.achartengine.renderer.XYMultipleSeriesRenderer; import org.achartengine.renderer.XYSeriesRenderer; import org.joda.time.DateTime; import org.joda.time.Duration; import android.graphics.Color; import android.util.Log; import arida.ufc.br.moap.core.beans.LatLonPoint; import arida.ufc.br.moap.core.beans.Trajectory; import arida.ufc.br.moap.datamodelapi.spi.ITrajectoryModel; import com.mendhak.gpslogger.common.Utilities; public class SpeedOverTimeChart { private final String TAG = "SpeedOverTimeChart"; private ITrajectoryModel<LatLonPoint, DateTime> model; private final int MAX = 3; private final int[] colors = { Color.RED, Color.BLUE, Color.GREEN }; private final PointStyle[] style = { PointStyle.SQUARE, PointStyle.CIRCLE,PointStyle.TRIANGLE }; public SpeedOverTimeChart(ITrajectoryModel<LatLonPoint, DateTime> trajectory_model){ this.model = trajectory_model; } public XYMultipleSeriesDataset createDataset() { Log.d(TAG, "Creating dataset - computing speed"); XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); if(this.model!=null){ Log.d(TAG, "Number of trajectories "+this.model.getTrajectoryCount()); for (Trajectory<LatLonPoint, DateTime> traj : this.model.getTrajectories()) { double speed = 0.0; XYSeries series = new XYSeries("Traj - " + traj.getId()); TimeSeries timeSeries = new TimeSeries("Traj - " + traj.getId()); series.add(0, speed); int i = traj.getPointCount(); // Insert data into the series for (int j = 1; j < i; j++) { LatLonPoint previousPoint = traj.getPoint(j - 1); LatLonPoint point = traj.getPoint(j); DateTime time = traj.getTime(j); DateTime previousTime = traj.getTime(j - 1); // distance in kilometers double distance = Utilities.CalculateDistance( point.getLatitude(), point.getLongitude(), previousPoint.getLatitude(), previousPoint.getLongitude()) / 1000; Duration duration = new Duration(previousTime, time); Utilities .LogDebug(String.format("%s - %s", previousTime, time)); double mili = duration.getMillis(); double hours = mili / (1000 * 60 * 60); // convert mili to hours speed = distance / hours; series.add(j, speed); timeSeries.add(new Date(time.getMillisOfDay()), speed); } dataset.addSeries(timeSeries); } } return dataset; } /* * Create Renderer */ public XYMultipleSeriesRenderer createRenderer() { int size = this.model.getTrajectoryCount(); XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); renderer.setYTitle("Speed"); renderer.setXTitle("Hour"); renderer.setAxisTitleTextSize(30); // renderer.setChartTitleTextSize(40); renderer.setLabelsTextSize(30); renderer.setLegendTextSize(20); renderer.setPointSize(6f); renderer.setFitLegend(true); renderer.setShowGridX(true); renderer.setShowGridY(true); renderer.setZoomButtonsVisible(true); renderer.setMargins(new int[] { 10, 60, 80, 0 }); for (int i = 0; i < size; i++) { int idx = i % MAX; XYSeriesRenderer r = new XYSeriesRenderer(); r.setColor(colors[idx]); r.setPointStyle(style[idx]); r.setFillBelowLine(false); r.setFillBelowLineColor(colors[idx]); r.setLineWidth(2.5f); r.setFillPoints(true); renderer.addSeriesRenderer(r); } renderer.setAxesColor(Color.DKGRAY); renderer.setLabelsColor(Color.LTGRAY); // renderer.setApplyBackgroundColor(true); // renderer.setBackgroundColor(Color.WHITE); return renderer; } }