0

I am developing an application that has a few custom overlays on a MapView - representing vessels. When selecting a vessel, I am showing its previous positions on the map, again with custom overlay items, and I would like to connect them with a line.

Some relevant problems I saw here were solved by overriding the Draw method, and by hard-coding the GeoPoints' coordinates in the Draw method. That does not help me at all, since I have many points from different vessels, and cannot hard-code them all into Draw.

Is there a simple way to just draw a line between the GeoPoints inside the for loop used to display the custom overlays??

Thanks you in advance.

Athan
  • 3
  • 1
  • 3

1 Answers1

2

Use the Projection from the MapView in order to convert GeoPoints to "screen" points. After that you can use Path to draw the line that you want. The first point should be specified with path.moveTo(x, y) and the rest with path.lineTo(x, y). At the end you call canvas.drawPath(path) and you are done.

Below is a code from my draw() method that draws a polygon around a set of points. Note that you do not have to use path.close() as I did on my code.

public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow){
    if(shadow){
        if(isDrawing == false){
            return;
        }
        Projection proj = mapView.getProjection();

        boolean first = true;
        /*Clear the old path at first*/
        path.rewind();
        /* The first tap */
        Paint circlePaint = new Paint();
        Point tempPoint = new Point();
        for(GeoPoint point: polygon){
            proj.toPixels(point, tempPoint);
            if(first){
                path.moveTo(tempPoint.x, tempPoint.y);
                first = false;
                circlePaint.setARGB(100, 255, 117, 0);
                circlePaint.setAntiAlias(true);
                canvas.drawCircle(tempPoint.x, tempPoint.y, FIRST_CIRCLE_RADIOUS, circlePaint);
            }
            else{
                path.lineTo(tempPoint.x, tempPoint.y);
                circlePaint.setARGB(100, 235, 0, 235);
                circlePaint.setAntiAlias(true);
                canvas.drawCircle(tempPoint.x, tempPoint.y, CIRCLE_RADIOUS, circlePaint);
            }
        }
        /* If indeed is a polygon just close the perimeter */
        if(polygon.size() > 2){
            path.close();
        }
        canvas.drawPath(path, polygonPaint);
        super.draw(canvas, mapView, shadow);
    }
}
Manos
  • 2,028
  • 16
  • 28