見出し画像

【MapKit】 ルート検索・POI検索のキャッシュ戦略 - その1. 必要な位置情報の精度を決定する

MapKitのルート検索・POI検索結果をキャッシュしたい。

モチベーションは、一般的なキャッシュと同じく、呼び出し回数を減らしたいのと、高速化

MKDirectionsを用いたルート検索では、1分間での呼び出し回数が50回を超えると `loadingThrottled` エラーが発生する。

Throttled "Directions" request: Tried to make more than 50 requests in 60 seconds, will reset in 37 seconds - Error Domain=GEOErrorDomain Code=-3 "(null)" UserInfo={details=(
    {
        intervalType = short;
        maxRequests = 50;
        "throttler.keyPath" =         "app:com.shu223.SanpoNavi/0x20200/short(default/any)";
        timeUntilReset = 37;
        windowSize = 60;
    }
), requestKindString=Directions, timeUntilReset=37, requestKind=512}

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 違うだけでも、キャッシュヒットさせずに再検索することになってしまう。

緯度・経度の数値における誤差

ここから先は

426字
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/