メッシュ番号から緯度経度を算出する
2016年1月1日 (金) 22:18時点におけるimported>Webmasterによる版
このプログラムはメッシュ番号(三次メッシュ(1km)/四次メッシュ(500m)/五次メッシュ(250m)/六次メッシュ(125m))から、中心の緯度経度を算出するためのプログラムです。
#メッシュ番号から緯度経度を算出するプログラム
#メッシュ番号:53394644444の場合
my $sample_data = "53394644444";
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_05Long =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_06Long =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;
#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;
#60分を超えたら度に加算
$MESH_Lat = $MESH_Lat + int($MESH_02_Lat/60);
$MESH_02_Lat = $MESH_02_Lat - int($MESH_02_Lat/60)*60;
$MESH_Long = $MESH_Long + int($MESH_02_Long/60);
$MESH_02_Long = $MESH_02_Long - int($MESH_02_Long/60)*60;
#緯度経度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";