メッシュ番号から緯度経度を算出する

提供: dococo wiki
2016年1月1日 (金) 22:16時点におけるimported>Webmasterによる版
ナビゲーションに移動 検索に移動
 #メッシュ番号から緯度経度を算出するプログラム
 	#メッシュ番号: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";