Наложение карты для osmdroid никогда не появляется - PullRequest
1 голос
/ 24 августа 2011

Я пытаюсь реализовать собственное наложение карты для 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();

}

По сути, моя плоскость никогда не отображается.

Я предполагаю, что это связано сматрица в исходном холсте, которая имеет большие значения (я предполагаю, что это своего рода географические координаты).

Хотя все это выглядит согласованно (расположение плоскости имеет большие значения, а также соответствует матрице).

Я пробовал несколько вещей:

  • рисование с фактического положения плоскости (большие значения): не помогло;
  • установка матрицы моего нового холста с помощьюматрица наложения холста: не помогло;
  • слияние с новой «пустой» матрицей: не помогло;-...

Я знаю, что мое изображение содержит плоскость (по крайней мере, если я рисую из 0,0 или нового центра холста, когда я сохранил его на SD, чтобы проверить ...

1 Ответ

1 голос
/ 03 сентября 2011

На случай, если это кому-нибудь пригодится, я наконец нашел решение.

По сути, я пытался сделать слишком много одновременно. Использование setPostRotate вместо setRotate в матрице слияния решило проблему (это и goig bac на чертежную доску для правильных параметров перевода).

Использование нижеприведенной матрицы слияния:

 // "Merging" canvas
 Matrix merge = new Matrix();
 merge.setTranslate(loc.x - pCenter.x, loc.y - pCenter.y);
 merge.postRotate(bearing, loc.x, loc.y);
...