【问题标题】:Map overlay for osmdroid never appearsosmdroid 的地图叠加层从未出现
【发布时间】:2011-08-24 10:45:50
【问题描述】:

我正在尝试为 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 进行检查...

【问题讨论】:

    标签: android android-canvas graphic


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多