メッシュ番号から緯度経度を算出する
2016年2月20日 (土) 17:29時点におけるimported>Webmasterによる版
- このプログラムはメッシュ番号(三次メッシュ(1km)/四次メッシュ(500m)/五次メッシュ(250m)/六次メッシュ(125m))から、中心の緯度経度を算出するためのプログラムです。
- サブルーチン処理として記載しています。
- メッシュ番号を入れると、その文字列の長さから三次/四次/五次/六次を判断して、緯度経度をRetuenで返します
#メッシュ番号から中心緯度経度を算出するプログラム
#入力値は三次/四次/五次/六次まで
sub mesh2lat_long{
my($sample_data) = @_;
my $MESH_No = 0;#何次メッシュかを得る
#メッシュの文字列の長さを得る
my $MESH_Length = length($sample_data);
if($MESH_Length == 8){$MESH_No = 3}#三次メッシュ(1km)
elsif ($MESH_Length == 9){$MESH_No = 4}#四次メッシュ(500m)
elsif ($MESH_Length == 10){$MESH_No = 5}#五次メッシュ(250m)
elsif ($MESH_Length == 11){$MESH_No = 6}#六次メッシュ(125m)
#一次メッシュ算出
my $MESH_01_Lat = substr($sample_data,0,2) / 1.5; #単位(度)
my $MESH_01_Long = substr($sample_data,2,2) + 100; #単位(度)
#二次メッシュ算出
my $MESH_02_Lat = substr($sample_data,4,1) * 5; #単位(分)
my $MESH_02_Long = substr($sample_data,5,1) * 7.5; #単位(分)
#print $MESH_02_Long," ";
#三次メッシュ算出
my $MESH_03_Lat = substr($sample_data,6,1) * 30 + 15; #単位(秒)
my $MESH_03_Long = substr($sample_data,7,1) * 45 + 22.5;#単位(秒)
#四次メッシュ算出
#算出が四次より大きければ処理する
#編集初期化
my $MESH_04_Lat =0;
my $MESH_04_Long =0;
if ($MESH_No >= 4){
if(substr($sample_data,8,1) == 1)
{
$MESH_04_Lat = -7.5;
$MESH_04_Long = -11.25;
}
elsif(substr($sample_data,8,1) == 2)
{
$MESH_04_Lat = -7.5;
$MESH_04_Long = 11.25;
}
elsif(substr($sample_data,8,1) == 3)
{
$MESH_04_Lat = +7.5;
$MESH_04_Long = -11.25;
}
elsif(substr($sample_data,8,1) == 4)
{
$MESH_04_Lat = +7.5;
$MESH_04_Long = +11.25;
}
}
#五次メッシュ算出
#算出が五次より大きければ処理する
#編集初期化
my $MESH_05_Lat =0;
my $MESH_05_Long =0;
if ($MESH_No >= 5){
if(substr($sample_data,9,1) == 1)
{
$MESH_05_Lat = -7.5 / 2;
$MESH_05_Long = -11.25 / 2;
}
elsif(substr($sample_data,9,1) == 2)
{
$MESH_05_Lat = -7.5 / 2;
$MESH_05_Long = 11.25 / 2;
}
elsif(substr($sample_data,9,1) == 3)
{
$MESH_05_Lat = +7.5 / 2;
$MESH_05_Long = -11.25 / 2;
}
elsif(substr($sample_data,9,1) == 4)
{
$MESH_05_Lat = +7.5 / 2;
$MESH_05_Long = +11.25 / 2;
}
}
#六次メッシュ算出
#算出が六次より大きければ処理する
#編集初期化
my $MESH_06_Lat =0;
my $MESH_06_Long =0;
if ($MESH_No >= 6){
if(substr($sample_data,10,1) == 1)
{
$MESH_06_Lat = -7.5 / 4;
$MESH_06_Long = -11.25 / 4;
}
elsif(substr($sample_data,10,1) == 2)
{
$MESH_06_Lat = -7.5 / 4;
$MESH_06_Long = 11.25 / 4;
}
elsif(substr($sample_data,10,1) == 3)
{
$MESH_06_Lat = +7.5 / 4;
$MESH_06_Long = -11.25 / 4;
}
elsif(substr($sample_data,10,1) == 4)
{
$MESH_06_Lat = +7.5 / 4;
$MESH_06_Long = +11.25 / 4;
}
}
#--------------------------------------------------------------------------
#秒の積算
my $Lat_Sec = $MESH_03_Lat + $MESH_04_Lat + $MESH_05_Lat + $MESH_06_Lat;
my $Long_Sec = $MESH_03_Long + $MESH_04_Long + $MESH_05_Long + $MESH_06_Long;
#print "秒の算出:(MESH_03)$MESH_03_Lat(MESH_04)$MESH_04_Lat(MESH_05)$MESH_05_Lat(MESH_06)$MESH_06_Lat\n";
#print "秒の算出:(MESH_03)$MESH_03_Long(MESH_04)$MESH_04_Long(MESH_05)$MESH_05_Long(MESH_06)$MESH_06_Long\n";
#print "\n";
#この時点の時分秒
#print "Lat :$MESH_01_Lat(度)$MESH_02_Lat(分)$Lat_Sec(秒)\n";
#print "Long:$MESH_01_Long(度)$MESH_02_Long(分)$Long_Sec(秒)\n";
#秒が60秒を超えたら分に加算
$MESH_02_Lat = $MESH_02_Lat + int($Lat_Sec/60);
$Lat_Sec = $Lat_Sec-int($Lat_Sec/60)*60;
$MESH_02_Long = $MESH_02_Long + int($Long_Sec/60);
$Long_Sec = $Long_Sec-int($Long_Sec/60)*60;
#print "Lat :$MESH_01_Lat(度)$MESH_02_Lat(分)$Lat_Sec(秒)\n";
#print "Long:$MESH_01_Long(度)$MESH_02_Long(分)$Long_Sec(秒)\n";
#分が60分を超えたら度に加算
$MESH_01_Lat = $MESH_01_Lat + int($MESH_02_Lat/60);
$MESH_02_Lat = $MESH_02_Lat - int($MESH_02_Lat/60)*60;
$MESH_01_Long = $MESH_01_Long + int($MESH_02_Long/60);
$MESH_02_Long = $MESH_02_Long - int($MESH_02_Long/60)*60;
#print "Lat :$MESH_01_Lat(度)$MESH_02_Lat(分)$Lat_Sec(秒)\n";
#print "Long:$MESH_01_Long(度)$MESH_02_Long(分)$Long_Sec(秒)\n";
#緯度経度10進数計算
my $MESH_Lat = $MESH_01_Lat + ($MESH_02_Lat / 60) + ($Lat_Sec / 60 /60);
my $MESH_Long = $MESH_01_Long + ($MESH_02_Long / 60) + ($Long_Sec / 60 /60);
#答え
#print "Lat=",$MESH_Lat," Long=",$MESH_Long,"\n";
return ($MESH_Lat,$MESH_Long);
}