【问题标题】:Overlays in osmdroid-android-3.0.3.jarosmdroid-android-3.0.3.jar 中的叠加层
【发布时间】:2011-04-01 19:11:06
【问题描述】:

在我的问题答案的大力帮助下,我之前曾设法使用 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.1 jar 使用新的 3.0.3 版本。

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

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

我注意到方法

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);
    }

这工作正常

【问题讨论】:

    标签: android openstreetmap osmdroid


    【解决方案1】:

    让我尝试提出一些建议:

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

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

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

    【讨论】:

    • 感谢您的信息。正如您之前建议的那样,我设法通过调整 Minimap 叠加层来使其工作。我注意到必须删除偏移量的设置才能使其正常工作,但这与 Minimap 示例不同(请参阅更新)。我还注意到,我用来通过计时两个 ACTION_DOWN 事件之间的时间来实现“doubleTap”的 on TouchEvent 似乎在单次触摸的 1 毫秒内触发了两次?
    • 您不需要偏移的原因是 getScreenRect() 获取屏幕上内容的可绘制屏幕坐标。换句话说,它是预偏移量。您应该能够在叠加层中覆盖 onDoubleTap (或类似的东西)以获得双击事件。
    • 感谢您的帮助。该应用程序现在看起来相当不错。我特别喜欢将压缩瓷砖无缝集成到瓷砖源中。是否可以在 TileSource 上设置任何属性,使其仅从 zip 或缓存中获取切片而不上线?
    • 绝对 - 你需要建立自己的瓷砖供应商链。看看 MapTileProviderArray。您可以向它传递一组 tile 提供程序“模块”(在模块名称空间中)。如果您查看 MapTileProviderBasic,它将展示如何创建切片提供程序链。
    • 再次感谢您。我看了一眼,下周对我来说似乎是一个有趣的练习。
    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多