0

Mapsforge を使用してオフライン マップを表示しています。ユーザーの GPS 位置をリアルタイムで表示したいと考えています。ドローアブルを表示するマップ上のユーザーの位置を表すオーバーレイ クラスがあります。

デバイスが新しい GPS 位置情報を受信すると、Overlay クラスのメソッドが呼び出されます。メソッドは locationChanged です。このメソッドはオーバーレイの場所を変更し、mapView.invalidate(); を呼び出します。

GoogleMaps では問題なく動作しますが、Mapsforge では動作しませんでした。Mapsforge を使用すると、最初にユーザーの GPS 位置を表示するときにドローアブルが正しく表示されますが、デバイスが新しい GPS 位置を受信すると、ドローアブルは移動しません。ユーザーが指でマップを動かしたときにのみ移動します。Mapsforge ライブラリの invalidate() メソッドが正しく動作していないと思います。

ブレークポイントでチェックしたため、メソッド locationChanged が呼び出されています。場所は正しく受信されており、mapView のインスタンスは正しいです。

これは私のオーバーレイクラスです:

public class CapoMyLocationOverlay extends Overlay implements CapoLocationListener{
    Bitmap pointer;
    GeoPoint location;
    int radius;
    boolean valid_location;
    public MapView mapView;

    public CapoMyLocationOverlay(MapView mapView){       
        Drawable d = ApplicationContextProvider.getContext().getResources().getDrawable(R.drawable.target_location);
        pointer = ((BitmapDrawable) d).getBitmap();
        radius = pointer.getWidth() / 2;       
        valid_location = false;
        this.mapView=mapView;
    }

    @Override
    protected void drawOverlayBitmap(Canvas canvas, Point drawPosition, Projection projection, byte drawZoomLevel) {
        if( valid_location ){           
            Point screenPts = new Point();
            //GeoPoint location = SectionManager.instance.lastLocationGeoPoint;
            mapView.getProjection().toPixels( location , screenPts);
            canvas.drawBitmap(pointer, screenPts.x-radius, screenPts.y-radius , null);   
        }       
    }   

    @Override
    public void locationChanged(Location newLocation) {
        location = new GeoPoint( (int)(newLocation.getLatitude() * 1000000) , (int)(newLocation.getLongitude()*1000000) );       
        valid_location = true;
        mapView.invalidate();
    }
}
4

2 に答える 2