Наложение карты для osmdroid никогда не появляется

1

Я пытаюсь реализовать собственный оверлей карт для osmdroid (но я предполагаю, что он довольно похож на наложения карт Google).

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

Идея состоит в том, что я рисую плоскость (и все) на холсте "лицом к северу", а затем поворачиваю его в соответствии с направлением полета и "сливаю" его с наложенным холстом (я попытался рисовать прямо на холст наложения, но при повороте, он также вращал карту).

Я создал подкласс Overlay и overiden метод 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, чтобы проверить...

Теги:
android-canvas
graphic

1 ответ

1
Лучший ответ

В случае, если это кому-то полезно, я наконец нашел решение.

В основном я пытался сделать слишком много в одно и то же время. Использование 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню