Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
実践:GeoKit と iPhone で作る位置情報アプリケーション(後編) - Cirius Lab. ブログ
[go: Go Back, main page]

実践:GeoKit と iPhone で作る位置情報アプリケーション(後編)

本記事は、WEB+DB PRESS Vol. 57 内の特集、「スマートフォンでもケータイでも![速習]位置情報サービス」のボツ原稿をリライトしたものです。
特集の方では、この原稿の代わりに、PostGIS をふんだんに使った実践編を書き下ろしました。その他にも、ケータイ/スマートフォン向けに位置情報アプリケーションを作るための情報が盛り込まれた特集になっています。詳細については前のエントリをご確認ください。

※DB+PRESS 掲載前のボツ原稿のため、細かい部分の推敲はできておりません。ソースコード等におかしなところがあったらツイッターアカウントhal_skまで教えていただければ幸いです。

前編はこちら→実践:GeoKit と iPhone で作る位置情報アプリケーション (前編)
中編はこちら→実践:GeoKit と iPhone で作る位置情報アプリケーション (中編)

現在地を表示する

さて、あと一息です。今度は、ユーザの現在地を自動的に取得して、その周辺の地図を表示するように変更しましょう。
ユーザの現在地を取得するには、ClLocationManager と CLLocationManagerDelegate プロトコルを利用します。CoreLocation フレームワークは既に import していますので、RootViewController に実装をしてみましょう。
RootViewController に、CLLocationManager 用の変数を追加し、CLLocationManagerDelegate を宣言します。

RootViewController にて、 CLLocationManager を有効にします
RootViewController.m

CLLocationManager の、startUpdatingLocation が呼ばれたため、位置が取得できたあとに delegate の locationManager メソッドが call されます。対応するメソッドを RootViewController に追加します。

RootViewController.m

ビルドして実行すると、現在地の近くのスポット一覧が表示されたと思います。
よく見ると地図から元のリスト戻れません。戻れるようにしておきましょう。 navigationItem のタイトルを設定するだけで、ナビゲーションバーが使えるようになります。

RootViewController.m
3-2-5-1.png

Pin から詳細画面へのリンクを作成する

せっかくURLを持っているので、Pin から詳細画面へ飛べるようにしておきましょう。 MapAnnotation に URL プロパティを持たせます。

MapAnnotation.h
MapAnnotation.m
WaiwaiMapViewController の loadAnnotaions で、先程追加したURLプロパティを更新します。
WaiwaiMapViewController.m

ピンをクリックした際に表示されるフキダシ(Callout と呼びます)をカスタマイズするためには、MKMapViewDelegate を実装する必要があります。 したがって、WaiwaiMapViewController に MKMapViewDelegate を定義します。

WaiwaiMapViewController.m
vieDidLoad で、MKMapView の delegate に自分を登録します。
View を返却するメソッドを実装します。
WaiwaiMapViewController.m

以上で、Callout の右側にボタンが表示されるようになりました。しかし、クリックしても何もおきません。 同じく MKMapViewDelegate の mapView: annotationView: calloutAccessoryControlTapped: を実装することでクリックした際の処理を実装できます。

WaiwaiMapViewController.m
3-2-6-1.png3-2-6-2.png

この例では Safari のブラウザを開いていますが、アプリケーションが一旦閉じてしまうのであまり動作的にはあまり良くありません。UIWebView を使って内部のブラウザを開く方が良いと思いますが、本稿のテーマと外れるので割愛します。

完成

さて、いかがでしたでしょうか。/map/add にいくつかマップをロードしてみると、リストにも反映されるはずです。

3-2-7-1.png

実は、今回のように40件程度のデータであれば RSS から直接データを取得して、iPhone側で全件表示してしまっても実装することができます。しかし、データが大量にある場合は全て iPhone 側でやるのは重たくなってしまいます。データ件数が多い場合は特に、サーバ側で処理するのが適切でしょう。
また、GeoKit には、他にもジオコーディングの機能(緯度経度と住所を変換する機能)や、距離を計算する機能も備わっています。

もちろん位置情報アプリケーションを作るには、GeoKit 以外の選択肢もありえます。今回データベースに利用した PostgreSQL には、PostGIS という 空間情報を扱うことができるエクステンションがあります。この拡張を利用することで、より複雑な検索を行うことができるようになります。例えば、GeoKit では単純な範囲検索しかできないのに対し、PostGIS を利用することでポリゴンで範囲を指定して検索を行うことが可能となります。また、データ件数が大量にある場合も、空間インデックスを利用できるので検索速度を向上させることが可能です。
また、座標系の変換や、面積や距離、交差判定などの空間演算、KML と SVG の変換といった処理も行うことができます。
PostGIS の機能を Rails から利用する場合、GeoRuby という Plugin を利用することができます。 PostGISについては、WEB+DB PRESS の特集に詳しく書かせていただきました。

いかがでしたでしょうか。位置情報アプリケーション作りって本当にいいものですね。何か作ったらぜひジオメディアサミットで発表してください。7月30日(金)には、

トラックバック(0)

このブログ記事を参照しているブログ一覧: 実践:GeoKit と iPhone で作る位置情報アプリケーション(後編)

このブログ記事に対するトラックバックURL: http://lab.cirius.co.jp/blog/cgi-bin/mt-tb.cgi/63