MKMapViewのzoomの挙動
Cocoaの日々: CoreLocation – [3] MKMapView の初期表示設定
MKMapViewのzoomについてこちらを参考にさせて頂いている中で、下の投稿を知ったのでメモのつもりで日本語訳しました。
(なんか英語が分からないところがあって訳がハチャメチャなので原文を読んだ方がマシかもしれませんが。。。)
iphone – MKMapView Zoom and Region – Stack Overflow
—-
まず、MKMapViewにはGoole mapのようなzoom levelは定義されていない。
その代わり、MKMapViewの見える範囲は以下の2つの値を持つMKCoordinateRegionを使って記述されている。
1. center(領域の中心点)
2. span(centerを中心とした見える領域のサイズ)
centerはすぐにわかる(これは領域の中心点)。
一方、span(MKCoordinateSpan)は以下で構成されている。
1. latitudeDelta(領域の縦方向の距離)
2. longitudeDelta(領域の横方向の距離)
MKCoordinateRegionを扱う簡単な例。
1. center:
– latitude: 0
– longitude: 0
2. span:
– latitudeDelta: 8
– longitudeDelta: 6
領域は以下のような最小座標と最大座標で表現される。
1. 最小座標(左下の点):
– latitude: -4
– longitude: -3
2. 最大座標(右上の点):
– latitude: 4
– longitude: 3
適切な大きさのMKCoordinateSpanを使ってcenterを中心としたzoom levelを指定できる。googleのzoom levelの概算に従って、googleがzoom levelから長さを作っているようにspanサイズを逆算できる。(googleはMKMapViewで使っているviewの領域を、centerとspanのように同じような方法で表現している。なので、google mapからこの値を持ってくることができる)
(※ この辺英語がよく分かりません)
As for restricting the region, you may play w/ this delegate method:
領域を制限することについては、このdelegateメソッドを使えばよい
(※ w/ って!? with なの?? Urban Dictionary: w/)
mapView:regionWillChangeAnimated
例えば、許可したzoom levelに入るように領域をリサイズすることによって。(table viewが端を超えたらゴムに引っ張られたように戻ってくるように)
しかし、役に立つかどうかは分からない。というのも、私は使わなかったから。
ところで、3.0で苦労したMapKitに関して、OS 3.1では確実に修正、改良が加えられている。
—-
— 追記(2013/09/06) —
なんとなく理解したつもりになっていたが、実際にMKCoordinateSpanの latitudeDelta, longitudeDeltaの値が何を表しているのかをちゃんと理解できていなかった。で、調べると、
latitudeDeltaとlongitudeDeltaはなんの数値かというと、それぞれ表示中の地図の端から端までの緯度・経度の差の絶対値だけど、iPhoneは長方形なので(MKMapViewを正方形とかにしれてば別だけど)、当然latitudeDeltaとlongitudeDeltaの値は違ってくる。
Emor.in Software Development » [iPhone]MKMapView.region.spanについて
ということらしい。
名前の通りといえば確かにその通り。
regionWillChangeAnimatedの中でlatitudeDeltaとlongitudeDeltaを監視していると、移動しただけでもlatitudeDeltaの値が変わるので、なぜって思っていたんだけど、メルカトル図法だから地図を上下に動かすと拡大縮小していなくても緯度の範囲が変わるってことでいいのかな?
極に近づくほど歪んでるってことで。
楽して学ぼうと思ってあちこち検索してたけど、やっぱりAppleのドキュメント読むのが一番の近道か。今頃!?って感じですが。
位置情報対応プログラミングガイド