Avenue语言下实现经纬度转换大地坐标的算法代码
- 算法与数据结构
- 2007-11-22
- 141热度
- 0评论
在上次项目开发过程中,有个需求是把经纬度转变为大地坐标,这里结合自己个工作经验,把用Avenue写的转换代码发布,希望能够给您带来帮助。
Avenue是用于ArcView二次开发的语言,是地理信息系统ArcGIS的一种开发语言。Avenue脚本语言,可以直接调用操作系统执行文件;在Windows环境下可以通过DDE和DLL与外部程序通讯,在Unix环境下可以通过IAC与外部程序通讯。
Number.SetDefFormat( "d.ddddddddddddddd" ) ' application default
theDialog=av.FindDialog("经纬度转换")
theview = av.FindDoc("电子地图")
p = theView.GetDisplay.ReturnUserPoint
aTextLine1 = theDialog.FindbyName("aTextLine1")
mx = aTextLine1.GetText
mxcount=mx.count
aTextLine2 = theDialog.FindbyName("aTextLine2")
my = aTextLine2.GetText
mycount=my.count
aTextLine3 = theDialog.FindbyName("TextLine3")
' s = aTextLine3.GetText
' scount=s.count
b1=mx.AsNumber
l1=my.AsNumber
PI = 3.141592653589793238462
'角度到弧度的转换
bb1 = b1
jd=bb1
i = (jd).Floor
j = ((jd * 100) -( i * 100)).Floor
k1 = ((jd * 10000) - (i * 10000)) - (j * 100)
If (k1 > 60) Then
j = j + 1
k1 = 0
End
jdd = ((i * PI) / 180 )+ (((j * PI )/ 180) / 60) + (((k1 * PI )/ 180) / 3600)
jdzh1 = jdd
b2=jdzh1
bb1=l1
jd=bb1
i = (jd).Floor
j = ((jd * 100) - (i * 100)).Floor
k1 = (jd * 10000) - (i * 10000) - (j * 100)
If (k1 > 60) Then
j = j + 1
k1 = 0
End
jdd = ((i * PI) / 180) + (((j * PI) / 180) / 60) + (((k1 * PI) / 180 )/ 3600)
jdzh1 = jdd
l2=jdzh1
'bb1为结束中央子午线经度
bb1 = 111 '111为结束中央子午线经度
jd=bb1
i = (jd).Floor
j = ((jd * 100 )- (i * 100)).Floor
k1 = (jd * 10000) - (i * 10000) - (j * 100)
If (k1 > 60) Then
j = j + 1
k1 = 0
End
jdd = ((i * PI) / 180) + (((j * PI) / 180 )/ 60) + (((k1 * PI) / 180) / 3600)
jdzh1 = jdd
ll2=jdzh1
'参数初始化,54坐标
k0 = 6399698.90178271
k1 = 6367558.49687
k2 = 32005.7801
k3 = 133.9213
k4 = 0.7032
k5 = 0.005051773902
k6 = 0.000029838676
k7 = 0.00673852541468349
k8 = 0.000000241496
'正算
o1 =b2.tan
o2 = b2.cos
o3 = k7 * o2 * o2
o4 = o1 * o1
o5 = 1 + o3
o6 = k0 / (o5).Sqrt
o7 = (l2 - ll2) * o2
o8 = o7 * o7
o9= o1 * o2
o10 = o9 * o9
o11 = (k2 + (o10 * (k3 + (o10 * k4))))
x2 = k1 * b2 - (o9 * o2 * o11) + (((((o4 - 58) * o4 + 61) * o8 / 30 + (((4 * o3 + 5) * o5) - o4) * o8 / 12) + 1) * o6 * o1 * o8 / 2)
y2 = (((((o4 - 18) * o4 - ((58 * o4 - 14) * o3 )+ 5) * o8 / 20) + o5 - o4) * o8 / 6 + 1) * o6 * o7
o12 = (o1 * o7 * (1 + (o8 * ((o5 + o3) * o5 / 3 + (o8 * (2 - o4) / 15)))))
'将o12的弧度到角度的转换
i = (o12 * 180 / PI).Floor
j =(((((o12 * 180) / PI) - i) * 60)).Floor
k = ((o12 * 180 / PI - i) * 60 - j) * 60
If (k > 59.999 )Then
k = 0
j = j + 1
If (j > 59.999) Then
j = 0
i = i + 1
End
End
jdd = i + (j / 100) + (k / 10000)
jdzh2 = jdd
rg = jdzh2
'这里参照6度带
'd1=6 If d1 = 6 Then y2 = y2 + (bb1 + 3) / 6 * 1000000 + 500000
' If d1 = 3 Then y2 = y2 + bb1 / 3 * 1000000 + 500000
' If (d1 <> 3) And (d1 <> 6) Then y2 = y2 + 500000
y2 = y2 + ((bb1 + 3) / 6 * 1000000 )+ 500000
MsgBox.Info("经度为:"+x2.AsString+ " 纬度为:"+y2.AsString,"")