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

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

プログラム例題26

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

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

考え方

        

 

結合トラバースは、最後の点を他の基準点に結合させます。しかし、計算上は

閉合トラバースの計算に、終点の座標と方向角を取り入れるだけです。

したがって、閉合トラバースのプログラムをすこし変更するだけで、結合トラバ

ースのプログラムが作れるはずです。

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

Aから点1、点1から点2、・・・、点Bから点Dに向かう方向角α1α2、・・・、

αnを順次もとめます。

まで方向角を計算します。

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

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

により、 αn を求め、αB との閉合差 ω を求めます。ω を測角数 n で除し

て各観測角に補正します。

このようにして、観測角の補正をしたあと、ふたたび方向角の計算をやり直し

ます。

(2)座標の誤差(閉合差)の処理

方向角の補正計算の後、各点の座標を次式により計算します。

   Xi = Xi-1 + Sicos(αi)

   Yi = Yi-1 + Sisin(αi)

最後の測点の座標と、初点座標との座標閉合差を求めます。

   Ex = Xn-1 - XB

   Ey = Yn-1 - YB

この座標閉合差を、各測線長(観測距離)に比例して配布します。

   X座標に対する補正数 = Ex × Si /ΣS

   Y座標に対する補正数 = Ey × Si /Σ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);
                alpb = Dobyo(alpb);
                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] - alpb;
                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] - xb,3);
                
sey = Rund(y[n-1] - yb,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;
                }
                Ketugo( );
//
        
}
//
//
                // 結合トラバース計算結果出力
//
function Ketugo( ) {
        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=350° 0′0″
         XB=132.51m, YB=338.24m, αB= 70° 0′0″
        点名=1, β1= 60° 0′ 0″,   S1=100.00m
        点名=2, β2=270° 0′ 0″,   S2=110.00m
        点名=B, β3=100° 0′ 0″,   S3=105.00m
        点名=D, β4=190° 0′20″

     ※4点目の入力は、点名= D、夾角= 190.0020、距離= なし

     ※必ずクリアボタンをクリックしてから入力します。

     ※入力終了は、点名に E を入力して、計算ボタンをクリックします。

 

 

 

プログラムの説明

閉合トラバースのプログラムと異なる部分を赤で記してあります。

終点の方向角の閉合差は、

    w = ai[n] - alpb

となります。

また、終点の座標の閉合差は、

        sex = Rund(x[n-1] - xb,3)
        
sey = Rund(y[n-1] - yb,3)

となります。

 

 


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

 りょうかんのアドバイス

閉合トラバースで苦労した分、結合トラバースは簡単になりました。

これまでのトラバース計算のプログラムをまとめて一本のプログラムにすると、

さらに使いやすいものになるでしょう。それには、各トラバースの違いをよく考

え、if 文で分けて処理するようにすればいいのです。

しかし、せっかく作ったプログラムを大幅に変更するのは大変です。結合トラ

バースと閉合トラバースの場合、少しの変更でまとめることができると思いま

すが、開放トラバースとまとめるのは難しいでしょう。そこで、りょうかんは次の

ように考えました。

 

(1)入力データにより、開放トラバースか、閉合トラバースか、結合トラバース

かを判断します。

(2)開放トラバースのデータならば、開放トラバースのプログラムを実行します。

(3)閉合トラバースと結合トラバースのデータの場合、閉合トラバースのプログ

ラムに if 文を入れて、結合トラバースの計算もできるように改良します。

 

このようにすると、簡単にまとめることができるでしょう。あとは皆さんへの宿

題にします。がんばってください。

 

次回は、『路線測量』の予定です。(10月10日ごろ)

この講座に対する、ご意見やご要望はメールでお願いします。

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

講師 大愚良寛


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