Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > помогите перевести с VisualBasic в Delphi


Автор: VirtualHouse 19.8.2005, 23:04
Это умная програмка перевода с координат системы GPS в наши метровые координаты. Очень полезная вещь. Только написана она не на делфи.




1 Функции рабочей книги для преобразования
1 геодезических координат из координатной системы Пулково 1942
' в координатную систему WGS84
' Все угловые значения передаются и возвращаются в градусах, ' высоты передаются и возвращаются в метрах
1 Сделано на основании ГОСТ Р 51794-2001 Российской Федерации
Const Pi As Double = 3.14159265358979 ' Число, Пи
Const ro As Double = 206264.8062 ' Число угловых секунд в радиане
1 Эллипсоид Красовского (Пулково 1942)
Const aP As Double = 6378245 ' Большая полуось
Const alP As Double = 1 / 298.3 ' Сжатие
Const e2P As Double = 2 * alP - alP A 2 ' Квадрат эксцентриситета
1 Эллипсоид GRS80 (WGS84)
Const aW As Double = 6378137 ' Большая полуось
Const alW As Double = 1 / 298.257223563 ' Сжатие
Const e2W As Double = 2 * alW - alW x 2 ' Квадрат эксцентриситета
1 Вспомогательные значения для преобразования эллипсоидов 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
1 Линейные элементы трансформирования, в метрах
Const dx As Double =23.92
Const dy As Double = -141.27
Const dz As Double = -80.9
1 Угловые элементы трансформирования, в секундах
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) As Double
WGS84_SK42_Lat = Bd - dB(Bd, Ld, H) / 3600
End Function
Function SK42_WGS84_Lat(Bd, Ld, H As Double) As Double
SK42__WGS84__Lat = Bd + dB(Bd, Ld, H) / 3600
End Function
Function WGS84_SK42__Long(Bd, Ld, H As Double) As Double
WGS84_SK42__Long = Ld - dL(Bd, Ld, H) / 3600
End Function
Function SK42_WGS84_Long(Bd, Ld, H As Double) As Double
SK42_WGS84_Long = Ld + dL(Bd, Ld, H) / 3600
End Function
Function dB(Bd, Ld, H As Double) As Double
Dim B, L, M, N- As Double
В = Bd * Pi / 180
L * Ld * Pi / 180
M = a * (1 - e2) / (1 - e2 * Sin(B) A 2) A 1.5
N = a * (1 - e2 * Sin(B) A 2) л -0.5
dB = ro / (M + H) * (N / a * e2 * Sin(B) * Cos(B) * da _ + (NA2/aA2+l) *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, Lid, H As Double) As Double
Dim B, L, N As Double
В = Bd * Pi / 180 L = Ld * Pi / 180 N = a * (1 - e2 * Sin(B) л 2) A -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) As Double
Dim B, L, N, dH As Double
В = Bd * Pi / 180 L = Ld * Pi / 180 N = a * (1 - e2 * Sin(B) A 2) x -0.5
dH = -a / N * da + N * Sin(B) A 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 A 2 / N + H) * ms
WGS84Alt = H + dH End Function

Автор: VirtualHouse 19.8.2005, 23:11
ПОПРАВОЧКА


Вместо л и А ставится ^ это в квадрате просто фаин ридер плохо раскидал символы

Автор: Fedor 20.8.2005, 00:04

Модератор: друзья! Если у вас назрел вопрос по Бэйсику или по Делфи или по этим обоим языкам вместе взятым, то зачем же постить вопрос в раздел Паскаля? В общем, перенесено из Паскаля в Центр помощи.

Автор: VirtualHouse 20.8.2005, 03:39
Спасибо что пернесли туда куда надо. но мне надо решить этот вопрос. с переводом с системы измерения GPS в нашё метровую систему координат

Автор: Mayk 20.8.2005, 08:31
Ну и в чем собсно проблема? Инструкции вида
Цитата(VirtualHouse @ 20.8.2005, 03:04)
Function WGS84_SK42_Lat(Bd, Ld, H As Double) As Double

Заменяешь на
Код

Function WGS84_SK42_Lat(Bd, Ld, H: Double) : Double; begin

Цитата(VirtualHouse @ 20.8.2005, 03:04)
WGS84_SK42_Lat = Bd - dB(Bd, Ld, H) / 3600

на
Код

WGS84_SK42_Lat := Bd - dB(Bd, Ld, H) / 3600;


Цитата(VirtualHouse @ 20.8.2005, 03:04)
Const aW As Double = 6378137 ' Большая полуось

на
Код

Const aW : Double = 6378137; //Большая полуось

(или как там в пасе консты объявляются?)


Автор: Pakshin A. S. 20.8.2005, 08:45
Цитата(Mayk @ 20.8.2005, 09:31)
или как там в пасе консты объявляются?)

Верно.. так...

Автор: VirtualHouse 20.8.2005, 11:37
Спасибо но он мне тут даёт ошибку В = Bd * Pi / 180

Автор: Fedor 20.8.2005, 11:55
Цитата(VirtualHouse @ 20.8.2005, 11:37)
В = Bd * Pi / 180


Код

В := Bd * Pi / 180

Автор: rsm 20.8.2005, 12:15
Вроде накатал нечто похожее на этот код. Только перед работой нужно будет вызвать процедуру InitVariables, т.к. Дельфи не понимает объявлений вида "da As Double = aW - aP" ни для констант, ни для переменных.

Код

unit gps;

interface

uses Math;

   procedure InitVariables;
   function WGS84_SK42_Lat(Bd, Ld, H :Double) :Double;
   function SK42_WGS84_Lat(Bd, Ld, H :Double) :Double;
   function WGS84_SK42__Long(Bd, Ld, H :Double) :Double;
   function SK42_WGS84_Long(Bd, Ld, H :Double) :Double;
   function dB(Bd, Ld, H :Double) :Double;
   function dL(Bd, Ld, H :Double) :Double;
   function WGS84Alt(Bd, Ld, H :Double) :Double;

const
   Pi   :Double = 3.14159265358979;
   ro   :Double = 206264.8062;
   aP   :Double = 6378245;
   alP  :Double = 1 / 298.3;
   aW   :Double = 6378137;
   alW  :Double = 1 / 298.257223563;
   dx   :Double = 23.92;
   dy   :Double = -141.27;
   dz   :Double = -80.9;
   wx   :Double = 0;
   wy   :Double = 0;
   wz   :Double = 0;
   ms   :Double = 0;

var
   e2W, a, e2P, de2, e2, da :Double;

implementation

procedure InitVariables;
begin
   e2W:= 2 * alW - Sqr(alW);
   a:= (aP + aW) / 2;
   e2P:= 2 * alP - Sqr(alP);
   de2:= e2W - e2P;
   e2:= (e2P + e2W) / 2;
   da:= aW - aP;
end;

function WGS84_SK42_Lat(Bd, Ld, H :Double) :Double;
begin
   Result:= Bd - dB(Bd, Ld, H) / 3600;
end;

function SK42_WGS84_Lat(Bd, Ld, H :Double) :Double;
begin
   Result:= Bd + dB(Bd, Ld, H) / 3600;
end;

function WGS84_SK42__Long(Bd, Ld, H :Double) :Double;
begin
   Result:= Ld - dL(Bd, Ld, H) / 3600;
end;

function SK42_WGS84_Long(Bd, Ld, H :Double) :Double;
begin
   Result:= Ld + dL(Bd, Ld, H) / 3600;
end;

function dB(Bd, Ld, H :Double) :Double;
var
   B, L, M, N :Double;
begin
   B:= Bd * Pi / 180;
   L:= Ld * Pi / 180;
   M:= a * (1 - e2) / Power(1 - e2 * Sqr(Sin(B)), 1.5);
   N:= a * Power(1 - e2 * Sqr(Sin(B)), -0.5);
   Result:= ro / (M + H) * (N / a * e2 * Sin(B) * Cos(B) * da +
      (Sqr(N) / Sqr(a)+l) * 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 dL(Bd, Ld, H :Double) :Double;
var
   B, L, N :Double;
begin
   B:= Bd * Pi / 180;
   L:= Ld * Pi / 180;
   N:= a * Power(1 - e2 * Sqr(Sin(B)), -0.5);
   Result:= ro / ((N + H) * Cos(B)) * (-dx * Sin(L) + dy * Cos(L)) +
      Tan(B) * (1 - e2) * (wx * Cos(L) + wy * Sin(L)) - wz;
end;

function WGS84Alt(Bd, Ld, H :Double) :Double;
var
   B, L, N, dH :Double;
begin
   B:= Bd * Pi / 180;
   L:= Ld * Pi / 180;
   N:= a * Power(1 - e2 * Sqr(Sin(B)), -0.5);
   dH:= -a / N * da + N * Sqr(Sin(B)) * 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)) +
      (Sqr(a) / N + H) * ms;
   Result:= H + dH;
end;

end.

Автор: Alex 20.8.2005, 14:05
Цитата(rsm @ 20.8.2005, 13:15)
Только перед работой нужно будет вызвать процедуру InitVariables

Не нужно:
Код

unit gps;

interface

uses Math;

   function WGS84_SK42_Lat(Bd, Ld, H :Double) :Double;
   function SK42_WGS84_Lat(Bd, Ld, H :Double) :Double;
   function WGS84_SK42__Long(Bd, Ld, H :Double) :Double;
   function SK42_WGS84_Long(Bd, Ld, H :Double) :Double;
   function dB(Bd, Ld, H :Double) :Double;
   function dL(Bd, Ld, H :Double) :Double;
   function WGS84Alt(Bd, Ld, H :Double) :Double;

const
   Pi   :Double = 3.14159265358979;
   ro   :Double = 206264.8062;
   aP   :Double = 6378245;
   alP  :Double = 1 / 298.3;
   aW   :Double = 6378137;
   alW  :Double = 1 / 298.257223563;
   dx   :Double = 23.92;
   dy   :Double = -141.27;
   dz   :Double = -80.9;
   wx   :Double = 0;
   wy   :Double = 0;
   wz   :Double = 0;
   ms   :Double = 0;

var
   e2W, a, e2P, de2, e2, da :Double;

implementation

procedure InitVariables;
begin
   e2W:= 2 * alW - Sqr(alW);
   a:= (aP + aW) / 2;
   e2P:= 2 * alP - Sqr(alP);
   de2:= e2W - e2P;
   e2:= (e2P + e2W) / 2;
   da:= aW - aP;
end;

function WGS84_SK42_Lat(Bd, Ld, H :Double) :Double;
begin
   Result:= Bd - dB(Bd, Ld, H) / 3600;
end;

function SK42_WGS84_Lat(Bd, Ld, H :Double) :Double;
begin
   Result:= Bd + dB(Bd, Ld, H) / 3600;
end;

function WGS84_SK42__Long(Bd, Ld, H :Double) :Double;
begin
   Result:= Ld - dL(Bd, Ld, H) / 3600;
end;

function SK42_WGS84_Long(Bd, Ld, H :Double) :Double;
begin
   Result:= Ld + dL(Bd, Ld, H) / 3600;
end;

function dB(Bd, Ld, H :Double) :Double;
var
   B, L, M, N :Double;
begin
   B:= Bd * Pi / 180;
   L:= Ld * Pi / 180;
   M:= a * (1 - e2) / Power(1 - e2 * Sqr(Sin(B)), 1.5);
   N:= a * Power(1 - e2 * Sqr(Sin(B)), -0.5);
   Result:= ro / (M + H) * (N / a * e2 * Sin(B) * Cos(B) * da +
      (Sqr(N) / Sqr(a)+l) * 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 dL(Bd, Ld, H :Double) :Double;
var
   B, L, N :Double;
begin
   B:= Bd * Pi / 180;
   L:= Ld * Pi / 180;
   N:= a * Power(1 - e2 * Sqr(Sin(B)), -0.5);
   Result:= ro / ((N + H) * Cos(B)) * (-dx * Sin(L) + dy * Cos(L)) +
      Tan(B) * (1 - e2) * (wx * Cos(L) + wy * Sin(L)) - wz;
end;

function WGS84Alt(Bd, Ld, H :Double) :Double;
var
   B, L, N, dH :Double;
begin
   B:= Bd * Pi / 180;
   L:= Ld * Pi / 180;
   N:= a * Power(1 - e2 * Sqr(Sin(B)), -0.5);
   dH:= -a / N * da + N * Sqr(Sin(B)) * 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)) +
      (Sqr(a) / N + H) * ms;
   Result:= H + dH;
end;

initialization
  InitVariables;

end.

Автор: VirtualHouse 20.8.2005, 22:00
Спрасибо большое. Кстати эта нужная прога для всех кто пользуется GPS

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)