#!/usr/bin/perl BEGIN { unshift @INC, 'extlib'; unshift @INC, 'lib'; } use CGI; my $q = new CGI(); my $ll = $q->param('ll'); my $map_service = $q->param('map_service'); my $cookie = $q->cookie('map_service'); my $eid = $q->param('entry_id'); use MT; use MT::Blog; use MT::Entry; my $mt = MT->new( Config => 'mt.cfg'); my $entry = MT::Entry->load($eid); my $blog_id = $entry->blog_id; my $blog = MT::Blog->load($blog_id); my $blog_url = $blog->site_url; my $css = $blog_url.'styles-site.css'; if ($q->param('reset') == 1) { $cookie = ''; $q->param(-name=>'reset',-value=>2); } unless ($ll || $q->param('reset')) { my $title = '位置情報が必要です'; print $q->header( -type => 'text/html', -charset => 'EUC-JP', ), $q->start_html( -encoding=>'EUC-JP', -lang=>ja, -head => $q->meta({-http_equiv => 'Content-Type', -content => 'text/html; charset=EUC-JP'}), -title=>$title, -style=>{'src'=>$css}, ), $title, $q->end_html; exit; } unless ($cookie || $map_service) { my $title = 'リンクする地図サービスを選択してください'; print $q->header( -type => 'text/html', -charset => 'EUC-JP', ), $q->start_html( -encoding=>'EUC-JP', -lang=>ja, -head => $q->meta({-http_equiv => 'Content-Type', -content => 'text/html; charset=EUC-JP'}), -title=>$title, -style=>{'src'=>$css}, ), $q->start_div({-id=>"banner-commentspop"}), $title, $q->end_div, $q->start_div({-class=>"blog"}), $q->start_div({-class=>"comments-body"}), $q->start_form(-method=>'GET'), $q->hidden(-name=>'ll'), $q->hidden(-name=>'entry_id'), $q->hidden(-name=>'reset'), $q->radio_group( -name=>'map_service', -values=>[ 'NAVITIME', 'MapFan Web', 'livedoor MAP', 'Google Maps', #'MapQuest', ], -default=>'NAVITIME', -linebreak=>'true', ), $q->submit(-value=>'選択'), $q->end_form, $q->br, $q->br, '選択はクッキーに保存され、以後は自動的に「場所」からリンクします', $q->end_div, $q->end_div, $q->end_html; exit; } else { my $url; if ($map_service) { my $cookie = $q->cookie( -name=>'map_service', -value=>$map_service, -expires=>'+10y' ); print $q->header( -type => 'text/html', -charset => 'EUC-JP', -cookie => $cookie, ); $url = coordinate2url($ll, $map_service); if ($q->param('reset') == 2 && !(defined $q->param('ll'))) { my $title = '設定を保存しました'; print $q->start_html( -encoding=>'EUC-JP', -lang=>ja, -head =>[ $q->meta({ -http_equiv => 'Content-Type', -content => 'text/html; charset=EUC-JP' }), ], -title=>$title, -style=>{'src'=>$css}, ), $title, $q->br, $q->a({href=>$blog_url}, '戻る'), $q->end_html; } else { my $title = '移動中...'; my $refresh = 1; if ($q->param('reset') == 2) { $title = '設定を保存して、移動中...'; $refresh = 4; } print $q->start_html( -encoding=>'EUC-JP', -lang=>ja, -head =>[ $q->meta({ -http_equiv => 'Content-Type', -content => 'text/html; charset=EUC-JP' }), $q->meta({ -http_equiv => 'Refresh', -content => "1; URL=$url", }), ], -title=>$title, -style=>{'src'=>$css}, ), $title, $q->br, '移動しない場合は', $q->a({href=>$url}, 'ここをクリック'), 'してください', $q->end_html; } } else { $url = coordinate2url($ll, $cookie); print $q->redirect(-uri=>$url); } exit; } sub geoconv { my ($lon, $lat, $datum) = @_; my ($b, $l, $h) = ($lat, $lon, 0); # 直交座標経由の測地系変換 # Nowral PXI07463@nifty.ne.jp # 99/9/10 # # 定数 $pi = 4 * atan2(1,1); # 円周率 $rd = $pi / 180; # [ラジアン/度] # 変換したい座標 # (Tokyo) # 緯度 35°20′39.984328″ # 経度 138°35′08.086122″ # 高さ 697.681000 [m] #$b = 35 + 20/60 + 39.984328/3600; # 緯度 [度] #$l = 138 + 35/60 + 8.086122/3600; # 経度 [度] #$h = 697.681000; # 高さ [m] #print "変換前\n緯度: ",°2dms($b),"\n経度: ",°2dms($l),"\n高さ: $h\n\n"; # データム諸元 # 変換元 # (WGS 84) $a = 6378137.0; # 6378137; # 赤道半径 $f = 1 / 298.257223563; # 1 / 298.257223; # 扁平率 $e2 = 2*$f - $f*$f; # 第1離心率 # 変換先 # (Tokyo) $a_ = 6378137.0 - 739.845; # 6377397.155; $f_ = 1/298.257223563 - 0.000010037483; # 1 / 299.152813; $e2_ = 2*$f_ - $f_*$f_; # 並行移動量 [m] # e.g. $x_ = $x + $dx etc. #$dx = -148; #$dy = +507; #$dz = +681; # JGD2000 #my $dx = -146.414; #my $dy = +507.337; #my $dz = +680.507; # 変換 if ($datum == 1) { # TOKYO97 my $dx = +146.336; my $dy = -506.832; my $dz = -680.254; my ($x, $y, $z) = &llh2xyz($b, $l, $h, $a, $e2); ($b, $l, $h) = &xyz2llh($x+$dx, $y+$dy, $z+$dz, $a_, $e2_); } else { # WGS-84 my $dx = -146.336; my $dy = +506.832; my $dz = +680.254; my ($x, $y, $z) = &llh2xyz($b, $l, $h, $a_, $e2_); ($b, $l, $h) = &xyz2llh($x+$dx, $y+$dy, $z+$dz, $a, $e2); } return ($l, $b); # 変換された座標 #print "変換後\n緯度: ",$b,"\n経度: ",$l,"\n高さ: $h\n\n"; #&MacPerl'Quit(2); #die "The Unhappy End"; } sub llh2xyz { # 楕円体座標 -> 直交座標 my($b, $l, $h, $a, $e2) = @_; my($sb, $cb, $rn, $x, $y, $z); $b *= $rd; $l *= $rd; $sb = sin($b); $cb = cos($b); $rn = $a / sqrt(1-$e2*$sb*$sb); $x = ($rn+$h) * $cb * cos($l); $y = ($rn+$h) * $cb * sin($l); $z = ($rn*(1-$e2)+$h) * $sb; ($x, $y, $z); } sub xyz2llh { # 直交座標 -> 楕円体座標 my($x, $y, $z, $a, $e2) = @_; my($bda, $p, $t, $st, $ct, $b, $l, $sb, $rn, $h); $bda = sqrt(1-$e2); # b/a $p = sqrt($x*$x+$y*$y); $t = atan2($z, $p*$bda); $st = sin($t); $ct = cos($t); $b = atan2($z+$e2*$a/$bda*$st*$st*$st, $p-$e2*$a*$ct*$ct*$ct); $l = atan2($y, $x); $sb = sin($b); $rn = $a / sqrt(1-$e2*$sb*$sb); $h = $p/cos($b) - $rn; ($b/$rd, $l/$rd, $h); } sub deg2dms { my($d) = @_; my($m, $s, $sf); $sf = int($d*360000 + 0.5); $s = $sf / 100 % 60; $m = $sf / 6000 % 60; $d = int($sf/360000); $sf %= 100; sprintf("%d\.%d\.%d\.%d", $d, $m, $s, $sf); } sub dms2deg { my $dms = shift; my $deg = $1 + $2/60 + $3/3600 if ($dms =~ /([0-9]+)\.([0-9]+)\.(([0-9]+)\.?([0-9]+))/); return $deg; } sub coordinate2url { my ($ll, $map_service) = @_; my ($lat, $lon) = split /\,/, $ll; my $url; if ($map_service eq 'NAVITIME') { ($lat, $lon) = (deg2dms($lat), deg2dms($lon)); $url = "http://walk.eznavi.jp/map/?datum=0&unit=0&lat=+$lat&lon=+$lon&fm=0"; } elsif ($map_service eq 'MapFan Web') { ($lon, $lat) = geoconv($lon, $lat, 1); ($lat, $lon) = (deg2dms($lat), deg2dms($lon)); #$url = "http://www.mapfan.com/index.cgi?MAP=E${lon}N${lat}&ZM=12"; $url = "http://kokomail.mapfan.com/receivew.cgi?MAP=E${lon}N${lat}&ZM=12"; } elsif ($map_service eq 'livedoor MAP') { ($lon, $lat) = geoconv($lon, $lat, 1); ($lat, $lon) = (deg2dms($lat), deg2dms($lon)); #$url = "http://www.mapfan.com/index.cgi?MAP=E${lon}N${lat}&ZM=12"; $url = "http://map.livedoor.com/map/?MAP=E${lon}N${lat}&ZM=12"; } elsif ($map_service eq 'Google Maps') { ($lon, $lat) = geoconv($lon, $lat, 1); use Jcode; my $j = new Jcode; my $permalink = $entry->permalink; my $title = $entry->title; $title = $j->set($title)->utf8; my $str = "$title"; $str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $str =~ tr/ /+/; $url = "http://maps.google.com/maps?q=$lat,$lon+($str)&spn=0.004579,0.006289"; } elsif ($map_service eq 'MapQuest') { my ($latd, $latm, $lats) = ($1, $2, int($3 + 0.5)) if ($lat =~ /([0-9]+)\.([0-9]+)\.(([0-9]+)\.?([0-9]+))/); my ($lond, $lonm, $lons) = ($1, $2, int($3 + 0.5)) if ($lon =~ /([0-9]+)\.([0-9]+)\.(([0-9]+)\.?([0-9]+))/); $url = "http://www.mapquest.com/maps/map.adp?latlongtype=degrees&latdeg=$latd&latmin=$latm&latsec=$lats&longdeg=$lond&longmin=$lonm&longsec=$lons&zoom=8"; } return $url; }