2009-07-22 8 views
83

GoogleマップのJavascript APIを使い慣れています。最近、私はiPhoneプロジェクトのMapKitフレームワークを使い始めましたが、私は地図上のズームや設定の難しさを感じています。MKMapViewズームと地域

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

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

誰かが、これらのスパンとデルタの参照ポイントとは何ですか?または整数のズームレベル(9など)をこれらのデルタ値に変換するアルゴリズムはありますか?ボーナス質問として

MKMapViewに最小最大ズームレベルを指定する:)スパンは、緯度と経度の度にある

おかげ

答えて

133

まず、MKMapViewは、Googleマップのように事前定義されたズームレベルを使用していません。

代わりに、MKMapViewの可視領域は、2つの値から成るMKCoordinateRegion、用いて説明する。

  1. 中心(領域の中心点)、及び
  2. スパン (中心付近の可視領域のサイズ)。

中心点は明白である必要があります(それは領域の中心点です)。)

しかし、MKCoordinateSpanあるスパン()で構成されています

  1. latitudeDelta領域で表される(垂直距離)、及び
  2. longitudeDelta(水平距離で表されます地域によって)。

簡単な例です。

  1. 中心:
    • 緯度:0
    • 経度:0
  2. スパン:
    • latitudeDelta:8
    • longitudeDelta:ここで玩具MKCoordinateRegionです6

領域は、その分を使用して記述することができ、次のように最大座標:

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

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

このデリゲートメソッドを使用して再生することができます:

mapView:regionWillChangeAnimated 

その領域を許可されたズームレベルに戻してサイズを変更します。 (テーブルビューを使用すると、スクロールしてエッジをスクロールさせることができますが、ラバーバンドを元の場所に戻すことができます)。ただし、この目的で使用していないため、マイレージが異なる場合があります。

btw、3.0で問題を起こしていたMapKitの面で、OS 3.1には明確な改良点があります。

+0

ニース。 Upvoted !!! – NSPratik

+0

@Kelvin、Googleが特定のズームレベルで使用するスパンサイズをリバースエンジニアリングしてスパンを作成する方法を詳しく説明できますか?私は本当にそれが必要です –

4

をどのような方法があります。代わりに距離を取るMKCoordinateRegion構造体を構築する方法があります。 MKCoordinateRegionMakeWithDistanceを使用してスパンを指定していて、regionDidChangeでそれを確認すると、MKCoordinateRegion構造体に格納されている緯度/経度で表示されます。

私が知る限り、整数のズームレベルは、MKMapKitを操作するときには利用できないか、まったく役に立ちません。私は個人的には、より柔軟なスパンの数字を使用することを好む。

ズームの最大値と最小値を指定することはできません。ハックする方法はわかりません.MKMapKitは現在実際にはかなり弱いですが、機能が不足していることにかなり失望しています。

3

地図のズームレベルをmaps.googleを使って簡単に比較できます。リンククエリ文字列を検査することにより、COMはDXとDYスパンは2倍に増加値ことを示しています。あなたは、明示的なズームレベルを使用する代わりにMKCoordinateSpanを定義することを好む場合

(0.005334, 0.011834) starting span 
(0.010668, 0.023668) dx: x2, dy: x2 
(0.021335, 0.047337) dx: x2, dy: x2 
(0.042671, 0.094671) dx: x2, dy: x2 
    ... 
117

、私が指定するためのサポートを追加したカテゴリを書きましたMKMapViewのズームレベル。コードはhereです。

+0

本当に興味深い記事、リンクのおかげで。 –

+4

トロイのブログ記事は、マップキットとGoogleマップの仕組みをよく理解してくれました。私はそれを読むことを強く勧めます。 – afarnham

+1

偉大な仕事の男..深い分析.. – harshalb

2

MKMapViewのBrantのカテゴリはうまく機能します。しかし、mapSizeInPixelsを計算するときに、網膜スクリーンを備えた新しいデバイスをサポートするように更新されていないようです。

それは、この行を交換することによって固定することができます。このラインで

CGSize mapSizeInPixels = mapView.bounds.size; 

:私は基本を知ってみましょう説明

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);