Arhara
Зарегистрирован: 18.02.2009 Сообщения: 400 Откуда: Moscow, RF
|
Добавлено: Ср Фев 24, 2010 5:54 pm Заголовок сообщения: |
|
|
раз это раздел по программированию, то уточните, что именно вы хотите:
1. формулу
2. способ
3. способ с использованием MapBasic
---
ГОСТ не устраивает? там есть формула перехода от СК-42 (проекция Гаусса-Крюгера) к WGS84 |
|
Владимир1001
Зарегистрирован: 31.08.2009 Сообщения: 3 Откуда: Питер
|
Добавлено: Пн Мар 01, 2010 11:23 am Заголовок сообщения: |
|
|
Владимир1001 писал(а): |
Можно начать с формулы? |
Товарищи! Вопрос был сформулирован некорректно
Как я понял последовательность такая: (если не так, поправьте меня):
СК64 -> СК42 -> WGS84, т.е прямой формулы из СК64 в WGS84 нет.
Тут лежит код на VB СК42 <-> WGS84
http://gis-lab.info/qa/wgs84-sk42-wgs84-formula.html
Я его перековал на на MB (только СК42 в WGS84):
Но упала точность. Там использовался тип Double здесь же Float. Оба
они 8 байтные.
1. Что делать с точность? Как повысить?
2. Где найти СК64 в СК42 наконец?...
include "mapbasic.def"
include "icons.def"
include "menu.def"
Declare Function dB(ByVal Bd as Float,ByVal Ld as Float,ByVal H as Float) As Float
Declare Function dL(ByVal Bd as Float,ByVal Ld as Float,ByVal H as Float) As Float
Declare Sub Main
Global Bd,Ld,B,L,N,M,Pi,ro,aP,alP,e2P,aW,alW,e2W,a,e2,da,de2,dx,dy,dz,wx,wy,wz,ms,in_x,in_y,in_z,res_x,res_y,res_z,tt as Float
Sub Main
Dialog
Title "Из СК42 в WGS84:"
Control StaticText
Title "X:"
Control EditText
into in_x
Control StaticText
Title "Y:"
Control EditText
into in_y
Control OkButton
Title "Пересчитать"
Control CancelButton
Title "Отмена"
if CommandInfo(CMD_INFO_DLG_OK) then
Pi= 3.14159265358979 ' Число Пи
ro= 206264.8062 ' Число угловых секунд в радиане
' Эллипсоид Красовского (Пулково 1942)
aP= 6378245 ' Большая полуось
alP= 1 / 298.3 ' Сжатие
e2P= 2 * alP - alP ^ 2 ' Квадрат эксцентриситета
' Эллипсоид GRS80 (WGS84)
aW= 6378137 ' Большая полуось
alW= 1 / 298.257223563 ' Сжатие
e2W= 2 * alW - alW ^ 2 ' Квадрат эксцентриситета
' Вспомогательные значения для преобразования эллипсоидов
a= (aP + aW) / 2
e2= (e2P + e2W) / 2
da= aW - aP
de2= e2W - e2P
' Линейные элементы трансформирования, в метрах
dx= 23.92
dy= -141.27
dz= -80.9
' Угловые элементы трансформирования, в секундах
wx= 0
wy= 0
wz= 0
' Дифференциальное различие масштабов
ms= 0
in_z=0
' -------------Из СК42 в WGS84----------
'
res_x =in_x+ dB(in_x,in_y,in_z) / 3600
'
res_y =in_y+ dL(in_x,in_y,in_z) / 3600
note "X:"+res_x+"; Y:"+res_y
end if
end sub 'main
Function dB(ByVal in_x,ByVal in_y,ByVal in_z as Float) As Float
B = in_x * Pi / 180
L = in_y * Pi / 180
M = a * (1 - e2) / (1 - e2 * Sin(B) ^ 2) ^ 1.5
N = a * (1 - e2 * Sin(B) ^ 2) ^ -0.5
tt = ro / (M + in_z) * (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
dB=tt*ms * e2 * Sin(B) * Cos(B)
End Function
Function dL(ByVal in_x,ByVal in_y,ByVal in_z as Float) As Float
B = in_x * Pi / 180
L = in_y * Pi / 180
N = a * (1 - e2 * Sin(B) ^ 2) ^ -0.5
dL = ro / ((N + in_z) * Cos(B)) * (-dx * Sin(L) + dy * Cos(L))+ Tan(B) * (1 - e2) * (wx * Cos(L) + wy * Sin(L)) - wz
End Function |
|
Arhara
Зарегистрирован: 18.02.2009 Сообщения: 400 Откуда: Moscow, RF
|
Добавлено: Ср Мар 03, 2010 2:35 am Заголовок сообщения: |
|
|
прямая формула - есть. и она уже зашита в MapInfo. называется команда SaveAs.
Вы не найдете легальной формулы ни СК64 -> СК42, поскольку этот переход секретен.
Будете знать все параметры СК64 - забейте их в саму MapInfo и она вам пересчитает их из СК64 в WGS84.
Вопрос точности тема долгого разговора. И практически весь он есть там же откуда взяли формулу.
Переход СК64 -> СК42, если оба используют один и то же эллипсоид, можно считать миллиметровым.
Переход СК42 -> WGS84 уникален для каждой местности. Если нужны точности в дециметры - следует использовать специальный софт.
Кроме того у MapInfo есть предел точности, связанный с границами карты. |
|