はじめに
とても簡単にできたのにGitHub
とかを読み漁ってしまった・・・。
// 最低限の地図の大きさ
let MINIMUM_MAP_SPAN = MKCoordinateSpanMake(0.002, 0.002)
var topLeftCoord = CLLocationCoordinate2D(latitude: -90, longitude: 180)
var bottomRightCoord = CLLocationCoordinate2D(latitude: 90, longitude: -180)
// 2点間の計算を行う。
// 現在地
topLeftCoord.longitude = fmin(topLeftCoord.longitude, localCoordinate.longitude)
topLeftCoord.latitude = fmax(topLeftCoord.latitude, localCoordinate.latitude)
bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, localCoordinate.longitude)
bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, localCoordinate.latitude)
// ピンの位置
topLeftCoord.longitude = fmin(topLeftCoord.longitude, pinCoordinate.longitude)
topLeftCoord.latitude = fmax(topLeftCoord.latitude, pinCoordinate.latitude)
bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, pinCoordinate.longitude)
bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, pinCoordinate.latitude)
var region = MKCoordinateRegion()
region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5
region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5
// 端ギリギリにピンが立つのを避けるため少し広げる
region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1;
region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1;
// 拡大しすぎの場合は最低限の縮尺にする
region.span.latitudeDelta = fmax(MINIMUM_MAP_SPAN.latitudeDelta, region.span.latitudeDelta);
region.span.longitudeDelta = fmax(MINIMUM_MAP_SPAN.longitudeDelta, region.span.longitudeDelta);
self.mapView.setRegion(self.mapView.regionThatFits(region), animated: true)
ではなくて
self.mapView.showAnnotations(self.mapView.annotations, animated: true)
これで現在地も含め、全てのピンが表示される地図の倍率を出してくれた・・・。
2時間も探し求めたのに・・・・(初めに見つけた文献は間違ってて余計にはまった。)
でも、緯度経度の考え方を見直すときに使いそうなのでメモっておく。
参考
がんばって計算しているコード
https://gist.github.com/ttsubono/2988074
アメリカなどを含めると以下の計算式だと途中で落ちる。
http://kesin.hatenablog.com/entry/20120915/1347726989