Porting a Google Maps app to Osmdroid - problem with overlay

前端 未结 1 625
北恋
北恋 2021-01-07 01:47

I\'m porting a Google Maps based project to Osmdroid in order to use OpenStreetMaps. The port is working OK apart from adding my overlay which consists of a number of straig

相关标签:
1条回答
  • 2021-01-07 02:34

    I'm not sure where you are calling redrawOverlay() from, but if you look at the MinimapOverlay you will see an example where something is drawn at a fixed location on the screen. In other words, you are drawing in screen coordinates not in map coordinates.

    Example:

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

    From here viewportRect represents the upper left to the lower right of the screen. You can use this to draw at any fixed points on the screen.

    UPDATE:

    To answer your second question - what you need to do is override onDoubleTap in your Overlay and return "true". Returning "true" indicates to the base class that you "consumed" the event and no further processing should take place. Take a look at the minimap overlay code for a good example:

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

    We are right in the middle of overhauling the Overlays, so some of this will be handled a little better in the near future. For example, the getOverlays().clear() bug you ran into has also been reported elsewhere and we've since fixed it.

    0 讨论(0)
提交回复
热议问题