From 044a2692273fbd227c43619277f80b41ee8428b3 Mon Sep 17 00:00:00 2001 From: morimoto Date: Sun, 28 Dec 2008 15:26:03 +0000 Subject: [PATCH] added maps.google.com as alternate rgeocode server --- lib/Keitairc/Config.pm | 4 +- lib/plugins/00location_receiver | 122 ++++++++++++++------------- lib/templates/default/location_receiver.html | 2 - 3 files changed, 66 insertions(+), 62 deletions(-) diff --git a/lib/Keitairc/Config.pm b/lib/Keitairc/Config.pm index 9f9138d..009523e 100644 --- a/lib/Keitairc/Config.pm +++ b/lib/Keitairc/Config.pm @@ -1,6 +1,6 @@ # -*- mode: perl; coding: utf-8 -*- # Keitairc::Config -# $Id: Config.pm,v 1.22 2008-08-03 13:33:39 morimoto Exp $ +# $Id: Config.pm,v 1.23 2008-12-28 15:26:03 morimoto Exp $ # $Source: /home/ishikawa/work/keitairc/tmp/keitairc/lib/Keitairc/Config.pm,v $ # # Copyright (c) 2008 Jun Morimoto @@ -40,6 +40,7 @@ sub new{ smtp_server smtp_from smtp_to debug use_iui version daemonize pid_dir pid_file template_dir plugin_dir public_dir + rgeocode_server reverse_message reverse_recent reverse_unread) ); @@ -71,6 +72,7 @@ sub new{ $me->use_iui(0); $me->mobile_fontsize(-1); $me->follow_nick(1); + $me->rgeocode_server('refits'); $me->debug(0); if(-r '/etc/keitairc'){ diff --git a/lib/plugins/00location_receiver b/lib/plugins/00location_receiver index e154bae..eaaec5b 100644 --- a/lib/plugins/00location_receiver +++ b/lib/plugins/00location_receiver @@ -1,9 +1,9 @@ # -*- 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" @@ -12,21 +12,74 @@ use Net::HTTP; 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{ @@ -87,7 +140,6 @@ $plugin = { 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))); # 測地系 @@ -131,15 +183,7 @@ $plugin = { } 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); @@ -149,10 +193,6 @@ $plugin = { $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); } @@ -179,15 +219,7 @@ $plugin = { } 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); @@ -197,10 +229,6 @@ $plugin = { $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); } @@ -216,15 +244,7 @@ $plugin = { $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); @@ -234,10 +254,6 @@ $plugin = { $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); } @@ -259,15 +275,7 @@ $plugin = { ($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); @@ -277,10 +285,6 @@ $plugin = { $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); } diff --git a/lib/templates/default/location_receiver.html b/lib/templates/default/location_receiver.html index d296e61..d02650c 100644 --- a/lib/templates/default/location_receiver.html +++ b/lib/templates/default/location_receiver.html @@ -34,8 +34,6 @@
- WGS84: ,
- Tokyo: ,

-- 2.11.0