13.4 閉合トラバース          [もくじへ] [トップページへ] [前ページへ]

===================================================

プログラム例題25

閉合トラバースのプログラムを作成せよ。

=========================================================

考え方

        

観測データには、いろいろな原因による誤差が含まれます。したがって、それ

から求められた方向角や座標には当然誤差を生じます。閉合トラバースが開

放トラバースと違う点は、この誤差を補正するか、補正しないかという点です。

閉合トラバースでは、方向角の誤差と、座標の誤差の2つに分けて処理します。

(1)方向角の誤差(閉合差)の処理

開放トラバースと同じように、点まで方向角を計算します。

   α1 = αA + β1       ( α1 が360°を超えたら360°を減ずる )

   αn-1 = αn-2 + βn-1 + 180° αn が360°を超えたら360°を減ずる )

閉合トラバースでは、さらに初点(点)に戻り、 β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);
                d
y[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);
                        d
y[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
                d
y[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);
                        d
y[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 のように、まず合計する変数をクリ

アした方が安全です。

JK 開放トラバースと同じで補正する前のXY座標を求めます。

LM   閉合トラバースでは、「終点の座標と初点の座標が同じ」という条件

がありますので、その差をとり閉合差を求めます。ここで、終点の番号は n-1

である点に注意してください。

NO  各座標に対する補正値を計算しながら、補正した座標を求めます。

変数 exseys は、それぞれ最後のX座標とY座標の1つ前の点までの配

布量を合計する変数です。これを求めると、最後の点にのこりの補正値をす

べて配布できます。

P    閉合差を求めます。

Q    精度の分母数を求めます。

R    計算結果出力のプロシージャに飛びます。

 

function Heigo( ) {
  ・
  ・
  ・
}

計算結果出力のプロシージャです。開放トラバースのプログラムに角度と座

標の補正値を追加しています。また、測角誤差、ΔX、ΔY、ΣS、閉合差、

精度を表示できるように、プログラムを追加してあります。

 

 


[もくじへ] [トップページへ]

 りょうかんのアドバイス

プログラミングが初めてという方には、閉合トラバースはちょっと難しくなりまし

たね。角度誤差とXY座標誤差の補正を取り入れるだけで、こんなに複雑にな

りました。

「プログラムなんて、やーめた。りょうかんは、よくこんなに難しいプログラムが

作れるもんだ。おれには無理だ。」なんて言わないでくださいね。

実は、このプログラムを作るのに3日かかりました。ずぅーと考え続けて3日で

す。測点の番号と観測データとの関係がややっこしくて、何回も図を画いてみ

たり、プログラムを書き換えてみたり、そりゃー大変な無駄な?苦労をしたの

ですよ。最初からスラスラとできたのではないのです。

難しい数学の問題が解けなかったとき、参考書の似たような問題の解説を見

ますね。しかし、またその解説が分からなくてイライラするということがありませ

んでしたか。りょうかんのプログラムは、初めてプログラムを作る人にとって、

そんな参考書の解説のように見えるかもしれません。でも、そこであきらめたら

いけません。では、どうするか? 自分で、最初から作ってみるのです。動くよ

うになるまで。

一度自分の力で作ってしまうと、あとは面白くなってプログラム作りにはまるは

ずです。こんなに楽しいあそびがあったのかと・・・。がんばってくださいね。

 

さて、ここでプログラムを作る時、りょうかんが気を付けていることを2、3挙げた

いと思います。

1.データは、何回も入力するのはたいへんなので、最初は代入文にする。完

全に動くのを確めたら、入力フォームを接続する。

2.最初から何でも欲張らない。あれも、これもできるようにと欲を出すとプログ

ラミングの効率が悪くなる。

3.コメント(注釈)を多く入れる。後で見た時、分かるように。

4.いろんなデータでチェックする。面倒がらずに。

   ・
   ・
   ・

次回は、『結合トラバース』の予定です。(10月10日ごろ)

この講座に対する、ご意見やご要望はメール掲示板・伝言板でお願

いします。

『JavaScriptによる測量計算プログラミング入門』 

講師 大愚良寛


[もくじへ] [トップページへ] [次ページへ]