Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.04.2018, 18:36
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Как записать данные через функции

Доброго времени суток!

Суть проблемы в переводе координат из одной системы в другую, а именно 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".

Помогите кто знает, как возможно реализовать такое, ибо своих знаний на данное творение не хватает.

Спасибо большое заранее!
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:44.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025