0

我正在使用 osmdroid 地图制作 GPS 跟踪应用程序。我有一项服务可以跟踪 gps 数据并将其存储在 sqlite 数据库中。该服务通过广播与地图通信(每次更改位置时,它都会发送广播消息)。当 Map 收到广播消息时,它会从数据库中获取最新的纬度和经度,并将地图移动到地理点。到目前为止,它运行流畅。

现在,我想用当前轨迹覆盖地图,在上面显示路线。我以这种方式使用 ItemizedIconOverlay 厌倦了它:

public static void locateMap(Context context) {

    try{
        SQLiteDatabase database = context.openOrCreateDatabase(DBNAME, MODE_PRIVATE, null);

        Cursor cLat = database.rawQuery(latitudeQuery, null);
        if (cLat.moveToFirst()) {
            latitude = cLat.getDouble(0);
        }
        else {
            latitude = 0;
        }

        Cursor cLong = database.rawQuery(longitudeQuery, null);
        if (cLong.moveToFirst()) {
            longitude = cLong.getDouble(0);
        }
        else {
            longitude = 0;
        }

        database.close();

        GeoPoint geoPoint = new GeoPoint(latitude,longitude);
        mMapController.animateTo(geoPoint);
        mMapController.setCenter(geoPoint);

        overlayItems.add(new OverlayItem("","",geoPoint));
        Drawable mDrawable = context.getResources().getDrawable(R.drawable.pont);

        mResourceProxy = new DefaultResourceProxyImpl(context.getApplicationContext());
        mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(overlayItems, mDrawable, null, mResourceProxy);

        mMapView.getOverlays().add(mMyLocationOverlay);

    }
    catch(Exception ex){
        String err = (ex.getMessage()==null)?"drawOnMapFailed":ex.getMessage();
        Log.v("MAP",err);
    }
}

它一直有效,直到点击地图。我得到 IndexOutOfBoundsException 异常,所以我认为地图并不喜欢这种方式。代码有问题,还是有其他方法可以覆盖 osmdroid?也许这与我制作这个应用程序的方式有关?

更新:我以这种方式尝试使用 PathOverlay,但在地图上没有显示任何内容:

        PathOverlay mMyLocationOverlay = new PathOverlay(Color.RED, context); 
        mMyLocationOverlay.addPoint(geoPoint);

        mMapView.getOverlays().add(mMyLocationOverlay);
4

1 回答 1

2

如果您只想显示路线,您应该查看专为该工作设计的 PathOverlay。即使您解决了错误,您当前的方法也会很快得到大量覆盖。使用 PathOverlay,您将只有一个叠加层,您需要将新点添加到其中。该实现经过优化,可以处理屏幕内外的大量点。

于 2013-04-18T11:14:41.810 回答