1

背景として... Android Google Map v2を使用してネイティブ Android アプリを開発しています。私の要件は次のとおりです。

要件 #1: 2 つの LatLng で区切られた特定の地域の衛星画像を表示します。これらの LatLngs は、表示したい長方形のマップ エリアの「中心線エンドポイント」と呼ばれるものを表していることに注意してください (マップ エリアの北東と南東の角とは対照的に)。わかりやすくするために、表示したいマップ エリアはゴルフ コースの 1 つのホールであり、2 つの LatLng は特定のゴルフ ホールのティーの場所とピン/ホールの場所を表しています。

これで問題ありません....この部分の解決策はかなり簡単です。次のコードを使用して、適切な境界でマップを表示します。

public void onCameraChange(CameraPosition arg0) {
// Determine the bounds and then move camera
LatLngBounds bounds = new LatLngBounds.Builder()
  .include(TPS_PIN)
  .include(TPS_HOLE)            
  .build();
googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 10));    

要件 #2:マップ イメージを回転させて、ポートレート モードでティーの場所が電話の画面の下部にあり、ピン/穴の場所が電話の画面の上部にくるようにします。

マップ画像を回転させるメソッド (CameraPosition.Builder で「ベアリング」パラメータを使用) がありますが、これを LatLngBounds メソッド (上記のように) と組み合わせて使用​​して、私の目標 (マップ画像をバインドして回転させる) を達成することはできないようです。 )。著者が同様の目的を持っている別の StackOverflow 投稿 ( Android は V2 newLatLngBounds をベアリングにマップします) がありますが、残念ながら、提供された回答は問題を解決しません。ただし、応答者は、提案された回答が機能しない場合 (および機能しない場合)、次のアプローチを提案しました。

「投影を使用してターゲットを計算し、自分でズームする必要がある場合があるため、上記の最初の moveCamera() 呼び出しの一部として境界を設定できます。」

残念ながら、これ以上の詳細は提供されていません。Projection を見てきましたが、目標を達成するために使用する方法がわかりません。

誰かが私の目標を達成する方法を見ていますか (バウンドと回転)? おそらく、Projection を使用してこれを行う方法はありますか? 使用できる LatLng ポイントが 2 つしかないことを思い出してください (Tee の場所と Pin/hole の場所の LatLng)。穴全体が画面に収まるようにする必要があります。

上で述べたように、電話が Potrait モードのときに T シャツが電話画面の下部にあり、穴/ピンの位置が画面の上部にあるように、画像を回転する方法を決定する必要があります。ここでも、穴全体 (ティーとピン/穴) がスクリーンに収まるようにする必要があります。特定の LatLng を画面の下部に、別の LatLng を電話画面の上部に「固定」する方法はありますか?

繰り返しますが、Android Maps v2 API で動作するソリューションが必要です。

高レベルの「方向性」の提案であっても、どんな提案でも大歓迎です。うまくいけば、「方向性のある」提案が、私が点をつなぐのに十分な詳細を持っていることを願っています。

4

1 に答える 1

0

ここで自分の質問に答えます。これが私の目標を達成するための最良の方法であるかどうかはわかりません(つまり、適切なズームレベルでバインドされた回転画像を(90度まで)表示します)..これを行うためのより良い方法がある場合は、ぜひ聞いてください.

大まかに言えば、私がやったことは次のとおりです。

  1. LatLngBounds を使用して、最初に 2 つの LatLng 座標を含むマップ イメージを取得しました。
  2. そのマップ画像の投影を取得して、他の属性 (ターゲット、ズーム レベル、勾配/方位) を抽出/計算し、それを使用して画像を表示しました。
  3. 次に、 CameraPosition.Builder() を使用して、前述のパラメータを抽出/計算して、最終的なマップ イメージを作成および表示しました。

これは機能しますが、これが私の目標を達成するための最も効率的な方法であるかどうかはわかりません。たとえば、「LatLngBounds」を使用してから「moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 25)」を使用してマップを生成し、zoomLevel を抽出できるようにします。残念ながら、「moveCamera」メソッドを使用すると、「暫定的な」マップ イメージが生成されます。最終的な回転マップ画像が生成されて表示される前に (少なくともエミュレーターで) 暫定的に表示されます. 最初の画像の残差が画面に短時間表示されるという視覚的な「グリッチ」に加えて、主要な属性を取得するために暫定マップを生成するように見えます.最終的なマップに必要な方法は非効率的です。

おそらく、実際に画像を生成せずに zoomLevel を取得する方法はありますか? ところで、私のアプリケーションでは、穴全体を表示しながら zoomLevel を可能な限り最大レベルに設定することが重要です。ゴルフのホールの長さは大きく異なる可能性があるため、zoomLevel はさまざまなホール間で大きく異なる可能性があるため、zoomLevel を「X」に設定してすべてのホールで機能することを期待できる可能性はありません。また、私のソリューションは世界中の 40,000 以上のゴルフ コースで動作する必要があるため、ゴルフ ホールごとに適切なズームレベルを保存できるわけではありません。

于 2013-04-18T17:40:45.980 に答える