1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| Attribute VB_Name = "Module1"
'Conversion Lat long en Coordonnées UTM
Option Explicit
Const A = 6378137 'a (earth radius-m)
Const PI = 3.1415927
Const k0 = 0.9996 'coeff.d'aplatissement de la terre
Const e = 0.8 'excentricité
Const eccSquared = 0.0064 'carré de l'excentricité
Const eccPrimeSquared = 0.007
Const North_South_Offset = 10000000 'décalage NS pour toujours manipuler des données positives l'équateur a la valeur
'10000km quand on va vers le Sud
Const East_West_Offset = 500000 'Le centre de chaque zone de 6 degrés a la valeur de
'500km.
'Data inputs
Public Deg_Long
Public Min_Long
Public Sec_Long
Public Deg_Lat
Public Min_Lat
Public Sec_Lat
Public DirEW
Public DirNS
'Data output
Public Zone_Number
Public X_North_south
Public Y_East_West
'Intermediate data
Dim b, f, deg_RAD, longrad, FormuleLong, FormuleLat, FormuleNS As Long
Dim longi, longo, lat, longdeg_origin, longradorigin As Long
Dim sinlat, sin2lat, coslat, tanlat, n1, n2, n3, n4, n5, T, C, A0 As Double
Dim Aprime, Bprime, Cprime, Dprime, Eprime, M, N As Double
Sub ConvUTM3(DirEW, DirNS, Deg_Long, Min_Long, Sec_Long, Deg_Lat, Min_Lat, Sec_Lat)
'Intermediate
b = A - A / 298.2572
deg_RAD = 2 * PI / 360
FormuleLong = ((Deg_Long) + (Min_Long) / 60 + (Sec_Long) / 3600) * deg_RAD
FormuleLat = ((Deg_Lat) + ((Min_Lat) / 60) + ((Sec_Lat) / 3600)) * deg_RAD
'Détermination du signe de longitude
If DirEW = "E" Then
longi = FormuleLong
Else
longi = -1 * FormuleLong
End If
'
'Détermination du signe de latitude
If DirNS = "N" Then
lat = FormuleLat
Else
lat = -1 * FormuleLat
End If
'Calcul du numéro de la Zone
If Deg_Long = 180 Then
Zone_Number = 1
Else
If DirEW = "E" Then
Zone_Number = Int((Deg_Long / 6) + 31)
Else
Zone_Number = Abs(Int((Deg_Long) / 6) - 30)
End If
End If
'Calcul de l'origine (centre) de la Zone
longdeg_origin = ((Zone_Number - 1) * 6) - 180 + 3
longo = (longdeg_origin) * deg_RAD
'Calculs de géométrie
sinlat = Sin(lat)
sin2lat = Sin(lat) * Sin(lat)
coslat = Cos(lat)
tanlat = Tan(lat)
T = Tan(lat)
N = A / Sqr(1 - eccSquared * sin2lat)
C = eccPrimeSquared * coslat * coslat
A0 = coslat * (longi - longo)
n1 = (A - b) / (A + b)
n2 = n1 * n1
n3 = n2 * n1
n4 = n3 * n1
n5 = n4 * n1
Aprime = A * (1 - n1 + (5 / 4) * (n2 - n3) + (81 / 64) * (n4 - n5))
Bprime = (3 * A * n1 / 2) * (1 - n1 + (7 / 8) * (n2 - n3) + (55 / 64) * (n4 - n5))
Cprime = (15 * A * n2 / 16) * (1 - n1 + (3 / 4) * (n2 - n3))
Dprime = (35 * A * n3 / 48) * (1 - n1 + (11 / 16) * (n2 - n3))
Eprime = (315 * A * n4 / 51) * (99 / 144) * (n2 - n3)
M = Aprime * lat - Bprime * Sin(2 * lat) + Cprime * Sin(4 * lat) - Dprime * Sin(6 * lat) + Eprime * Sin(8 * lat)
FormuleNS = (k0 * (M + N * tanlat * (A0 * A0 / 2 + (5 - T + 9 * C + 4 * C * C) * A0 * A0 * A0 * A0 / 24 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A0 * A0 * A0 * A0 * A0 * A0 / 720)))
'Output data
If lat < 0 Then
X_North_south = North_South_Offset + FormuleNS
Else
X_North_south = FormuleNS
End If
Y_East_West = (k0 * N * (A0 + (1 - T + C) * A0 * A0 * A0 / 6 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A0 * A0 * A0 * A0 * A0 / 120) + East_West_Offset)
End Sub |
Partager