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

提供: dococo wiki
2016年1月3日 (日) 12:53時点におけるimported>Webmasterによる版
ナビゲーションに移動 検索に移動

このプログラムはメッシュ番号(三次メッシュ(1km)/四次メッシュ(500m)/五次メッシュ(250m)/六次メッシュ(125m))から、中心の緯度経度を算出するためのプログラムです。

 	#メッシュ番号から中心緯度経度を算出するプログラム
 	#出力は三次/四次/五次/六次まで

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);
}