携帯用の移動計算式、よくわかりません…
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;
}


コメント