Avenue语言下实现经纬度转换大地坐标的算法代码

在上次项目开发过程中,有个需求是把经纬度转变为大地坐标,这里结合自己个工作经验,把用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,"")