views:

433

answers:

1

I've developed a GPS app in which i record the user routes and show it on the map. But panning around on the map when reviewing my route is painfully slow, it takes at least 4 or 5 seconds for the map to respond the finger swipes.

I've overridden the onDraw() method and drawing the lines to show the routes whenever we zoom on the map, the lat-long is again drawn by calling onDraw()(Overridden) method, which has the geopoints with lat-lon values, and thus it becomes very slow to display the map. Is there any better way to do this so that panning becomes faster as in the application "MyTracks"?

Following is the code to draw the routes on map. Please look into it and show me how I can make it more efficient so that the panning and zooming works well.

class PathOverlay extends Overlay{
  public PathOverlay() {
        // TODO Auto-generated constructor stub
        geopoints=new ArrayList<GeoPoint>();
        c.moveToFirst();
        for (int i = 0; i <c.getCount() ; i++){

            if(c.getDouble(c.getColumnIndex("latitude")) != 0.0 ||
                    c.getDouble(c.getColumnIndex("longitude"))!=0.0) {

                geopoints.add(getPoint(c.getDouble(c.getColumnIndex("latitude"))
                        , c.getDouble(c.getColumnIndex("longitude"))));
                gps_status.add(Boolean.parseBoolean(c.getString(c.getColumnIndex("gps") )));
                avgeSpeed_points.add(c.getFloat(9));
            }
            c.moveToNext();


        }

    }
    private GeoPoint getPoint(double lat, double lon) {
        return(new GeoPoint((int)(lat*1000000.0),(int)(lon*1000000.0)));
    }

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {

    //  super.draw(canvas, mapView, shadow);
        mapView.getDrawingCache();

        Paint paint_Line=new Paint();
        //paint_Line.setColor(Color.RED);
        paint_Line.setARGB(255, 255, 0, 0);
        paint_Line.setStrokeWidth(3);
        paint_Line.setDither(true);
        paint_Line.setStyle(Style.FILL);
        paint_Line.setAntiAlias(true);
        paint_Line.setStrokeJoin(Paint.Join.ROUND);
        paint_Line.setStrokeCap(Paint.Cap.ROUND);



        mapView.postInvalidateDelayed(6000);


        for(int i=0;i<geopoints.size()-1;i++) {

            Point p1=new Point();
            Point p2=new Point();

            if((geopoints.get(i).getLatitudeE6()!=geopoints.get(i+1).getLatitudeE6())
                    && (geopoints.get(i).getLongitudeE6()!=geopoints.get(i+1).getLongitudeE6())
                    && gps_status.get(i+1)){
            paint_Line.setColor(Color.BLUE);
            mapView.getProjection().toPixels(geopoints.get(i), p1);
            mapView.getProjection().toPixels(geopoints.get(i+1),p2);
            canvas.drawLine(p1.x,p1.y,p2.x,p2.y,paint_Line);
           }    

            mapView.getProjection().toPixels(geopoints.get(i),p1);
            if(i==0){
                canvas.drawBitmap(start, p1.x-2, p1.y-start.getHeight()+2, null);
            }
            if (i+1==geopoints.size()-1) {
                canvas.drawBitmap(finish, p1.x-2, p1.y-finish.getHeight()+2, null);
            }   
        }






    }

}
A: 

Can you save the points to a KML file on your server? Try creating a premade KML file with the same points and adding it to the map using:

Intent mapIntent = new Intent(Intent.ACTION_VIEW, uri);
Uri uri1 = Uri.parse("geo:0,0?q=http://code.google.com/apis/kml/documentation/KML_Samples.kml");
mapIntent.setData(uri1);
startActivity(Intent.createChooser(mapIntent, "Sample Map ")); 

If the speeds are much faster then you should look at this approach rather than writing your own draw method. KML is a form of XML so you can create it in the same manner. remember to add the style (colours etc.) to the KML file.

geographika
Can u please tell me which .jar file is needed inorder to use GGeXml() class ?
sheik
Apparently not supported. Try updated code above.
geographika
hi ,thank you for the response, i tried the above mentioned method but it seems its not clear for me .if u can fwd any worked example project , it would be more helpful ..we are drawing the tracks/routes on the map after the completion ofthe track . Problem exists when their is large amount of datacollected ( atleast after 10mi data drawn on map) and on every zoomthis is re-drawn and hence takes time to display .thank u again ,regardsSheik
sheik