13.4 閉合トラバース [もくじへ] [トップページへ] [前ページへ]
===================================================
プログラム例題25
閉合トラバースのプログラムを作成せよ。
=========================================================
考え方
観測データには、いろいろな原因による誤差が含まれます。したがって、それ
から求められた方向角や座標には当然誤差を生じます。閉合トラバースが開
放トラバースと違う点は、この誤差を補正するか、補正しないかという点です。
閉合トラバースでは、方向角の誤差と、座標の誤差の2つに分けて処理します。
(1)方向角の誤差(閉合差)の処理
開放トラバースと同じように、点nまで方向角を計算します。
α1 = αA + β1 ( α1 が360°を超えたら360°を減ずる )
αn-1 = αn-2 + βn-1 + 180°( αn が360°を超えたら360°を減ずる )
閉合トラバースでは、さらに初点(点n)に戻り、 βn を測定します。
そして、
αn = αn-1 + βn + 180°
により、 αn を求め、αA との閉合差 ω を求めます。ω を測角数 n で除し
て各観測角に補正します。
もし閉合差が整除できない場合、つぎのように補正します。
ω = 9″を n = 7 で配布する場合
ω/n ≒ 1.3″
累加補正数 各角への補正数
1.3 ≒ 1 = 1″
2.6 ≒ 3 3 - 1 = 2″
3.9 ≒ 4 4 - 3 = 1″
5.2 ≒ 5 5 - 4 = 1″
6.5 ≒ 7 7 - 5 = 2″
7.8 ≒ 8 8 - 7 = 1″
9.1 ≒ 9 9 - 8 = 1″
このようにして、観測角の補正をしたあと、ふたたび方向角の計算をやり直し
ます。
(2)座標の誤差(閉合差)の処理
方向角の補正計算の後、各点の座標を次式により計算します。
Xi = Xi-1 + Sicos(αi)
Yi = Yi-1 + Sisin(αi)
最後の測点の座標と、初点座標との座標閉合差を求めます。
Ex = Xn-1 - XA
Ey = Yn-1 - YA
この座標閉合差を、各測線長(観測距離)に比例して配布します。
X座標に対する補正数 = Ex × Si /ΣS
Y座標に対する補正数 = Ey × Si /ΣS
この場合の端数は、最後の点に配布します。
このような、座標に対する閉合差の配布法をコンパス法といいます。
閉合差 ds は、
で求められます。
また、精度 h は、
h = ds / ΣS
で求められます。
プログラム
<HTML>
<HEAD>
<TITLE>例題25</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
//
//
var an, xa, ya, alpa; // 初点名,X,Y,方向角
var bn, xb, yb, alpb; // 終点名,X,Y,方向角
var ii = 1; // 測点番号
na = new Array(50); // 測点名
bt = new Array(50); // 夾角
ds = new Array(50); // 距離
var n; // 測点数
//
ai = new Array(50); // 方向角
x = new Array(50); // X座標
y = new Array(50); // Y座標
dx = new Array(50); // X座標差
dy = new Array(50); // Y座標差
var doo, fun, byo; // 度分秒
//
var w; //
測角誤差
et = new
Array(50); //
夾角への補正数
var sex, sey; // X、Y座標誤差
var delts, ss; // 閉合差、距離合計
ex = new
Array(50); // X座標への補正数
ey = new
Array(50); // Y座標への補正数
var seido; // 精度
//
//
//
// クリアボタンをクリック
//
function onINI( )
{
var
i, sg;
//
document.Form1.AN.value
= "";
document.Form1.XA.value
= 0;
document.Form1.YA.value
= 0;
document.Form1.AA.value
= 0;
//
//
document.Form1.BN.value
= "";
document.Form1.XB.value
= 0;
document.Form1.YB.value
= 0;
document.Form1.AB.value
= 0;
//
ii = 1;
for (i = 1; i<=50; i++)
{
na[i]
= "";
bt[i]
= 0;
ds[i]
= 0;
}
//
document.Form1.NO.value
= ii;
document.Form1.NA.value
= na[ii];
document.Form1.BT.value
= bt[ii];
document.Form1.DS.value
= ds[ii];
}
//
//
// 後退ボタン(<)をクリック
//
function onBCK( )
{
na[ii]
= document.Form1.NA.value;
bt[ii]
= eval(document.Form1.BT.value);
ds[ii]
= eval(document.Form1.DS.value);
//
ii--;
if (ii <= 0) ii=1;
document.Form1.NO.value
= ii;
document.Form1.NA.value
= na[ii];
document.Form1.BT.value
= bt[ii];
document.Form1.DS.value
= ds[ii];
}
//
//
// 前進ボタン(>)をクリック
//
function
onFRD( ) {
na[ii]
= document.Form1.NA.value;
bt[ii]
= eval(document.Form1.BT.value);
ds[ii]
= eval(document.Form1.DS.value);
//
ii++;
if (ii > 50) ii=50;
document.Form1.NO.value
= ii;
document.Form1.NA.value
= na[ii];
document.Form1.BT.value
= bt[ii];
document.Form1.DS.value
= ds[ii];
}
//
// 角度の変換(度を秒に)
//
function
Dobyo( x ) {
var d, f, b, r;
d
= Math.floor(x);
f
= Math.floor((x - d)*100);
b
= Math.floor(((x - d)*100 - f)*100 + 0.5);
r
= d*3600 + f*60 + b;
return
r;
}
//
//
// 角度の変換(秒を度分秒に)
//
function
Byodfb( x ) {
doo
= Math.floor(x/3600);
fun
= Math.floor((x - doo*3600)/60);
byo
= x - doo*3600 - fun*60;
if (byo<0)
byo = 0;
}
//
//
// 四捨五入
//
function
Rund(x,y) {
var sg, r;
if
(x>=0) {sg = 1;}
else
{sg =-1;}
r =
sg*Math.floor(Math.abs(x)*Math.pow(10,y) + 0.5)/Math.pow(10,y);
return
r;
}
//
//
// 計算ボタンをクリック
//
function onCAL( )
{
var i, r;
var ew, sg //
測角誤差w/n、その符号
var
exs, eys // X、Yの累加補正数
//
//
初点データ
an
= document.Form1.AN.value;
xa
= eval(document.Form1.XA.value);
ya
= eval(document.Form1.YA.value);
alpa
= eval(document.Form1.AA.value);
//
// 終点データ
bn
= document.Form1.BN.value;
xb
= eval(document.Form1.XB.value);
yb
= eval(document.Form1.YB.value);
alpb
= eval(document.Form1.AB.value);
//
// 測点データ
na[ii]
= document.Form1.NA.value;
bt[ii]
= eval(document.Form1.BT.value);
ds[ii]
= eval(document.Form1.DS.value);
//
// 測点数のカウント
n =
0;
for
(i = 1; i<=50; i++) {
if (na[i]
== "E") break;
n++;
}
//
//
// *** 計算部 ***
// 角度を秒に変換
alpa
= Dobyo(alpa);
for
(i = 1; i<=n; i++) {
bt[i]
= Dobyo(bt[i]);
}
//
ai[1]
= alpa + bt[1];
while (ai[1]>=1296000)
{
ai[1]
= ai[1] - 1296000;
}
for
(i = 2; i<=n; i++) {
ai[i]
= ai[i-1] + bt[i] + 648000;
while (ai[i]>=1296000)
{
ai[i]
= ai[i] - 1296000;
}
}
//
w
= ai[n] - alpa;
ew
= w/n;
if
(ew>=0) {
sg = 1;
}
else {
sg
= -1;
}
ew = Math.abs(ew);
for (i = 1; i<=n; i++) {
sewb =
Math.floor(ew*(i-1)+0.5); // 前の累加補正数
sewf =
Math.floor(ew*i+0.5); //
後の累加補正数
et[i]
= sg*(sewf - sewb);
}
ai[1]
= alpa + bt[1] - et[1];
while (ai[1]>=1296000) {
ai[1] = ai[1] - 1296000;
}
for (i = 2; i<=n; i++) {
ai[i]
= ai[i-1] + bt[i]- et[i] + 648000;
while (ai[i]>=1296000) {
ai[i] = ai[i] - 1296000;
}
}
//
ss = 0;
for (i = 1; i<=n-1; i++) {
ss
= ss + ds[i];
}
//
dx[1] =
Rund(ds[1]*Math.cos(ai[1]/648000*Math.PI),3);
dy[1] =
Rund(ds[1]*Math.sin(ai[1]/648000*Math.PI),3);
x[1] = xa + dx[1];
y[1] = ya + dy[1];
for (i = 2; i<=n-1; i++) {
dx[i]
= Rund(ds[i]*Math.cos(ai[i]/648000*Math.PI),3);
dy[i] =
Rund(ds[i]*Math.sin(ai[i]/648000*Math.PI),3);
x[i]
= x[i-1] + dx[i];
y[i] = y[i-1] + dy[i];
}
//
sex =
Rund(x[n-1] - xa,3);
sey =
Rund(y[n-1] - ya,3);
exs = 0;
eys = 0;
ex[1] = Rund(sex*ds[1]/ss,3);
exs
= exs + ex[1];
ey[1] = Rund(sey*ds[1]/ss,3);
eys = eys +
ey[1];
x[1]
= Rund(xa + dx[1] - ex[1],3);
y[1] = Rund(ya + dy[1] - ey[1],3);
for (i = 2; i<=n-2; i++) {
ex[i] = Rund(sex*ds[i]/ss,3);
exs
= exs + ex[i];
ey[i] = Rund(sey*ds[i]/ss,3);
eys = eys +
ey[i];
x[i]
= Rund(x[i-1] + dx[i] - ex[i],3);
y[i] = Rund(y[i-1] + dy[i] - ey[i],3);
}
ex[n-1] = Rund(sex - exs,3);
ey[n-1] = Rund(sey - eys,3);
x[n-1]
= Rund(x[n-2] + dx[n-1] - ex[n-1],3);
y[n-1] = Rund(y[n-2] + dy[n-1] -
ey[n-1],3);
//
delts=Rund(Math.sqrt(Math.pow(sex,2)
+ Math.pow(sey,2)),3);
if (delts
!= 0) {
seido=Rund(ss/delts,0);
}
else {
seido=0;
}
Heigo( )
//
}
//
//
// 閉合トラバース計算結果出力
//
function Heigo( ) {
var i, r;
//
document.write
("<CENTER>","*** 閉合トラバース計算 ***","</CENTER><BR>");
//
document.write
("<CENTER><TABLE BORDER='1'>");
document.write
("<TR ALIGN='CENTER'><TD
ALIGN='left'>","測点 ","</TD>");
document.write
("<TD ALIGN='right'>"," 夾角 ","</TD>");
document.write
("<TD ALIGN='right'>"," 方向角
","</TD>");
document.write
("<TD ALIGN='right'>"," 距離 ","</TD>");
document.write
("<TD ALIGN='right'>"," X ","</TD>");
document.write
("<TD ALIGN='right'>"," Y ","</TD></TR>");
document.write
("<TR ALIGN='CENTER'><TD ALIGN='center'
></TD>");
document.write
("<TD ALIGN='right'>"," β ","</TD>");
document.write
("<TD ALIGN='right'>"," α ","</TD>");
document.write
("<TD ALIGN='right'>"," S ","</TD>");
document.write
("<TD ALIGN='right'>"," ΔX ","</TD>");
document.write
("<TD ALIGN='right'>"," ΔY ","</TD></TR>");
document.write
("<TR ALIGN='CENTER'><TD ALIGN='center'
></TD>");
document.write
("<TD ALIGN='right'>"," δβ ","</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD ALIGN='right'>"," δX ","</TD>");
document.write
("<TD ALIGN='right'>"," δY ","</TD></TR>");
//
// 1行目
document.write
("<TR ALIGN='CENTER'><TD ALIGN='left'
>",an,"</TD>");
r =
Byodfb(bt[1],doo,fun,byo);
document.write
("<TD ALIGN='right'>",doo + "-" + fun +
"-" + byo,"</TD>");
r =
Byodfb(alpa,doo,fun,byo);
document.write
("<TD ALIGN='right'>",doo + "-" + fun +
"-" + byo,"</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD
ALIGN='right'>",xa,"</TD>");
document.write
("<TD
ALIGN='right'>",ya,"</TD></TR>");
// 2行目
document.write
("<TR ALIGN='CENTER'><TD ALIGN='left'
></TD>");
document.write
("<TD
ALIGN='right'>",-et[1],"</TD>");
r =
Byodfb(ai[1],doo,fun,byo);
document.write
("<TD ALIGN='right'>",doo + "-" + fun +
"-" + byo,"</TD>");
document.write
("<TD
ALIGN='right'>",ds[1],"</TD>");
document.write
("<TD
ALIGN='right'>",dx[1],"</TD>");
document.write
("<TD
ALIGN='right'>",dy[1],"</TD></TR>");
// 3行目
document.write
("<TR ALIGN='CENTER'><TD ALIGN='left'
></TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD
ALIGN='right'>",-ex[1],"</TD>");
document.write
("<TD
ALIGN='right'>",-ey[1],"</TD></TR>");
// i
for (i = 1; i<=n-2; i++) {
// iの1行目
document.write
("<TR ALIGN='CENTER'><TD ALIGN='left' >",na[i],"</TD>");
r
= Byodfb(bt[i+1],doo,fun,byo);
document.write
("<TD ALIGN='right'>",doo + "-" + fun +
"-" + byo,"</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD
ALIGN='right'>",x[i],"</TD>");
document.write
("<TD
ALIGN='right'>",y[i],"</TD></TR>");
// iの2行目
document.write
("<TR ALIGN='CENTER'><TD ALIGN='left'
></TD>");
document.write
("<TD
ALIGN='right'>",-et[i+1],"</TD>");
r
= Byodfb(ai[i+1],doo,fun,byo);
document.write
("<TD ALIGN='right'>",doo + "-" + fun +
"-" + byo,"</TD>");
document.write
("<TD
ALIGN='right'>",ds[i+1],"</TD>");
document.write
("<TD
ALIGN='right'>",dx[i+1],"</TD>");
document.write
("<TD
ALIGN='right'>",dy[i+1],"</TD></TR>");
// iの3行目
document.write
("<TR ALIGN='CENTER'><TD ALIGN='left'
></TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD
ALIGN='right'>",-ex[i+1],"</TD>");
document.write
("<TD
ALIGN='right'>",-ey[i+1],"</TD></TR>");
}
// n-1行目
document.write
("<TR ALIGN='CENTER'><TD ALIGN='left'
>",na[n-1],"</TD>");
r =
Byodfb(bt[n],doo,fun,byo);
document.write
("<TD ALIGN='right'>",doo + "-" + fun +
"-" + byo,"</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD
ALIGN='right'>",x[n-1],"</TD>");
document.write
("<TD
ALIGN='right'>",y[n-1],"</TD></TR>");
// n行目
document.write
("<TR ALIGN='CENTER'><TD ALIGN='left'
></TD>");
document.write
("<TD
ALIGN='right'>",-et[n],"</TD>");
r =
Byodfb(ai[n],doo,fun,byo);
document.write
("<TD ALIGN='right'>",doo + "-" + fun +
"-" + byo,"</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD>");
document.write
("<TD ALIGN='right'>"," ","</TD></TR>");
// n+1行目
document.write
("<TR ALIGN='CENTER'><TD ALIGN='right'
></TD></TR>");
// n+2行目
document.write
("<TR ALIGN='CENTER'><TD ALIGN='right'
>","測角誤差 =","</TD>");
document.write
("<TD ALIGN='right'>",w,"</TD>");
document.write
("<TD ALIGN='right'>","ΔX=","</TD>");
document.write
("<TD
ALIGN='right'>",sex,"</TD>");
document.write
("<TD ALIGN='right'>","ΔY=","</TD>");
document.write
("<TD
ALIGN='right'>",sey,"</TD></TR>");
// n+3行目
document.write
("<TR ALIGN='CENTER'><TD ALIGN='right'
>","ΣS =","</TD>");
document.write
("<TD
ALIGN='right'>",ss,"</TD>");
document.write
("<TD ALIGN='right'>","閉合差
=","</TD>");
document.write
("<TD
ALIGN='right'>",delts,"</TD>");
document.write
("<TD ALIGN='right'>","精度 =
","</TD>");
document.write
("<TD
ALIGN='right'>","1/",seido,"</TD></TR>");
document.write
("</TABLE>");
}
//
// -->
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="Form1">
*** トラバース計算 ***<BR>
<BR>
初点名= <INPUT TYPE="text" NAME="AN"
size=15>
XA= <INPUT TYPE="text" NAME="XA"
size=15>
YA= <INPUT TYPE="text" NAME="YA"
size=15>
αA= <INPUT TYPE="text" NAME="AA"
size=15>
<BR>
終点名= <INPUT TYPE="text" NAME="BN"
size=15>
XB= <INPUT TYPE="text" NAME="XB"
size=15>
YB= <INPUT TYPE="text" NAME="YB"
size=15>
αB= <INPUT TYPE="text" NAME="AB"
size=15>
<BR>
番号= <INPUT TYPE="text" NAME="NO"
size=15>
点名= <INPUT TYPE="text" NAME="NA"
size=15>
測角= <INPUT TYPE="text" NAME="BT"
size=15>
距離= <INPUT TYPE="text" NAME="DS"
size=15>
<BR>
<BR>
<INPUT TYPE="button"
NAME="BCK" VALUE=" < "
onClick="onBCK( )">
<INPUT TYPE="button" NAME="FRD"
VALUE=" > " onClick="onFRD( )">
<INPUT TYPE="button"
NAME="INI" VALUE="クリア"
onClick="onINI( )">
<INPUT TYPE="button" NAME="CAL"
VALUE="計 算" onClick="onCAL( )">
<HR>
</FORM>
</BODY>
</HTML>
入力データと実行結果
XA=100.00m, YA=100.00m, αA=300°0′0″
点名=1, β1=180°0′
0″, S1=100.00m
点名=2, β2=
60°0′ 0″, S2=100.00m
点名=A, β3=
60°0′ 0″, S3=100.00m
点名=B, β4=240°0′20″
※4点目の入力は、点名= B、夾角= 240.0020、距離= なし
※必ずクリアボタンをクリックしてから入力します。
※入力終了は、点名に E を入力して、計算ボタンをクリックします。
プログラムの説明
var w; //
測角誤差
et = new
Array(50); //
夾角への補正数
var sex, sey; // X、Y座標誤差
var delts, ss; // 閉合差、距離合計
ex = new
Array(50); // X座標への補正数
ey = new
Array(50); // Y座標への補正数
var
seido; // 精度
開放トラバースのプログラムに、追加したグローバル変数です。計算結果出
力のプロシージャ Heigo( ) でも使うので、グローバル変数にします。
function
onCAL( ) {
var i,
r;
var ew, sg //
測角誤差w/n、その符号 @
var
exs, eys // X、Yの累加補正数 A
//
//
初点データ
an = document.Form1.AN.value;
xa = eval(document.Form1.XA.value);
ya = eval(document.Form1.YA.value);
alpa = eval(document.Form1.AA.value);
//
// 終点データ
bn = document.Form1.BN.value;
xb = eval(document.Form1.XB.value);
yb = eval(document.Form1.YB.value);
alpb = eval(document.Form1.AB.value);
//
// 測点データ
na[ii]
= document.Form1.NA.value;
bt[ii]
= eval(document.Form1.BT.value);
ds[ii] = eval(document.Form1.DS.value);
//
// 測点数のカウント
n = 0;
for (i = 1; i<=50; i++) {
if (na[i] == "E") break;
n++;
}
//
//
// *** 計算部 ***
// 角度を秒に変換
alpa = Dobyo(alpa);
for (i = 1; i<=n; i++) {
bt[i] = Dobyo(bt[i]);
}
//
ai[1]
= alpa + bt[1];
while (ai[1]>=1296000) {
ai[1]
= ai[1] - 1296000;
}
for (i = 2; i<=n; i++) {
ai[i]
= ai[i-1] + bt[i] + 648000;
while (ai[i]>=1296000) {
ai[i]
= ai[i] - 1296000;
}
}
//
w
= ai[n] - alpa; B
ew
= w/n; C
if
(ew>=0) { D
sg = 1;
}
else {
sg
= -1;
}
ew = Math.abs(ew); E
for (i = 1; i<=n; i++) { F
sewb =
Math.floor(ew*(i-1)+0.5); // 前の累加補正数
sewf =
Math.floor(ew*i+0.5); //
後の累加補正数
et[i]
= sg*(sewf - sewb);
}
ai[1]
= alpa + bt[1] - et[1]; G
while (ai[1]>=1296000) {
ai[1] = ai[1] - 1296000;
}
for (i = 2; i<=n; i++) { H
ai[i]
= ai[i-1] + bt[i]- et[i] + 648000;
while (ai[i]>=1296000) {
ai[i] = ai[i] - 1296000;
}
}
//
ss = 0;
for (i = 1; i<=n-1; i++) { I
ss
= ss + ds[i];
}
//
dx[1] =
Rund(ds[1]*Math.cos(ai[1]/648000*Math.PI),3); J
dy[1] =
Rund(ds[1]*Math.sin(ai[1]/648000*Math.PI),3);
x[1] = xa + dx[1];
y[1] = ya + dy[1];
for (i = 2; i<=n-1; i++) {
dx[i]
= Rund(ds[i]*Math.cos(ai[i]/648000*Math.PI),3);
dy[i] =
Rund(ds[i]*Math.sin(ai[i]/648000*Math.PI),3);
x[i]
= x[i-1] + dx[i];
y[i] = y[i-1] + dy[i];
} K
//
sex =
Rund(x[n-1] - xa,3); L
sey =
Rund(y[n-1] - ya,3); M
exs = 0;
eys = 0;
ex[1] = Rund(sex*ds[1]/ss,3); N
exs
= exs + ex[1];
ey[1] = Rund(sey*ds[1]/ss,3);
eys =
eys + ey[1];
x[1]
= Rund(xa + dx[1] - ex[1],3);
y[1] = Rund(ya + dy[1] - ey[1],3);
for (i = 2; i<=n-2; i++) {
ex[i] = Rund(sex*ds[i]/ss,3);
exs
= exs + ex[i];
ey[i] = Rund(sey*ds[i]/ss,3);
eys =
eys + ey[i];
x[i]
= Rund(x[i-1] + dx[i] - ex[i],3);
y[i] = Rund(y[i-1] + dy[i] - ey[i],3);
}
ex[n-1] = Rund(sex - exs,3);
ey[n-1] = Rund(sey - eys,3);
x[n-1]
= Rund(x[n-2] + dx[n-1] - ex[n-1],3);
y[n-1] = Rund(y[n-2] + dy[n-1] -
ey[n-1],3); O
//
delts=Rund(Math.sqrt(Math.pow(sex,2)
+ Math.pow(sey,2)),3); P
if
(delts != 0) {
seido=Rund(ss/delts,0); Q
}
else {
seido=0;
}
Heigo( ) R
//
}
計算の中心になる部分です。
@A 開放トラバースに追加したローカル変数です。このプロシージャの
中だけしか使わない変数ですから、プロシージャ内で宣言するローカル変数
にします。
B これより前の部分は、開放トラバースと同じです。閉合トラバースで
は、「終点の方向角と初点の方向角が同じ」という条件がありますので、その
差をとり測角誤差を求めます。
C 1点当たりの測角誤差を求めています。
DE 測角誤差の符号を取り、その絶対値を求めます。四捨五入しながら、
各点に配布する誤差(これを補正値といいます)を求めるので、プラスの値で
計算し後で元の符号に戻すようにしてあります。
F このループで各点に配布する補正値を求めます。その点までの累加
補正数から、1つ前までの累加補正数を減じて、その点に対する配布補正値
を求めます。
GH このループで、方向角を補正します。
I 距離の合計を求めます。ss = 0 のように、まず合計する変数をクリ
アした方が安全です。
J〜K 開放トラバースと同じで補正する前のXY座標を求めます。
LM 閉合トラバースでは、「終点の座標と初点の座標が同じ」という条件
がありますので、その差をとり閉合差を求めます。ここで、終点の番号は n-1
である点に注意してください。
NO 各座標に対する補正値を計算しながら、補正した座標を求めます。
変数 exs と eys は、それぞれ最後のX座標とY座標の1つ前の点までの配
布量を合計する変数です。これを求めると、最後の点にのこりの補正値をす
べて配布できます。
P 閉合差を求めます。
Q 精度の分母数を求めます。
R 計算結果出力のプロシージャに飛びます。
function Heigo( ) {
・
・
・
}
計算結果出力のプロシージャです。開放トラバースのプログラムに角度と座
標の補正値を追加しています。また、測角誤差、ΔX、ΔY、ΣS、閉合差、
精度を表示できるように、プログラムを追加してあります。
りょうかんのアドバイス
プログラミングが初めてという方には、閉合トラバースはちょっと難しくなりまし
たね。角度誤差とXY座標誤差の補正を取り入れるだけで、こんなに複雑にな
りました。
「プログラムなんて、やーめた。りょうかんは、よくこんなに難しいプログラムが
作れるもんだ。おれには無理だ。」なんて言わないでくださいね。
実は、このプログラムを作るのに3日かかりました。ずぅーと考え続けて3日で
す。測点の番号と観測データとの関係がややっこしくて、何回も図を画いてみ
たり、プログラムを書き換えてみたり、そりゃー大変な無駄な?苦労をしたの
ですよ。最初からスラスラとできたのではないのです。
難しい数学の問題が解けなかったとき、参考書の似たような問題の解説を見
ますね。しかし、またその解説が分からなくてイライラするということがありませ
んでしたか。りょうかんのプログラムは、初めてプログラムを作る人にとって、
そんな参考書の解説のように見えるかもしれません。でも、そこであきらめたら
いけません。では、どうするか? 自分で、最初から作ってみるのです。動くよ
うになるまで。
一度自分の力で作ってしまうと、あとは面白くなってプログラム作りにはまるは
ずです。こんなに楽しいあそびがあったのかと・・・。がんばってくださいね。
さて、ここでプログラムを作る時、りょうかんが気を付けていることを2、3挙げた
いと思います。
1.データは、何回も入力するのはたいへんなので、最初は代入文にする。完
全に動くのを確めたら、入力フォームを接続する。
2.最初から何でも欲張らない。あれも、これもできるようにと欲を出すとプログ
ラミングの効率が悪くなる。
3.コメント(注釈)を多く入れる。後で見た時、分かるように。
4.いろんなデータでチェックする。面倒がらずに。
・
・
・
次回は、『結合トラバース』の予定です。(10月10日ごろ)
この講座に対する、ご意見やご要望はメールか掲示板・伝言板でお願
いします。
『JavaScriptによる測量計算プログラミング入門』
講師 大愚良寛