1

osmdroid 用に独自のマップ オーバーレイを実装しようとしています (ただし、Google マップ オーバーレイとかなり似ていると思います)。

私がやろうとしているのは、飛行機を描き、方位に応じて回転させ、速度ベクトルを描くことです(飛行方向で飛行機の先にある線で、飛行機がすぐにどこにあるかを示します)。

アイデアは、「北向き」のキャンバスに飛行機(その他)を描画し、飛行方向に従って回転させ、オーバーレイキャンバスと「マージ」することです(オーバーレイキャンバスに直接描画しようとしましたが、回転すると、マップも回転していました)。

Overlay のサブクラスを作成し、次のように onDraw メソッドをオーバーライドしました。

@Override
protected void draw(Canvas c, MapView mapView, boolean shadow) {
    if (location != null) {
        Point locPoint = new Point();
        GeoPoint locGeoPoint = new GeoPoint(location);
        final Projection pj = mapView.getProjection();
        pj.toMapPixels(locGeoPoint, locPoint);

        this.drawPlane(c, locPoint, location.getBearing());
    }
}

private void drawPlane(Canvas cs, Point ctr, float bearing) {

    Paint paint = new Paint();
    paint.setColor(Color.RED);
    paint.setAntiAlias(true);

    Bitmap planeBM = Bitmap.createBitmap(cs.getWidth(), cs.getHeight(), Bitmap.Config.ARGB_8888);
    planeBM.setDensity(cs.getDensity());        
    Canvas c = new Canvas(planeBM);

    Rect r = new Rect();

    //Point center = new Point(cs.getWidth() / 2, cs.getHeight() /2);
    Point center = new Point(0, 0);

    // Draw fuselage
    r.left = center.x - PLANE_WIDTH / 2;
    r.right = r.left + PLANE_WIDTH;
    r.top = center.y - PLANE_SIZE / 3;
    r.bottom = r.top + PLANE_SIZE;

    c.drawRect(r, paint);

    // Draw wing (REMOVED)

    // Draw stabilizer    (REMOVED)

    // TODO Draw Speed vector


    // "Merging" canvas

    Matrix merge = new Matrix(cs.getMatrix());
    //merge.setTranslate(0, 0);
    //merge.setRotate(bearing, center.x, center.y);
    cs.drawBitmap(planeBM, merge, paint);
    cs.save();

}

基本的に私の飛行機は表示されません。

これは、大きな値を持つ初期キャンバスのマトリックスに関係していると思います(これらは一種の地理的座標であると思います)。

ただし、すべて一貫しているように見えます (平面の位置には大きな値があり、行列と一致しています)。

私は多くのことを試しました:

  • 実際の平面位置からの描画 (大きな値) : 役に立ちませんでした;
  • オーバーレイ キャンバス マトリックスを使用して新しいキャンバスのマトリックスを設定する: 役に立ちませんでした。
  • 新しい「空の」マトリックスとのマージ:役に立たなかった; -...

画像に平面が含まれていることはわかっています(少なくとも、確認のためにSDに保存したときに0,0または新しいキャンバスの中心から描画した場合...

4

1 に答える 1

1

これが誰かに役立つ場合、私は最終的に解決策を見つけました。

基本的に、私は同時に多くのことをしようとしていました。マージ マトリックスで setRotate の代わりに setPostRotate を使用すると、問題が解決されました (正しい変換パラメーターについては、製図板に戻ります)。

以下をマージマトリックスとして使用するとうまくいきました:

 // "Merging" canvas
 Matrix merge = new Matrix();
 merge.setTranslate(loc.x - pCenter.x, loc.y - pCenter.y);
 merge.postRotate(bearing, loc.x, loc.y);
于 2011-09-03T10:41:36.157 に答える