osmdroid-android-3.0.3.jar中的叠加层

时间:2011-04-01 19:11:07

标签: android openstreetmap osmdroid

我以前设法使用osmdroid-android-3.0.1.jar将OpenStreetMaps整合到我的应用程序中,并在我的问题的答案的帮助下

Porting a Google Maps app to Osmdroid - problem with overlay

我现在已升级到使用3.0.3 jar并且无法显示我的叠加层。

我的应用可以将显示从Google地图切换到OSM,并在两者之上显示由线条和文字组成的相同叠加层。替代显示现在每个都在他们自己的活动中运行,因为类相似但没有完全相同的方法,或者至少它们在3.0.1中没有。 (最后我想使用Osmdroid包装器jar将它们组合在一个活动中并减少重复的代码,但这是一个以后的问题)现在我想获得与现在相同的功能使用新的3.0.3版本弃用了3.0.1 jar。

使用新jar,我仍然可以显示mapview,但叠加层已消失。我必须对代码进行一些更改,因为3.0.1 onDraw()方法现在已经被 MapOverlay extends org.osmdroid.views.overlay.Overlay中的draw()(就像Google)所取代。 类。

上一个onDraw()(现在绘制)方法中的所有代码都是从上面提到的问题的答案中逐字复制的,虽然我承认没有完全理解worldsize,bounding boxes和所描述的转变。

我注意到方法

final Point upperLeft = org.osmdroid.views.util.Mercator
            .projectGeoPoint(boundingBox.getLatNorthE6(), boundingBox.getLonWestE6(),
            zoomLevel + tileZoom, null);

现已弃用,我不得不删除tileZoom和

final int tileZoom = projection.getTileMapZoom();

让它编译。<​​/ p>

当我接触draw()方法中的代码时,我可以在调试器中看到绘制叠加层所需的所有数据仍然存在且正确。绘图由canvas.drawLine(....)和canvas.drawText(....)等行完成。我根本没有在函数(布尔阴影)中使用额外的参数。

我的redrawOverlay()方法仍为:

private void redrawOverlay() {

    mGpt = mMapVw.getMapCenter();

    if (mmapOverlay == null)
        mmapOverlay = new MapOverlay(this);
    mmapOverlay.setEnabled(true);
    List<Overlay> listOfOverlays = mMapVw.getOverlays();
    int ovlSize = listOfOverlays.size();
    if (ovlSize > 1)
        listOfOverlays.remove(1);
    listOfOverlays.add(mmapOverlay);
    mMapVw.invalidate();
}

(Google listofOverlays.clear()不应该用作osmdroid 3.0.1将元素0作为地图本身 - 因此删除(1))

我想知道如何修改现有的3.0.1代码以使用3.0.3?我希望其中一位作者可以阅读这个问题。

更新

通过如上面提到的问题的答案中所建议的那样过度调整Minimap,用于从左上角到右下角绘制叠加层的draw()方法现在变为:

    @Override
    protected void draw(Canvas pC,  MapView pOsmv, boolean shadow) {
        if(shadow)
            return;

        Paint lp3;
        lp3 = new Paint();
        lp3.setColor(Color.RED);
        lp3.setAntiAlias(true);
        lp3.setStyle(Style.STROKE);
        lp3.setStrokeWidth(1);
        lp3.setTextAlign(Paint.Align.LEFT);
        lp3.setTextSize(12);
        // Calculate the half-world size
          final Rect viewportRect = new Rect();
          final Projection projection = pOsmv.getProjection();
          final int zoomLevel = projection.getZoomLevel();
          int mWorldSize_2 = TileSystem.MapSize(zoomLevel) / 2;

          // Save the Mercator coordinates of what is on the screen
          viewportRect.set(projection.getScreenRect());
          // DON'T set offset with either of below
          //viewportRect.offset(-mWorldSize_2, -mWorldSize_2);
          //viewportRect.offset(mWorldSize_2, mWorldSize_2);

          // Draw a line from one corner to the other
          pC.drawLine(viewportRect.left, viewportRect.top, viewportRect.right, viewportRect.bottom, lp3);
    }

这没关系

1 个答案:

答案 0 :(得分:0)

让我试着提出一些建议:

  1. 在新的jar版本中,调用getOverlays()。clear()将不再删除地图图块叠加层。现在调用remove(1)可能不正确,因为地图图块覆盖不再位于位置0。

  2. 投影有一个方法可以获得当前屏幕上的屏幕坐标矩形。您可以检查用于在此矩形上绘制线条的坐标,以确保它们可以截取它。

  3. 看一下新的TileSystem类。可以使用这些函数重新创建任何已弃用的内容。