連載第3回目の今回は、
Geolocation APIを利用する
Geolocation APIとは、
ただし、
位置情報を取り扱うgeolocationオブジェクトは、
- navigator.
geolocation. getCurrentPosition( successCallback , errorCallback , option) - 現在の位置を取得する
- navigator.
geolocation. watchPosition( successCallback , errorCallback , option) - 位置を定期的に取得する
- navigator.
geolocation. clearWatch( watchId) - watchPositionの定期的な位置情報取得を止める
getCurrentPositionとwatchPositionの第一引数には、
position. | 緯度経度などを保持するCordinatesオブジェクト。 |
position. | 位置情報を取得した時刻。 |
緯度経度を保持するCordinatesオブジェクトは、
coords. | 緯度 |
coords. | 経度 |
coords. | 高度 |
coords. | 正確性 |
coords. | 高度の正確性 |
coords. | 方位 |
coords. | 速度 |
getCurrentPositionとwatchPositionの第二引数には、
error. |
エラーコード 1.位置情報の取得が許可されていない 2.位置情報の取得が利用できない 3.タイムアウト |
error. | エラーメッセージ |
getCurrentPositionとwatchPositionの第三引数には、
option. | より高い正確性を求める スマートフォンでこのオプションを指定するとGPSを利用する |
option. | 処理のタイムアウト |
option. | キャッシュされている位置情報オブジェクトを許容するキャシュ時間 |
watchPositionはlong値のidを返します。clearWatch 関数にこのidを渡すと、
Gearsを利用する
Gearsとは、
名前が、
GearsのGeolocation APIを利用するには、
var geolocation = google.gears.factory.create(‘beta.geolocation’);
使い方は、
W3Cの定義から拡張されている内容の一つに、
Gearsを利用すると、
サンプルコード
ブラウザで位置情報を取得して、
ページ内のstartをクリックすると、
サンプルコード解説
13~24行目では、
try {
if(typeof(navigator.geolocation) == 'undefined'){
geolocation = google.gears.factory.create('beta.geolocation');
} else {
geolocation = navigator.geolocation;
}
} catch(e) {}
if (!geolocation) {
alert('位置情報は利用できません');
return;
}
28~40行目では、
50~54行目では、
var option = {
enableHighAccuracy: true,
timeout : 10000,
maximumAge: 0
};
56~59行目は、
function start() {
watchId = geolocation.watchPosition(success, error, option);
$('#controler').attr('value','stop');
}
61~64行目は、
function stop() {
geolocation.clearWatch(watchId);
$('#controler').attr('value','start');
}
66行目では、
$('#controler').toggle(start, stop);
ジオコーディングを利用する
ジオコーディングとは、
ジオコーディングのAPIはいくつか公開されています。代表的なAPIは、
以下に、
#!/usr/bin/env perl
use strict;
use warnings;
use LWP::Simple qw(get);
use Data::Dumper;
use Perl6::Say;
use JSON::XS;
my $url = sprintf "http://maps.googleapis.com/maps/api/geocode/json?sensor=false&language=ja&address=%s", shift;
my $res = get $url;
$res = decode_json $res;
my $results = $res->{results};
foreach my $result (@$results) {
say "----------";
say $result->{formatted_address};
say $result->{geometry}->{location}->{lat} . "," .$result->{geometry}->{location}->{lng};
}
例えば、
% perl geocording.pl 東京都目黒区中目黒2-10-15 ---------- 日本, 東京都目黒区中目黒2丁目10?15 35.6406465,139.7027264
ジオコーディングを利用するとテキストを入力する手間は増えますが、
ジオコーディングの限界
住所や地名から緯度経度を取得できる便利なジオコーディングですが、
「東京タワー」
また、
しかしながら、
サーバーで位置情報を取得する
取得した位置情報をサービスで利用するには、
はてなココでは、
package Geo::Format::HTTP;
use strict;
use warnings;
our $VERSION = '1.0';
use Exporter::Lite;
our @EXPORT = qw(
get_location_from_req
);
sub get_location_from_req ($) {
my $req = shift;
no warnings 'uninitialized';
my ($lat, $lon);
if (my $pos = $req->param('pos')) {
# Softbank
$pos =~ /^([NS])([0-9]+)\.([0-9]+)\.([0-9]+)\.(?:[0-9]+)([EW])([0-9]+)\.([0-9]+)\.([0-9]+)\.(?:[0-9]+)$/;
$lat = $2 + ($3 / 60) + ($4 / 60 / 60);
$lat *= -1 if $1 eq 'S';
$lon = $6 + ($7 / 60) + ($8 / 60 / 60);
$lon *= -1 if $5 eq 'W';
} elsif (my $ll = $req->param('ll')) {
my @latlon = split ',' , $ll;
$lat = $latlon[0] || 0;
$lon = $latlon[1] || 0;
} else {
$lat = $req->param('lat') || 0;
$lon = $req->param('lon') || 0;
# Fraction part of second is not support at the moment.
if ($lat =~ /([+-]?[0-9]+)\.([0-9]+)\.([0-9.]+)/) {
# au, docomo (au's non-GPS data does not have leading "+")
$lat = $1 + ($2 / 60) + ($3 / 60 / 60);
} else {
$lat += 0;
}
if ($lon =~ /([+-]?[0-9]+)\.([0-9]+)\.([0-9.]+)/) {
$lon = $1 + ($2 / 60) + ($3 / 60 / 60);
} else {
$lon += 0;
}
}
if ($lat > +90) {
$lat = +90;
} elsif ($lat < -90) {
$lat = -90;
}
if ($lon > +180) {
$lon = +180;
} elsif ($lon < -180) {
$lon = -180;
}
# It returns false values if the position cannot be retrieved from
# $pos.
return ($lat, $lon);
}
1;
上記ファイルをuseすることで、
my ($lat, $lon) = get_location_from_req $request;
これにより、
本当にその場所にいる/いたのか?
位置情報を利用したサービスを提供する場合、
結論からいうと、
携帯電話からのリクエストに話を絞ると、
次回予告
第3回は、
次回は、