1. ホーム
  2. アンドロイド

[解決済み】Android map v2 zoom to show all markers

2022-03-28 08:45:57

質問

の中に10個のマーカーがあります。 GoogleMap . できるだけズームインして、すべてのマーカーを表示したままにしたいのですが?以前のバージョンでは、以下の方法で実現可能でした。 zoomToSpan() が、v2 ではどうすればいいのかさっぱりわかりません。さらに、私は見えるようにする必要がある円の半径を知っています。

どのように解決するのですか?

を使用する必要があります。 CameraUpdate クラスを使用して、(おそらく)すべてのプログラムによるマップの移動を行います。

そのために、まずすべてのマーカーの境界を次のように計算します。

LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
    builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();

次に、ファクトリーを使用して動作記述オブジェクトを取得します。 CameraUpdateFactory :

int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);

最後にマップを移動します。

googleMap.moveCamera(cu);

また、アニメーションが必要な場合は

googleMap.animateCamera(cu);

以上です :)

明確化1

ほとんどすべてのムーブメントメソッドで Map オブジェクトがレイアウト処理を通過している必要があります。これを待つには addOnGlobalLayoutListener という構文があります。詳細は、この回答や残りの回答へのコメントで確認できます。また を使用してマップの範囲を設定するための完全なコードです。 addOnGlobalLayoutListener ここで .

明確化2

あるコメントで、1つのマーカーに対してこの方法を使用すると、地図のズームが "奇妙な" ズームレベルに設定されるという指摘がありました(私は与えられた場所で利用できる最大ズームレベルだと考えています)。私は、これは予想されたことだと思います。

  1. その LatLngBounds bounds インスタンスには northeast プロパティに等しい southwest つまり、地球上の面積のうち、この bounds はちょうどゼロです。(これは論理的なことで、1つのマーカーは面積を持たないからです)。
  2. を渡すことで boundsCameraUpdateFactory.newLatLngBounds のようなズームレベルの計算を要求します。 bounds (面積がゼロ)であれば、マップビュー全体をカバーします。
  3. この計算は、実際に紙の上で行うことができます。答えとなる理論上のズームレベルは「+∞」(正の無限大)です。実際には Map オブジェクトはこの値をサポートしていないので、与えられた場所で許容されるより合理的な最大レベルに固定されます。

別の言い方をすれば、どのようにすれば Map オブジェクトがどのようなズームレベルを選択すべきかを知ることができます。 一箇所 ? たぶん、最適な値は20(特定の住所を表す場合)であるべきです。あるいは、11(町を表す場合)。あるいは、6(国を表す場合)かもしれません。APIはそれほど賢くないので、その判断はあなた次第です。

ということは、単純に markers が1箇所しかない場合は、どちらかを使用します。

  • CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition()) - マーカー位置へ移動し、現在のズームレベルはそのままにします。
  • CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F) - マーカー位置に移動し、ズームレベルを任意に選択した値12に設定します。