1

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

将 Google Maps 应用程序移植到 Osmdroid - 覆盖问题

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

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

使用新罐子,我仍然可以正常显示地图视图,但覆盖层已经消失。我不得不对代码进行一些更改,因为MapOverlay 扩展 org.osmdroid.views.overlay.Overlay类中的 3.0.1 onDraw() 方法现在已替换为 draw()(就像 Google 一样)。

之前的 onDraw()(现在是 draw)方法中的所有代码都从上面提到的问题的答案中逐字复制,它工作得很好,尽管我承认没有完全理解 worldsize、边界框和所描述的转换的概念.

我注意到该方法

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

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

final int tileZoom = projection.getTileMapZoom();

让它编译。

当我看到 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 作为地图本身 - 因此 remove(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);
    }

这工作正常

4

1 回答 1

0

让我尝试提出一些建议:

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

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

  3. 看看新的 TileSystem 类。任何被弃用的东西都可以使用这些函数重新创建。

于 2011-04-02T02:15:02.550 回答