2011-02-05 37 views
2

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

在OSM项目中,我的叠加层只是一个完全隐藏地图的灰色方块。如果我删除了重新拨号的呼叫,OSM磁贴显示OK。我已将叠加代码减少到下面代码示例中单个对角线的最小值。它在Google应用中正常工作,覆盖地图图块。该com.google.android.maps.Overlay有平局法,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); 
    } 

虽然在谷歌地图原来我有相同的:

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 UPDATE问:

感谢您的帮助,到目前为止,我看你是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方法是否会有所帮助,但是在javadoc中没有对它的引用。你有什么建议吗?

回答

2

我不确定你从哪里调用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表示左上到屏幕的右下角。您可以使用它在屏幕上的任何固定点绘制。

UPDATE:

要回答你的第二个问题 - 你需要做的是在你的叠加覆盖onDoubleTap并返回“真”。如果返回“true”,则表示您已“消费”该事件,并且不应进行进一步的处理。看看小地图覆盖代码一个很好的例子:

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

我们是正确的检修重叠的中间,所以其中一部分将被处理在不久的将来更好一点。例如,您遇到的getOverlays()。clear()错误在其他地方也有报道,我们已经修复了它。

+0

这肯定会在屏幕上画一条线,一旦我将mWorldSize_2定义为int并将一个Paint参数添加到.drawline。 (我想传入的Canvas与Google Maps传递的Canvas完全不同)。然而,底层的MapView消失了,我只是在灰色背景上划了一条线。 – NickT 2011-02-08 09:44:54

相关问题