⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 judgegpsstate.pas

📁 a voice guide client ,it is the second part of voice guide center
💻 PAS
字号:
unit JudgeGpsState;

interface

uses
  SysUtils, Classes, tbGisIdTCPClient, uPubFun;

type

  TJudgeGpsState = class(TComponent)
  private
    { Private declarations }
    fGoodsSheetList: TStringList;
    fOnRecvOperation: TRecvOperation;
    fCurTarget: string;
    //function GetDistance(Lon1, Lat1, Lon2, Lat2: Double): Double;
    function GetState(GpsData: TGpsData; GoodsSheet: TGoodsSheet): string;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent);override;
    destructor Destroy; override;
    procedure FlushDB;
    procedure RecvGpsData(Target: string; GpsData: TGpsData);
  published
    { Published declarations }
    property OnRecvOperation: TRecvOperation
        read fOnRecvOperation
       Write fOnRecvOperation;
  end;

//procedure Register;

implementation

uses Math, uDm;

//procedure Register;
//begin
//  RegisterComponents('Treble', [TJudgeGpsState]);
//end;

{ TJudgeGpsState }

constructor TJudgeGpsState.Create(AOwner: TComponent);
begin
  inherited;
  fGoodsSheetList:= TStringList.Create;
  FlushDB;
end;

destructor TJudgeGpsState.Destroy;
begin
  fGoodsSheetList.Free;
  inherited;
end;

procedure TJudgeGpsState.FlushDB;
var
  sCarId: string;
  GoodsSheet: TGoodsSheet;
begin
  with DataModule1 do begin
    cdsLookup.Close;
    cdsLookup.CommandText:=
      'SELECT GoodsSheetId, CarId, SheetNo, FromName, FromAddress, FromZip, '+
      'FromTel, FromTime, ToName, ToAddress, ToZip, ToTel, ToTime, Remark, '+
      'FromLong1, FromLat1, FromLong2, FromLat2, '+
      'FromRdcLong1, FromRdcLat1, FromRdcLong2, FromRdcLat2, '+
      'ToLong1, ToLat1, ToLong2, ToLat2, '+
      'IsReportState, StartTime, EndTime '+
      'FROM GoodsSheetInfo WHERE IsReportState=1';
    try
      cdsLookup.Open;
    except
      Exit;
    end;
    while not cdsLookup.Eof do begin
      //生成一笔货单
      GoodsSheet:= TGoodsSheet.Create;
      sCarId:= Trim(cdsLookup.FieldValues['CarId']);
      GoodsSheet.GoodSheetId:= cdsLookup.FieldValues['GoodsSheetId'];
      GoodsSheet.CarId:= cdsLookup.FieldValues['CarId'];
      GoodsSheet.SheetNo:= Trim(cdsLookup.FieldValues['SheetNo']);
      GoodsSheet.FromName:= Trim(cdsLookup.FieldValues['FromName']);
      GoodsSheet.FromAddress:= Trim(cdsLookup.FieldValues['FromAddress']);
      GoodsSheet.FromZip:= Trim(cdsLookup.FieldValues['FromZip']);
      GoodsSheet.FromTel:= Trim(cdsLookup.FieldValues['FromTel']);
      GoodsSheet.FromTime:= cdsLookup.FieldValues['FromTime'];
      GoodsSheet.ToName:= Trim(cdsLookup.FieldValues['ToName']);
      GoodsSheet.ToAddress:= Trim(cdsLookup.FieldValues['ToAddress']);
      GoodsSheet.ToZip:= Trim(cdsLookup.FieldValues['ToZip']);
      GoodsSheet.ToTel:= Trim(cdsLookup.FieldValues['ToTel']);
      GoodsSheet.ToTime:= cdsLookup.FieldValues['ToTime'];
      GoodsSheet.Remark:= Trim(cdsLookup.FieldValues['Remark']);
      GoodsSheet.FromLong1:= cdsLookup.FieldValues['FromLong1'];
      GoodsSheet.FromLat1:= cdsLookup.FieldValues['FromLat1'];
      GoodsSheet.FromLong2:= cdsLookup.FieldValues['FromLong2'];
      GoodsSheet.FromLat2:= cdsLookup.FieldValues['FromLat2'];
      GoodsSheet.FromRdcLong1:= cdsLookup.FieldValues['FromRdcLong1'];
      GoodsSheet.FromRdcLat1:= cdsLookup.FieldValues['FromRdcLat1'];
      GoodsSheet.FromRdcLong2:= cdsLookup.FieldValues['FromRdcLong2'];
      GoodsSheet.FromRdcLat2:= cdsLookup.FieldValues['FromRdcLat2'];
      GoodsSheet.ToLong1:= cdsLookup.FieldValues['ToLong1'];
      GoodsSheet.ToLat1:= cdsLookup.FieldValues['ToLat1'];
      GoodsSheet.IsReportState:= cdsLookup.FieldValues['IsReportState'];
      GoodsSheet.StartTimePlan:= cdsLookup.FieldValues['StartTime'];
      GoodsSheet.EndTimePlan:= cdsLookup.FieldValues['EndTime'];
      GoodsSheet.Edited:= rsNoneChange;
      GoodsSheet.GoodsList:= nil;
      fGoodsSheetList.AddObject(sCarId, GoodsSheet);
      cdsLookup.Next;
    end;
  end;
end;

//function TJudgeGpsState.GetDistance(Lon1, Lat1, Lon2, Lat2: Double):double;
////获取两个经纬度坐标点间的距离,单位:米
//const
//  a = 6378245;
//  f = 1/298.3;
//  b = a * (1 - f);
//var
//  i: Integer;
//  w: Double;
//  tanU1, U1, sinU1, cosU1, tanU2, U2, sinU2, cosU2: Double;
//
//  y: Double;
//
//  sin2_a, cos_a, tan_a, _a, sin_a, sina, cosa: Double;
//
//  cos2_am: Double;
//
//  _u2{, _u}: Extended;
//
//  C: Double;
//
//  BA, BB, Delta_a: Double;
//
//  s: Double;
//
//begin
//  Lat1 := DegToRad(Lat1);
//  Lat2 := DegToRad(Lat2);
//  Lon1 := DegToRad(Lon1);
//  Lon2 := DegToRad(Lon2);
//
//  if (Lat1 = Lat2) and (Lon1 = Lon2) then
//  begin
//    Result := 0;
//    Exit;
//  end;
//  w := Lon2 - Lon1;
//
//  tanU1 := (1 - f) * tan(Lat1);
//  U1 := ArcTan(tanU1);
//  sinU1 := sin(U1);
//  cosU1 := cos(U1);
//
//  tanU2 := (1 - f) * tan(Lat2);
//  U2 := ArcTan(tanU2);
//  sinU2 := sin(U2);
//  cosU2 := cos(U2);
//
//  y := w;
//
//  for i := 0 to 99 do
//  begin
//    sin2_a := cosU2 * sin(y) * cosU2 * sin(y) +
//              (cosU1 * sinU2 - sinU1 * cosU2 * cos(y)) * (cosU1 * sinU2 - sinU1 * cosU2 * cos(y));
//    cos_a := sinU1 * sinU2 + cosU1 * cosU2 * cos(y);
//    sin_a := Power(sin2_a, 0.5);
//    tan_a := sin_a / cos_a;
//    _a := ArcTan(tan_a);
//
//    sina := cosU1 * cosU2 * sin(y) / sin_a;
//    cosa := cos(ArcSin(sina));
//
//
//    cos2_am := cos_a - 2 * sinU1 * sinU2 / (cosa * cosa);
//
//    C := (f / 16) * cosa * cosa * (4 + f * (4 - 3 * cosa * cosa));
//
//    y := w + (1 - C) * f * sina * (_a + C * sin_a * (cos2_am + C * cos_a * (-1 + 2 * cos2_am * cos2_am)));
//  end;
//
//    _u2 := cosa * cosa * ((a / b) * (a / b) - 1);
//
//    BA := 1 + (_u2 / 16384) * (4096 + _u2 * (-768 + _u2 * (320 - 175 * _u2)));
//
//    BB := (_u2 / 1024) * (256 + _u2 * (-128 + _u2 * (74 - 47 * _u2)));
//
//    Delta_a := BB * sin_a * (cos2_am + (BB / 4) * (cos_a * (-1 + 2 * cos2_am * cos2_am) - (BB / 6) * cos2_am * (-3 + 4 * sin2_a) * (-3 + 4 * cos2_am * cos2_am)));
//
//    s := b * BA * (_a - Delta_a);
//
//    Result := s;
//
//end;

procedure TJudgeGpsState.RecvGpsData(Target: string; GpsData: TGpsData);
var
  index: Integer;
  sCarId, sState: string;
  GoodsSheet: TGoodsSheet;
begin
  fCurTarget:= Target;
  if Pos('8613', Target)=1
  then sCarId:= Copy(Target, 5, MaxInt)
  else if Pos('13', Target)=1
  then sCarId:= Copy(Target, 3, MaxInt);
  //判断
  Index:= fGoodsSheetList.IndexOf(sCarId);
  if Index<0 then Exit;
  GoodsSheet:= TGoodsSheet(fGoodsSheetList.Objects[index]);
  if not Assigned(GoodsSheet) then Exit;
  //产生事件
  sState:= GetState(GpsData, GoodsSheet);
  if sState<>'' then fOnRecvOperation(Self, Target, -1, 0, '', '', sState);
end;

function TJudgeGpsState.GetState(GpsData: TGpsData;
  GoodsSheet: TGoodsSheet): string;
var
  //Dist1, Dist2: Double;
  IsIn: Boolean;
begin
  Result:= '';
  {if (GpsData.GpsTime< GoodsSheet.StartTimePlan)
   or(GpsData.GpsTime> GoodsSheet.StartTimePlan)
  then Exit;}
  IsIn:= (GpsData.Long> GoodsSheet.FromLong1) and
    (GpsData.Long< GoodsSheet.FromLong2) and
    (GpsData.Lat> GoodsSheet.FromLat1) and
    (GpsData.Lat< GoodsSheet.FromLat2);
  if IsIn then Result:= '进入货仓'
  else begin
    IsIn:= (GpsData.Long> GoodsSheet.FromRdcLong1) and
      (GpsData.Long< GoodsSheet.FromRdcLong2) and
      (GpsData.Lat> GoodsSheet.FromRdcLat1) and
      (GpsData.Lat< GoodsSheet.FromRdcLat2);
    if IsIn then Result:= '进入RDC'
    else begin
      IsIn:= (GpsData.Long> GoodsSheet.ToLong1) and
        (GpsData.Long< GoodsSheet.ToLong2) and
        (GpsData.Lat> GoodsSheet.ToLat1) and
        (GpsData.Lat< GoodsSheet.ToLat2);
      if IsIn then Result:= '货物到达'
      else Result:= '运输途中';
    end;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -