2011-02-05 50 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

相關問題