3

最初に問題を紹介します。マップフィールドを表示し、マーカーと線をオーバーレイするアプリケーションを開発しています。ただし、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つのポイント(表示されているマップのコーナー)のみを変換することをお勧めします。

他のアプローチやアイデアもいただければ幸いです。

前もって感謝します。

4

3 に答える 3

3

ただ原始的な考え:あなたの「長方形」の2つの反対側の角、例えば左上のものと右下のものを取りなさい。次の方法で、両方のコーナーをデカルト空間座標に変換(x,y,z)します。

x = cos[long] cos[lat]
y = sin[long] cos[lat]
z = sin[lat] 

両方の(x,y,z)座標は単位ベクトルです(球の中心がに(0,0,0)あり、ベクトルがそこから表面への矢印であると想像してください)。マップ領域の「中央」を2つのコーナーベクトルのノルム平均として見つけます(ベクトルとして追加し、合計ベクトルの長さで割って、新しい単位ベクトルがあることを確認します)。中央がある場合(xMiddle,yMiddle,zMiddle)、デカルトに変換されたすべての目印座標について、中央への近さの尺度として(x,y,z)内積を使用します。(xMiddle,yMiddle,zMiddle)

(xMiddle,yMiddle,zMiddle)ここで、の内積が左上隅の内積よりも大きいすべての目印を含めます(xMiddle,yMiddle,zMiddle)

これにより、「中央」を中心とする円形ディスク内のすべての目印が表示されます。

于 2012-05-17T10:46:11.873 に答える
2

マップ座標空間の単純なボックスチェックを使用すると、少なくとも多数の候補を除外できます。ここにはおそらく3つの主なケースがあります。長方形の中に極があるか、ないかのどちらかです。極が表示されていない場合は、長方形が+/-180度の線と交差しているかどうかを確認します。+/- 90の線はあり得ません。これは、北極と南極を組み合わせて、4Dマップを使用していないためです。;-)

ケース1、極が表示されます。それが北極の場合、どのコーナーが最小の緯度を持っているかを把握します。それよりも小さい緯度は、画面外にある可能性があります。南極の場合は、ロジックを逆にします。つまり、最大の緯度を使用し、緯度が大きいアイテムを除外します。あるコーナーにポールがあり、別のコーナーに赤道があるということは、まだ半球全体が含まれていることを意味します。しかし、少なくとも残りの半分は安価に除外できます。

ケース2、極がなく、+ /-180経度線と交差していない:最小/最大経度と緯度の値を見つけて、それらを簡単なボックスチェックに使用します。ボックスの外側はすべて画面外にあります。

ケース3、極はありませんが、+ /-180経度線と交差しています:緯度については上記と同じです。経度については、それぞれ+180と-180から最も遠い経度を見つけます。緯度が最小/最大の外側、または見つかった2つの最も遠い経度の間にあるアイテムを除外します。

ケース2と3は、他の人のブルートフォースチェックを実行可能にするのに十分な候補を除外できるはずです。ケース1ではさらに後処理が必要になる場合がありますが、洗練されたものが必要な場合は、その部分が少し複雑すぎるのではないかと思います。ポールが画面の中心から離れている場合は、ポールに最も近い画面外のポイントを見つけることができると思います。次に、どういうわけか、そのポイントに1つのコーナーがある三角形のような形状を作成し、画面の長方形に触れずにできるだけ大きくします。

于 2012-05-17T09:42:04.057 に答える
0

長方形の周囲を地理座標に変換するだけでよいと思います。地理座標を画面座標に変換しようとする代わりに。

答えが素朴で申し訳ありませんが、論理について質問しますか。したがって、私が視覚化する論理的なことは、spehere上をスライドするウィンドウです。つまり、参照ポイントとしてそのウィンドウの地理座標を使用する必要があります。

その「3D」情報を処理した後、ビューのレンダリングを開始できます。

于 2012-05-17T09:24:48.573 に答える