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

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

この記事を読むのに必要な時間:およそ 2 分

【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;
}

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

著者プロフィール

堤修一(つつみしゅういち)

1978年生まれ。京都大学工学部を卒業後,同大学院修了。その後,NTTデータにて音声認識技術の研究開発,キヤノンにて画像処理機能の設計に携わる。

2010年より面白法人カヤックに入社。3年間ほぼiOSアプリ開発に専念し,フルスクラッチで開発しリリースしたアプリは30本以上。代表作は150万ユーザを突破した「バウンドモンスターズ」,AppStore Best of 2012を獲得した「タップ忍者」,カンヌ国際広告祭でブロンズを獲得した「Domino's App」など。

現在は,米国シリコンバレーのマウンテンビューにあるAppSocially社の一員として活躍中。

著書=『iOSアプリ開発 達人のレシピ100―開発現場で実証された実用コード集』

ブログ=Over&Outその後

Github=shu223

Twitter=shu223

コメント

  • 御礼

    きし様
    けい様

    ご指摘の通り、GoogleMapsOverlayiOSの実装は規約に抵触していたため、その旨を記事冒頭に追記させていただきました。コメントどうもありがとうございました!

    Commented : #3  堤 (2012/10/10, 21:46)

  • Re:

    https://developers.google.com/maps/erms?hl=jaの9.1.2 a に、ひっかかるのでライセンス違反なのでは?

    Commented : #2  けい (2012/10/10, 00:07)

  • 規約違反のライブラリを紹介してはいけません

    タイル画像のみダウンロードする手の実装はGoogle Maps APIの規約違反です。ちゃんとソースは確認しましたか?無責任ですよ。

    Commented : #1  きし (2012/10/04, 23:26)

コメントの記入