Google Maps Component for iOS の CoordinateBounds について

すごくニッチな話ですけど、Xamarin Components にある Google Maps を Xamarin.iOS で使った。

このライブラリの中に CoordinateBounds という「領域」を表すクラスがある。これは GMSCoordinateBounds の Binding だ。

で、CoordinateBounds には Including (includingCoordinate) というメソッドがあって、これを呼ぶと指定した座標が入るように領域を拡幅してくれる、便利だ。

で、最初はこのクラスをこう使っていた。

var bounds = new CoordinateBounds();
bounds.Including(new CLLocationCoordinate2D(34d, 134d));
bounds.Including(new CLLocationCoordinate2D(33d, 133d));
bounds.Including(new CLLocationCoordinate2D(35d, 135d));

動かしてみて、この使い方だと bounds から期待した結果が得られないことに気づいた。範囲が -180〜+180 になってしまった。

正しくはこう。

var bounds = new CoordinateBounds(
    new CLLocationCoordinate2D(34d, 134d),
    new CLLocationCoordinate2D(33d, 133d));
bounds.Including(new CLLocationCoordinate2D(35d, 135d));

これだと結果は、正しく [33,133 - 35,135] を返す。

処理上、生成時に2つの座標が揃ってないケースだったので、「あ、デフォルトコンストラクタあるじゃん」と使ってたらハマった。本家 iOS 版の方には引数無しの initXXX は無かった。

Objective-C の仕様上 alloc して init しないのを防げない、んだっけ? だから、Xamarin.iOS の Binding でデフォルトコンストラクタを隠せないのかな? 突っ込んで調べてないけど、Binding ライブラリを使う時は注意しましょう、ちゃんと本家のAPIリファレンスを見ましょう、というお話でした。