
建筑工地实验员要按规定对原材料和过程半成品送到质监站去检测,然后取报告,送检材料的复试报告拿到后,及时送给工地资料员。负责现场标准养护室的动态监控,满足试块养护要求,填写试验台帐及技术资料台帐,负责编写一部分技术资料以及贯标资料等。
我有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
我有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
另外,站长团上有产品团购,便宜有保证
地球上任两点间距离公式:
地球上任两点,其经度分别为A1、A2(E正,W负),纬度分别为B1、B2(N正,S负)。
令A0=(A1-A2)÷2,B0=(BI-B2)÷2
f=√sinB0×sinB0+cosB1×cosB2×sinA0×sinA0
则
1、两点间空间直线距离=2fR
2、两点间最小球面距离=arcsinf/90°
πR(角度)
3、两点间最小球面距离=arcsinf
2R(弧度)
说明:E、W、N、S=东西南北;R=地球半径;√=根号;π=圆周率
给出的链接是一个换算的软件
参考资料:
>
工作原因,经常和地理数据打交道,发现不少甚至是从事GIS工作的人都搞不清楚坐标系统。确实,坐标相关术语繁多,内容也相当复杂。我把常见的一些问题列举出来,采用问答的方式进行说明。
1)说“经纬度投影”对吗?
经纬度表示的是地理坐标系(单位是度),不是投影坐标系(单位是米),两者放一起明显不妥。
2)大地坐标系与地理坐标系有何不同?
大地坐标系和地理坐标系都是经纬度表示的坐标系,本身并不包含投影信息,很多时候,这两种说法都是相同的。
3)为什么有地理坐标系和投影坐标系之分?
由于经纬度的度数不对应某一标准长度,因此无法精确测量距离或面积,也难以在平面地图或计算机屏幕上显示数据。在使用许多(不是全部)GIS 分析和制图应用程序时,经常需要由投影坐标系提供的更稳定的平面坐标框架。与地理坐标系不同,在二维空间范围内,投影坐标系的长度、角度和面积恒定。投影坐标系始终基于地理坐标系,而后者则是基于球体或旋转椭球体的。在投影坐标系中,通过格网上的 x,y 坐标来标识位置,其原点位于格网中心。
4)通常所说的西安80,北京54是指什么?
GIS中的坐标系统定义由基准面和地图投影两组参数确定,基准面对应一个参考椭球体,我们常说的北京54、西安80、国家大地2000坐标系都是指其参考椭球体。基于这种椭球体,我们能定义出大地坐标系和投影坐标系。只说一个西安80是不能确定坐标系统的,因为没有说明有没有投影及投影信息。如果不指明投影方式,则认为西安80、北京54的表现形式为大地坐标,而不是投影平面直角坐标。
5)什么都是高斯投影 ?
高斯-克吕格投影属于横轴墨卡托投影,能小范围内保持形状不变,因此被国内普遍采用,但在表示小比例尺数据时,这种投影明显不合适。就中国来说,一般50万以上比例尺采用高斯投影,50万以下采用兰伯特投影。数据用途不同,具体的投影方式各有不同,有的是为了保持面积不变,有的是为了保持形状不变。另一种世界常用的投影是UTM(通用墨卡托投影),高斯-克吕格投影是“等角横切椭圆柱投影”,投影后中央经线保持长度不变,即比例系数为1;UTM投影是“等角横轴割圆柱投影”,圆柱割地球于南纬80度、北纬84度两条等高圈,投影后两条割线上没有变形,中央经线上长度比 09996。
6)北京54,西安80,WGS84,国家2000 有何不同?
54和80本质上是参心坐标系,大地原点分别在苏联和西安,原点是参考椭球的几何中心,这类坐标难以表达高度信息,精度信息等也不够,正被淘汰。。 84和2000本质上是地心坐标系,即以地球质量中心作为坐标系原点。 54的椭球体长半轴半径是6378245米,80为6378140米,84和2000坐标系一样,都是6378137米。国家最新的2000坐标系和WGS84据说在厘米级都是一样的,但和80坐标在高纬度地区误差达十几倍。
7) Google、Microsoft、ArcGIS提供的地图服务分别采用了什么坐标系?
现在都统一为了Web Mercator,即正轴墨卡托投影,和UTM(常规墨卡托)投影的主要区别是为了实现上的方便,把地球模拟为球体而非椭球体,精度理论上差别033%,比例尺大时基本可以忽略。同时纬度范围变成了(-85,85),南北极显示不了,但不影响正常使用,这样也减少了切图数量。
8)ArcGIS的空间参考与坐标系统?
ArcGIS的空间参考信息SpatialReference,不仅包含了坐标系统的定义,还包括容差Tolerance和分辨率Resolution等,通常由Prj文件表示。ArcGIS中的坐标系统分地理坐标系和投影坐标系,其中投影坐标系也一定包含一个地理坐标系,反之不然。
以上就是关于要当试验员需要做些什么全部的内容,包括:要当试验员需要做些什么、《大地测量学基础》里面的高斯投影正反算公式及换带计算的VB或者C语言编程、MATLAB编写高斯投影反算程序有错,求帮助解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)