携帯用の移動計算式、よくわかりません…
PHP用はよく見るのにPerlは…;
ちょっと適当ですが
use POSIX qw( fmod ); # South sprintf( "%.6f", (fmod((90 + $c_lat - IMG_HEIGHT / 256 * (IMG_HEIGHT * 0.5) / 2 ** $zoom), (180 - 90)) )); # East sprintf( "%.6f", (fmod((180 + $c_lon - IMG_WIDTH / -256 * (IMG_WIDTH * 0.7) / 2 ** $zoom), (360 - 180)) ));
他は適当に応用で。いい加減だな…
緯度経度から2点間の距離算出。
PHPからPerlへの焼き直し!!w精度は十分かと。
use Math::Trig qw( pi ); sub _distance { my $lat1 = shift; my $lon1 = shift; my $lat2 = shift; my $lon2 = shift; my $mode = shift || 1; # 緯度経度をラジアンに変換 my $radLat1 = $lat1 * pi() / 180.0; # 緯度1 my $radLon1 = $lon1 * pi() / 180.0; # 経度1 my $radLat2 = $lat2 * pi() / 180.0; # 緯度2 my $radLon2 = $lon2 * pi() / 180.0; # 経度2 # 平均緯度 my $radLatAve = ($radLat1 + $radLat2) / 2.0; # 緯度差 my $radLatDiff = $radLat1 - $radLat2; # 経度差算 my $radLonDiff = $radLon1 - $radLon2; my $sinLat = sin($radLatAve); my $meridianRad = 0; my $dvrad = 0; if( $mode ) { # $mode引数が 1 なら世界測地系で計算(デフォルト) my $temp = 1.0 - 0.00669438 * ($sinLat * $sinLat); $meridianRad = 6335439.0 / sqrt($temp * $temp * $temp); # 子午線曲率半径 $dvrad = 6378137.0 / sqrt($temp); # 卯酉線曲率半径 } else { # $mode引数が 0 なら日本測地系で計算 my $temp = 1.0 - 0.00667478 * ($sinLat * $sinLat); $meridianRad = 6334834.0 / sqrt($temp * $temp * $temp); # 子午線曲率半径 $dvrad = 6377397.155 / sqrt($temp); # 卯酉線曲率半径 } my $t1 = $meridianRad * $radLatDiff; my $t2 = $dvrad * cos($radLatAve) * $radLonDiff; my $dist = sqrt( ($t1 * $t1) + ($t2 * $t2) ); return $dist; }
コメント