最初に問題を紹介します。マップフィールドを表示し、マーカーと線をオーバーレイするアプリケーションを開発しています。ただし、BlacBerry OS 5.0ではMapField
、APIで利用できるのは、データをオーバーレイする手段を提供せず、ある場所の地図のみを表示することです。また、画面座標(ピクセル)をWGS84座標との間で変換する方法も提供します。これらの方法は、計算コストがかかる可能性があります。
したがって、自分のアイテムをペイントするには、このクラスを拡張し、そのpaint()メソッドをオーバーライドする必要があります。拡張クラスは場所のコレクションも保持します。これは、オーバーライドされたメソッドがどのように見えるかを示しています(ここではJavaを使用します)。
public void paint (Graphics g) {
super.paint(g); //draws the map
//TODO
//Draw placemarks. The placemarks are basically holder objects
//(for latitude and longitude) stored in a collection in this class.
}
ただし、これらのオブジェクトを画面にペイントするには、最初に目印の位置(lat、long)を画面座標(ピクセル単位のx、y)に変換する必要があります。マップは静的ではないため、事前にこれを行うことはできません。そのため、スクロールしてズームインすることができます。これが、各ペイントループで少なくとも可視オブジェクトをペイントする必要がある理由です。そうは言っても、私の質問は次のとおりです。
角が地理的な場所(現在表示されているマップの部分の変換された4つの角)である長方形の周囲を考えると、コレクション内のすべての目印をループして、それらが表示されているかどうかを判断する高速な方法はありますか?
このテストが100%正確である必要はありません。画面の外側のいくつかの場所がペイントされていてもかまいません。ただし、目印コレクションには多くの要素(<100)を含めることができ、画面の再描画ごとにpaintメソッドが呼び出されるため、コレクション内のすべての場所を表示されているかどうかを確認せずにペイントしようとすると、パフォーマンスに影響を与え、ラグが発生する可能性があります。ユーザーがマップを操作します。
素朴な答えを提供しようとする前に、これは単純な幾何学的問題ではないことに注意してください。整数の画面座標ではなく、地理座標を使用しています。世界は経度+180、または緯度+90で終わらない。この関数は極と赤道で機能するはずなので、長方形と交差する遷移線(-180から+180、または-90から+90、または両方の線)がある場合にも機能する必要があります。ロジックが複雑になる可能性があるため、独自のアルゴリズムを実装するのではなく、これがすでに実行およびテストされている既存のアルゴリズムまたはオープンソースライブラリがあるかどうかを知りたいと思います。
また、最初にコレクション内のすべての場所を画面座標に変換してから、正の画面座標(x = 0、y = 0から開始)のみで構成される長方形と簡単に照合することもできますが、変換関数は高価になる可能性があるため、目印の数が不確定であるよりも、更新ごとに4つのポイント(表示されているマップのコーナー)のみを変換することをお勧めします。
他のアプローチやアイデアもいただければ幸いです。
前もって感謝します。