我正在使用后台线程从我的数据库中读取一些数据。我读的数据是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();
}
}
答案 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密钥:
答案 1 :(得分:0)
首先你的问题不太清楚。 但是你可能想查看你在myLocOverlay中的for循环(&amp;你有一个同名的变量!不酷)你的geoPointsArray.size()可能不会超过1,因此循环总是打破。我可能还建议您先使用AsyncTask获取所有GeoPoints,然后再继续执行任何类型的叠加(特别是如果您的数据大小不是太多而且不需要花费太多时间)。