# -*- mode: perl; coding: utf-8 -*-
# keitairc/lib/plugins/00location_receiver
# 位置情報送信、のコールバック
-# $Id: 00location_receiver,v 1.13 2008-12-20 12:46:28 morimoto Exp $
+# $Id: 00location_receiver,v 1.14 2008-12-28 15:26:03 morimoto Exp $
# $Source: /home/ishikawa/work/keitairc/tmp/keitairc/lib/plugins/00location_receiver,v $
-
+#
# The line number (1 incremented) and filename below must be
# actual. see perlsyn.
# line 10 "keitairc/lib/plugins/00location_receiver"
use XML::Simple;
use Encode;
+# refits.cgk.affrc.go.jp を使ってgeocode逆変換
# WGS84系を渡すこと
-sub get_rgeocode_xml {
+sub get_rgeocode_refits {
my ($lat, $lon) = @_;
my $s = Net::HTTP->new(Host => 'refits.cgk.affrc.go.jp') || return;
$s->write_request(GET => "/tsrv/jp/rgeocode.php?lat=$lat&lon=$lon");
$s->read_response_headers();
- my $xml;
+ my $xml_code;
for(;;){
my $buf;
my $n = $s->read_entity_body($buf, 1024);
return unless defined $n;
last unless $n;
- $xml .= $buf;
+ $xml_code .= $buf;
+ }
+ my $xml = XMLin($xml_code);
+ if($xml->{status} ne 'true'){
+ return;
}
- $xml;
+ return $xml->{prefecture}->{pname} .
+ $xml->{municipality}->{mname} .
+ $xml->{local}->{section};
+}
+
+# maps.google.com を使ってgeocode逆変換
+# WGS84系を渡すこと
+sub get_rgeocode_google{
+ my ($lat, $lon) = @_;
+ my $s = Net::HTTP->new(Host => 'maps.google.com') || return;
+ $s->write_request(
+ 'GET' => "/maps/geo?oe=utf-8&ll=$lat%2C$lon&output=xml&callback=gmap",
+ 'Accept-Language' => 'ja'
+ );
+ $s->read_response_headers();
+ my $xml_code;
+ for(;;){
+ my $buf;
+ my $n = $s->read_entity_body($buf, 1024);
+ return unless defined $n;
+ last unless $n;
+ $xml_code .= $buf;
+ }
+ my $xml = XMLin($xml_code);
+ if(defined $xml){
+ if(defined $xml->{Response}){
+ if(defined $xml->{Response}->{Placemark}){
+ if(defined $xml->{Response}->{Placemark}->{p1}){
+ return $xml->{Response}->{Placemark}->{p1}->{address};
+ }
+ }
+ }
+ }
+ return;
+}
+
+sub get_rgeocode{
+ my $s;
+ if($::cf->rgeocode_server() eq 'refits'){
+ $s = get_rgeocode_refits(@_);
+ }elsif($::cf->rgeocode_server() eq 'google'){
+ $s = get_rgeocode_google(@_);
+ }else{
+ return;
+ }
+ if(Encode::is_utf8($s)){
+ Encode::_utf8_off($s);
+ }
+ return $s;
}
sub dms_to_degree{
my $p;
$p->{session_id} = $session_id;
$p->{cid} = $cid;
- $p->{stamp} = time;
$p->{channel_compact} = $::ib->simple_escape(encode($::cf->web_charset(), $::ib->compact_channel_name($cid)));
# 測地系
}
my ($tx, $ty) = wgs84_to_tokyo($wx, $wy);
- my $xml_code = get_rgeocode_xml($wx, $wy);
- unless($xml_code){
- $p->{error} = 1;
- $p->{rgeocode_noresponse} = 1;
- return $view->render('location_receiver.html', $p);
- }
-
- my $xml = XMLin($xml_code);
- if($xml->{status} ne 'true'){
+ unless($p->{address} = get_rgeocode($wx, $wy)){
$p->{error} = 1;
$p->{rgeocode_invalid} = 1;
return $view->render('location_receiver.html', $p);
$p->{tx} = $tx;
$p->{ty} = $ty;
$p->{map_image_url} = google_map_image($wx, $wy, 'gif');
- $p->{address} = $xml->{prefecture}->{pname} .
- $xml->{municipality}->{mname} .
- $xml->{local}->{section};
- Encode::_utf8_off($p->{address}) if Encode::is_utf8($p->{address});
Encode::from_to($p->{address}, 'utf8', $::cf->web_charset());
return $view->render('location_receiver.html', $p);
}
}
my ($wx, $wy) = (dms_to_degree($lat), dms_to_degree($lon));
my ($tx, $ty) = wgs84_to_tokyo($wx, $wy);
- my $xml_code = get_rgeocode_xml($wx, $wy);
- unless($xml_code){
- $p->{error} = 1;
- $p->{rgeocode_noresponse} = 1;
- return $view->render('location_receiver.html', $p);
- }
-
- my $xml = XMLin($xml_code);
- if($xml->{status} ne 'true'){
+ unless($p->{address} = get_rgeocode($wx, $wy)){
$p->{error} = 1;
$p->{rgeocode_invalid} = 1;
return $view->render('location_receiver.html', $p);
$p->{tx} = $tx;
$p->{ty} = $ty;
$p->{map_image_url} = google_map_image($wx, $wy, 'png');
- $p->{address} = $xml->{prefecture}->{pname} .
- $xml->{municipality}->{mname} .
- $xml->{local}->{section};
- Encode::_utf8_off($p->{address}) if Encode::is_utf8($p->{address});
Encode::from_to($p->{address}, 'utf8', $::cf->web_charset());
return $view->render('location_receiver.html', $p);
}
$h{lon} =~ s/^%2b//i; # au GPSOneの場合
my ($wx, $wy) = (dms_to_degree($h{lat}), dms_to_degree($h{lon}));
my ($tx, $ty) = wgs84_to_tokyo($wx, $wy);
- my $xml_code = get_rgeocode_xml($wx, $wy);
- unless($xml_code){
- $p->{error} = 1;
- $p->{rgeocode_noresponse} = 1;
- return $view->render('location_receiver.html', $p);
- }
-
- my $xml = XMLin($xml_code);
- if($xml->{status} ne 'true'){
+ unless($p->{address} = get_rgeocode($wx, $wy)){
$p->{error} = 1;
$p->{rgeocode_invalid} = 1;
return $view->render('location_receiver.html', $p);
$p->{tx} = $tx;
$p->{ty} = $ty;
$p->{map_image_url} = google_map_image($wx, $wy, 'png');
- $p->{address} = $xml->{prefecture}->{pname} .
- $xml->{municipality}->{mname} .
- $xml->{local}->{section};
- Encode::_utf8_off($p->{address}) if Encode::is_utf8($p->{address});
Encode::from_to($p->{address}, 'utf8', $::cf->web_charset());
return $view->render('location_receiver.html', $p);
}
($wx, $wy) = (dms_to_degree($wx), dms_to_degree($wy));
my ($tx, $ty) = wgs84_to_tokyo($wx, $wy);
- my $xml_code = get_rgeocode_xml($wx, $wy);
- unless($xml_code){
- $p->{error} = 1;
- $p->{rgeocode_noresponse} = 1;
- return $view->render('location_receiver.html', $p);
- }
-
- my $xml = XMLin($xml_code);
- if($xml->{status} ne 'true'){
+ unless($p->{address} = get_rgeocode($wx, $wy)){
$p->{error} = 1;
$p->{rgeocode_invalid} = 1;
return $view->render('location_receiver.html', $p);
$p->{tx} = $tx;
$p->{ty} = $ty;
$p->{map_image_url} = google_map_image($wx, $wy, 'gif');
- $p->{address} = $xml->{prefecture}->{pname} .
- $xml->{municipality}->{mname} .
- $xml->{local}->{section};
- Encode::_utf8_off($p->{address}) if Encode::is_utf8($p->{address});
Encode::from_to($p->{address}, 'utf8', $::cf->web_charset());
return $view->render('location_receiver.html', $p);
}