在地图上画一条线

时间:2011-05-08 14:12:10

标签: android map line android-asynctask paint

我正在使用后台线程从我的数据库中读取一些数据。我读的数据是GPS(纬度,经度)......每次读取一些新数据时我都尝试使用路径绘图显示该点的地图()并在我读到的点之间画一条线。

以下代码正在运行!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

public class screen_database扩展了MapActivity {

private LocationManager lm;

private LocationListener locationListener;

private MyLocationOverlay myLocOverlay;

private MapView mapView;

private MapController mc;

DBAdapter db;

InitTask init_task;

GeoPoint p;

GeoPoint progress1[];

List<GeoPoint> geoPointsArray = new ArrayList<GeoPoint>();

GeoPoint srcPlace;

GeoPoint destPlace;


double latitude;
double longitude;
private ProgressDialog progress;
MotionEvent event;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.screen_database);
    db = new DBAdapter(this);

    progress = new ProgressDialog(this);
    progress.setIndeterminate(true);
    progress.setMessage("I am thinking");

    initMap();
    // initMyLocation();
    // theRouteDraw();

}

protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}

private void initMap() {
    mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);
    mapView.setStreetView(true);

    mc = mapView.getController();

}

public void onResume() {
    super.onResume();
    init_task = new InitTask();
    init_task.execute(db);

}

public void theRouteDraw(GeoPoint p) {
    mc.animateTo(p);
    mc.setZoom(17);
    mapView.setSatellite(true);
    mapView.setStreetView(true);
    mapView.invalidate();

}

class myOverlay extends Overlay {
    GeoPoint gp1;
    GeoPoint gp2;

    public myOverlay(GeoPoint gp1, GeoPoint gp2) {

        this.gp1 = gp1;
        this.gp2 = gp2;

    }

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

        Projection projection = mapView.getProjection();
        Paint mPaint = new Paint();
        Point from = new Point();
        projection.toPixels(gp1, from);
        mPaint.setColor(Color.BLUE);

        Point to = new Point();
        projection.toPixels(gp2, to);
        mPaint.setStrokeWidth(9);
        mPaint.setAlpha(120);

        canvas.drawLine(from.x, from.y, to.x, to.y, mPaint);
        super.draw(canvas, mapView, shadow);

    }

}

public class InitTask extends AsyncTask<DBAdapter, GeoPoint, Void> {
    List<GeoPoint> geoPointsArray = new ArrayList<GeoPoint>();
    DBAdapter db;
    int latitude;
    int longitude;
    GeoPoint p;

    protected void onPreExecute() {
        progress.show();
    }

    protected Void doInBackground(DBAdapter... db) {
        try {
            db[0].openDataBase();
            Cursor c = db[0].getAllData();

            if (c.moveToFirst()) {

                do {

        longitude =Integer.parseInt(c.getString(1));


                            latitude = Integer.parseInt(c.getString(2));

                    p = new GeoPoint(latitude, longitude);

                    geoPointsArray.add(p);

                    publishProgress(p);

                    Thread.sleep(1500);
                } while (c.moveToNext());

            }
            c.close();
            db[0].close();

        } catch (Exception e) {
            Log.d("Eroare", "doInBackground", e);
        }

        return null;
    }

    protected void onProgressUpdate(GeoPoint... progress1) {


        try{

        if(geoPointsArray.size()==1){

            mapView.getOverlays().add(new myOverlay(geoPointsArray.get(1),geoPointsArray.get(1)));

            theRouteDraw(progress1[0]);
        }

                        } 

              catch(Exception e){

                  e.printstack();
                             }

        if (geoPointsArray.size() > 1) {

        int i = geoPointsArray.size();

            List overlays = mapView.getOverlays();

            overlays.add(new myOverlay(geoPointsArray.get(i - 1),
                    progress1[0]));

            theRouteDraw(progress1[0]);
        }

geoPointsArray.add(progress1 [0]);             }

}

protected void onPause() {

    init_task.cancel(true);

    super.onPause();
}

}

2 个答案:

答案 0 :(得分:1)

你没有在地图上看到一条线的原因是因为当你使用两个GeoPoints创建新的myOverlay时,你实际上使用了相同的两个点。在这一行:

mapView.getOverlays().add(new myOverlay(geoPointsArray.get(1),geoPointsArray.get(1)));
显而易见的是,相同的点被添加为起点和起点 - 我认为当你在阵列中只有1点时这是可以的(这是你的起点)。但是,代码:

overlays.add(new myOverlay(geoPointsArray.get(i - 1), progress1[0]));

也使用相同的点,因为您刚刚将新点progress1 [0]添加到此行之前的geoPointsArray中:

geoPointsArray.add(progress1[0]);

所以canvas.drawLine不会产生可见的结果。

如果将上面的行移到方法的末尾,那么你将不会在myOverlay构造函数中对gp1和gp2使用相同的点。你必须稍微整理一下排序。我使用了一组预构建的GeoPoints,而不是从数据库中获取它们,我发现AsyncTask有点不可预测 - 这是我的尝试的屏幕截图(地图没有显示,因为我没有使用我的正确map API密钥:

enter image description here

答案 1 :(得分:0)

首先你的问题不太清楚。 但是你可能想查看你在myLocOverlay中的for循环(&amp;你有一个同名的变量!不酷)你的geoPointsArray.size()可能不会超过1,因此循环总是打破。我可能还建议您先使用AsyncTask获取所有GeoPoints,然后再继续执行任何类型的叠加(特别是如果您的数据大小不是太多而且不需要花费太多时间)。