我有VB的,自己很多年前写的,一直用,但是正算->反算->正算后,Y坐标与原来的差了05-07mm,不知道怎么回事,这两年工作忙也没有时间再深究,但是这样的计算精度做控制足够了,如果楼主或是者是哪位同仁见此贴能顺便把这个问题解决了,咱们就一起进步了!代码如下:
'高斯坐标正算
Private Sub DadiZs()
Dim t As Double, Itp As Double, X0 As Double, N As Double, L0 As Double
Dim V As Double, ll As Double, W As Double, M As Double
Lat = Radian(Lat)
Lon = Radian(Lon)
L0 = Radian(Lo)
If Tq = 0 Then
a = 6378245 '54椭球参数
b = 635686301877305
ep = 0006693421622966
ep1 = 0006738525414683
f = (a - b) / a
c = a ^ 2 / b
d = b ^ 2 / a
X0 = 1111348611 (Lat 180# / Pi) - (320057799 Sin(Lat) + 1339238 (Sin(Lat)) ^ 3 + 06973 (Sin(Lat)) ^ 5 + 00039 (Sin(Lat)) ^ 7) Cos(Lat)
'X0 = 1111348611 (Lat 180# / Pi) - (320057798 Sin(Lat) + 1339238 (Sin(Lat)) ^ 3 + 06972 (Sin(Lat)) ^ 5 + 00039 (Sin(Lat)) ^ 7) Cos(Lat)
Else
a = 6378140 '75椭球参数
b = 635675528815753
ep = 0006694384999588
ep1 = 0006739501819473
f = (a - b) / a
c = a ^ 2 / b
d = b ^ 2 / a
X0 = 1111330047 (Lat 180 / Pi) - (320098575 Sin(Lat) + 1339602 (Sin(Lat)) ^ 3 + 06976 (Sin(Lat)) ^ 5 + 00039 (Sin(Lat)) ^ 7) Cos(Lat)
End If
ll = Lon - L0
t = Tan(Lat)
Itp = ep1 Cos(Lat) ^ 2
W = Sqr(1 - ep Sin(Lat) ^ 2)
V = Sqr(1 + ep1 Cos(Lat) ^ 2)
M = c / V ^ 3
N = a / W
'x = X0 + N t (Cos(Lat)) ^ 2 ll ^ 2 / 2 + N t (5 - t t + 9 Itp + 4 Itp Itp) (Cos(Lat)) ^ 4 ll ^ 4 / 24 + N t (61 - 58 t ^ 2 + t ^ 4 + 270 Itp - 330 t ^ 2 Itp) (Cos(Lat)) ^ 6 ll ^ 6 / 720 + N t (1385 - 3111 t ^ 2 + 543 t ^ 4 - t ^ 6) Cos(Lat) ^ 8 ll ^ 8 / 40320
x = X0 + N t (Cos(Lat)) ^ 2 ll ^ 2 / 2 + N t (5 - t t + 9 Itp ^ 2 + 4 Itp ^ 4) (Cos(Lat)) ^ 4 ll ^ 4 / 24 + N t (61 - 58 t ^ 2 + t ^ 4 + 270 Itp ^ 2 - 330 t ^ 2 Itp ^ 2) (Cos(Lat)) ^ 6 ll ^ 6 / 720 + N t (1385 - 3111 t ^ 2 + 543 t ^ 4 - t ^ 6) Cos(Lat) ^ 8 ll ^ 8 / 40320
y = N Cos(Lat) ll + N (1 - t t + Itp) (Cos(Lat)) ^ 3 ll ^ 3 / 6 + N (5 - 18 t t + t ^ 4 + 14 Itp - 58 Itp t t) (Cos(Lat)) ^ 5 ll ^ 5 / 120 + N (61 - 479 t ^ 2 + 179 t ^ 4 - t ^ 6) Cos(Lat) ^ 7 ll ^ 7 / 5040
r = Sin(Lat) ll + Sin(Lat) (Cos(Lat)) ^ 2 ll ^ 3 (1 + 3 Itp + 2 Itp ^ 2) / 3 + Sin(Lat) (Cos(Lat)) ^ 4 ll ^ 5 (2 - t t) / 15
r = Degree(r)
y = y + 500000#
End Sub
'高斯反算
Private Sub DadiFs()
Dim t As Double, Itp As Double, X0 As Double, Bf As Double, N As Double
Dim v As Double, ll As Double, W As Double, M As Double, L0 As Double
L0 = Radian(Lo)
X0 = x 0000001
y = y - 500000#
If Tq = 0 Then
a = 6378245 '54椭球参数
b = 635686301877305
ep = 0006693421622966
ep1 = 0006738525414683
f = (a - b) / a
c = a ^ 2 / b
d = b ^ 2 / a
If X0 < 3 Then
Bf = 904353301294 X0 - 000000049604 X0 ^ 2 - 000075310733 X0 ^ 3 - 000000084307 X0 ^ 4 - 000000426055 X0 ^ 5 - 000000010148 X0 ^ 6
ElseIf X0 < 6 Then
Bf = 2711115372595 + 902468257083 (X0 - 3) - 000579740442 (X0 - 3) ^ 2 - 000043532572 (X0 - 3) ^ 3 + 000004857285 (X0 - 3) ^ 4 + 000000215727 (X0 - 3) ^ 5 - 000000019399 (X0 - 3) ^ 6
End If
Else
a = 6378140 '75椭球参数
b = 635675528815753
ep = 0006694384999588
ep1 = 0006739501819473
f = (a - b) / a
c = a ^ 2 / b
d = b ^ 2 / a
If X0 < 3 Then
Bf = 904369066313 X0 - 000000049618 X0 ^ 2 - 000075325505 X0 ^ 3 - 00000008433 X0 ^ 4 - 000000426157 X0 ^ 5 - 00000001015 X0 ^ 6
ElseIf X0 < 6 Then
Bf = 2711162289465 + 902483657729 (X0 - 3) - 000579850656 (X0 - 3) ^ 2 - 000043540029 (X0 - 3) ^ 3 + 000004858357 (X0 - 3) ^ 4 + 000000215769 (X0 - 3) ^ 5 - 000000019404 (X0 - 3) ^ 6
End If
End If
Bf = Bf Pi / 180#
t = Tan(Bf)
Itp = ep1 Cos(Bf) ^ 2
W = Sqr(1 - ep Sin(Bf) ^ 2)
v = Sqr(1 + ep1 Cos(Bf) ^ 2)
M = c / v ^ 3
N = a / W
Lat = Bf - 05 v ^ 2 t ((y / N) ^ 2 - (5 + 3 t t + Itp - 9 Itp t t) (y / N) ^ 4 / 12 + (61 + 90 t t + 45 t ^ 4) (y / N) ^ 6 / 360)
ll = ((y / N) - (1 + 2 t t + Itp) (y / N) ^ 3 / 6 + (5 + 28 t t + 24 t ^ 4 + 6 Itp + 8 Itp t t) (y / N) ^ 5 / 120) / Cos(Bf)
r = y t / N - y ^ 3 t (1 + t t - Itp) / (3 N ^ 3) + y ^ 5 t (2 + 5 t t + 3 t ^ 4) / (15 N ^ 5)
Lat = Degree(Lat)
Lon = Degree(L0 + ll)
r = Degree(r)
End Sub
有了正反算,换带也就完成了!
用到的子程序:
Public Const Pi = 314159265358979, p = 206264806
Public Cktq As String
'角度化弧度
Public Function Radian(a As Double) As Double
Dim Ro As Double
Dim c As Double
Dim Fs As Double
Dim Ib As Integer
Dim Ic As Integer
If a < 0 Then a = -a: t = 1
Ro = Pi / 180#
Ib = Int(a)
c = (a - Ib) 100#
Ic = Int(c + 0000000000001)
Fs = (c - Ic) 100#
If t = 1 Then Radian = -(Ib + Ic / 60# + Fs / 3600#) Ro Else Radian = (Ib + Ic / 60# + Fs / 3600#) Ro
End Function
'弧度化角度
Public Function Degree(a As Double) As Double
Dim Bo As Double
Dim Fs As Double
Dim Im As Integer
Dim Id As Integer
If a < 0 Then a = -a: t = 1
Bo = a
Call DMS(Bo, Id, Im, Fs)
If t = 1 Then Degree = -(Id + Im / 100# + Fs / 10000#) Else Degree = Id + Im / 100# + Fs / 10000#
End Function
Public Sub DMS(a As Double, Id As Integer, Im As Integer, Fs As Double)
Dim Bo As Double
Dim c As Double
c = a
c = 180# / Pi c
Id = Int(c)
Bo = (c - Id) 60
Im = Int(Bo)
Fs = (Bo - Im) 60
End Sub
'取位计算
Public Function Qw(a As Double, Ws As Integer) As Double
Qw = Int(a 10 ^ Ws + 05) / 10 ^ Ws
End Function
另外,站长团上有产品团购,便宜有保证
是6,上例中‘VB’是两个字符,‘程序设计’是四个字符,所以选择6。
len在VB里就是测量一个字符串中含有字符的数量。
例如len("ABC1234")的值是7,len("他今年专14岁")的值是6。
len(x)返回字符串变属量x的长度,即x含有字符的个数。
扩展资料:
在VBA中,Len 函数的功能为返回 Long,其中包含字符串内字符的数目,或是存储一变量所需的字节数。
LEN函数语法
Len(string | varname)
Len 函数的语法有下面这些部分:
string:任何有效的字符串表达式。如果 string 包含 Null,会返回 Null。
以下是实现在 VB 程序中加入三个文件系统控件并让它们同步的步骤:
1 打开 Visual Basic 程序,并创建一个新项目。
2 在窗体上添加三个文件系统控件,例如 `DriveListBox`、`DirListBox` 和 `FileListBox`。可以通过拖放的方式将这些控件添加到窗体上。
3 设置每个控件的主要属性,如下所示:
- `DriveListBox` 控件:设置 `Drive` 属性为 `""`(空字符串);
- `DirListBox` 控件:设置 `Path` 属性为 `DriveListBoxPath`,以确保该控件始终显示当前驱动器的根目录;
- `FileListBox` 控件:设置 `Path` 属性为 `DirListBoxPath`,以确保该控件始终显示当前目录下的文件列表。
4 编写代码来实现控件之间的同步。具体来说,需要为 `DriveListBox` 控件和 `DirListBox` 控件编写 `Change` 事件处理程序,为 `DirListBox` 控件和 `FileListBox` 控件编写 `Click` 事件处理程序。代码示例如下:
```vb
Private Sub DriveListBox_Change()
DirListBoxPath = DriveListBoxDrive
End Sub
Private Sub DirListBox_Change()
FileListBoxPath = DirListBoxPath
End Sub
Private Sub DirListBox_Click()
FileListBoxRefresh
End Sub
```
在这些事件处理程序中,我们使用控件的属性和方法来进行控件之间的同步。当用户选择不同的驱动器时,`DriveListBox_Change()` 事件处理程序会设置 `DirListBox` 控件的 `Path` 属性为当前驱动器的根目录;当用户选择不同的目录时,`DirListBox_Change()` 事件处理程序会设置 `FileListBox` 控件的 `Path` 属性为当前目录,以更新文件列表;当用户单击 `DirListBox` 控件时,`DirListBox_Click()` 事件处理程序会调用 `FileListBoxRefresh` 方法来刷新文件列表,以确保它显示最新的文件列表。
5 运行程序并测试控件之间的同步是否正常工作。您应该能够从 `DriveListBox` 控件中选择不同的驱动器,并从 `DirListBox` 控件中选择不同的目录,然后在 `FileListBox` 控件中看到当前目录下的文件列表。
需要注意的是,本示例代码仅提供了基本的控件同步功能,您可以根据自己的需求进行修改和扩展。同时,还应该考虑异常情况的处理,例如用户选择了不存在的驱动器或目录等情况。
Private Sub Form_Click()
Dim num1, num2, num3, sum, average As Single
'获取三个单精度浮点数
num1 = Val(InputBox("请输入第一个单精度浮点数:"))
num2 = Val(InputBox("请输入第二个单精度浮点数:"))
num3 = Val(InputBox("请输入第三个单精度浮点数:"))
'计算总和与平均值
sum = num1 + num2 + num3
average = sum / 3
'显示结果
MsgBox "这三个数的和为:" & sum & vbCrLf & "这三个数的平均值为:" & average
End Sub
以上就是关于我要用VB编一个能进行高斯投影正反算和邻带换算的程序 哪个高手帮帮忙 万分感谢全部的内容,包括:我要用VB编一个能进行高斯投影正反算和邻带换算的程序 哪个高手帮帮忙 万分感谢、VB中 表达式Len(“ VB程序设计“ )的值是_______。 A、4 B、6 C、8 D、11、vb程序设计实验内容1.程序中加入三个文件系统控件,让他们同步等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)