1. ホーム
  2. iphone

[解決済み] MKMapView ズームとリージョン

2023-04-27 22:53:59

質問

Google MapsのJavascript APIを使い慣れました。最近、私はiPhoneプロジェクトのためにMapKitフレームワークを使用し始めましたが、私はズームと地図上の地域を設定することを理解するのに苦労しています。

Google Maps API では、8、9、10 のような整数のズーム レベルを、簡単な関数 setZoom() と共に使用していました。私が MapKit フレームワークで見ることができる唯一の同等のメソッドは、setRegion:animated です。私が理解したところでは、ズームレベルを指定するために、地域のスパンの緯度と経度の "delta" 値を設定する必要があるようです。しかし、私はこれらの値が何を表しているのか本当にわかりません(ドキュメントを読みました)。

MKMapView デリゲートを使用して、regionDidChange デリゲートメソッドでスパン値をトレースすると、結果は互いに相関していないように見えます。ズームアウトして、ドキュメントで指定されているようにスパン デルタ値が増加しているのを見ると、大丈夫です。しかし、突然、ズームせずにマップをドラッグすると、デルタ値が 0.0 になります。

どなたか、これらのスパンとデルタの基準点が何であるか説明していただけませんか。または、整数のズーム レベル (9 など) をこれらのデルタ値に変換するアルゴリズムはありますか?

ボーナス質問として、MKMapViewで最小-最大ズームレベルを指定する方法はありますか?)

ありがとうございます。

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

まず最初に MKMapView はGoogle Mapsのようなあらかじめ定義されたズームレベルのセットを使用/持っていません。

その代わり、MKMapViewの表示領域は MKCoordinateRegion を使って記述します。

  1. 中央 (領域の中心点)、および
  2. スパン (中央付近の可視領域の大きさ)。

中心点は明白であるべきです(それはリージョンの中心点です)。

しかし、span(これは MKCoordinateSpan )で構成されています。

  1. 緯度デルタ (領域が表す垂直方向の距離)、および
  2. 経度δ (領域が表す水平方向の距離) を指定します。

簡単な例です。 これはおもちゃのMKCoordinateRegionです。

  1. の中心です。
    • 緯度: 0
    • 経度: 0
  2. スパンです。
    • 緯度デルタ: 8
    • 経度デルタ: 6

領域は、その最小値と最大値の座標を用いて、以下のように記述することができる。

  1. min座標(左下点)。
    • 緯度: -4
    • 経度: -3
  2. 最大座標(右上の点)。
    • 緯度 4
    • 経度 3

したがって、適切なサイズの MKCoordinateSpan を使用して、中心点の周りのズーム レベルを指定することができます。 Googleの数値ズームレベルの近似値として、Googleが特定のズームレベルに使用するスパンのサイズをリバースエンジニアリングして、それに応じてスパンを作成することができます。 (Googleは、MKMapViewと同じ方法で、中心+スパンとしてビュー領域を記述しているので、Google Mapsからこれらの値を引き出すことができます)。

地域を制限するために、このデリゲートメソッドを使用することができます。

mapView:regionWillChangeAnimated

例えば、許容されたズームレベルに戻るように領域をリサイズすることによって。 (テーブル ビューで端を越えてスクロールできるようにする方法のようなものですが、その後、ゴムバンドで元の場所に戻ります)。 しかし、私はこの目的のためにそれを使用したことがないので、あなたのマイルセージは異なるかもしれません。

OS 3.1 では、3.0 で問題があった MapKit のアスペクトに対する明確な修正/改良があります。