2011-05-08 175 views
0

我使用一个后台线程读取,我读我的database.The数据的一些数据是GPS(纬度,lobgitude)......每次读了一些新的数据我尝试显示使用RouteDraw()在该点绘制地图,并在我读取的点之间绘制一条线。在地图上绘制一条线

下面的代码是工作!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

公共类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(); 
} 

}

回答

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]); 

所以画布。 drawLine不会产生可见的结果。

如果将上面的方法结束行,那么你将无法使用在myOverlay构造GP1和GP2的相同点。你将不得不整理一下排序。我用预构建的GeoPoints的阵列,而不是从数据库中获取他们的,我发现的AsyncTask有点不可预知的 - 这是我尝试的截屏(因为我没有使用我的正确的地图不显示地图API密钥:

enter image description here

+0

你是对的...当我想多少时间,我已经花了这一点;) – adrian 2011-05-15 16:34:25

0

首先你的问题不是很清楚。 然而,你可能想看看for循环你在myLocOverlay(& u有相同名称的变量!不凉)有可能你的geoPointsArray.size()不超越1,因此该循环总是打破。我可能还建议你先使用AsyncTask来获取所有的GeoPoints,然后继续进行任何覆盖(特别是如果你的数据量不是太多,并且不需要太多时间)。