Created
November 27, 2013 12:39
-
-
Save maxp/7675009 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Const Pi As Double = 3.14159265358979 ' Число Пи | |
| Const ro As Double = 206264.8062 ' Число угловых секунд в радиане | |
| ' Эллипсоид Красовского | |
| Const aP As Double = 6378245 ' Большая полуось | |
| Const alP As Double = 1 / 298.3 ' Сжатие | |
| Const e2P As Double = 2 * alP - alP ^ 2 ' Квадрат эксцентриситета | |
| ' Эллипсоид WGS84 (GRS80, эти два эллипсоида сходны по большинству параметров) | |
| Const aW As Double = 6378137 ' Большая полуось | |
| Const alW As Double = 1 / 298.257223563 ' Сжатие | |
| Const e2W As Double = 2 * alW - alW ^ 2 ' Квадрат эксцентриситета | |
| ' Вспомогательные значения для преобразования эллипсоидов | |
| Const a As Double = (aP + aW) / 2 | |
| Const e2 As Double = (e2P + e2W) / 2 | |
| Const da As Double = aW - aP | |
| Const de2 As Double = e2W - e2P | |
| ' Линейные элементы трансформирования, в метрах | |
| Const dx As Double = 23.92 | |
| Const dy As Double = -141.27 | |
| Const dz As Double = -80.9 | |
| ' Угловые элементы трансформирования, в секундах | |
| Const wx As Double = 0 | |
| Const wy As Double = 0 | |
| Const wz As Double = 0 | |
| ' Дифференциальное различие масштабов | |
| Const ms As Double = 0 | |
| Function WGS84_SK42_Lat(Bd, Ld, H) As Double | |
| WGS84_SK42_Lat = Bd - dB(Bd, Ld, H) / 3600 | |
| End Function | |
| Function SK42_WGS84_Lat(Bd, Ld, H) As Double | |
| SK42_WGS84_Lat = Bd + dB(Bd, Ld, H) / 3600 | |
| End Function | |
| Function WGS84_SK42_Long(Bd, Ld, H) As Double | |
| WGS84_SK42_Long = Ld - dL(Bd, Ld, H) / 3600 | |
| End Function | |
| Function SK42_WGS84_Long(Bd, Ld, H) As Double | |
| SK42_WGS84_Long = Ld + dL(Bd, Ld, H) / 3600 | |
| End Function | |
| Function dB(Bd, Ld, H) As Double | |
| Dim B, L, M, N As Double | |
| B = Bd * Pi / 180 | |
| L = Ld * Pi / 180 | |
| M = a * (1 - e2) / (1 - e2 * Sin(B) ^ 2) ^ 1.5 | |
| N = a * (1 - e2 * Sin(B) ^ 2) ^ -0.5 | |
| dB = ro / (M + H) * (N / a * e2 * Sin(B) * Cos(B) * da _ + (N ^ 2 / a ^ 2 + 1) * N * Sin(B) * Cos(B) * de2 / 2 _ - (dx * Cos(L) + dy * Sin(L)) * Sin(B) + dz * Cos(B)) _ - wx * Sin(L) * (1 + e2 * Cos(2 * B)) _ + wy * Cos(L) * (1 + e2 * Cos(2 * B)) _ - ro * ms * e2 * Sin(B) * Cos(B) | |
| End Function | |
| Function dL(Bd, Ld, H) As Double | |
| Dim B, L, N As Double | |
| B = Bd * Pi / 180 | |
| L = Ld * Pi / 180 | |
| N = a * (1 - e2 * Sin(B) ^ 2) ^ -0.5 | |
| dL = ro / ((N + H) * Cos(B)) * (-dx * Sin(L) + dy * Cos(L)) _ + Tan(B) * (1 - e2) * (wx * Cos(L) + wy * Sin(L)) - wz | |
| End Function | |
| Function WGS84Alt(Bd, Ld, H) As Double | |
| Dim B, L, N, dH As Double | |
| B = Bd * Pi / 180 | |
| L = Ld * Pi / 180 | |
| N = a * (1 - e2 * Sin(B) ^ 2) ^ -0.5 | |
| dH = -a / N * da + N * Sin(B) ^ 2 * de2 / 2 _ + (dx * Cos(L) + dy * Sin(L)) * Cos(B) + dz * Sin(B) _ - N * e2 * Sin(B) * Cos(B) * (wx / ro * Sin(L) - wy / ro * Cos(L)) _ + (a ^ 2 / N + H) * ms | |
| WGS84Alt = H + dH | |
| End Function |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment