Sample program in Delphi

 

 

{************************************************************************}

{                       Sample program in DELPHI XE                      }

{                                                                        }

{ Authors: RATIOSoftware, Mr. Schettler and Killet GeoSoftware Ing.-GbR  }

{                                                                        }

(    DELPHI demonstration program for using geodetic GeoDLL functions    )

{                                                                        }

(                  Uses the DELPHI Interface "GeoDll32",                 }

(         which is described in the topic "Interface Templates".         }

{                                                                        }

{     In the calling directory of the program the files geodll32.dll     }

{                    and geodllbn.bin must be present.                   }

{************************************************************************}

 

 

unit GeoRechnen;

 

 

interface

uses

  timebox,Windows, Messages, SysUtils, Variants, Classes, Graphics,

  Controls, Forms,GeoDll32,strTools,dialogs;

 

 

const

 

  _Std=1/24;

  _Min=1/24/60;

  _Sec=1/24/60/60;

 

 

  Function BerechneEntfernung(x1,y1,x2,y2:Double):Double;

  Function BerechneDauer(meter:Double;KmGeschwindigkeit:Integer):Double;

  Function BerechneGeschwindikgeit(meter:Double; dauer:Double):Integer;

  Function BerechneFahrtzeit(x1,y1,x2,y2:Double;

           KmGeschwindigkeit:Integer):Double;

  Procedure CheckKoords(Var _X:String; Var _Y:STring);

  Procedure GaussToWGS84(dKoordXQ, dKoordYQ: double;var dKoordXZ:double;

            var dKoordYZ:double);

  Procedure GradToDecimal(Var _X:String);

 

 

implementation

 

  Function BerechneFahrtzeit(x1,y1,x2,y2:Double;

           KmGeschwindigkeit:Integer):Double;

  var

  meter:double;

  begin

  meter:=BerechneEntfernung(x1,y1,x2,y2);

  result:=BerechneDauer(meter,KmGeschwindigkeit);

  end;

 

 

  Function BerechneEntfernung(x1,y1,x2,y2:Double):Double;

  //Berechnet die Distanz zwischen zwei Punkten in Meter

  var

  d:Double;

  begin

  if distancegeo(y1,x1,y2,x2,d,0)>0 then

    Result:=d

  else

    result:=-1;

  end;

 

 

  Function BerechneDauer(meter:Double;KmGeschwindigkeit:Integer):Double;

  //Berechnet die Dauer für eine Strecke bei gegebener Geschw. in Km/h

  begin

    if KmGeschwindigkeit<=0 then

      raise Exception.create('Kein Geschwindigkeitsprofil für 

      Zeitdauerberechnung angegeben');

    result:=(meter*60)/ (KmGeschwindigkeit*1000) ;

    result:=result/(24*60);

    Result:=RoundTimeToMinute(result);

  end;

 

 

  Function BerechneGeschwindikgeit(meter:Double; dauer:Double):Integer;

  //Berechnet die Geschindikgeit für eine Strecke in Km/h

  var

  d:double;

  begin

    if dauer<=0 then

      raise Exception.create('Keine Zeitangabe für 

      Geschwindigkeitsberechnung vorhanden');

    d:=DoubleToMinute(dauer);

    result:=Round((meter*60) / (d*1000));

  end;

 

 

  Procedure GradToDecimal(Var _X:String);

  //Rechnet die Geokoordinaten Minuten,Sekunden in Decimalanteil um.

  //Angabe : Bsp. "9,43,13" wird zu "9,72027"

  Var

  i,cnt:Integer;

  grad,min,sec:Integer;

  dec:Integer;

  begin

    cnt:=0;

    for i:=1 to Length(_x) do

      if _x[i]=',' then inc(cnt);

    if cnt<2 then Exit;

    Try

      grad:=StrToInt(TeilStr(_x,',',1));

      min:=StrToInt(TeilStr(_x,',',2));

     Sec:=StrToInt(TeilStr(_x,',',3));

     dec:=Round((((Min*60)+Sec)/360)*10000);

     _x:=Inttostr(grad)+','+Copy(Inttostr(dec)+'00000',1,5);

    Except

      MessageDlg('Ungültiges Zahlenformat: '+_x,mtInformation,[mbOk],0);

      abort;

   end;

  end;

 

 

  Procedure CheckKoords(Var _X:String; Var _Y:STring);

  var

  p:Integer;

  x,y:Double;

  xq,yq:Double;

  begin

    p:=Pos(',',_x);

    If p=0 then

      p:=Pos('.',_x);

    if (P=0) or (p>6) //Daten liegen im Gaus-Krügerformat vor.

    then

    begin

      xq:=StrToFloat(_x);

      yq:=StrToFloat(_y);

      GaussToWGS84(xq,yq,x,y);

      _x:=FloatTostr(x);

      _y:=FloatTostr(y);

    end

  end;

 

 

  Procedure GaussToWGS84(dKoordXQ, dKoordYQ: double;var dKoordXZ:double;

            var dKoordYZ:double);

  var

  {dKoordXQ X-Koordinate des Quellkoordinatensystems }

  {dKoordYQ Y-Koordinate des Quellkoordinatensystems }

  {dKoordXZ X-Koordinate des Zielkoordinatensystems }

  {dKoordYZ Y-Koordinate des Zielkoordinatensystems }

  sKoordSysQ   : word;    { Kennung fuer das Quellkoordinatensystem }

  sBezSysQ     : word;    { Kennung fuer das Quellbezugssystem }

  sNotationQ   : word;    { Kennung fuer die Notation der Quellkoordinat. }

  sKoordSysZ   : word;    { Kennung fuer das Zielkoordinatensystem }

  sBezSysZ     : word;    { Kennung fuer das Zielbezugssystem }

  sNotationZ   : word;    { Kennung fuer die Notation der Zielkoordinaten }

  sStreifenZ   : word;    { Kennung fuer den Zielmeridianstreifen }

  begin

    sKoordSysQ   := GK3;  { Kennung fuer das Quellkoordinatensystem }

    sBezSysQ     := 0;    { Kennung fuer das Quellbezugssystem }

    sNotationQ   := 0;    { Kennung fuer die Notation der Quellkoordinat. }

    sKoordSysZ   := 1;    { Kennung fuer das Zielkoordinatensystem }

    sBezSysZ     := 0;    { Kennung fuer das Zielbezugssystem }

    sNotationZ   := 0;    { Kennung fuer die Notation der Zielkoordinaten }

    sStreifenZ   := 0 ;   { Kennung fuer den Zielmeridianstreifen }

    if Coordtrans3(dKoordXQ,

      dKoordYQ,

      sKoordSysQ,

      sBezSysQ,

      sNotationQ,

      dKoordYZ,     // ACHTUNG X und Y sind in der DLL vertauscht!

      dKoordXZ,     // ACHTUNG X und Y sind in der DLL vertauscht!

      sKoordSysZ,

      sBezSysZ,

      sNotationZ,

      sStreifenZ)=0 then

      begin

        dKoordYZ:=0;

        dKoordXZ:=0;

      end;

  end;

end.