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);
dy[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);
dy[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による測量計算プログラミング入門』
講師 大愚良寛