📄 judgegpsstate.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 + -