1

OSMdroid を使用してマッピング アプリケーションを実装しています。

最大 22 のズーム レベルを許可するタイル ソースを使用するカスタム MapTileProvider を実装しました。

デフォルトの MAPNIK プロバイダーは、レベル 18 までのズームのみを許可します。

問題は、ズーム レベル 19 までは PathOverlay インスタンスが完全に描画されますが、ズーム レベル 20 ~ 22 では適切に描画されないことです。誰かがパスの長さの 90% 以上を消しゴムでこすったように見えます (下のスクリーンショットを参照)。

PathOverlay の draw() メソッドを実行したところ、正しく計算されているようです(中間点は ZoomLevel 22 で正しく表示され、XY 投影は 22-ZoomLevel で除算されて現在の画面座標が取得されます)。

問題の内容とその解決方法について、誰かが洞察を提供できますか?

Cloudmade の小さなタイルを使用して MapView を呼び出すと、同じことが起こります。これは、レベル 20 までズームアップでき、「組み込み」の osmDroid タイル プロバイダー クラスです。

    //mMapTileProvider = new HighResMapTileProvider(this);
    mMapTileProvider = new MapTileProviderBasic(this,TileSourceFactory.CLOUDMADESMALLTILES);
    mMapView = new MapView(this, 256, mResourceProxy,mMapTileProvider);

したがって、問題はタイル ソースまたはプロバイダーにあるようには見えませんが、キャンバスの描画方法に問題があるようです。これを解決する方法についてのアイデアはありますか?

zoomLevel 19 では、パスをうまく見ることができます。 ズームレベル 19

しかし、次のズーム レベルでの同じパスは次のとおりです。 ここに画像の説明を入力

4

6 に答える 6

2

回避策を見つけました。理想的ではありませんが、機能します。

まず、canvas.drawCircle(screenPoint1.x, screenPoint1.y, 5, cpaint); を追加するとします。

PathOverlay の draw() メソッドにこれが表示されるので、座標が少なくとも正しく計算されていることがわかります。

ズーム レベル 20

したがって、問題は Android の基になる線の描画方法に関連しているようです。

試行錯誤の結果、PathOverlay の Paint オブジェクトの STROKE WIDTH を 0.0 に設定すると問題が解決することがわかりましたが、線の幅は明らかに 1 ピクセルしかありません。

PathOverlay.draw() に現在のズーム レベルのチェックを追加してストローク幅を設定すると、レベルが 20 未満の場合は現在の動作が維持され、より高いズーム レベルではヘアライン パスが描画されます。

私が気づいた他のいくつかのこと:

  • ズーム レベル 21 と 22 では、円は正方形になります。これは、非常に大きな (x,y) 座標を Path.lineTo / canvas.drawCircle などに渡すときに浮動小数点の精度の問題があることを強く示唆しています (例: mPath.lineTo(131000001,38000001))。
  • ストローク幅を設定すると、ズーム レベル 21 までは 5 種類で動作しますが、レベル 22 で同じ問題が再び発生します。
于 2012-02-15T04:22:02.390 に答える
1

これは、デフォルトの PathOverlay がビュー内のポイント間の線のみを描画するためだと確信しています。点が現在のビューの外にある場合、線分は描画されません。低いズーム レベルでは、すべてのセクションが小さいため、ビューから外れている線のビットが表示されていないことがわかりません。

2つのオプションがあると思います。

簡単ですが最善ではないかもしれませんが、パスにより多くのポイントを配置することです。そうすれば、少なくとも問題は目立たなくなります。これが良いアイデアであるかどうかは、すでに持っているポイントの数によって異なります。

正しい解決策は、クラスを拡張し、独自の描画メソッドを実行してから、ビューから外れた線分をビューの端にクリップすることです。コードをソースに戻すのが理想的です。

于 2012-02-14T14:54:22.450 に答える
1

更新:これは osmdroid 3.0.9 で修正されました。

元の回答:
この問題は Android に根ざしているようです。ビューを大きなオフセットにスクロールするときに発生する丸めエラーが原因だと思います(おそらくSKScalarの使用が原因です)。このバグは、アクティビティとビューを使用して新しい Android プロジェクトを作成することで分離できます。

  1. スクロール オフセットがまだない原点のビューから始めます。
  2. キャンバスに円を描く:canvas.drawCircle(screenCenterX, screenCenterY, 100, mPaint)
  3. ビューを多数スクロールします。mainView.scrollTo(536870912, 536870912)
  4. キャンバスに円を描く:canvas.drawCircle(newScreenCenterX, newScreenCenterY, 100, mPaint)

最初の円は正常に描画され、2 番目の円は歪んで描画されます。さらに証拠を得るために、緯度 0 度、経度 0 度の近くでパスを描画してズームインしてみてください。歪みが表示されなくなっていることに注意してください。

osmdroid チケットをいくつかの可能な解決策の回避策で更新します。

于 2012-07-02T20:26:28.667 に答える
0

Google MapView を使用して同じ機能の DrawPath 関数 (ズーム レベル 21 & 22) を取得したため、これが OSMDROID 関連のバグであることに同意します。彼らがこの問題に対処できることを願っています。

于 2012-03-02T01:27:10.633 に答える
0

私は同じ問題を抱えており、OSMDroid にバグを投稿しました:

http://code.google.com/p/osmdroid/issues/detail?can=2&start=0&num=100&q=221&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary&groupby=&sort=&id=221

OSMDroidの問題なのか、キャンバスが大きすぎるだけの問題なのかわかりません。

他の回避策は、新しい小さなキャンバス (現在表示されている mapView のサイズ) に描画し、大きなキャンバスの左上隅で drawBitmap を使用することです。描画ごとに新しいビットマップを作成しないように注意してください。コストがかかるためです。

すべての形状は完全にきれいに描画されますが、18 を超えるレベルでのパンがスムーズではないという他の問題に苦労しています。マップをパンすると、18 未満のレベルのようにすべてのピクセルが移動していないことがわかりますが、いくつかのピクセルを飛び越えます。 .

于 2012-02-21T13:15:35.627 に答える
-2

この問題を解決するには、ライン クリッピング アルゴリズムを実装する必要があります。マップ ビューポートでクリッピングすることにより、パスに頂点が追加されます。したがって、大きなズーム レベルで正しく描画されます。

于 2013-08-09T11:50:56.903 に答える