【问题标题】:Porting a Google Maps app to Osmdroid - problem with overlay将 Google 地图应用程序移植到 Osmdroid - 覆盖问题
【发布时间】:2011-02-11 12:03:29
【问题描述】:

我正在将基于 Google 地图的项目移植到 Osmdroid 以使用 OpenStreetMaps。除了添加由许多直线和一些文本组成的覆盖之外,该端口工作正常。在这两个项目中,我都通过计时器线程和调用 redrawOverlay 的处理程序来添加 Overlay。

在 OSM 项目中,我的叠加层只是一个完全隐藏地图的灰色方块。如果我删除对 redrawOveraly 的调用,OSM 磁贴显示正常。在下面的代码示例中,我已将覆盖代码减少到最小的一条对角线。它在 Google 应用中运行良好,覆盖了地图图块。 com.google.android.maps.Overlay有draw方法,OSM有onDraw,所以我在OSM版本有:

   private MapView mv;
   private MapOverlay mmapOverlay = null;

   private void redrawOverlay() {

   gPt = mv.getMapCenter();
   if (mmapOverlay == null)
      mmapOverlay = new MapOverlay(getApplicationContext());
      List<Overlay> listOfOverlays = mv.getOverlays();
      listOfOverlays.clear();
      listOfOverlays.add(mmapOverlay);
      mv.invalidate();
   }

   public class MapOverlay extends org.osmdroid.views.overlay.Overlay {

   public MapOverlay(Context ctx) {
      super(ctx);
      // TODO Auto-generated constructor stub
   }

      @Override
      public void onDraw(Canvas canvas, MapView mapView) {

      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);
      canvas.drawLine(10, 10, 150, 150, lp3);
   }

虽然在 Google 地图原版中我有等价物:

  public class MapOverlay extends com.google.android.maps.Overlay {


   @Override
   public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
   long when) {
      super.draw(canvas, mapView, shadow);
      Paint lp3;
      lp3 = new Paint();
      .....etc.

redrawOverlay 是一样的,只是覆盖的实例化只是:

mmapOverlay = new MapOverlay();

我们将不胜感激所有建议

更新 kurtzmarc 的问题:

感谢您到目前为止的帮助,我知道您是 Osmdroid 的作者之一。我喜欢它到目前为止所做的事情。我想抑制双击时出现的“跳转并放大”。我希望它什么都不做。我认为它可能在您的源代码中遇到了这一点并进行了 zoomInFixing:

private class MapViewDoubleClickListener implements GestureDetector.OnDoubleTapListener {
   @Override
   public boolean onDoubleTap(final MotionEvent e) {
   for (int i = mOverlays.size() - 1; i >= 0; i--)
      if (mOverlays.get(i).onDoubleTapUp(e, MapView.this))
         return true;

      final GeoPoint center = getProjection().fromPixels(e.getX(), e.getY());
      return zoomInFixing(center);
  }

似乎我无法覆盖它。我正在使用 3.0.1 jar 和相关的 javadocs。我想知道 Mapview 的 setTouchDelegate 方法是否有帮助,但 javadocs 中没有引用它。请问您有什么建议吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    我不确定你从哪里调用 redrawOverlay(),但是如果你查看 MinimapOverlay,你会看到一个在屏幕上固定位置绘制的示例。换句话说,您是在屏幕坐标而不是地图坐标中绘图。

    例子:

    @Override
    protected void onDraw(final Canvas pC, final MapView pOsmv) {
      // Calculate the half-world size
      final Rect viewportRect = new Rect();
      final Projection projection = pOsmv.getProjection();
      final int zoomLevel = projection.getZoomLevel();
      final int tileZoom = projection.getTileMapZoom();
      mWorldSize_2 = 1 << (zoomLevel + tileZoom - 1);
    
      // Find what's on the screen
      final BoundingBoxE6 boundingBox = projection.getBoundingBox();
      final Point upperLeft = org.osmdroid.views.util.Mercator
                .projectGeoPoint(boundingBox.getLatNorthE6(), boundingBox.getLonWestE6(),
                zoomLevel + tileZoom, null);
      final Point lowerRight = org.osmdroid.views.util.Mercator
         .projectGeoPoint(boundingBox.getLatSouthE6(), boundingBox.getLonEastE6(), zoomLevel
         + tileZoom, null);
    
      // Save the Mercator coordinates of what is on the screen
      viewportRect.set(upperLeft.x, upperLeft.y, lowerRight.x, lowerRight.y);
    
      // Offset into OSM coordinates
      viewportRect.offset(-mWorldSize_2, -mWorldSize_2);
    
      // Draw a line from one corner to the other
      canvas.drawLine(viewportRect.left, viewportRect.top, viewportRect.right, viewportRect.bottom);
    

    从这里 viewportRect 代表屏幕的左上角到右下角。您可以使用它在屏幕上的任何固定点进行绘制。

    更新:

    要回答您的第二个问题 - 您需要做的是在 Overlay 中覆盖 onDoubleTap 并返回“true”。返回“true”向基类表明您“消费”了该事件并且不应进行进一步处理。看看小地图覆盖代码就是一个很好的例子:

    http://code.google.com/p/osmdroid/source/browse/trunk/osmdroid-android/src/org/osmdroid/views/overlay/MinimapOverlay.java

    我们正处于对叠加层进行大修的过程中,因此在不久的将来,其中一些问题会得到更好的处理。例如,您遇到的 getOverlays().clear() 错误也已在其他地方报告过,我们已经修复了它。

    【讨论】:

    • 这肯定会在屏幕上画一条线,一旦我将 mWorldSize_2 定义为 int 并向 .drawline 添加了 Paint 参数。 (我猜传入的 Canvas 与 Google Maps 传入的 Canvas 完全不同)。然而底层的 MapView 消失了,我只是在灰色背景上得到一条线。
    • 感谢您的帮助,我正在慢慢到达那里! listOfOverlays.clear() 是罪魁祸首;除了索引为 0 的那个之外,我需要清除它们。(这与谷歌地图不同)。我现在的主要问题是我做了很多工作来获取线条的坐标和一些我想通过我编写的服务/远程接口绘制的文本。这些在屏幕像素坐标中,因为这就是 Google 叠加层想要它们的方式。我现在需要将它们全部转换为 Osmdroid 的 OSM 坐标。
    • 完成了!非常感谢。在我清醒了头脑并用笔和纸坐下来之后,我意识到我只需要编写几个两行的 transformX、transformY 例程。它看起来就像现在的 Google 地图叠加层。
    • 我已编辑原始问题以包含另一个查询。希望你不要介意。我认为 SO 的任何其他成员都无法提供帮助,因为我可以看到您仍在为 Osmdroid 编写代码
    • Fwiw,链接已损坏。大量样品here。我假设MinimapOverlay.java 的模拟现在是SampleWithMinimapItemizedoverlay.java,但我还没有玩过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2017-05-08
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多