「メッシュ番号から緯度経度を算出する」の版間の差分
ナビゲーションに移動
検索に移動
imported>Webmaster |
imported>Webmaster |
||
(同じ利用者による、間の3版が非表示) | |||
1行目: | 1行目: | ||
− | このプログラムはメッシュ番号(三次メッシュ(1km)/四次メッシュ(500m)/五次メッシュ(250m)/六次メッシュ(125m))から、中心の緯度経度を算出するためのプログラムです。 | + | *このプログラムはメッシュ番号(三次メッシュ(1km)/四次メッシュ(500m)/五次メッシュ(250m)/六次メッシュ(125m))から、中心の緯度経度を算出するためのプログラムです。 |
+ | *サブルーチン処理として記載しています。 | ||
+ | *メッシュ番号を入れると、その文字列の長さから三次/四次/五次/六次を判断して、緯度経度をRetuenで返します | ||
<syntaxhighlight lang="perl"> | <syntaxhighlight lang="perl"> | ||
− | + | #メッシュ番号から中心緯度経度を算出するプログラム | |
− | # | + | #入力値は三次/四次/五次/六次まで |
− | + | ||
+ | sub mesh2lat_long{ | ||
+ | my($sample_data) = @_; | ||
+ | |||
my $MESH_No = 0;#何次メッシュかを得る | my $MESH_No = 0;#何次メッシュかを得る | ||
16行目: | 21行目: | ||
#一次メッシュ算出 | #一次メッシュ算出 | ||
− | my $MESH_01_Lat = substr($sample_data,0,2) / 1.5; | + | my $MESH_01_Lat = substr($sample_data,0,2) / 1.5; #単位(度) |
− | my $MESH_01_Long = substr($sample_data,2,2) + 100; | + | my $MESH_01_Long = substr($sample_data,2,2) + 100; #単位(度) |
#二次メッシュ算出 | #二次メッシュ算出 | ||
− | my $MESH_02_Lat = substr($sample_data,4,1) * 5;# | + | my $MESH_02_Lat = substr($sample_data,4,1) * 5; #単位(分) |
− | my $MESH_02_Long = substr($sample_data,5,1) * 7.5;# | + | my $MESH_02_Long = substr($sample_data,5,1) * 7.5; #単位(分) |
#print $MESH_02_Long," "; | #print $MESH_02_Long," "; | ||
#三次メッシュ算出 | #三次メッシュ算出 | ||
− | my $MESH_03_Lat = substr($sample_data,6,1) * 30 + 15;# | + | 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_03_Long = substr($sample_data,7,1) * 45 + 22.5;#単位(秒) |
#四次メッシュ算出 | #四次メッシュ算出 | ||
59行目: | 64行目: | ||
#編集初期化 | #編集初期化 | ||
my $MESH_05_Lat =0; | my $MESH_05_Lat =0; | ||
− | my $ | + | my $MESH_05_Long =0; |
if ($MESH_No >= 5){ | if ($MESH_No >= 5){ | ||
if(substr($sample_data,9,1) == 1) | if(substr($sample_data,9,1) == 1) | ||
86行目: | 91行目: | ||
#編集初期化 | #編集初期化 | ||
my $MESH_06_Lat =0; | my $MESH_06_Lat =0; | ||
− | my $ | + | my $MESH_06_Long =0; |
if ($MESH_No >= 6){ | if ($MESH_No >= 6){ | ||
if(substr($sample_data,10,1) == 1) | if(substr($sample_data,10,1) == 1) | ||
114行目: | 119行目: | ||
my $Long_Sec = $MESH_03_Long + $MESH_04_Long + $MESH_05_Long + $MESH_06_Long; | 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); | $MESH_02_Lat = $MESH_02_Lat + int($Lat_Sec/60); | ||
$Lat_Sec = $Lat_Sec-int($Lat_Sec/60)*60; | $Lat_Sec = $Lat_Sec-int($Lat_Sec/60)*60; | ||
− | + | ||
$MESH_02_Long = $MESH_02_Long + int($Long_Sec/60); | $MESH_02_Long = $MESH_02_Long + int($Long_Sec/60); | ||
$Long_Sec = $Long_Sec-int($Long_Sec/60)*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_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; | $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進数計算 | #緯度経度10進数計算 | ||
my $MESH_Lat = $MESH_01_Lat + ($MESH_02_Lat / 60) + ($Lat_Sec / 60 /60); | my $MESH_Lat = $MESH_01_Lat + ($MESH_02_Lat / 60) + ($Lat_Sec / 60 /60); | ||
133行目: | 152行目: | ||
#答え | #答え | ||
− | print "Lat=",$MESH_Lat," Long=",$MESH_Long,"\n"; | + | #print "Lat=",$MESH_Lat," Long=",$MESH_Long,"\n"; |
+ | return ($MESH_Lat,$MESH_Long); | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
---- | ---- | ||
<!-- カテゴリに追加するページ名を記入 --> | <!-- カテゴリに追加するページ名を記入 --> | ||
− | [[Category:Perl| | + | [[Category:Perl|めっしゅばんごうからいどけいどをさんしゅつする]] |
2016年2月20日 (土) 17:31時点における最新版
- このプログラムはメッシュ番号(三次メッシュ(1km)/四次メッシュ(500m)/五次メッシュ(250m)/六次メッシュ(125m))から、中心の緯度経度を算出するためのプログラムです。
- サブルーチン処理として記載しています。
- メッシュ番号を入れると、その文字列の長さから三次/四次/五次/六次を判断して、緯度経度をRetuenで返します
#メッシュ番号から中心緯度経度を算出するプログラム
#入力値は三次/四次/五次/六次まで
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);
}