我开发了一个GPS应用程序,我在其中记录用户路线并在地图上显示。但是在查看我的路线时在地图上平移是非常缓慢的,地图至少需要4或5秒才能响应手指滑动。
我已经重写onDraw()方法并绘制线条以便在我们放大地图时显示路线,通过调用onDraw()(重叠)方法再次绘制lat-long,其中包含具有lat的geopoints -lon值,因此显示地图变得非常慢。有没有更好的方法来实现这一点,以便在应用程序“MyTracks”中平移变得更快?
以下是在地图上绘制路线的代码。请仔细研究并向我展示如何使其更高效,以便平移和缩放效果良好。
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);
}
}
}
}
答案 0 :(得分:0)
您可以将积分保存到服务器上的KML文件吗? 尝试创建具有相同点的预制KML文件,并使用以下方法将其添加到地图中:
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 "));
如果速度要快得多,那么你应该看看这种方法而不是编写自己的绘制方法。 KML是XML的一种形式,因此您可以以相同的方式创建它。记得将样式(颜色等)添加到KML文件中。