実践:GeoKit と iPhone で作る位置情報アプリケーション(前編)
特集の方では、この原稿の代わりに、PostGIS をふんだんに使った実践編を書き下ろしました。その他にも、ケータイ/スマートフォン向けに位置情報アプリケーションを作るための情報が盛り込まれた特集になっています。詳細については前のエントリをご確認ください。
※DB+PRESS 掲載前のボツ原稿のため、細かい部分の推敲はできておりません。ソースコード等におかしなところがあったらツイッターアカウントhal_skまで教えていただければ幸いです。
中編はこちら→実践:GeoKit と iPhone で作る位置情報アプリケーション (中編)
後編はこちら→実践:GeoKit と 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
- Cirius Lab.内リンク
- ラボトップ
- Geo Platform API
- ジオメディアサービス
- 最近のブログ記事
- スマートフォン勉強会で、iPhone のバックグラウンド測位についてお話しました。
- 第6回ジオメディアサミット開催いたしました。
- 実践:GeoKit と iPhone で作る位置情報アプリケーション(後編)
- 実践:GeoKit と iPhone で作る位置情報アプリケーション(中編)
- 実践:GeoKit と iPhone で作る位置情報アプリケーション(前編)
- WEB+DB プレスで、位置情報サービスの特集を書きました
- 7/30(金) ジオメディアサミット名古屋
- 機は熟した。ジオメディアが今熱い:第5回ジオメディアサミット開催しました。
- 第5回ジオメディアサミット、ライトニングトーク登壇者決定!
- 第5回ジオメディアサミットライトニングトーク枠争奪バトル