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による測量計算プログラミング入門』
講師 りょうかん