【MapKit】 ルート検索・POI検索のキャッシュ戦略 - その1. 必要な位置情報の精度を決定する
MapKitのルート検索・POI検索結果をキャッシュしたい。
モチベーションは、一般的なキャッシュと同じく、呼び出し回数を減らしたいのと、高速化。
MKDirectionsを用いたルート検索では、1分間での呼び出し回数が50回を超えると `loadingThrottled` エラーが発生する。
POI検索ではそういうエラーこそ発生しないが、大量に呼んでいるとそれなりに遅い。
というわけでこれらの結果をキャッシュしたいが、どうやるか、というのを検討したメモ。
キャッシュのキー
ルート検索であれば、スタート地点・ゴール地点の緯度・経度を、
let source = MKPlacemark(coordinate: srcCoord)
let destination = MKPlacemark(coordinate: destCoord)
let request = MKDirections.Request()
request.source = MKMapItem(placemark: source)
request.destination = MKMapItem(placemark: destination)
POI検索であれば中心の緯度・軽度と、半径を、
let request = MKLocalPointsOfInterestRequest(center: coordinate, radius: radius)
検索の入力として指定する。
つまりこれらの結果をキャッシュする際には、緯度・経度の座標情報をキャッシュのキーとして保存することになる。(POIの場合は半径も)
緯度・経度を表す型
MapKit / Core Location においてこの座標情報をあらわす型である `CLLocationCoordinate2D` は、緯度・経度を `CLLocationDegrees` 型で持つわけだが、
public struct CLLocationCoordinate2D {
public init()
public init(latitude: CLLocationDegrees, longitude: CLLocationDegrees)
public var latitude: CLLocationDegrees
public var longitude: CLLocationDegrees
}
この実態は Double 型となっている。
public typealias CLLocationDegrees = Double
で、何がいいたいかというと、位置の座標をキャッシュキーとして保存する際に、Double型の精度は必要ないよね?という話。
たとえばDoubleをフル精度でキャッシュキーとして用いるとすると、 `139.55372748` と `139.55372747` のように、数値が 0.00000001 違うだけでも、キャッシュヒットさせずに再検索することになってしまう。
緯度・経度の数値における誤差
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/