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 で作る位置情報アプリケーション (後編)

それでは、早速 iPhone で動作する位置情報アプリケーションを作ってみましょう。

Yahoo!ワイワイマップでは、色々なユーザーがPOI情報を共有してオリジナルのマップを作成しています。 今回は、この中から好きなマップを選んで、iPhone の地図上で検索や表示ができるようにしてみます。

利用する主な技術
クライアント:
・iPhone App (Objective-c)
・MapKit

サーバ
・Ruby on Rails
・GeoKit
・PostgreSQL

まずは、サーバ側の設定を行いましょう。今回は、Ruby on Rails でシステムを作成します。 検証の環境には、Ubuntu-8.04-Japanese を利用しました。

サーバアプリケーションの作成

Ruby on Rails のインストール

まずは、ワイワイマップのデータを、自分のサーバ上で検索可能にするためのサーバをセットアップします。データベースには、のちの PostGIS のインストールを考慮して PostgreSQL を採用しましたが、ポリゴンデータなどの空間情報を利用した検索が必要なければ、MySQL でも問題はありません。(今回の記事では、空間情報検索は行ないません。PostGISの詳細についてはWeb+DB PRESS側をご確認ください。)

$ sudo apt-get install postgresql

インストールすると、postgres ユーザが作成されます。パスワードを設定しましょう。

$ sudo passwd postgres
Ruby 、Apache をインストールします。
$ sudo apt-get install ruby-full build-essential
$ sudo apt-get install apache2 apache2-mpm-prefork apache2-prefork-dev
Rubygems をインストールし、PATHを通します。
$ sudo apt-get install rubygems
$ export PATH=/var/lib/gems/1.8/bin:$PATH
Gem をアップデートします。
$ sudo gem update --system
/usr/bin/gem を修正します。
$ vi /usr/bin/gem

Gem.manage_gems
の行を
#Gem.manage_gems
に変更し、以下の行を追加

require 'rubygems'
require 'rubygems/gem_runner'
#Gem.manage_gems
参考:http://www.videc.at/2009/04/30/rubygems-undefined-method-manage_gems-for-gemmodule-nomethoderror/

Ruby on Rails をインストールします。
$ sudo gem install rails
Postgres 用アダプタをインストールします。
$ sudo gem install pg

アプリケーション環境のセットアップ

DB上にユーザを作成します。
$ sudo su - postgres
$ createuser -P waiwaiview
Rails のアプリケーションの初期化をします。
$ cd ~/Documents/webapps/
$ rails waiwaiview -d postgresql    # DB に Postgres を指定
$ cd waiwaiview
GeoKit プラグインのインストールを行います。
$ sudo apt-get install git-core
$ script/plugin install git://github.com/andre/geokit-rails.git
environment.rb を修正し、geokit を利用できるようにします。 以下の行を Rails::Initializer.run ブロックの中に追加します。
config.gem "geokit"
GeoKit をインストールします。
$ sudo rake gems:install
$ sudo gem install geokit
DB を作成しましょう
$ createdb waiwaiview_development
config/database.yml を編集して、DB接続のための定義を追加します。
アプリケーションの起動を確認してみます。 http://localhost:3000/ をブラウザで開くと、Rails の初期画面が開きます。

アプリケーションの作成

それでは、ワイワイマップのデータを格納するためのモデルを作成します。 ワイワイマップでは、マップのPOI情報をRSSで提供しています。今回はこのデータを取り込んで、検索できるようにすることとします。

http://waiwai.map.yahoo.co.jp/

今回は、「幕末維新を歩く」マップを選択してみます。 http://waiwai.map.yahoo.co.jp/map?mid=vb3zf6HEm9whRdlD08NsDw9pEecHGsrUrSU-

本当は全件取れるといいのですが、どうも最新の40件しか表示されないようです。 今回はサンプル用なので、この40件を対象とします。

取得したいマップの右上に、RSS というリンクがありますので、そこの URL を表示してみます。 http://waiwai.map.yahoo.co.jp/rss/map/index.xml?mid=vb3zf6HEm9whRdlD08NsDw9pEecHGsrUrSU- 中身は、このようになっています。

まずは、このデータを格納するモデルを作成します。
$ ./script/generate model map title:string link:string description:text pub_date:datetime lastbuild_date:datetime image:string 
$ ./script/generate model poi map_id:integer title:string description:text link:string pub_date:datetime latitude:decimal longitude:decimal 
migration を実行します。
$ rake db:migrate
(in /home/hal/Documents/webapps/waiwaiview)
==  CreateMaps: migrating =====================================================
-- create_table(:maps)
NOTICE:  CREATE TABLE will create implicit sequence "maps_id_seq" for serial column "maps.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "maps_pkey" for table "maps"
   -> 0.0505s
==  CreateMaps: migrated (0.0510s) ============================================

==  CreatePois: migrating =====================================================
-- create_table(:pois)
NOTICE:  CREATE TABLE will create implicit sequence "pois_id_seq" for serial column "pois.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "pois_pkey" for table "pois"
   -> 0.0219s
==  CreatePois: migrated (0.0220s) ============================================
model 間の関連を定義し、poi モデルを緯度経度で検索できるようにします。

acts_as_mappable によって、 longitude 及び latitude を使って、空間検索ができるようになります。

早速検索をしてみたいところですが、まずはデータが必要です。 controller に RSS の URL をパラメータで与えると、上記のモデルに展開する controller を作ります。

$ ./script/generate controller map
/map/add?url=#{rss のurl} で、データを登録できるように、./app/controllers/map_controller.rb を編集します。
これで、
http://#{サーバのアドレス}/map/add?url=http://waiwai.map.yahoo.co.jp/rss/map/index.xml?mid=vb3zf6HEm9whRdlD08NsDw9pEecHGsrUrSU-
にアクセスしてみると、map 及び poi データをDBへ登録し、登録後の map ID を出力するようになりました。

さて、登録されたデータから、現在地の近くのPO情報を検索できるようにします。 input は map id と緯度経度です。

'http://#{サーバのアドレス}/map/search/#{id}?ll=#{緯度経度}' にアクセスすると、与えられた緯度経度の周辺のデータを返却するようにメソッドを作りましょう。 map_controller.rb に以下のメソッドを追加します。

これで、与えられた緯度経度から、10マイル内にあるスポット情報を JSON 形式で返却するスクリプトが完成しました。 実際に http://192.168.1.30:3000/map/search/1?ll=35.647401,139.716911 にアクセスした結果は以下のようになります。 (35.647401,139.716911 は渋谷駅の緯度経度です)

さて、あとは、インポート済のマップの一覧を出力するメソッドも作っておきましょう。
これだけでOKです。 以上でサーバ側の設定は完了です。 次は、iPhone クライアントの作成に続きます。

トラックバック(0)

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

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