開発合宿で作ったアプリをリリース && 地名から緯度経度を取得するAPIの比較
5月の連休中に、友人と温泉旅館でswift開発合宿をしました。
そこで作ったアプリを少しずつ肉付けして、本日ようやくAppleの審査を通過してリリースできました。
作ったアプリ: どこでも展望台
アプリ説明用画像
どこでも展望台について
アプリ「どこでも展望台」は、画像を見てもらえばだいたいわかると思いますが、 登録したランドマークの方角と距離をARで表示するアプリです。
主に展望台あっちに富士山が見えるはず・・・みたいな時に利用することを想定しています。
無料なのでぜひ使ってみてくださいね!
このアプリでは、サイドメニューから地名を入力してランドマークを登録するのですが、 この地名→緯度経度を取得するところで結構右往左往してしまいました。
ということで今回は、どこでも展望台を開発する家庭で得られた 地名から緯度経度を取得するAPIの比較について紹介します。
地名からの緯度経度情報を取得方法の検討
結論から先にいうと、Google Maps APIのPlaces API Web Serviceを使うのが一番よいです。
以下、検討の詳細です。
ジオコーディングと逆ジオコーディング
「地名 緯度経度 取得」みたいなクエリでググると、 ジオコーディングと逆ジオコーディングなるものがあることがわかりました。
ざっくりいうと
- ジオコーディング: 住所→緯度経度の変換
- 逆ジオコーディング: 緯度経度→住所の変換
のことです。
今回は、ジオコーディングっぽいですが、住所ではなく地名を直接緯度経度に変換することが目的です。
今回扱う地名→緯度経度の変換の名称は結局わからないままでした。
地名→緯度経度の変換方法
今回は、swiftでiosアプリを作ることを前提としています。また、お金は出したくないです。
この制約の下で使える地名→緯度経度の変換方法について以下の4つを検討しました。
※ 順番は検討した順番
比較した内容
検討では、以下の観点について比較を行いました。
※ 何れも2016/06/09時点の比較です
また、性質の違いがわかりやすいクエリとして、「東京タワー」「富士山」「六本木一丁目駅」「ランドマークタワー」の結果も記載します。
(結果自体をのせるのはダメっぽいので成功・失敗についてのみ記載)
結果
概要
方法 | カバレッジ・精度 | APIの制限 | 備考 |
---|---|---|---|
Geocoding API | ○ | 5秒に1回以上のアクセスはNG | 1クエリに対して1Result。 レスポンスがやや遅い(3〜5秒) |
CLGeocoder | ✕ | 制限はあるが具体的な数値は書いてない | - |
YOLP コンテンツジオコーダAPI | ✕ | 1日50000回以下(実際は不明?) | - |
Google Maps API | ○ | 1日100回。ただしクレカ登録で1日15000回までUP | クレカ登録ではお金は発生しない |
詳細
Geocoding API
- APIのトップに仕様・利用規約が書かれています
- 裏でGoogle Maps APIを叩いている?ので精度はかなり良いようです。
- 5秒に1回以上のアクセスは禁止しています。
地名→緯度経度の変換例
クエリ | 成功 or 失敗 | 備考 |
---|---|---|
東京タワー | ○ | - |
富士山 | ○ | - |
六本木一丁目駅 | ○ | - |
ランドマークタワー | ○ | - |
CLGeocoder
- 純正のジオコーダ。基本iphone限定になってしまう。
- 精度はかなりイマイチな感じ。今後に期待。
- API制限についてはドキュメントに以下のように記載されています。
Geocoding requests are rate-limited for each app, so making too many requests in a short period of time may cause some of the requests to fail.
地名→緯度経度の変換例
クエリ | 成功 or 失敗 | 備考 |
---|---|---|
東京タワー | ○ | - |
富士山 | ○ | - |
六本木一丁目駅 | ✕ | 麻布十番一丁目がHIT |
ランドマークタワー | ✕ | HITしない。 「横浜ランドマークタワー」ならHIT |
YOLP コンテンツジオコーダAPI
- 住所検索とランドマークの検索ができる
- YOLPの「ランドマーク」に定義されていないもの(山など)は取れない?
- 利用制限については、APIの合計で50000回 && API単体制限回数があるとのことですが、 コンテンツジオコーダ自体のAPI制限についての記載は見当たりませんでした。
クエリ | 成功 or 失敗 | 備考 |
---|---|---|
東京タワー | ○ | - |
富士山 | ✕ | 富士山駅がHIT |
六本木一丁目駅 | ✕ | 六本木駅がHIT。 |
ランドマークタワー | ✕ | HITしない。 「横浜ランドマークタワー」だと横浜駅がHIT |
Google Maps API
- 安心と信頼のGoogle Map API
- 制限については、Google Maps APIとして24hあたり1000回ですが、 クレジットカードを登録して本人確認を行えば150000回まで増えます。
- ただし、テキスト検索(地名で検索)する場合にはAPI 10回分消費するので、実質1日15000回。
使用制限は、Google 周辺検索サービスと Google プレイス テキスト検索サービスとで共通ですが、テキスト検索サービスには 10 倍の乗数が適用されます。つまり、テキスト検索リクエスト 1 回で、リクエスト 10 回分の割り当て量を使用することになります。Google Maps API for Work の契約の一部として Google Places API を購入した場合、乗数は異なります。詳しくは、Google Maps API for Work のドキュメントをご覧ください。
クエリ | 成功 or 失敗 | 備考 |
---|---|---|
東京タワー | ○ | - |
富士山 | ○ | - |
六本木一丁目駅 | ○ | - |
ランドマークタワー | ○ | - |
考察
地名から緯度経度情報が欲しい時、最低限の精度を満たすのは、Geocoding APIかGoogle Maps APIだと思います。
ただし、Geocoding APIは元データがGoogle Maps APIですし、 大量のAPI利用はできないので、普通にGoogle Maps APIを使っておけば良さそうです。
結論
地名から緯度経度情報がほしい時は、今のところGoogle Maps API一択で良いと思います。
何れの方法を使うにしても、必ず利用規約をよく読んで正しく使いましょう。
私の場合は、Google Maps APIに以下の制限があるのに後で気づいて実装やり直しが何回か発生してしまいました。。