マップに表示されている範囲の南北の距離がどのくらいか知りたくなったら以下のメソッドを使うと良いです。使い道としては、ユーザがマップを移動させたときのオートロードなどに使うとよさそうですね。今まで表示されていたマップの中心点と、移動したあとのマップの中心の移動距離が下記で取得した南北の距離の半分以上になったらマップをリロードするとかでしょうか。
1 2 3 4 5 6 7 8 |
func getScreenDistanceNS() -> CLLocationDistance { let mRect = mapView.visibleMapRect let topMapPoint = MKMapPointMake(MKMapRectGetMidX(mRect), MKMapRectGetMinY(mRect)) let bottomMapPoint = MKMapPointMake(MKMapRectGetMidX(mRect), MKMapRectGetMaxY(mRect)) let currentDist = MKMetersBetweenMapPoints(topMapPoint, bottomMapPoint) return currentDist } |
ちなみにcurrentDistはメートル単位で取得できるので、もしkmが必要なら1/1000すればよいです。
また、緯度経度の範囲検索を行いたいときは1kmあたりの緯度経度の差分がわかると便利です。こんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 現在地の座標から1km先の地点の緯度経度の差になります let latfor1km = 0.0090133729745762 let longfor1km = 0.010966404715491394 // これを応用すると、画面に表示されている南西と北東の地点の座標も取れます var NSDistance = getScreenDistanceNS() /2 let lat = 0.0090133729745762*NSDistance let long = 0.010966404715491394*NSDistance // 南西の地点 latitude:currentLat-lat, longitude:currentLong-long // 北東の地点 latitude:currentLat+lat, longitude:currentLong+long |
例えば、座標情報を持っているオブジェクトに対して自分を中心にして画面に表示されている範囲に存在しているものだけを表示とかに使えます。先ほど紹介した画面の移動距離についての計算と合わせるとユーザのマップのスクロールに合わせて情報を更新できたりして便利かと思います。
余談ですが、緯度の一度の差は111120メートルで、それの1/60である一分は1852メートルだそうです。そしてこの1852メートルこそが1マイル!ということはこの111120メートルを360倍すると地球の円周の距離になるわけですね。考えた人は頭いいなと思った次第です。