package org.osmdroid.google.overlay; import java.util.ArrayList; import java.util.List; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapView; import com.google.android.maps.Overlay; import com.google.android.maps.Projection; import org.osmdroid.api.IGeoPoint; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; // based on org.osmdroid.views.overlay.PathOverlay public class GooglePolylineOverlay extends Overlay { private ArrayList<GeoPoint> mPoints; protected Paint mPaint = new Paint(); private final Path mPath = new Path(); private final Point mTempPoint1 = new Point(); private final Point mTempPoint2 = new Point(); public GooglePolylineOverlay(final int aColor) { this(aColor, 2.0f); } public GooglePolylineOverlay(final int aColor, final float aWidth) { mPaint.setColor(aColor); mPaint.setStrokeWidth(aWidth); mPaint.setStyle(Paint.Style.STROKE); clearPath(); } public void clearPath() { mPoints = new ArrayList<GeoPoint>(); } public void addPoints(final IGeoPoint... aPoints) { for(final IGeoPoint geoPoint : aPoints) { addPoint(geoPoint.getLatitude(), geoPoint.getLongitude()); } } public void addPoints(final List<IGeoPoint> aPoints) { for(final IGeoPoint point : aPoints) { addPoint(point.getLatitude(), point.getLongitude()); } } public void addPoint(final double latitude, final double longitude) { mPoints.add(new GeoPoint((int)(latitude*1E6), (int)(longitude*1E6))); } @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { if (shadow) { return; } final int size = mPoints.size(); if (size < 2) { // nothing to paint return; } final Projection pj = mapView.getProjection(); Point screenPoint0 = null; // points on screen Point screenPoint1; GeoPoint projectedPoint0; // points from the points list GeoPoint projectedPoint1; mPath.rewind(); projectedPoint0 = mPoints.get(size - 1); for (int i = size - 2; i >= 0; i--) { // compute next points projectedPoint1 = mPoints.get(i); // the starting point may be not calculated, because previous segment was out of clip // bounds if (screenPoint0 == null) { screenPoint0 = pj.toPixels(projectedPoint0, mTempPoint1); mPath.moveTo(screenPoint0.x, screenPoint0.y); } screenPoint1 = pj.toPixels(projectedPoint1, mTempPoint2); // skip this point, too close to previous point if (Math.abs(screenPoint1.x - screenPoint0.x) + Math.abs(screenPoint1.y - screenPoint0.y) <= 1) { continue; } mPath.lineTo(screenPoint1.x, screenPoint1.y); // update starting point to next position projectedPoint0 = projectedPoint1; screenPoint0.x = screenPoint1.x; screenPoint0.y = screenPoint1.y; } canvas.drawPath(mPath, mPaint); } }