![a2da985c8f46726e26a46905ee402dc3.png](https://i-blog.csdnimg.cn/blog_migrate/9c3baaeadac3e6a1e70a115cb31b4a1b.png)
点击上方蓝色文字关注我们吧
利用VB程序计算桥涵结构物坐标
在工程测量中,测量人员在进行桥涵结构物放样的时候需要先把结构物的边角控制点坐标先计算出来,而目前使用软件及Excel表格坐标方法计算占大多数,而专业软件大多数又需要注册,收费成本比较高,并且Excel计算表格大多数只能计算路线正交简单的正反算,由于桥涵结构物与路线的关系除正交外还存在斜交,做的方式还有斜交斜做、斜交正做、正交斜做、正交正做,如果单纯的按照线路正反算来计算的话在放样曲线上的构筑物时,会出现梯形,即一头大一头小的现象,这是因为在直线上每一个点的法线是互相平行的,而在曲线上,任意两个不同点的法线都是不平行的,所以,我们在计算结构物的坐标时首先要确定结构物的中轴线和线路的关系,是正交还是斜交,如果是斜交,斜交角度是多少,然后以某一点或某一条线来作为基准点或基准线控制整个结构物的形状即可。
一、测量基础公式计算坐标
我们由测量基础公式来计算。如下图,设A为已知点, B为未知点, 当A点坐标( xA, yA ) 、 A点至B点的水平距离 SAB,和坐标方位角 αAB均为已知时, 则可求得B点坐标( xB, yB )。
图 1
xB = xA + ΔxAB
yB = yB + ΔyAB
改成用三角函数计算公式是:
X=x0+S*cos(α) ①
Y=y0+S*sin(α) ②
注:X,Y为待求点,x0,y0为基准点坐标,L为两点距离,α是基准点方位角。
以下示图为例:在缓和曲线上K27+000处设置一涵洞,涵长左端18.21m,右端18.79m,涵宽1.5m,与路线斜交成60°夹角,K27+000的方位角α=177°11′50.32″;涵洞采用斜交正做的方式。结构中心坐标为:X0=2889584.9154,Y0=481265.4763。
图 2
上图是正确的放样示意图,如果还是以常规方法来放样就会形成内侧涵洞的宽度小于曲线外侧涵洞的宽度,放样出如下错误示意图:
图 3
首先我们利用公式①②以结构物中心O点为基准点计算中轴线上A、B点坐标:
XA=X0+S1*COS(α-(180°-60°))
YA=Y0+S1*SIN(α-(180°-60°))
S1=18.21m
代入数据解得XA=2889594.7810,YA=481280.7830
可求得结构中心至B点方位角β=α+60°
同理代入相对应数据解得 XB=2889574.7360 ,YB=481249.6830
同理可求出1、2、3、4点的坐标依次为:
X1=2889595.4110,Y1=481280.3762
X4= 2889594.1502,Y4= 481281.1889
X2= 2889575.3664,Y2= 481249.2762
X3= 2889574.1056,Y3= 481250.0888
以上用公式计算虽然准确但耗费时间,如果路线上设置多出桥涵结构物,还是用公式计算每一个放样角点,这样会麻烦耗时,所以,提出自己编写小程序来解决这一问题,这样就可以快速准确的计算出多点坐标。
二、VB小程序计算坐标
接下来利用VB小程序来计算结构物角点坐标,结构物计算程序运行界面如下图:
图 4
主程序计算代码如下:
Private Sub CommandButton1_Click()
Const pi = 3.14159265358979
'构造物边点坐标计算
Dim x0, y0, a, b, α, β, β2, c, d, a1, a2, a3 As Double
x0 = UserForm2.TextBox1.Text
y0 = UserForm2.TextBox2.Text
α = UserForm2.TextBox3.Text
β = UserForm2.TextBox16.Text
β2 = UserForm2.TextBox22.Text
a = UserForm2.TextBox4.Text
b = UserForm2.TextBox5.Text
c = UserForm2.TextBox8.Text
d = UserForm2.TextBox7.Text
a1 = 简易角度转弧度(α)
a2 = 简易角度转弧度(β)
a3 = 简易角度转弧度(β2)
zzx = x0 + a * Cos(a1 - (pi - a2)) '左中x坐标
zzy = y0 + a * Sin(a1 - (pi - a2)) '左中y坐标
yzx = x0 + b * Cos(a1 + a2) '右中x坐标
yzy = y0 + b * Sin(a1 + a2) '右中y坐标
X1 = zzx + d * Cos(a1 - (pi - a2) - a3)
Y1 = zzy + d * Sin(a1 - (pi - a2) - a3)
x4 = zzx + c * Cos(a1 + a2 - a3)
y4 = zzy + c * Sin(a1 + a2 - a3)
x3 = yzx + c * Cos(a1 + a2 - a3)
y3 = yzy + c * Sin(a1 + a2 - a3)
X2 = yzx + d * Cos(a1 - (pi - a2) - a3)
Y2 = yzy + d * Sin(a1 - (pi - a2) - a3)
UserForm2.TextBox6.Text = Round(zzx, 3)
UserForm2.TextBox10.Text = Round(zzy, 3)
UserForm2.TextBox9.Text = Round(yzx, 3)
UserForm2.TextBox14.Text = Round(yzy, 3)
UserForm2.TextBox13.Text = Round(X1, 3)
UserForm2.TextBox12.Text = Round(Y1, 3)
UserForm2.TextBox20.Text = Round(x4, 3)
UserForm2.TextBox21.Text = Round(y4, 3)
UserForm2.TextBox18.Text = Round(x3, 3)
UserForm2.TextBox17.Text = Round(y3, 3)
UserForm2.TextBox11.Text = Round(X2, 3)
UserForm2.TextBox15.Text = Round(Y2, 3)
End Sub
以上为主程序代码,不过在计算的时候会涉及到三角函数计算,如果不进行转换,软件会无法识别输入的角度格式,就连Excel表格也一样,它只能设置简单的角度格式显示及简单的计算,复杂角度的运算就会涉及到复杂的公式问题了,但是利用程序代码来解决这个问题就很方便,只需在里面建一个模块定义一个转换函数,以后用的时候调用就行了。
角度转换代码如下:
Const pi = 3.14159265358979
Public Function 简易角度转弧度(ByVal JiYiJ As Double) As Double
Dim d As Integer
Dim f As Integer
Dim m As Double
d = Fix(JiYiJ)
f = Fix((JiYiJ - d) * 100)
m = ((JiYiJ - d) * 100 - f) * 100
简易角度转弧度 = (d + f / 60 + m / 3600) / 180 * pi
End Function
Public Function 弧度转简易角度(ByVal HuDuJ As Double) As Double
Dim d As Double
Dim f As Double
Dim m As Double
d = HuDuJ / pi * 180
f = (d - Fix(d)) * 60
m = (f - Fix(f)) * 60
Dim Ms As String
Dim Fs As String
If f < 10 Then Fs = "0" & Str(Fix(f)) Else Fs = Str(Fix(f)) '分小于10用0补位
If m < 10 Then Ms = "0" & Str(m) Else Ms = Str(m) '秒小于10用0补位
'由于秒一般有小数,需要去掉小数点
Ms = Replace(Ms, ".", "")
弧度转简易角度 = Val(Str(Fix(d)) & "." & Fs & Ms)
End Function
利用VB程序计算上面结构物角点坐标结果如下图:
图 5
将手算结果与程序计算结果对比如下:
点号 | 坐标XY | 手算结果 | 程序计算结果 | ΔX、 ΔY |
1 | X | 2889595.4110 | 2889595.4110 | 0.0000 |
Y | 481280.3762 | 481280.3760 | 0.0002 | |
2 | X | 2889575.3664 | 2889575.3660 | 0.0004 |
Y | 481249.2762 | 481249.2760 | 0.0002 | |
3 | X | 2889574.1056 | 2889574.1060 | -0.0004 |
Y | 481250.0888 | 481250.0890 | -0.0002 | |
4 | X | 2889594.1502 | 2889594.1500 | 0.0002 |
Y | 481281.1889 | 481281.1890 | -0.0001 | |
A左中 | X | 2889594.7810 | 2889594.7810 | 0.0000 |
Y | 481280.7830 | 481280.7830 | 0.0000 | |
B右中 | X | 2889574.7360 | 2889574.7360 | 0.0000 |
Y | 481249.6830 | 481249.6830 | 0.0000 |
从表中可以看出,根据公式手算的结果和程序计算的结果差值ΔX、ΔY均符合进精度要求,表明程序计算的结果可以用于坐标施工放样。 结果表明手算虽然准确率高,但是手动计算较为繁琐耗时,并且需要借助多功能计算器,而且一个数据输入错误就会造成最终结果的错误。在工程任务紧张的情况下,我们可以利用这个小程序将需要放样的点位坐标用程序先计算好,遵循“复核再复核”的测量准则,我们可以抽点进行手算来复核数据,这样既保证了测量人员内业计算数据的准确性,也提高了计算数据的效率。
![5f3dafd0370447aba0e70f05dec02b32.gif](https://i-blog.csdnimg.cn/blog_migrate/89a0de3806355f90622f5b5b1e3fc6a1.gif)