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>例題26</TITLE>

<SCRIPT LANGUAGE="VBScript">
<!--
'
        Dim an, xa, ya, alpa                          '初点名,X,Y,方向角
        Dim bn, xb, yb, alpb                          '終点名,X,Y,方向角
        Dim ii
        ii = 1                                        '測点番号
        Dim na(50), bt(50), ds(50)                    '測点名,夾角,距離
        Dim n                                         '測点数
'
        Dim ai(50), x(50), y(50)                      '方向角,X座標,Y座標
        Dim dx(50), dy(50)                            'X座標差,Y座標差
        Dim PI
        PI = 3.141592653589793
'
        Dim w                                         '測角誤差
        Dim et(50)                                    '夾角への補正数
        Dim sex, sey                                  'X、Y座標誤差
        Dim delts, ss                                 '閉合差、距離合計
        Dim ex(50), ey(50)                            'X、Y座標への補正数
        Dim seido                                     '精度
'
'
                'クリアボタンをクリック
'
        Sub INI_OnClick
                Dim 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 To 50
                       na(i) = ""
                       bt(i) = 0
                       ds(i) = 0
                Next
'
                document.Form1.NO.value = ii
                document.Form1.NA.value = na(ii)
                document.Form1.BT.value = bt(ii)
                document.Form1.DS.value = ds(ii)
        End Sub
'
'
                '後退ボタン(<)をクリック
'
        Sub BCK_OnClick
                na(ii) = document.Form1.NA.value
                bt(ii) = CDbl(document.Form1.BT.value)
                ds(ii) = CDbl(document.Form1.DS.value)
'
                ii = ii-1
                If ii <= 0 Then 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)
        End Sub
'
'
                '前進ボタン(>)をクリック
'
        Sub FRD_OnClick
                na(ii) = document.Form1.NA.value
                bt(ii) = CDbl(document.Form1.BT.value)
                ds(ii) = CDbl(document.Form1.DS.value)
'
                ii = ii+1
                If ii > 50 Then 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)
        End Sub
'
'
'  角度の変換(度を秒に)
'
        Function Dobyo( x )
                Dim d, f, b
                d = Int(x)
                f = Int((x - d)*100)
                b = Int(((x - d)*100 - f)*100 + 0.5)
                Dobyo = d*3600 + f*60 + b
        End Function
'
'
'  角度の変換(秒を度分秒に)
'
        Function Byodfb( x, doo, fun, byo )
       IF x<0 Then x = x + 1296000
                doo = Int(x/3600)
                fun = Int((x - doo*3600)/60)
                byo = x - doo*3600 - fun*60
                IF byo<0 Then byo = 0
        End Function
'
'
'  四捨五入
'
        Function Rund(x,y)
                Dim sg
                IF x>=0 Then sg = 1 Else sg =-1
                Rund = sg*Int(abs(x)*10^y + 0.5)/10^y
        End Function
'
'
                '計算ボタンをクリック
'
        Sub CAL_OnClick
                Dim i
                Dim ew, sg                           '測角誤差w/n、その符号          
                Dim exs, eys                         'X、Yの累加補正数
'
                '初点データ
                an = document.Form1.AN.value
                xa = CDbl(document.Form1.XA.value)
                ya = CDbl(document.Form1.YA.value)
                alpa = CDbl(document.Form1.AA.value)
'
                '終点データ
                bn = document.Form1.BN.value
                xb = CDbl(document.Form1.XB.value)
                yb = CDbl(document.Form1.YB.value)
                alpb = CDbl(document.Form1.AB.value)
'
                '測点データ
                na(ii) = document.Form1.NA.value
                bt(ii) = CDbl(document.Form1.BT.value)
                ds(ii) = CDbl(document.Form1.DS.value)
'
                '測点数のカウント
                n = 0
                For i = 1 To 50
                        If na(i)="E" Then Exit For
                             n = n + 1
                Next
'
'
'   *** 計算部 ***
'   角度を秒に変換
                alpa = Dobyo(alpa)
                
alpb = Dobyo(alpb)
                For i = 1 To n
                        bt(i) = Dobyo(bt(i))
                Next
'
                ai(1) = alpa + bt(1)
                Do While ai(1)>=1296000
                      ai(1) = ai(1) - 1296000
                Loop
                For i = 2 To n
                        ai(i) = ai(i-1) + bt(i) + 648000
                        Do While ai(i)>=1296000
                              ai(i) = ai(i) - 1296000
                        Loop
                Next
'
                w = ai(n) -
alpb
                ew = w/n
                IF ew>=0 Then sg = 1 Else sg = -1
                ew = abs(ew)
                For i = 1 To n
                        sewb = Int(ew*(i-1)+0.5)               '前の累加補正数
                        sewf = Int(ew*i+0.5)                   '後の累加補正数
                        et(i) = sg*(sewf - sewb)
                Next
                ai(1) = alpa + bt(1) - et(1)
                Do While ai(1)>=1296000
                      ai(1) = ai(1) - 1296000
                Loop
                For i = 2 To n
                        ai(i) = ai(i-1) + bt(i)- et(i) + 648000
                        Do While ai(i)>=1296000
                              ai(i) = ai(i) - 1296000
                        Loop
                Next
'
                ss = 0
                For i = 1 To n-1
                        ss = ss + ds(i)
                Next
'
                dx(1) = Rund(ds(1)*cos(ai(1)/648000*PI),3)
                dy(1) = Rund(ds(1)*sin(ai(1)/648000*PI),3)
                x(1) = xa + dx(1)
                y(1) = ya + dy(1)
                For i = 2 To n-1
                        dx(i) = Rund(ds(i)*cos(ai(i)/648000*PI),3)
                        dy(i) = Rund(ds(i)*sin(ai(i)/648000*PI),3)
                        x(i) = x(i-1) + dx(i)
                        y(i) = y(i-1) + dy(i)
                Next
'
                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) = xa + dx(1) - ex(1)
                y(1) = ya + dy(1) - ey(1)
                For i = 2 To n-2
                        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) = x(i-1) + dx(i) - ex(i)
                        y(i) = y(i-1) + dy(i) - ey(i)
                Next
                ex(n-1) = Rund(sex - exs,3)
                ey(n-1) = Rund(sey - eys,3)
                x(n-1) = x(n-2) + dx(n-1) - ex(n-1)
                y(n-1) = y(n-2) + dy(n-1) - ey(n-1)
'
                delts=Rund(Sqr(sex^2 + sey^2),3)
                IF delts<>0 Then
                      seido=Rund(ss/delts,0)
                Else
                      seido=0
                End IF
                Ketugo
'
        End Sub
'
'
                '結合トラバース計算結果出力
'
Sub Ketugo
        Dim 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 to n-2
                '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>"
        Next
        '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>"
End Sub
'
-->
</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=" < ">
<INPUT TYPE="button" NAME="FRD" VALUE=" > ">
      <INPUT TYPE="button" NAME="INI" VALUE="クリア">
<INPUT TYPE="button" NAME="CAL" VALUE="計 算">
<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月5日ごろ)

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

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

                                講師 りょうかん


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