#!/usr/bin/perl --
# Geocodeサンプルプログラム by masa
# CSVアドレスマッチングサービス*を利用して、住所から経度緯度に変換します。
# * http://www.tkl.iis.u-tokyo.ac.jp/~sagara/geocode/
# 簡易RESTインタフェースに変換するインタフェースラッパーCGIになっています。
# http://xxx.cgi?addr=(住所)&mode=(測地系)
# 測地系: TKY(日本測地系) or WGS(世界測地系)
#
# 出力形式
#
# 住所
# 経度
# 緯度
# 精度
#
use strict;
use LWP::UserAgent;
use HTTP::Request::Common;
use Jcode;
my %FORM;
&form_decode;
my $addr = $FORM{'addr'};
my $mode = $FORM{'mode'};
$mode = "TKY" if(!$mode);
print << "_EOM_";
Content-Type: text/xml
_EOM_
my $url3 = "http://newspat.csis.u-tokyo.ac.jp/cgi-bin/geocode.cgi";
my $port;
if ($mode eq "TKY" || $mode eq "TD"){
$port = 8600;
}else{
$port = 8800;
}
if($addr){
my $content = $addr;
my $ua = new LWP::UserAgent;
my $req =
POST $url3,
Content_Type => 'form-data',
Content => [
action => 'input',
spat_host => 'newspat.csis.u-tokyo.ac.jp',
spat_port => $port,
ncolumn => '1',
input_kanji_code => 'auto',
output_kanji_code => 'sjis',
output_file_format => 'csv',
file => [
undef, 'test.csv',
Content_Type => 'text/csv',
Content => $content ]];
my $res = $ua->request($req);
unless($res =~ /Geocoding/){
my $results = $res->content;
chomp($results);
$results =~ s/\"//g;
my @data = split(/\,/,$results);
$data[1] =~ s/\// /g;
print "$data[1]\n";
print "$data[2]\n";
print "$data[3]\n";
print "$data[4]\n";
# print "$data[5]\n";
}
}
print "\n";
exit;
sub form_decode{
my $form;
if($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN,$form,$ENV{'CONTENT_LENGTH'});
}
else{
$form=$ENV{'QUERY_STRING'};
}
my @pairs = split(/&/,$form);
foreach my $pair(@pairs){
my($name,$value)=split(/=/,$pair);
$value=~tr/+/ /;
$value=~s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
$name=~s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
$value=~s/>/>/g;
$value=~s/</g;
$value=~s/\t/ /g;
$value=~s/\n/\t/g;
$value=~s/\r//g;
$value= jcode($value)->sjis;
$name=jcode($name)->sjis;
$FORM{$name}=$value;
}
}