経度緯度からメッシュ番号を算出する
2016年2月20日 (土) 17:31時点におけるimported>Webmasterによる版
#!/usr/bin/perl
use strict;
use warnings;
#---------------------------------------------------------------------------------------------------------------------
#緯度経度からメッシュ番号を算出するサブルーチン
#パッケージ名を「lat_long_to_mesh」とする
#lat_long_to_mesh::mesh($Longitude, $Latitude, $MESH_CODE)と呼ばれることで
#経度/緯度/メッシュサイズをで入れると、指定されたメッシュ番号に変換して返す
#メッシュサイズ引数(1=1km/2=500m/3=250m/4=125m/5=100m)
package lat_long_to_mesh;
sub mesh {
my($Longitude_out, $Latitude_out, $MESH_CODE) = @_;
#print $Longitude_out,"-",$Latitude_out,"-",$MESH_CODE,"\n";
#-------------------------緯度経度→メッシュ番号算出----------------------------------------------
# 1st mesh(latitude)
#・緯度×60分÷40分=p 余りa p=第1次地域区画を示す数字の上2けた の計算
#
my $mesh_P = int($Latitude_out * 60 / 40);
my $mesh_a = ($Latitude_out * 60) - ($mesh_P * 40) ;
#print "一次メッシュ(P=$mesh_P a=$mesh_a)\n";
# 2nd mesh(latitude)
#・ a÷5分=q 余りb q=第2次地域区画を示す数字の上1けた の計算
my $mesh_Q = int($mesh_a / 5);
my $mesh_b = $mesh_a - ($mesh_Q * 5) ;
#print "二次メッシュ(Q=$mesh_Q b=$mesh_b)\n";
# 3tn mesh(latitude)
#・b×60秒÷30秒=r 余りx r=第3次地域区画を示す数字の上1けた の計算
my $mesh_R = int($mesh_b * 60 / 30);
my $mesh_x = ($mesh_b * 60) - ($mesh_R * 30) ;
#print "三次メッシュ(R=$mesh_R x=$mesh_x)\n";
# 4tn mesh(latitude)
#・x÷15秒=R2 余りx2 R2=第4次地域区画を示す数字の上1けた の計算
my $mesh_R2 = int($mesh_x / 15);
my $mesh_x2 = $mesh_x - ($mesh_R2 * 15) ;
#print "四次メッシュ(R2=$mesh_R2 x2=$mesh_x2)\n";
# 5th mesh(latitude)
#・x2÷7.5秒=R3 余りx3 R3=第5次地域区画を示す数字の上1けた の計算
my $mesh_R3 = int($mesh_x2 / 7.5);
my $mesh_x3 = $mesh_x2 - ($mesh_R3 * 7.5) ;
#print "五次メッシュ(R3=$mesh_R3 x3=$mesh_x3)\n";
# 6rh mesh(latitude)
#・ x2÷3.75秒=R3 余りx3 R3=第5次地域区画を示す数字の上1けた の計算
my $mesh_R4 = int($mesh_x3 / 3.75);
my $mesh_x4 = $mesh_x3 - ($mesh_R4 * 3.75) ;
#print "六次メッシュ(R4=$mesh_R4 x4=$mesh_x4)\n";
# 100m mesh(latitude)
# 緯度差3秒
#・x÷3秒=R5 余りx4 R4=100mメッシュを示す数字の上1けた の計算
my $mesh_R5 = int($mesh_x / 3);
my $mesh_x5 = $mesh_x - ($mesh_R2 * 3) ;
#print "100mメッシュ(R5=$mesh_R2 x5=$mesh_x2)\n";
# 1st mesh(longitude)
#・経度-100度=s 余りc s=第1次地域区画を示す数字の下2けた の計算
#
my $mesh_S = int($Longitude_out - 100);
my $mesh_c = $Longitude_out -100 - $mesh_S ;
#print "一次メッシュ(S=$mesh_S c=$mesh_c)\n";
# 2nd mesh(longitude)
#・c×60分÷7分30秒=t 余りd t=第2次地域区画を示す数字の下1けた の計算
#
my $mesh_T = int($mesh_c * 60 / 7.5);
my $mesh_d = ($mesh_c * 60) - ($mesh_T * 7.5) ;
#print "二次メッシュ(T=$mesh_T d=$mesh_d)\n";
# 3th mesh(longitude)
#・d×60秒÷45秒=u 余りy u=第3次地域区画を示す数字の下1けた の計算
#
my $mesh_U = int($mesh_d * 60 / 45);
my $mesh_y = ($mesh_d * 60) - ($mesh_U * 45) ;
#print "三次メッシュ(U=$mesh_U y=$mesh_y)\n";
# 4th mesh(longitude)
# 経度差は22.5秒
#・y÷22.5秒=u2 余りy2 u2=第4次地域区画を示す数字の下1けた の計算
#
my $mesh_u2 = int($mesh_y / 22.5);
my $mesh_y2 = $mesh_y - ($mesh_u2 * 22.5) ;
#print "四次メッシュ(u2=$mesh_u2 y2=$mesh_y2)\n";
# 5th mesh(longitude)
#・y2÷11.25秒=u3 余りy3 u3=第5次地域区画を示す数字の下1けた の計算
#
my $mesh_u3 = int($mesh_y2 / 11.25);
my $mesh_y3 = $mesh_y2 - ($mesh_u3 * 11.25) ;
#print "五次メッシュ(u3=$mesh_u3 y3=$mesh_y3)\n";
# 6th mesh(longitude)
#・y3÷5.625秒=u4 余りy4 u4=第6次地域区画を示す数字の下1けた の計算
#
my $mesh_u4 = int($mesh_y3 / 5.625);
my $mesh_y4 = $mesh_y3 - ($mesh_u4 * 5.625) ;
#print "六次メッシュ(u4=$mesh_u4 y4=$mesh_y4)\n";
# 100m mesh(longitude)
#・y÷4.5秒=u5 余りy5 u5=100mメッシュを示す数字の下1けた の計算
#経度差は4.5秒
my $mesh_u5 = int($mesh_y / 4.5);
my $mesh_y5 = $mesh_y - ($mesh_u2 * 4.5) ;
#print "100mメッシュ(u5=$mesh_u2 y5=$mesh_y2)\n";
#-------------組み立て-----------
my $mesh1 = $mesh_P * 100 + $mesh_S;
my $mesh2 = $mesh_Q * 10 + $mesh_T;
my $mesh3 = $mesh_R * 10 + $mesh_U;
my $mesh4 = oct('0b'.$mesh_R2.$mesh_u2) + 1;
my $mesh5 = oct('0b'.$mesh_R3.$mesh_u3) + 1;
my $mesh6 = oct('0b'.$mesh_R4.$mesh_u4) + 1;
my $mesh_code_out = 0;
if ($MESH_CODE == 1){$mesh_code_out = sprintf("%04d%02d%02d", $mesh1, $mesh2, $mesh3);} #1kmメッシュ計算
elsif ($MESH_CODE == 2){$mesh_code_out = sprintf("%04d%02d%02d%01d", $mesh1, $mesh2, $mesh3, $mesh4);}#500mメッシュ計算
elsif ($MESH_CODE == 3){$mesh_code_out = sprintf("%04d%02d%02d%01d%01d", $mesh1, $mesh2, $mesh3, $mesh4, $mesh5);}#250mメッシュ計算
elsif ($MESH_CODE == 4){$mesh_code_out = sprintf("%04d%02d%02d%01d%01d%01d", $mesh1, $mesh2, $mesh3, $mesh4, $mesh5, $mesh6);}#125mメッシュ計算
elsif ($MESH_CODE == 5){$mesh_code_out = sprintf("%04d%02d%02d%01d%01d", $mesh1, $mesh2, $mesh3, $mesh_R5, $mesh_u5);} #100mメッシュ計算
return $mesh_code_out;
}