2011-02-05 24 views
2

OpenStreetMapsを使うためにGoogle MapsベースのプロジェクトをOsmdroidに移植します。ポートは、数多くの直線とテキストからなるオーバーレイを追加するだけでOKです。どちらのプロジェクトでも、私は、スレッドとハンドラーredrawOverlayを呼び出すことによってオーバーレイを追加します。GoogleマップアプリをOsmdroidに移植する - オーバーレイに関する問題

OSMプロジェクトでは、私のオーバーレイは地図を完全に隠す灰色の四角形です。 redrawOveralyへの呼び出しを削除すると、OSMタイルはOKと表示されます。下のコードサンプルでは、​​オーバーレイコードを1つの対角線の最小値に減らしました。 Googleアプリでうまく動作し、地図タイルをオーバーレイします。 com.google.android.maps.Overlayは、drawメソッドを持って、OSMはonDrawは持っているので、私はOSMのバージョンを持っている:

:私は同等のものを持っているGoogleマップの元でながら

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

すべての提案は感謝

0を受信します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メソッドが助けになるかどうかは疑問だが、javadocsにはその参照がない。何か提案してください?

答えて

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:

は、2番目の質問に答えるために - 何をする必要がある、あなたのオーバーレイで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として定義し、.drawlineにPaint引数を追加すると、画面に線を描画します。 (Canvasが渡されるCanvasは、Google Mapsが渡すCanvasとはまったく異なります)。しかし、基礎をなすMapViewが消えて、灰色の背景の上に線が表示されます。 – NickT

+0

あなたの助けてくれてありがとう、私はゆっくりとそこに着いています! listOfOverlays.clear()が原因でした。インデックス0のものを除いてすべてクリアする必要がありました(Googleマップと同じではありません)。私の主な問題は、私が書いたサービス/リモートインターフェイス経由で描画したい線の座標とテキストを得るために多くの作業をしたことです。これらはGoogleのオーバーレイがそれらを望んでいたので、スクリーンピクセル座標で表示されます。 OsmdroidのOSM座標に変換する必要があります。 – NickT

+0

完了!どうもありがとう。私は頭を払ってペンと紙で座った後、私はちょうど2行の2行のtransformX、transformYルーチンを書く必要があることを理解しました。これはGoogleマップオーバーレイのように見えます。 – NickT

関連する問題