1

私は以前、osmdroid-android-3.0.1.jar を使用して OpenStreetMaps をアプリケーションに組み込むことができましたが、私の質問への回答の大きな助けになりました

Osmdroid への Google マップ アプリの移植 - オーバーレイの問題

3.0.3 jar を使用するようにアップグレードしましたが、オーバーレイを表示できません。

私のアプリは、Google マップから OSM に表示を切り替えて、どちらかの上に線とテキストで構成される同じオーバーレイを表示できます。クラスは似ていますが、完全に同一のメソッドを持っていないか、少なくとも 3.0.1 では持っていなかったので、別の方法では、今のところそれぞれの実行を独自のアクティビティで表示します。(最終的には、Osmdroid ラッパー jar を使用してそれらを 1 つのアクティビティに結合し、重複するコードを減らしたいと考えていますが、それは後日の質問です) 今のところ、現在と同じ機能を取得したいと考えています。新しい 3.0.3 バージョンを使用して 3.0.1 jar を非推奨にしました。

新しいjarを使用しても、マップビューは問題なく表示されますが、オーバーレイは消えています。MapOverlay extends org.osmdroid.views.overlay.Overlayクラスで 3.0.1 の onDraw() メソッドが (Google のように) draw() に置き換えられたため、コードにいくつかの変更を加える必要がありました。

以前の onDraw() (現在は描画) メソッドのすべてのコードは、上記の質問への回答からそのままコピーされています。ワールドサイズ、バウンディング ボックス、および説明されている変換の概念を完全には理解していないことを告白しますが、問題なく動作しました。 .

その方法に気がついた

final Point upperLeft = org.osmdroid.views.util.Mercator
            .projectGeoPoint(boundingBox.getLatNorthE6(), boundingBox.getLonWestE6(),
            zoomLevel + tileZoom, null);

は非推奨になり、tileZoom を削除する必要がありました。

final int tileZoom = projection.getTileMapZoom();

コンパイルできるようにします。

draw() メソッドのコードに到達すると、オーバーレイを描画するために必要なすべてのデータがまだ存在し、正しいことをデバッガーで確認できます。描画は canvas.drawLine(....) や canvas.drawText(....) などの線で行われます。関数 (ブール値の影) に余分なパラメーターをまったく使用していません。

私の redrawOverlay() メソッドは次のようになります。

private void redrawOverlay() {

    mGpt = mMapVw.getMapCenter();

    if (mmapOverlay == null)
        mmapOverlay = new MapOverlay(this);
    mmapOverlay.setEnabled(true);
    List<Overlay> listOfOverlays = mMapVw.getOverlays();
    int ovlSize = listOfOverlays.size();
    if (ovlSize > 1)
        listOfOverlays.remove(1);
    listOfOverlays.add(mmapOverlay);
    mMapVw.invalidate();
}

(Google listofOverlays.clear() は、osmdroid 3.0.1 がマップ自体として要素 0 を持っていたため、使用しないでください - したがって、remove(1))

既存の 3.0.1 コードを 3.0.3 で動作するように変更するにはどうすればよいのでしょうか? の作者の 1 人がこの質問を読んでくれることを願っています。

アップデート

上記の質問への回答で提案されているように、ミニマップを全体的に適応させることにより、オーバーレイを左上から右下に描画する draw() メソッドは次のようになります。

    @Override
    protected void draw(Canvas pC,  MapView pOsmv, boolean shadow) {
        if(shadow)
            return;

        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);
        // Calculate the half-world size
          final Rect viewportRect = new Rect();
          final Projection projection = pOsmv.getProjection();
          final int zoomLevel = projection.getZoomLevel();
          int mWorldSize_2 = TileSystem.MapSize(zoomLevel) / 2;

          // Save the Mercator coordinates of what is on the screen
          viewportRect.set(projection.getScreenRect());
          // DON'T set offset with either of below
          //viewportRect.offset(-mWorldSize_2, -mWorldSize_2);
          //viewportRect.offset(mWorldSize_2, mWorldSize_2);

          // Draw a line from one corner to the other
          pC.drawLine(viewportRect.left, viewportRect.top, viewportRect.right, viewportRect.bottom, lp3);
    }

これは正常に動作します

4

1 に答える 1

0

いくつか提案してみましょう。

  1. 新しい jar ビルドでは、getOverlays().clear() を呼び出してもマップ タイル オーバーレイが削除されなくなりました。マップ タイル オーバーレイが位置 0 にないため、remove(1) の呼び出しは正しくない可能性があります。

  2. プロジェクションには、現在画面上にあるものの画面座標の長方形を取得するメソッドがあります。この長方形に対して線を描画するために使用する座標をチェックして、それらがそれを横取りしていることを確認できます。

  3. 新しい TileSystem クラスを見てください。非推奨になったものはすべて、これらの関数を使用して再作成できます。

于 2011-04-02T02:15:02.550 に答える