13.3 開放トラバース          [もくじへ] [トップページへ] [前ページへ]

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

プログラム例題24

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

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

考え方

        

初点方向角αA、初点座標 A(XA,YA)、Aでの測角 β1、測距S1 とすると、

Aより点への方向角α1は、

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

の座標は、

   X1 = XA + S11)

   Y1 = YA + S11)

となります。

また、点1より点2への方向角α2は、

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

方向角α2が求められれば、点2の座標は点1の座標と同様に、

   X2 = X1 + S22)

   Y2 = Y1 + S22)

となります。

以下同様にして各点の座標を求めることができます。したがって、一般式は

次のようになります。

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

   Xn = Xn-1 + Snn)

   Yn = Yn-1 + Snn)

 

 

プログラム

 

<HTML>
<HEAD>
   <TITLE>例題24</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;                                    // 度分秒
//
//
//
                
// クリアボタンをクリック
//
        function onINI( ) {
                
var i;
                
//
                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;
//
                // 初点データ
                
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;
                        }
                
}
//
                
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; 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];
                
}
                
Kaiho( );
//
        
}
//
//
                
// 開放トラバース計算結果出力
//
function Kaiho( ) {
        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]);
        document.write("<TD ALIGN='right'>",doo + "-" + fun + "-" + byo,"</TD>");
        r = Byodfb(alpa);
        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'>"," ","</TD>");
        r = Byodfb(ai[1]);
        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'>"," ","</TD>");
        document.write("<TD ALIGN='right'>"," ","</TD></TR>");
        
// i
        
for (i = 1; i<=n-1; i++) {
                
// iの1行目
                document.write("<TR ALIGN='CENTER'><TD ALIGN='left' >",na[i],"</TD>");
                r = Byodfb(bt[i+1]);
                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'>"," ","</TD>");
                r = Byodfb(ai[i]);
                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'>"," ","</TD>");
                document.write("<TD ALIGN='right'>"," ","</TD></TR>");
        
}
        
// n行目
        document.write("<TR ALIGN='CENTER'><TD ALIGN='left' >",na[n],"</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[n],"</TD>");
        document.write("<TD ALIGN='right'>",y[n],"</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=-6132.14, YA=8462.15

 

閉合トラバースや、結合トラバースにも使える表にしました。空白になっている

箇所があるのは、そのためです。

 

 

プログラムの説明

 

        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;                                    // 度分秒

入力画面のプログラムに、追加したグローバル変数です。

 

//  角度の変換(度を秒に)
//
        
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;
        
}

測量計算では、角度は1秒も無視できません。ラジアンや度のままだと、場合

によっては数秒の誤差が出る場合があります。したがって、秒に変換して計

算誤差が出ないようにしています。これらは、そのための関数プロシージャ

です。

 

//  四捨五入
//
        
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;
        }

変数 sg は、四捨五入するデータの符号(±1)を代入します。abs( ) は、絶

対値を求める関数です。したがって、このプロシージャでは、データの絶対値

を小数第y+1位を四捨五入した後、符号を元に戻します。JavaScript には、

四捨五入の関数があります。

r = Math.round(x*Math.pow(10,y))/Math.pow(10,y) でこのプログラムと

同じ結果が得られます。

 

//   *** 計算部 ***
//   角度を秒に変換
                
alpa = Dobyo(alpa);  @
                
for (i = 1; i<=n; i++) {
                        
bt[i] = Dobyo(bt[i]);  A
                
}
//
                ai[1] = alpa + bt[1];
  B
                
while (ai[1]>=1296000) {  C
                           ai[1] = ai[1] - 1296000;
                }
                
for (i = 2; i<=n; i++) {
                        ai[i] = ai[i-1] + bt[i] + 648000;
  D
                        
while (ai[i]>=1296000) {
                                   ai[i] = ai[i] - 1296000;
                        }
                
}
//
                
dx[1] = Rund(ds[1]*Math.cos(ai[1]/648000*Math.PI),3);  E
                d
y[1] = Rund(ds[1]*Math.sin(ai[1]/648000*Math.PI),3);  F
                
x[1] = xa + dx[1];  G
                
y[1] = ya + dy[1];  H
                
for (i = 2; i<=n; i++) {
                        dx[i] = Rund(ds[i]*Math.cos(ai[i]/648000*Math.PI),3);
  I
                        d
y[i] = Rund(ds[i]*Math.sin(ai[i]/648000*Math.PI),3);  J
                        x[i] = x[i-1] + dx[i];
  K
                        
y[i] = y[i-1] + dy[i];  L
                
}
                
Kaiho( );  M

開放トラバースの計算部です。

@A 入力された角度データをすべて秒に変換します。

B   初点から測点1への方向角の計算です。

C   Bの方向角が360°(129600秒)を超えたら、360°を減じます。

C   Bの方向角が360°(129600秒)を超えたら、360°を減じます。


while 文

for 文はくり返し回数の決まっている場合に使いますが、 while 文はくり返し

回数の決まっていない場合に用います。

    while ( 条件式 ) {

      くりかえす文

    }

のように記述し、条件式を満たしている間くり返します。


D   B以外の方向角の計算です。測点2以降の方向角計算は同じなので、

ループに入れます。

EF 初点からの座標差を求めます。座標差は小数第3位に丸めます。

GH 測点1の座標を求めます。

I〜L 測点2以降の座標差と座標を求めます。 

M 開放トラバース計算結果出力のプロシージャを実行します。

 

                // 開放トラバース計算結果出力
//
function Kaiho( ) {
  ・
  ・
  ・

開放トラバース計算結果出力のプロシージャです。閉合トラバースと結合トラ

バースにも使えるように設計してあります。

JavaScript には、表示桁をそろえるフォーマット文がないので、HTML の表作

成のタグを使って表を作成します。しかし、表作成はなかなか面倒でなもので

す。このプログラムを作る時も、何回か試行錯誤をくりかえして、なんとか表ら

しいものにすることができました。

したがって、ここでは表作成のタグの説明をしますので、それを理解した上で

プログラムを解析し、すっきりした表を作ってみてください。

 

表作成のタグについて

表の始まりと終わりのタグは、<TABLE> </TABLE> です。その中に行を作

るには <TR> </TR> 、列を作るには <TD> </TD> のタグを使います。

また、HTML では行の中に列を作るという考え方をしますので、たとえ行の中

に列が1列しかなくても、<TR> <TD> </TD> </TR> のように使います。

表に枠を付ける時は <TABLE BORDER="1"> のようにします。BORDER

の数値は枠の太さを表します。

枠の中に入れるデータの位置を調整するには、<TD ALIGN="right"> のよ

うに、ALIGN を使います。左揃えは left、中央揃えは center、右揃えは

right を指定します。

たとえば、次のように HTML を書くと、

<TABLE BORDER="1">
<TR><TD>(1,1)</TD><TD>(1,2)</TD><TD>(1,3)</TD></TR>
<TR><TD>(2,1)</TD><TD>(2,2)</TD><TD>(2,3)</TD></TR>
</TABLE>

次のような、2行3列の表ができます。

     

BORDER などに値を指定する場合、"1" のようにダブルクォーテーション

で囲みますが、これを JavaScript で記述する場合、次のように内側はシン

グルクォーテーションにしなければなりません。

document.write("<CENTER><TABLE BORDER='1'>");

 


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

 

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

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

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

講師 大愚良寛


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