職人が教える!iOSアプリ開発で使いこなしたいとっておきのOSS

第6回iOS6のApple製マップに、Googleマップをオーバーレイするライブラリ/フレームワーク

【10/10追記】

本記事で紹介しているGoogleMapsOverlayiOSは、現在のコードではGoogleマップのタイル画像に直接アクセスする方法をとっているため、Google Mapsの規約に抵触しています。プロダクトには使用せず、あくまで参考の範囲に止めていただくようご注意ください。
⁠きし様、けい様、コメント欄でのご指摘どうもありがとうございました)

はじめに

米国時間9月19日、待望の「iOS 6」がリリースされました。Passbookや、Facebookとの統合など、いくつかの注目の新機能がある中、もっとも話題をさらったのは、⁠新マップの出来の悪さ」ではないでしょうか。データが少ない、場所が間違っている、ダブりがある、といった批判が世界中から寄せられていました。

このApple謹製マップによる影響は、iOS6でMapKitフレームワークを使用するすべてのアプリに及びます。ナビゲーション系や、現地配達系など、地図の精度がコア機能に密接に関係するアプリにとっては由々しき事態です。

今回は、そんな iOS6のマップに、Google Maps APIから取得した地図をオーバーレイするライブラリ/フレームワークを2つ紹介します。

GoogleMapsOverlayiOS

概要

Google Maps APIから取得した地図を、 iOS 6のマップにオーバーレイするライブラリです。

図1 iOS 6の地図とGoogleマップの比較
図1 iOS 6の地図とGoogleマップの比較

図1左がiOS 6でMapKitを普通に使用した場合(横浜駅がありません…⁠⁠、右がiOS 6でMapKitを使用しつつGoogleMapsOverlayiOSでオーバーレイさせた場合のスクリーンショットです。

このように、iOS 6でMapKitを使用している場合でも、Google Mapsの地図を表示することができるようになります。

使い方

(前提として、MKMapViewを用いた地図表示の実装は完了しているものとします)

1.ソースコードを以下のURLよりダウンロード
2.TileOverlayとTileOverlayViewをプロジェクトに追加

TileOverlay.h, TileOverlay.m, TileOverlayView.h, TileOverlayView.m の4つのファイルをプロジェクトに追加します。

3.ヘッダをインポート
#import "TileOverlay.h"
#import "TileOverlayView.h"
4.TileOverlay のプロパティを宣言
@property (nonatomic, strong) TileOverlay *overlay;
5.TileOverlayをMKMapViewにオーバーレイ

TileOverlayオブジェクトを生成してMKMapViewオブジェクトにオーバーレイします。

self.overlay = [[TileOverlay alloc] initOverlay];
[self.mapView addOverlay:self.overlay];

MKMapRect visibleRect = [self.mapView mapRectThatFits:self.overlay.boundingMapRect];
visibleRect.size.width /= 2;
visibleRect.size.height /= 2;
visibleRect.origin.x += visibleRect.size.width / 2;
visibleRect.origin.y += visibleRect.size.height / 2;
self.mapView.visibleMapRect = visibleRect;
6. mapView:viewForOverlay: メソッドを実装

MKMapViewDelegate の mapView:viewForOverlay: メソッドで、TileOverlayViewを生成し、返します。

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    TileOverlayView *overlayView = [[TileOverlayView alloc] initWithOverlay:overlay];
    overlayView.tileAlpha = 1.0;
    return overlayView;
}

リポジトリには現在地を表示する簡単なデモプロジェクトが入っているので、まずはそちらで挙動を確認してみることもできます。

YAMapKit

概要

前述の GoogleMapsOverlayiOSと同じく Google Maps API を利用するものですが、こちらは「MapKit.frameworkと置き換えてそのまま使える」というコンセプトで開発されています。

2012年9月25日現在では、リポジトリのREADMEに "under construction" とありますが、デモプロジェクトを見ると地図表示やズーム、スクロールなどの基本機能はすでに動作しているようです。

使い方

(前提として、MKMapViewを用いた地図表示の実装まで完了しているものとします)

1.ソースコードを以下のURLよりダウンロード
2.YAMapKitフレームワークをプロジェクトに追加

9月25日現在、リポジトリに入っているYAMapKitフォルダ配下には必要なファイルとそうでないファイルが混在しているので、付属しているYAMapKitプロジェクトを開いてからFrameworkグループをドラッグ&ドロップで自分のプロジェクトにコピーすれば、必要なファイルのみプロジェクトに追加することができます。

YAMapKitプロジェクトのFrameworkグループ
YAMapKitプロジェクトのFrameworkグループ

または、次のようにYAMapKitフォルダ配下から必要なファイルを選別してください。

  • ソースファイル(拡張子.hと拡張子.mのファイル)のみ抽出する
  • main, MKViewController, MKAppDelegateは取り除く
3.CoreLocation.frameworkをプロジェクトに追加
4.MapKit.frameworkをプロジェクトから外す

概要のところで述べた通り、MapKitを「置き換える」コンセプトでつくられたものなので、MapKit.frameworkは不要となります。

以上の手順を踏めば、MapKitで実装したコードがそのまま動き、かつiOS6上でGoogle Mapsの地図が表示されるようになります。

Google Maps APIのライセンスについて

Google Maps API を無料で使用する場合には、次のような使用制限があります。

  • APIごとに1日あたりの地図読み込み回数が最大で25,000回まで
  • スタイル付き地図機能を使用して変更された地図の1日あたりの読み込み回数が最大で2,500回まで

これらの使用制限を超過してGoogle Maps APIを使用する場合には、Maps API Premierライセンスを購入するか、超過分を支払う地図読み込み回数の超過分のオンライン購入価格か、のいずれかの対応が必要になります。

これらの利用規約や使用制限については、Googleのデベロッパ向けサイトにわかりやすくまとめられています。

まとめ

iOS 6のApple製マップをGoogle Mapsで代替できるライブラリ/フレームワークを2種紹介しました。

それぞれ効用は似ていますが、MKMapViewにオーバーレイ、MapKitフレームワークごと置き換え、と実現方法が大きく異なります。

「MKMapViewだけGoogleの地図に置き換えたい」という場合はGoogleMapsOverlayiOSを、⁠MapKitの機能を色々使いたいけどAppleのじゃなくGoogleのを使いたい」という場合はYMMapKitを、といったようにご利用になるケースに応じて適した方をご検討ください。

またApple製のマップも、まだリリースされたばかりのものなので、これからどんどん改善されていくと思います。こちらの今後にも期待していきましょう!

おすすめ記事

記事・ニュース一覧