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

提供: dococo wiki
2016年1月4日 (月) 23:12時点におけるimported>Webmasterによる版 (ページの作成:「<syntaxhighlight lang="perl"> #!/usr/bin/perl use strict; use warnings; #-----------------------------------------------------------------------------------------------...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

<syntaxhighlight lang="perl">

  1. !/usr/bin/perl

use strict; use warnings;

  1. ---------------------------------------------------------------------------------------------------------------------

#緯度経度からメッシュ番号を算出するサブルーチン #パッケージ名を「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;

}