Как записать данные через функции
Доброго времени суток!
Суть проблемы в переводе координат из одной системы в другую, а именно WGS84 в СК42.
Есть код, в котором 4 функции, используя их возможно выполнить 2 направления перевода координат, т.е. Широта и долгота из WGS84 в СК42, и наоборот.
Написал небольшой проект, в котором исходные данные из файла обрабатываются и выгружаются в STRINGGRID1. Проблема в том, что я не знаю как использовать функции для обработки массивов (я так понимаю данные загруженные данные в STRINGGRID1 это и есть массив). Из этих четырех функций меня интересуют только две:
Код:
Function WGS84_SK42_Lat(Bd, Ld, H: Double): Double;
Begin
WGS84_SK42_Lat := Bd - dB(Bd, Ld, H) / 3600;
End;
Function WGS84_SK42_Long(Bd, Ld, H: Double): Double;
Begin
WGS84_SK42_Long := Ld - dL(Bd, Ld, H) / 3600;
End;
Как прописать обработчик на кнопке, чтобы данные из Srtinggrid1 обрабатывались функциями выше и заносились в Stringgrid 2?
Вот код, который у меня получился:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Math, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls, Grids;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Button1: TButton;
Edit1: TEdit;
XMLDocument1: TXMLDocument;
OpenDialog1: TOpenDialog;
Button2: TButton;
Button3: TButton;
Button5: TButton;
SaveDialog1: TSaveDialog;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
Button4: TButton;
Memo1: TMemo;
Широта: TLabel;
Долгота: TLabel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
Pi: Double = 3.14159265358979; // Число Пи
ro: Double = 206264.8062; // Число угловых секунд в радиане
// Эллипсоид Красовского
aP: Double = 6378245; // Большая полуось
alP: Double = 1 / 298.3; // Сжатие
{$J+}
e2P: Double = 0; // Квадрат эксцентриситета 2 * alP - alP ^ 2
{$J-}
// Эллипсоид WGS84 (GRS80, эти два эллипсоида сходны по большинству параметров)
aW: Double = 6378137; // Большая полуось
alW: Double = 1 / 298.257223563; // Сжатие
{$J+}
e2W: Double = 0; // Квадрат эксцентриситета 2 * alW - alW ^ 2
{$J-}
// Вспомогательные значения для преобразования эллипсоидов
{$J+}
a: Double = 0; // (aP + aW) / 2
e2: Double = 0; // (e2P + e2W) / 2
da: Double = 0; // aW - aP
de2: Double = 0; // e2W - e2P
{$J-}
// Линейные элементы трансформирования, в метрах
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
Form1: TForm1;
implementation
{$R *.dfm}
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 * Power(Sin(B), 2)), 1.5);
N := a * Power((1 - e2 * Power(Sin(B), 2)), -0.5);
dB := ro / (M + H) * (N / a * e2 * Sin(B) * Cos(B) * da +
(Power(N, 2) / Power(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 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 * Power(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 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 * Power(Sin(B), 2)), -0.5);
dH := -a / N * da + N * Power(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)) +
(Power(a, 2) / N + H) * ms;
WGS84Alt := H + dH;
End;
Function WGS84_SK42_Lat(Bd, Ld, H: Double): Double;
Begin
WGS84_SK42_Lat := Bd - dB(Bd, Ld, H) / 3600;
End;
Function SK42_WGS84_Lat(Bd, Ld, H: Double): Double;
Begin
SK42_WGS84_Lat := Bd + dB(Bd, Ld, H) / 3600;
End;
Function WGS84_SK42_Long(Bd, Ld, H: Double): Double;
Begin
WGS84_SK42_Long := Ld - dL(Bd, Ld, H) / 3600;
End;
Function SK42_WGS84_Long(Bd, Ld, H: Double): Double;
Begin
SK42_WGS84_Long := Ld + dL(Bd, Ld, H) / 3600;
End;
procedure TForm1.FormCreate(Sender: TObject);
begin
e2P := 2 * alP - Power(alP, 2); // Квадрат эксцентриситета
e2W := 2 * alW - Power(alW, 2); // Квадрат эксцентриситета
a := (aP + aW) / 2;
e2 := (e2P + e2W) / 2;
da := aW - aP;
de2 := e2W - e2P;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
openDialog1.InitialDir := GetCurrentDir;
if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
Edit1.Text:=extractfilename(opendialog1.filename);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
XMLDocument1.LoadFromFile(OpenDialog1.FileName);
XMLDocument1.Active:= true;
with XMLDocument1.DocumentElement.ChildNodes['trk'].ChildNodes['trkseg'] do
for i:= 0 to ChildNodes.Count-1 do
begin
StringGrid1.RowCount:= StringGrid1.RowCount+1;
StringGrid1.Cells[0,StringGrid1.RowCount-2]:= VarToStr(ChildNodes.Nodes[i].Attributes['lat']);
StringGrid1.Cells[1,StringGrid1.RowCount-2]:= VarToStr(ChildNodes.Nodes[i].Attributes['lon']);
end;
XMLDocument1.Active:= false;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
close
end;
end.
Проект прилагаю - Проект_D7.ZIP
Как прочитать данные из строк в Stringgrid1 через функции соответственно в Stringgrid2, т.е. например так:
Ячейка "(1,1) Srtinggrid1" -> Функция "Function WGS84_SK42_Lat(Bd, Ld, H: Double): Double;" -> Ячейка "(1,1) Srtinggrid2".
Помогите кто знает, как возможно реализовать такое, ибо своих знаний на данное творение не хватает.
Спасибо большое заранее!
|