OSDN Git Service

added maps.google.com as alternate rgeocode server
authormorimoto <morimoto@180c8125-5b33-4295-ad04-72a68a15b4cc>
Sun, 28 Dec 2008 15:26:03 +0000 (15:26 +0000)
committermorimoto <morimoto@180c8125-5b33-4295-ad04-72a68a15b4cc>
Sun, 28 Dec 2008 15:26:03 +0000 (15:26 +0000)
lib/Keitairc/Config.pm
lib/plugins/00location_receiver
lib/templates/default/location_receiver.html

index 9f9138d..009523e 100644 (file)
@@ -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 <morimoto@mrmt.net>
@@ -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'){
index e154bae..eaaec5b 100644 (file)
@@ -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);
                }
index d296e61..d02650c 100644 (file)
@@ -34,8 +34,6 @@
        <input type="hidden" name="stamp" value="<!-- tmpl_var stamp -->" />
        <input type="submit" accesskey="1" value="[1] \94­\8c¾"><br />
       </form>
-      WGS84: <!-- tmpl_var wx -->, <!-- tmpl_var wy --><br />
-      Tokyo: <!-- tmpl_var tx -->, <!-- tmpl_var ty --><br />
     </tmpl_if>
 
     <hr />