![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Доброго времени суток!
Суть проблемы в переводе координат из одной системы в другую, а именно 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; Вот код, который у меня получился: Код:
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. Как прочитать данные из строк в Stringgrid1 через функции соответственно в Stringgrid2, т.е. например так: Ячейка "(1,1) Srtinggrid1" -> Функция "Function WGS84_SK42_Lat(Bd, Ld, H: Double): Double;" -> Ячейка "(1,1) Srtinggrid2". Помогите кто знает, как возможно реализовать такое, ибо своих знаний на данное творение не хватает. Спасибо большое заранее! |