iOSのAPIで位置から名前を取得したかったのだが・・・


ご無沙汰です、代表です。
今年の頭くらいから暇を見てGPSを使ったiPhoneアプリ開発をしていたのですが、ここに来て完全に行き詰まってしまいました。
やりたかったことは自分が居た場所を記録して一つのテキストを組み上げる、というものです、ある種の
自動日記、
だと思ってもらえれば分かりやすいかと思います。

位置情報を電池の消費を抑えつつ記録し、地図上に軌跡を描画する、などは雑作なく実装できます。
しかし、そのトラッキング情報を文章にするには「場所の名前」が必要です。
例えばGPSから取得した位置情報から”〇〇市〇〇町〇〇番地の◯”なんていう情報は簡単に取得できますが、欲しいのは住所ではなく、”〇〇町児童公園”とか、”イオンモール〇〇”、”ファミリーマート〇〇店” のような場所の名前なわけです。

まずは何の疑いも持たずCLGeocoderクラスを使ってみました。
普通に出来そうに見えたのです。
reverseGeocodeLocationメソッドで住所を取得すれば、areasOfInterestプロパティで名前が分かる、と踏んだのですが、areasOfInterestには全く値が入りません。
それどころか、ocean, inlandWaterプロパティにも値が入りません、川の中だろうと海の中だろうと。
宮崎県だからでしょうか?東京だと違うのでしょうか?
つまりAppleのライブラリが情報の取得元としているデータベースに田舎町の情報が乏しい、んじゃないのか?と。
しかし仮にこれが「田舎特有の現象」だったとして、じゃぁ、このアプリは田舎では使えません、なんて理屈は通らないんじゃないのか? ということで、他の方法を探すことにしました。

GooglePlace Apiってのが使えそう、に見えました。
何しろAppleは一旦は自前の地図機能を諦めてGoogleMapを採用したくらいです、そのGoogleの提供するサービスですから、マシな情報が取れるに決まってます。
しかし実際に使ってみるとこれは、宮崎市内のほとんどの座標で「宮崎」という文字列しか返しません。
地図上には沢山の店舗や病院、学校、その他の施設がひしめいているというのに。
ひどすぎるじゃぁないですか・・・
どうやらGooglePlace Apiで場所の名前を取得しようとすると、ある種の「口コミ情報」データベースから検索してくるようです。
相対的に情報の投稿者が少ない田舎では使えません。

最後にもう一度Apple謹製のAPIに戻ってきました。
MKLocalSearch クラスです。
これは「指定の座標の近くにある、場所の名前を検索」するというものです。
CLGeocoderクラスと違って、正方向(正攻法)の検索方法ではありません。
例えば近くのお店を探したければ、

let req = MKLocalSearchRequest()
req.naturalLanguageQuery = "store"
req.region = MKCoordinateRegionMakeWithDistance(coordinate, 100, 100)
let search = MKLocalSearch(request: req)
search.start(.....)

のように、”store”という文字列を渡せば近くのお店を探してくれます。
サンプルプログラムを書いて実行してみたところ、近所のコンビニの名前がずらずらと表示されます。
これは!もしかしたら使えるかも!

要するに、思いつく限りの「場所の種別」を与えて帰ってきた情報から、距離の一番近い情報を選択して採用すればいいのです。
少しばかり負荷と時間がかかるかもしれませんが、この検索処理は1日に一回の処理だから大丈夫、と思いました。

とりあえず、以下のようなリストを作り、それぞれで検索しようと考えました、これくらいあればほぼ網羅出来るんじゃないか?俺は天才か? なんて思いました。

    static let searchlist = [
        "bridge",
        "factory",
        "building",
        "park",
        "shop",
        "center",
        "library",
        "school",
        "company",
        "lake",
        "river",
        "clinic",
        "store",
        "restaurant",
        "apart",
        "zoo",
        "amusement",
        "highway",
        "airport",
        "port",
        "station",
        "bus"
    ]

ところが、実際にGPSのトラッキングデータから名称の取得処理を流してみると、これが駄目だという事が判ってしまいました。

問題点は、

  1. 範囲指定がほとんど効かない、宮崎市内の座標100m四方範囲で検索しても東京の場所を返してくる。
  2. GooglePlace APIよりはマシだが、やっぱり地方の情報が少ない、近くのあからさまな場所の名前が取得できないのに、東京の場所の名前が返ってくる。

一通り検索するのにものすごく時間が掛かるのに、使えるデータは返ってこない、という、もう絶望的な状況です。

一番重要な機能が今頃になって実装不能なことが判ってきて頭を抱えてしまっておるという次第です。
解決方法は思いつくのでしょうか?・・・