diff --git a/components/lazmapviewer/source/mvcache.pas b/components/lazmapviewer/source/mvcache.pas index 59bee01b3..aeacecab3 100644 --- a/components/lazmapviewer/source/mvcache.pas +++ b/components/lazmapviewer/source/mvcache.pas @@ -22,7 +22,8 @@ unit mvCache; interface uses - Classes, SysUtils,mvmapprovider,IntfGraphics,syncObjs,mvtypes; + Classes, SysUtils, IntfGraphics, syncObjs, + mvMapProvider, mvTypes; Type @@ -45,7 +46,7 @@ Type Function MapProvider2FileName(MapProvider: TMapProvider): String; Function DiskCached(const aFileName: String): Boolean; procedure LoadFromDisk(const aFileName: String; out img: TLazIntfImage); - Function GetFileName(MapProvider: TMapProvider;const TileId: TTileId): String; + Function GetFileName(MapProvider: TMapProvider; const TileId: TTileId): String; public Procedure CheckCacheSize(Sender: TObject); constructor Create(aOwner: TComponent); override; diff --git a/components/lazmapviewer/source/mvdragobj.pas b/components/lazmapviewer/source/mvdragobj.pas index 49c9bf1bf..646ad0103 100644 --- a/components/lazmapviewer/source/mvdragobj.pas +++ b/components/lazmapviewer/source/mvdragobj.pas @@ -31,7 +31,7 @@ Type { TDragObj } - TDragObj = Class + TDragObj = class private FMouseDown : boolean; FLnkObj: TObject; @@ -50,76 +50,75 @@ Type procedure SetOnDrag(AValue: TDragEvent); procedure SetOnEndDrag(AValue: TDragEvent); - Procedure DostartDrag(X,Y : Integer); - Procedure DoDrag(X,Y : integer); - Procedure DoEndDrag(X,Y : integer); - Function HasMoved(X,Y : integer) : Boolean; + Procedure DostartDrag(X,Y: Integer); + Procedure DoDrag(X,Y: integer); + Procedure DoEndDrag(X,Y: integer); + Function HasMoved(X,Y: integer) : Boolean; Procedure AbortDrag; public - Procedure MouseDown(aDragSrc : TObject;X,Y : integer); - Procedure MouseUp(X,Y : integer); - Procedure MouseMove(X,Y : integer); + Procedure MouseDown(aDragSrc: TObject; X,Y: integer); + Procedure MouseUp(X,Y: integer); + Procedure MouseMove(X,Y: integer); - property OnDrag : TDragEvent read FOnDrag write SetOnDrag; - property OnEndDrag : TDragEvent read FOnEndDrag write SetOnEndDrag; + property OnDrag: TDragEvent read FOnDrag write SetOnDrag; + property OnEndDrag: TDragEvent read FOnEndDrag write SetOnEndDrag; - - - property OfsX : integer read FOfsX; - property OfsY : integer read FOfsY; - property StartX : integer read FStartX; - property StartY : integer read FStartY; - property MouseX : Integer read FMouseX; - property MouseY : integer read FMouseY; - property EndX : integer read FEndX; - property EndY : integer read FEndY; - Property LnkObj : TObject Read FLnkObj write SetLnkObj; - property DragSrc : TObject Read FStartSrc; + property OfsX: integer read FOfsX; + property OfsY: integer read FOfsY; + property StartX: integer read FStartX; + property StartY: integer read FStartY; + property MouseX: Integer read FMouseX; + property MouseY: integer read FMouseY; + property EndX: integer read FEndX; + property EndY: integer read FEndY; + Property LnkObj: TObject Read FLnkObj write SetLnkObj; + property DragSrc: TObject Read FStartSrc; end; + implementation { TDragObj } procedure TDragObj.SetDest(X, Y: Integer); begin - FEndX:=X; - FEndY:=Y; - FOfsX:=FEndX-FstartX; - FOfsY:=FEndY-FstartY; + FEndX := X; + FEndY := Y; + FOfsX := FEndX-FstartX; + FOfsY := FEndY-FstartY; end; procedure TDragObj.SetLnkObj(AValue: TObject); begin if FLnkObj=AValue then Exit; FreeAndNil(FLnkObj); - FLnkObj:=AValue; + FLnkObj := AValue; end; procedure TDragObj.SetOnDrag(AValue: TDragEvent); begin if FOnDrag=AValue then Exit; - FOnDrag:=AValue; + FOnDrag := AValue; end; procedure TDragObj.SetOnEndDrag(AValue: TDragEvent); begin if FOnEndDrag=AValue then Exit; - FOnEndDrag:=AValue; + FOnEndDrag := AValue; end; procedure TDragObj.DostartDrag(X, Y: Integer); begin - InDrag:=True; - FStartSrc := FDragSrc; - DoDrag(X,Y); + InDrag := True; + FStartSrc := FDragSrc; + DoDrag(X,Y); end; procedure TDragObj.DoDrag(X, Y: integer); begin if (X<>FEndX) or (Y<>FEndY) then - Begin + begin SetDest(X,Y); if Assigned(FOnDrag) then FOnDrag(Self); @@ -133,12 +132,12 @@ begin FOnEndDrag(self); FreeAndNil(FLnkObj); FStartSrc := nil; - InDrag:=False; + InDrag := False; end; function TDragObj.HasMoved(X, Y: integer): Boolean; begin - Result:=(X<>FStartX) or (Y<>FStartY); + Result := (X <> FStartX) or (Y <> FStartY); end; procedure TDragObj.AbortDrag; @@ -146,8 +145,8 @@ begin if InDrag then Begin DoDrag(FstartX,FStartY); - InDrag:=False; - FMouseDown:=False; + InDrag := False; + FMouseDown := False; FDragSrc :=nil; FStartSrc := nil; FreeAndNil(FLnkObj); @@ -157,16 +156,16 @@ end; procedure TDragObj.MouseDown(aDragSrc : TObject;X, Y: integer); begin if not(FMouseDown) then - Begin - FDragSrc := aDragSrc; - FMouseDown := True; - FStartX := X; - FStartY := Y; - FEndX := X; - FEndY := Y; - End - Else - AbortDrag; + begin + FDragSrc := aDragSrc; + FMouseDown := True; + FStartX := X; + FStartY := Y; + FEndX := X; + FEndY := Y; + end + else + AbortDrag; end; @@ -175,13 +174,13 @@ begin FMouseX := X; FMouseY := Y; if FMouseDown then - Begin + begin if InDrag then - DoDrag(X,Y) + DoDrag(X,Y) else - Begin - if HasMoved(X,Y) then - DoStartDrag(X,Y); + begin + if HasMoved(X,Y) then + DoStartDrag(X,Y); end; end; end; @@ -190,10 +189,10 @@ end; procedure TDragObj.MouseUp(X, Y: integer); begin if FMouseDown then - Begin - FMouseDown:=False; + begin + FMouseDown := False; if InDrag then - DoEndDrag(X,Y); + DoEndDrag(X,Y); FDragSrc := nil; end; end; diff --git a/components/lazmapviewer/source/mvengine.pas b/components/lazmapviewer/source/mvengine.pas index f818e6740..a32951ef3 100644 --- a/components/lazmapviewer/source/mvengine.pas +++ b/components/lazmapviewer/source/mvengine.pas @@ -39,7 +39,8 @@ const Type - TDrawTileEvent = Procedure (const TileId : TTileId;X,Y : integer;TileImg : TLazIntfImage) of object; + TDrawTileEvent = Procedure (const TileId: TTileId; X,Y: integer; + TileImg: TLazIntfImage) of object; TTileIdArray = Array of TTileId; @@ -49,7 +50,7 @@ Type MapProvider: TMapProvider; X: Int64; Y: Int64; - Center : TRealPoint; + Center: TRealPoint; Zoom: integer; Height: integer; Width: integer; @@ -100,21 +101,21 @@ Type function IsCurrentWin(const aWin: TMapWindow) : boolean; protected procedure ConstraintZoom(var aWin: TMapWindow); - function GetTileName(const Id: TTileId) : String; - procedure evDownload(Data: TObject;Job : TJob); + function GetTileName(const Id: TTileId): String; + procedure evDownload(Data: TObject; Job: TJob); procedure TileDownloaded(Data: PtrInt); Procedure RegisterProviders; - Procedure DrawTile(const TileId : TTileId;X,Y : integer;TileImg : TLazIntfImage); + Procedure DrawTile(const TileId: TTileId; X,Y: integer; TileImg: TLazIntfImage); function GetLetterSvr(id: integer): String; function GetYahooSvr(id: integer): String; - function GetYahooY(const Tile : TTileId): string; - function GetYahooZ(const Tile : TTileId): string; - function GetQuadKey(const Tile : TTileId): string; + function GetYahooY(const Tile: TTileId): string; + function GetYahooZ(const Tile: TTileId): string; + function GetQuadKey(const Tile: TTileId): string; - Procedure DoDrag(Sender : TDragObj); + Procedure DoDrag(Sender: TDragObj); public - constructor Create(aOwner : TComponent);override; + constructor Create(aOwner: TComponent); override; destructor Destroy; override; function AddMapProvider(OpeName: String; Url: String; @@ -133,11 +134,12 @@ Type procedure DblClick(Sender: TObject); procedure MouseDown(Sender: TObject; Button: TMouseButton; {%H-}Shift: TShiftState; X, Y: Integer); - procedure MouseMove(Sender: TObject; {%H-}Shift: TShiftState; X, Y: Integer); + procedure MouseMove(Sender: TObject; {%H-}Shift: TShiftState; + X, Y: Integer); procedure MouseUp(Sender: TObject; Button: TMouseButton; {%H-}Shift: TShiftState; X, Y: Integer); - procedure MouseWheel(Sender: TObject; {%H-}Shift: TShiftState; WheelDelta: Integer; - {%H-}MousePos: TPoint; var Handled: Boolean); + procedure MouseWheel(Sender: TObject; {%H-}Shift: TShiftState; + WheelDelta: Integer; {%H-}MousePos: TPoint; var Handled: Boolean); procedure ZoomOnArea(const aArea: TRealArea); property Center: TRealPoint read GetCenter write SetCenter; @@ -146,8 +148,10 @@ Type property Active: Boolean read FActive write SetActive default false; property CacheOnDisk: Boolean read GetCacheOnDisk write SetCacheOnDisk; property CachePath: String read GetCachePath write SetCachePath; - property DownloadEngine: TMvCustomDownloadEngine read FDownloadEngine write SetDownloadEngine; - property DrawTitleInGuiThread: boolean read FDrawTitleInGuiThread write FDrawTitleInGuiThread; + property DownloadEngine: TMvCustomDownloadEngine + read FDownloadEngine write SetDownloadEngine; + property DrawTitleInGuiThread: boolean + read FDrawTitleInGuiThread write FDrawTitleInGuiThread; property Height: integer read GetHeight write SetHeight; property JobQueue: TJobQueue read Queue; property MapProvider: String read GetMapProvider write SetMapProvider; @@ -161,6 +165,7 @@ Type property OnZoomChange: TNotifyEvent read FOnZoomChange write FOnZoomChange; end; + implementation uses @@ -171,7 +176,7 @@ type { TLaunchDownloadJob } - TLaunchDownloadJob = Class(TJob) + TLaunchDownloadJob = class(TJob) private AllRun: boolean; Win: TMapWindow; @@ -180,14 +185,15 @@ type FTiles: TTileIdArray; FStates: Array of integer; protected - function pGetTask: integer;override; - procedure pTaskStarted(aTask: integer);override; - procedure pTaskEnded(aTask: integer; aExcept: Exception);override; + function pGetTask: integer; override; + procedure pTaskStarted(aTask: integer); override; + procedure pTaskEnded(aTask: integer; aExcept: Exception); override; public - procedure ExecuteTask(aTask: integer; FromWaiting: boolean);override; - function Running: boolean;override; + procedure ExecuteTask(aTask: integer; FromWaiting: boolean); override; + function Running: boolean; override; public - Constructor Create(Eng: TMapViewerEngine; const Tiles: TTileIdArray; const aWin: TMapWindow); + constructor Create(Eng: TMapViewerEngine; const Tiles: TTileIdArray; + const aWin: TMapWindow); end; @@ -295,7 +301,7 @@ end; { TEnvTile } -constructor TEnvTile.Create(const aTile : TTileId;Const aWin : TMapWindow); +constructor TEnvTile.Create(const aTile: TTileId; const aWin: TMapWindow); begin Tile := aTile; Win := aWin; @@ -336,7 +342,7 @@ end; function TMapViewerEngine.AddMapProvider(OpeName: String; Url: String; MinZoom, MaxZoom, NbSvr: integer; GetSvrStr: TGetSvrStr; GetXStr: TGetValStr; - GetYStr: TGetValStr; GetZStr: TGetValStr) : TMapProvider; + GetYStr: TGetValStr; GetZStr: TGetValStr): TMapProvider; var idx :integer; Begin @@ -357,8 +363,8 @@ var begin MaxX := (Int64(aWin.Width) div TILE_SIZE) + 1; MaxY := (Int64(aWin.Height) div TILE_SIZE) + 1; - startX := (-(aWin.X)) div TILE_SIZE; - startY := (-(aWin.Y)) div TILE_SIZE; + startX := -aWin.X div TILE_SIZE; + startY := -aWin.Y div TILE_SIZE; Result.Left := startX; Result.Right := startX + MaxX; Result.Top := startY; @@ -712,10 +718,8 @@ var nCenter: TRealPoint; aPt: TPoint; Begin - if Sender.LnkObj=nil then - begin + if Sender.LnkObj = nil then Sender.LnkObj := TMemObj.Create(MapWin); - end; old := TMemObj(Sender.LnkObj); aPt.X := old.FWin.Width DIV 2-Sender.OfsX; aPt.Y := old.FWin.Height DIV 2-Sender.OfsY; @@ -757,7 +761,7 @@ end; procedure TMapViewerEngine.RegisterProviders; begin - AddMapProvider('Aucun','',0,30, 0); + AddMapProvider('Aucun','',0,30, 0); { AddMapProvider('Google Satellite','http://khm%d.google.com/kh/v=82&x=%x%&y=%y%&z=%z%&s=Ga',4); AddMapProvider('Google Hybrid','http://khm%d.google.com/kh/v=82&x=%x%&y=%y%&z=%z%&s=Ga',4); @@ -771,7 +775,7 @@ begin //AddMapProvider('Yahoo Hybrid','http://maps%serv%.yimg.com/ae/ximg?v=1.9&t=a&s=256&.intl=en&x=%x%&y=%y%&z=%z%&r=1', 0,20,3,@GetYahooSvr, nil, @getYahooY, @GetYahooZ); //[Random(3)+1, X, YahooY(Y), Z+1])); //AddMapProvider('Yahoo Hybrid','http://maps%serv%.yimg.com/hx/tl?b=1&v=4.3&t=h&.intl=en&x=%x%&y=%y%&z=%z%&r=1' , 0,20,3,@GetYahooSvr, nil, @getYahooY, @GetYahooZ); //[Random(3)+1, X, YahooY(Y), Z+1])); - // opeName, Url, MinZoom, MaxZoom, NbSvr, GetSvrStr, GetXStr, GetYStr, GetZStr + // opeName, Url, MinZoom, MaxZoom, NbSvr, GetSvrStr, GetXStr, GetYStr, GetZStr MapWin.MapProvider := AddMapProvider('OpenStreetMap Mapnik', 'http://%serv%.tile.openstreetmap.org/%z%/%x%/%y%.png', 0, 19, 3, @GetLetterSvr); @@ -877,7 +881,7 @@ var begin idx := lstProvider.IndexOf(aValue); if not ((aValue = '') or (idx <> -1)) then - raise Exception.Create('Unknow Provider : ' + aValue); + raise Exception.Create('Unknow Provider: ' + aValue); if Assigned(MapWin.MapProvider) and (MapWin.MapProvider.Name = AValue) then Exit; if idx <> -1 then begin diff --git a/components/lazmapviewer/source/mvextradata.pas b/components/lazmapviewer/source/mvextradata.pas index a8597bc6d..29c6f0e1d 100644 --- a/components/lazmapviewer/source/mvextradata.pas +++ b/components/lazmapviewer/source/mvextradata.pas @@ -5,7 +5,7 @@ unit mvExtraData; interface uses - Classes, SysUtils,graphics; + Classes, SysUtils, graphics; type @@ -17,26 +17,26 @@ type FId: integer; procedure SetColor(AValue: TColor); public - constructor Create(aId : integer);virtual; - property Color : TColor read FColor write SetColor; - property Id : integer read FId; + constructor Create(aId: integer);virtual; + property Color: TColor read FColor write SetColor; + property Id: integer read FId; End; + implementation { TDrawingExtraData } - procedure TDrawingExtraData.SetColor(AValue: TColor); begin - if FColor=AValue then Exit; - FColor:=AValue; + if FColor = AValue then Exit; + FColor := AValue; end; constructor TDrawingExtraData.Create(aId: integer); begin - FId:=aId; - FColor:=clRed; + FId := aId; + FColor := clRed; end; end. diff --git a/components/lazmapviewer/source/mvgeonames.pas b/components/lazmapviewer/source/mvgeonames.pas index 9370c5513..7bab828ef 100644 --- a/components/lazmapviewer/source/mvgeonames.pas +++ b/components/lazmapviewer/source/mvgeonames.pas @@ -62,7 +62,7 @@ type ADownloadEngine: TMvCustomDownloadEngine): TRealPoint; published property LocationName: string read FLocationName; - property OnNameFound : TNameFoundEvent read FOnNameFound write FOnNameFound; + property OnNameFound: TNameFoundEvent read FOnNameFound write FOnNameFound; end; @@ -195,51 +195,13 @@ begin parser.Free; end; end; - (* -function TMVGeoNames.RemoveTag(Const str : String) : TStringArray; -var iStart,iEnd,i : Integer; - tmp : String; - lst : TStringList; -Begin - SetLength(Result,0); - tmp := StringReplace(str,'
',#13,[rfReplaceall]); - tmp := StringReplace(tmp,' ',' ',[rfReplaceall]); - tmp := StringReplace(tmp,' ',' ',[rfReplaceall]); - repeat - iEnd:=-1; - iStart:=pos('<',tmp); - if iStart>0 then - Begin - iEnd:=posEx('>',tmp,iStart); - if iEnd>0 then - Begin - tmp:=copy(tmp,1,iStart-1)+copy(tmp,iEnd+1,length(tmp)); - end; - end; - until iEnd<=0; - lst:=TStringList.Create; - try - lst.Text:=tmp; - SetLEngth(Result,lst.Count); - For i:=0 to pred(lst.Count) do - Result[i]:=trim(lst[i]); - finally - freeAndNil(lst); - end; -end; - *) function TMVGeoNames.Search(ALocationName: String; ADownloadEngine: TMvCustomDownloadEngine): TRealPoint; -{ -const - LAT_ID = ''; - LONG_ID = ''; - } var s: string; - function gs(id: string;Start : integer): string; + function gs(id: string; Start: integer): string; var i: Integer; ln: Integer; @@ -260,12 +222,6 @@ var var ms: TMemoryStream; url: String; - { - iRes,i : integer; - lstRes : Array of TResRec; - iStartDescr : integer; - lst : TStringArray; - } begin FLocationName := ALocationName; ms := TMemoryStream.Create; @@ -280,46 +236,6 @@ begin end; Result := Parse(PChar(s)); - { - Result.Lon := 0; - Result.Lat := 0; - SetLength(lstRes, 0); - iRes := Pos('0) do - begin - SetLength(lstRes,length(lstRes)+1); - lstRes[high(lstRes)].Loc.Lon := StrToFloat(gs(LONG_ID,iRes)); - lstRes[high(lstRes)].Loc.Lat := StrToFloat(gs(LAT_ID,iRes)); - iStartDescr := RPosex('',s,iRes); - if iStartDescr>0 then - begin - lst:=RemoveTag(Copy(s,iStartDescr,iRes-iStartDescr)); - if length(lst)>0 then - lstRes[high(lstRes)].Name:=lst[0]; - lstRes[high(lstRes)].Descr:=''; - for i:=1 to high(lst) do - lstRes[high(lstRes)].Descr+=lst[i]; - end; - - Result.Lon += lstRes[high(lstRes)].Loc.Lon; - Result.Lat += lstRes[high(lstRes)].Loc.Lat; - iRes := PosEx(' 0 then - begin - if Length(lstRes) > 1 then - begin - Result.Lon := Result.Lon/length(lstRes); - Result.Lat := Result.Lat/length(lstRes); - end; - if Assigned(FOnNameFound) then - for iRes:=low(lstRes) to high(lstRes) do - begin - FOnNameFound(lstRes[iRes].Name, lstRes[iRes].Descr, lstRes[iRes].Loc); - end; - end; - } end; end. diff --git a/components/lazmapviewer/source/mvgpsobj.pas b/components/lazmapviewer/source/mvgpsobj.pas index 284270212..1c14c546f 100644 --- a/components/lazmapviewer/source/mvgpsobj.pas +++ b/components/lazmapviewer/source/mvgpsobj.pas @@ -23,151 +23,159 @@ interface uses Classes, SysUtils,fgl,mvtypes,contnrs,syncobjs; + const NO_ELE = -10000000; NO_DATE = 0; + type - TIdArray = Array of integer; + TIdArray = Array of integer; - { TGPSObj } + { TGPSObj } - TGPSObj = Class - private - BBoxSet : Boolean; - FBoundingBox : TRealArea; - FExtraData: TObject; - FName: String; - FIdOwner : integer; - function GetBoundingBox: TRealArea; - procedure SetBoundingBox(AValue: TRealArea); - procedure SetExtraData(AValue: TObject); - public - destructor Destroy;override; - Procedure GetArea(out Area : TRealArea);virtual;abstract; - property Name : String read FName write FName; - property ExtraData : TObject read FExtraData write SetExtraData; - property BoundingBox : TRealArea read GetBoundingBox write SetBoundingBox; + TGPSObj = class + private + BBoxSet: Boolean; + FBoundingBox: TRealArea; + FExtraData: TObject; + FName: String; + FIdOwner: integer; + function GetBoundingBox: TRealArea; + procedure SetBoundingBox(AValue: TRealArea); + procedure SetExtraData(AValue: TObject); + public + destructor Destroy; override; + procedure GetArea(out Area: TRealArea); virtual; abstract; + property Name: String read FName write FName; + property ExtraData: TObject read FExtraData write SetExtraData; + property BoundingBox: TRealArea read GetBoundingBox write SetBoundingBox; + end; - end; + TGPSObjarray = Array of TGPSObj; - TGPSObjarray = Array of TGPSObj; + { TGPSPoint } - { TGPSPoint } + TGPSPoint = class(TGPSObj) + private + FRealPt: TRealPoint; + FEle: Double; + FDateTime: TDateTime; + function GetLat: Double; + function GetLon: Double; + public + constructor Create(ALon,ALat : double;AEle : double=NO_ELE;ADateTime : TDateTime=NO_DATE); + class function CreateFrom(aPt: TRealPoint): TGPSPoint; - TGPSPoint = Class(TGPSObj) - private - FRealPt : TRealPoint; - FEle : Double; - FDateTime : TDateTime; - function GetLat: Double; - function GetLon: Double; - public - Procedure GetArea(out Area : TRealArea);override; - Function HasEle : boolean; - Function HasDateTime : Boolean; - Function DistanceInKmFrom(OtherPt : TGPSPoint;UseEle : boolean=true) : double; - constructor Create(ALon,ALat : double;AEle : double=NO_ELE;ADateTime : TDateTime=NO_DATE); - Class function CreateFrom(aPt : TRealPoint) : TGPSPoint; + procedure GetArea(out Area: TRealArea);override; + function HasEle: boolean; + function HasDateTime: Boolean; + function DistanceInKmFrom(OtherPt: TGPSPoint; UseEle: boolean=true): double; - property Lon : Double read GetLon; - property Lat : Double read GetLat; - property Ele : double read FEle; - property DateTime : TDateTime read FDateTime; - property RealPoint : TRealPoint read FRealPt; - end; + property Lon: Double read GetLon; + property Lat: Double read GetLat; + property Ele: double read FEle; + property DateTime: TDateTime read FDateTime; + property RealPoint: TRealPoint read FRealPt; + end; - TGPSPointList = specialize TFPGObjectList; + TGPSPointList = specialize TFPGObjectList; - { TGPSTrack } + { TGPSTrack } - TGPSTrack = Class(TGPSObj) - private - FDateTime: TDateTime; - FPoints : TGPSPointList; - function GetDateTime: TDateTime; - public - constructor Create; - destructor Destroy;override; + TGPSTrack = class(TGPSObj) + private + FDateTime: TDateTime; + FPoints: TGPSPointList; + function GetDateTime: TDateTime; + public + constructor Create; + destructor Destroy; override; - Procedure GetArea(out Area : TRealArea);override; - Function TrackLengthInKm(UseEle : Boolean=true) : double; + procedure GetArea(out Area: TRealArea); override; + function TrackLengthInKm(UseEle: Boolean=true): double; - property Points : TGPSPointList read FPoints; - property DateTime : TDateTime read GetDateTime write FDateTime; - end; + property Points: TGPSPointList read FPoints; + property DateTime: TDateTime read GetDateTime write FDateTime; + end; - TGPSObjList_ = specialize TFPGObjectList; + TGPSObjList_ = specialize TFPGObjectList; - { TGPSObjList } + { TGPSObjList } - TGPSObjList = class(TGPSObjList_) - private - FRef : TObject; - public - Destructor Destroy;override; - end; + TGPSObjList = class(TGPSObjList_) + private + FRef: TObject; + public + destructor Destroy; override; + end; - { TGPSObjectList } - TModifiedEvent = procedure (Sender : TObject;objs : TGPSObjList;Adding : boolean) of object; + { TGPSObjectList } - TGPSObjectList = Class(TGPSObj) - private - Crit: TCriticalSection; - FPending: TObjectList; - FRefCount: integer; - FOnModified: TModifiedEvent; - FUpdating: integer; - FItems: TGPSObjList; - function Getcount: integer; - protected - Procedure _Delete(Idx: Integer; var DelLst: TGPSObjList); - Procedure FreePending; - Procedure DecRef; - procedure Lock; - procedure UnLock; - procedure CallModified(lst: TGPSObjList; Adding: boolean); - property Items : TGPSObjList read FItems; - procedure IdsToObj(const Ids : TIdArray; out objs: TGPSObjArray;IdOwner : integer); - public - Procedure GetArea(out Area : TRealArea);override; - function GetObjectsInArea(const Area: TRealArea): TGPSObjList; - constructor Create; - destructor Destroy;override; - Procedure Clear(OwnedBy : integer); - procedure ClearExcept(OwnedBy : integer;const ExceptLst : TIdArray;out Notfound : TIdArray); - function GetIdsArea(const Ids : TIdArray;IdOwner : integer) : TRealArea; + TModifiedEvent = procedure (Sender: TObject; objs: TGPSObjList; + Adding: boolean) of object; - function Add(aItem : TGpsObj;IdOwner : integer) : integer; - Procedure DeleteById(const Ids : Array of integer); + TGPSObjectList = class(TGPSObj) + private + Crit: TCriticalSection; + FPending: TObjectList; + FRefCount: integer; + FOnModified: TModifiedEvent; + FUpdating: integer; + FItems: TGPSObjList; + function GetCount: integer; + protected + procedure _Delete(Idx: Integer; var DelLst: TGPSObjList); + procedure FreePending; + procedure DecRef; + procedure Lock; + procedure UnLock; + procedure CallModified(lst: TGPSObjList; Adding: boolean); + property Items: TGPSObjList read FItems; + procedure IdsToObj(const Ids: TIdArray; out objs: TGPSObjArray; IdOwner: integer); + public + constructor Create; + destructor Destroy; override; + Procedure Clear(OwnedBy: integer); + procedure ClearExcept(OwnedBy: integer; const ExceptLst: TIdArray; + out Notfound: TIdArray); + procedure GetArea(out Area: TRealArea); override; + function GetObjectsInArea(const Area: TRealArea): TGPSObjList; + function GetIdsArea(const Ids: TIdArray; IdOwner: integer): TRealArea; - Procedure BeginUpdate; - Procedure EndUpdate; + function Add(aItem: TGpsObj; IdOwner: integer): integer; + procedure DeleteById(const Ids: Array of integer); - property Count : integer read Getcount; - property OnModified : TModifiedEvent read FOnModified write FOnModified; - end; + procedure BeginUpdate; + procedure EndUpdate; - function hasIntersectArea(const Area1 : TRealArea;const Area2 : TRealArea) : boolean; - function IntersectArea(const Area1 : TRealArea;const Area2 : TRealArea) : TRealArea; - function PtInsideArea(const aPoint : TRealPoint;const Area : TRealArea) : boolean; - Function AreaInsideArea(const AreaIn : TRealArea;const AreaOut : TRealArea) : boolean; - Procedure ExtendArea(var AreaToExtend : TRealArea;Const Area : TRealArea); - Function GetAreaOf(objs : TGPSObjList) : TRealArea; + property Count: integer read GetCount; + property OnModified: TModifiedEvent read FOnModified write FOnModified; + end; + +function HasIntersectArea(const Area1: TRealArea; const Area2: TRealArea): boolean; +function IntersectArea(const Area1: TRealArea; const Area2: TRealArea): TRealArea; +function PtInsideArea(const aPoint: TRealPoint; const Area: TRealArea): boolean; +function AreaInsideArea(const AreaIn: TRealArea; const AreaOut: TRealArea): boolean; +procedure ExtendArea(var AreaToExtend: TRealArea; const Area: TRealArea); +function GetAreaOf(objs: TGPSObjList): TRealArea; implementation -uses mvextradata; + +uses + mvExtraData; function hasIntersectArea(const Area1: TRealArea; const Area2: TRealArea): boolean; begin - Result:=(Area1.TopLeft.Lon<=Area2.BottomRight.Lon) and (Area1.BottomRight.Lon>=Area2.TopLeft.Lon) and - (Area1.TopLeft.Lat>=Area2.BottomRight.Lat) and (Area1.BottomRight.Lat<=Area2.TopLeft.Lat); + Result := (Area1.TopLeft.Lon <= Area2.BottomRight.Lon) and + (Area1.BottomRight.Lon >= Area2.TopLeft.Lon) and + (Area1.TopLeft.Lat >= Area2.BottomRight.Lat) and + (Area1.BottomRight.Lat <= Area2.TopLeft.Lat); end; -function IntersectArea(const Area1: TRealArea; const Area2: TRealArea - ): TRealArea; +function IntersectArea(const Area1: TRealArea; const Area2: TRealArea): TRealArea; begin - Result:=Area1; + Result := Area1; if Result.TopLeft.LonArea2.topLeft.Lat then @@ -180,15 +188,18 @@ end; function PtInsideArea(const aPoint: TRealPoint; const Area: TRealArea): boolean; begin - Result:=(Area.TopLeft.Lon<=aPoint.Lon) and (Area.BottomRight.Lon>=aPoint.Lon) and - (Area.TopLeft.Lat>=aPoint.Lat) and (Area.BottomRight.Lat<=aPoint.Lat); + Result := (Area.TopLeft.Lon <= aPoint.Lon) and + (Area.BottomRight.Lon >= aPoint.Lon) and + (Area.TopLeft.Lat >= aPoint.Lat) and + (Area.BottomRight.Lat <= aPoint.Lat); end; -function AreaInsideArea(const AreaIn: TRealArea; const AreaOut: TRealArea - ): boolean; +function AreaInsideArea(const AreaIn: TRealArea; const AreaOut: TRealArea): boolean; begin - Result:=(AreaIn.TopLeft.Lon>=AreaOut.TopLeft.Lon) and (AreaIn.BottomRight.Lon<=AreaOut.BottomRight.Lon) and - (AreaOut.TopLeft.Lat>=AreaIn.TopLeft.Lat) and (AreaOut.BottomRight.Lat<=AreaIn.BottomRight.Lat); + Result := (AreaIn.TopLeft.Lon >= AreaOut.TopLeft.Lon) and + (AreaIn.BottomRight.Lon <= AreaOut.BottomRight.Lon) and + (AreaOut.TopLeft.Lat >= AreaIn.TopLeft.Lat) and + (AreaOut.BottomRight.Lat <= AreaIn.BottomRight.Lat); end; procedure ExtendArea(var AreaToExtend: TRealArea; const Area: TRealArea); @@ -205,17 +216,18 @@ begin end; function GetAreaOf(objs: TGPSObjList): TRealArea; -var i : integer; +var + i: integer; begin - Result.TopLeft.Lon:=0; - Result.TopLeft.Lat:=0; - Result.BottomRight.Lon:=0; - Result.BottomRight.Lat:=0; + Result.TopLeft.Lon := 0; + Result.TopLeft.Lat := 0; + Result.BottomRight.Lon := 0; + Result.BottomRight.Lat := 0; if Objs.Count>0 then - Begin - Result:=Objs[0].BoundingBox; - For i:=1 to pred(Objs.Count) do - ExtendArea(Result,Objs[i].BoundingBox); + begin + Result := Objs[0].BoundingBox; + for i:=1 to pred(Objs.Count) do + ExtendArea(Result, Objs[i].BoundingBox); end; end; @@ -224,7 +236,7 @@ end; destructor TGPSObjList.Destroy; begin if Assigned(FRef) then - TGPSObjectList(FRef).DecRef; + TGPSObjectList(FRef).DecRef; inherited Destroy; end; @@ -234,24 +246,24 @@ procedure TGPSObj.SetExtraData(AValue: TObject); begin if FExtraData=AValue then Exit; if Assigned(FExtraData) then - FreeAndNil(FExtraData); - FExtraData:=AValue; + FreeAndNil(FExtraData); + FExtraData := AValue; end; function TGPSObj.GetBoundingBox: TRealArea; begin if not(BBoxSet) then - Begin - GetArea(FBoundingBox); - BBoxSet:=true; + begin + GetArea(FBoundingBox); + BBoxSet := true; end; - Result:=FBoundingBox; + Result := FBoundingBox; end; procedure TGPSObj.SetBoundingBox(AValue: TRealArea); begin - FBoundingBox:=AValue; - BBoxSet:=true; + FBoundingBox := AValue; + BBoxSet := true; end; destructor TGPSObj.Destroy; @@ -262,39 +274,39 @@ end; { TGPSObjectList } -function TGPSObjectList.Getcount: integer; +function TGPSObjectList.GetCount: integer; begin - Result:=FItems.Count + Result := FItems.Count end; procedure TGPSObjectList._Delete(Idx: Integer; var DelLst: TGPSObjList); // wp: was "out" var Item: TGpsObj; begin - Lock; - Try - if not(Assigned(DelLst)) then - Begin - DelLst:=TGpsObjList.Create(False); - DelLst.FRef:=Self; - inc(FRefCount); - end; - if not Assigned(FPending) then - FPending:=TObjectList.Create(true); - Item:=Items.Extract(Items[Idx]); - FPending.Add(Item); - finally - UnLock; + Lock; + try + if not(Assigned(DelLst)) then + begin + DelLst := TGpsObjList.Create(False); + DelLst.FRef := Self; + inc(FRefCount); end; - DelLst.Add(Item); + if not Assigned(FPending) then + FPending := TObjectList.Create(true); + Item := Items.Extract(Items[Idx]); + FPending.Add(Item); + finally + UnLock; + end; + DelLst.Add(Item); end; procedure TGPSObjectList.FreePending; begin if Assigned(FPending) then - Begin + begin Lock; - Try + try FreeAndNil(FPending); finally UnLock; @@ -324,41 +336,42 @@ end; procedure TGPSObjectList.CallModified(lst: TGPSObjList; Adding: boolean); begin if (FUpdating=0) and Assigned(FOnModified) then - FOnModified(self,lst,Adding) + FOnModified(self, lst, Adding) else lst.Free; end; -procedure TGPSObjectList.IdsToObj(const Ids: TIdArray; out objs: TGPSObjArray;IdOwner : integer); +procedure TGPSObjectList.IdsToObj(const Ids: TIdArray; out objs: TGPSObjArray; + IdOwner: integer); function ToSelect(aId: integer): boolean; var i: integer; begin - result:=false; + result := false; for i:=low(Ids) to high(Ids) do if Ids[i]=aId then begin - result:=true; - break; + result := true; + break; end; end; var i,nb : integer; begin - SetLength(objs,length(Ids)); - nb:=0; + SetLength(objs, Length(Ids)); + nb := 0; Lock; - Try + try for i:=0 to pred(FItems.Count) do begin - if (IdOwner=0) or (IdOwner=FItems[i].FIdOwner) then + if (IdOwner = 0) or (IdOwner = FItems[i].FIdOwner) then if Assigned(FItems[i].ExtraData) and FItems[i].ExtraData.InheritsFrom(TDrawingExtraData) then - Begin + begin if ToSelect(TDrawingExtraData(FItems[i].ExtraData).Id) then - Begin - objs[nb]:=FItems[i]; + begin + objs[nb] := FItems[i]; nb+=1; end; end; @@ -366,26 +379,27 @@ begin finally Unlock; end; - SetLength(objs,nb); + SetLength(objs, nb); end; procedure TGPSObjectList.GetArea(out Area: TRealArea); -var i : integer; - ptArea : TRealArea; +var + i: integer; + ptArea: TRealArea; begin - Area.BottomRight.lon:=0; - Area.BottomRight.lat:=0; - Area.TopLeft.lon:=0; - Area.TopLeft.lat:=0; + Area.BottomRight.lon := 0; + Area.BottomRight.lat := 0; + Area.TopLeft.lon := 0; + Area.TopLeft.lat := 0; Lock; - Try - if Items.Count>0 then + try + if Items.Count > 0 then begin - Area:=Items[0].BoundingBox; + Area := Items[0].BoundingBox; for i:=1 to pred(Items.Count) do begin - ptArea:=Items[i].BoundingBox; - ExtendArea(Area,ptArea); + ptArea := Items[i].BoundingBox; + ExtendArea(Area, ptArea); end; end; finally @@ -394,21 +408,22 @@ begin end; function TGPSObjectList.GetObjectsInArea(const Area: TRealArea): TGPSObjList; -var i : integer; - ItemArea : TRealArea; +var + i: integer; + ItemArea: TRealArea; begin - Result:=TGPSObjList.Create(false); + Result := TGPSObjList.Create(false); Lock; - Try + try Inc(FRefCount); - For i:=0 to pred(Items.Count) do - Begin - ItemArea:=Items[i].BoundingBox; - If hasIntersectArea(Area,ItemArea) then - Result.Add(Items[i]); + for i:=0 to pred(Items.Count) do + begin + ItemArea := Items[i].BoundingBox; + if hasIntersectArea(Area,ItemArea) then + Result.Add(Items[i]); end; - if Result.Count>0 then - Result.FRef:=Self + if Result.Count > 0 then + Result.FRef := Self else Dec(FRefCount); finally @@ -418,7 +433,7 @@ end; constructor TGPSObjectList.Create; begin - Crit:=TCriticalSection.Create; + Crit := TCriticalSection.Create; FItems := TGPSObjList.Create(true); end; @@ -431,59 +446,63 @@ begin end; procedure TGPSObjectList.Clear(OwnedBy: integer); -var i : integer; - DelObj : TGPSObjList; +var + i: integer; + DelObj: TGPSObjList; begin - DelObj:=nil; + DelObj := nil; Lock; try - For i:=pred(FItems.Count) downto 0 do - if (OwnedBy=0) or (FItems[i].FIdOwner=OwnedBy) then - _Delete(i,DelObj); + for i:=pred(FItems.Count) downto 0 do + if (OwnedBy = 0) or (FItems[i].FIdOwner = OwnedBy) then + _Delete(i,DelObj); finally Unlock; end; if Assigned(DelObj) then - CallModified(DelObj,false); + CallModified(DelObj, false); end; procedure TGPSObjectList.ClearExcept(OwnedBy: integer; - const ExceptLst : TIdArray; out Notfound: TIdArray); + const ExceptLst: TIdArray; out Notfound: TIdArray); -var Found : TIdArray; +var + Found: TIdArray; -function ToDel(aIt : TGPsObj) : boolean; -var i,Id : integer; -Begin - if (aIt.ExtraData=nil) or not(aIt.ExtraData.InheritsFrom(TDrawingExtraData)) then - result:=true - else - Begin - Result:=true; - Id:=TDrawingExtraData(aIt.ExtraData).Id; - for i:=low(ExceptLst) to high(ExceptLst) do - if Id=ExceptLst[i] then - begin - result:=false; - SetLength(Found,Length(Found)+1); - Found[high(Found)]:=Id; - exit; - end; + function ToDel(aIt: TGPsObj): boolean; + var + i,Id: integer; + begin + if (aIt.ExtraData=nil) or not(aIt.ExtraData.InheritsFrom(TDrawingExtraData)) then + Result := true + else + Begin + Result := true; + Id := TDrawingExtraData(aIt.ExtraData).Id; + for i := Low(ExceptLst) to High(ExceptLst) do + if Id = ExceptLst[i] then + begin + Result := false; + SetLength(Found, Length(Found)+1); + Found[high(Found)] := Id; + exit; + end; + end; end; -end; -var i,j : integer; - IsFound : boolean; - DelLst : TGPSObjList; +var + i,j: integer; + IsFound: boolean; + DelLst: TGPSObjList; begin - DelLst:=nil; - SetLength(NotFound,0); - SetLength(Found,0); + DelLst := nil; + SetLength(NotFound, 0); + SetLength(Found, 0); Lock; try - For i:=pred(FItems.Count) downto 0 do + for i := pred(FItems.Count) downto 0 do begin - if (FItems[i].FIdOwner=OwnedBy) or (OwnedBy=0) then + if (FItems[i].FIdOwner = OwnedBy) or (OwnedBy = 0) then Begin if ToDel(FItems[i]) then _Delete(i,DelLst); @@ -492,77 +511,77 @@ begin finally Unlock; end; - For i:=low(ExceptLst) to high(ExceptLst) do - Begin - IsFound:=false; - for j:=low(Found) to high(Found) do - if Found[j]=ExceptLst[i] then + for i:=low(ExceptLst) to high(ExceptLst) do + begin + IsFound := false; + for j:=Low(Found) to High(Found) do + if Found[j] = ExceptLst[i] then begin - IsFound:=true; + IsFound := true; break; end; - if not(IsFound) then - Begin - SetLength(NotFound,length(NotFound)+1); - NotFound[high(NotFound)]:=ExceptLst[i]; + if not IsFound then + begin + SetLength(NotFound, Length(NotFound)+1); + NotFound[high(NotFound)] := ExceptLst[i]; end; end; if Assigned(DelLst) then - CallModified(DelLst,false); + CallModified(DelLst, false); end; -function TGPSObjectList.GetIdsArea(const Ids: TIdArray;IdOwner : integer): TRealArea; -var Objs : TGPSObjarray; - i : integer; +function TGPSObjectList.GetIdsArea(const Ids: TIdArray; IdOwner: integer): TRealArea; +var + Objs: TGPSObjarray; + i: integer; begin - Result.BottomRight.Lat:=0; - Result.BottomRight.Lon:=0; - Result.TopLeft.Lat:=0; - Result.TopLeft.Lon:=0; + Result.BottomRight.Lat := 0; + Result.BottomRight.Lon := 0; + Result.TopLeft.Lat := 0; + Result.TopLeft.Lon := 0; Lock; - Try - IdsToObj(Ids,Objs,IdOwner); - if length(Objs)>0 then - Begin - Result:=Objs[0].BoundingBox; - for i:=succ(low(Objs)) to high(Objs) do - begin - ExtendArea(Result,Objs[i].BoundingBox); - end; + try + IdsToObj(Ids, Objs, IdOwner); + if Length(Objs) > 0 then + begin + Result := Objs[0].BoundingBox; + for i:=succ(Low(Objs)) to High(Objs) do + ExtendArea(Result, Objs[i].BoundingBox); end; finally Unlock; end; end; -function TGPSObjectList.Add(aItem: TGpsObj;IdOwner : integer): integer; -var mList : TGPSObjList; +function TGPSObjectList.Add(aItem: TGpsObj; IdOwner: integer): integer; +var + mList: TGPSObjList; begin - aItem.FIdOwner:=IdOwner; + aItem.FIdOwner := IdOwner; Lock; try - Result:=Items.Add(aItem); - mList:=TGPSObjList.Create(false); + Result := Items.Add(aItem); + mList := TGPSObjList.Create(false); mList.Add(aItem); inc(FRefCount); - mList.FRef:=Self; + mList.FRef := Self; finally Unlock; end; - CallModified(mList,true); + CallModified(mList, true); end; procedure TGPSObjectList.DeleteById(const Ids: array of integer); - function ToDelete(const AId : integer) : Boolean; + function ToDelete(const AId: integer): Boolean; var i: integer; begin - result:=false; - For i:=low(Ids) to high(Ids) do - if Ids[i]=AId then - Begin - result:=true; + result := false; + For i:=Low(Ids) to High(Ids) do + if Ids[i] = AId then + begin + result := true; exit; end; end; @@ -572,7 +591,7 @@ var i: integer; DelLst: TGPSObjList; begin - DelLst:=nil; + DelLst := nil; Lock; try for i:=Pred(Items.Count) downto 0 do @@ -584,8 +603,9 @@ begin Extr := TDrawingExtraData(Items[i]); // !!! wp: There is a warning that TGPSObj and TDrawingExtraData are not related !!! if ToDelete(Extr.Id) then - _Delete(i,DelLst); - // !!! wp: DelLst is a local var and created by _Delete but not destroyed anywhere here !!! + _Delete(i, DelLst); + // !!! wp: DelLst is a local var and was created by _Delete but is + // not destroyed anywhere here !!! end; end; end; @@ -593,7 +613,7 @@ begin Unlock; end; if Assigned(DelLst) then - +// wp: is this missing here: DelLst.Free; end; procedure TGPSObjectList.BeginUpdate; @@ -603,11 +623,11 @@ end; procedure TGPSObjectList.EndUpdate; begin - if FUpdating>0 then + if FUpdating > 0 then begin Dec(FUpdating); - if FUpdating=0 then - CallModified(nil,true); + if FUpdating = 0 then + CallModified(nil, true); end; end; @@ -616,12 +636,12 @@ end; function TGPSTrack.GetDateTime: TDateTime; begin - if FDateTime=0 then + if FDateTime = 0 then Begin - if FPoints.Count>0 then - FDateTime:=FPoints[0].DateTime; + if FPoints.Count > 0 then + FDateTime := FPoints[0].DateTime; end; - Result:=FDateTime; + Result := FDateTime; end; constructor TGPSTrack.Create; @@ -636,66 +656,68 @@ begin end; procedure TGPSTrack.GetArea(out Area: TRealArea); -var i : integer; - ptArea : TRealArea; +var + i: integer; + ptArea: TRealArea; begin - Area.BottomRight.lon:=0; - Area.BottomRight.lat:=0; - Area.TopLeft.lon:=0; - Area.TopLeft.lat:=0; - if FPoints.Count>0 then + Area.BottomRight.lon := 0; + Area.BottomRight.lat := 0; + Area.TopLeft.lon := 0; + Area.TopLeft.lat := 0; + if FPoints.Count > 0 then begin - Area:=FPoints[0].BoundingBox; + Area := FPoints[0].BoundingBox; for i:=1 to pred(FPoints.Count) do begin - ptArea:=FPoints[i].BoundingBox; - ExtendArea(Area,ptArea); + ptArea := FPoints[i].BoundingBox; + ExtendArea(Area, ptArea); end; end; end; function TGPSTrack.TrackLengthInKm(UseEle: Boolean): double; -var i : integer; +var + i: integer; begin - Result:=0; - For i:=1 to pred(FPoints.Count) do - begin - result+=FPoints[i].DistanceInKmFrom(FPoints[pred(i)],UseEle); - end; + Result := 0; + for i:=1 to pred(FPoints.Count) do + result += FPoints[i].DistanceInKmFrom(FPoints[pred(i)], UseEle); end; + { TGPSPoint } function TGPSPoint.GetLat: Double; begin - result:=FRealPt.Lat; + result := FRealPt.Lat; end; function TGPSPoint.GetLon: Double; begin - result:=FRealPt.Lon; + result := FRealPt.Lon; end; procedure TGPSPoint.GetArea(out Area: TRealArea); begin - Area.TopLeft:=FRealPt; - Area.BottomRight:=FRealPt; + Area.TopLeft := FRealPt; + Area.BottomRight := FRealPt; end; function TGPSPoint.HasEle: boolean; begin - Result:=FEle<>NO_ELE; + Result := FEle <> NO_ELE; end; function TGPSPoint.HasDateTime: Boolean; begin - Result:=FDateTime<>NO_DATE; + Result := FDateTime <> NO_DATE; end; -function TGPSPoint.DistanceInKmFrom(OtherPt: TGPSPoint;UseEle : boolean): double; -var a : double; - lat1,lat2,lon1,lon2,t1,t2,t3,t4,t5,rad_dist : double; - DiffEle :Double; +function TGPSPoint.DistanceInKmFrom(OtherPt: TGPSPoint; UseEle: boolean): double; +var + a: double; + lat1, lat2, lon1, lon2, t1, t2, t3, t4, t5, rad_dist: double; + DiffEle: Double; begin a := PI / 180; lat1 := lat * a; @@ -712,25 +734,25 @@ begin result := (rad_dist * 3437.74677 * 1.1508) * 1.6093470878864446; if UseEle and (FEle<>OtherPt.FEle) then if (HasEle) and (OtherPt.HasEle) then - Begin + begin //FEle is assumed in Metter - DiffEle:=(FEle-OtherPt.Ele)/1000; - Result:=sqrt(DiffEle*DiffEle+result*result); + DiffEle := (FEle-OtherPt.Ele)/1000; + Result := sqrt(DiffEle*DiffEle+result*result); end; end; constructor TGPSPoint.Create(ALon, ALat: double; AEle: double; ADateTime: TDateTime); begin - FRealPt.Lon:=ALon; - FRealPt.Lat:=ALat; - FEle:=AEle; - FDateTime:=ADateTime; + FRealPt.Lon := ALon; + FRealPt.Lat := ALat; + FEle := AEle; + FDateTime := ADateTime; end; class function TGPSPoint.CreateFrom(aPt: TRealPoint): TGPSPoint; begin - Result:=Create(aPt.Lon,aPt.Lat); + Result := Create(aPt.Lon,aPt.Lat); end; end. diff --git a/components/lazmapviewer/source/mvjobs.pas b/components/lazmapviewer/source/mvjobs.pas index 71ec4c7b7..5ad01d8dd 100644 --- a/components/lazmapviewer/source/mvjobs.pas +++ b/components/lazmapviewer/source/mvjobs.pas @@ -105,10 +105,12 @@ begin Result := NO_MORE_TASK end else + begin if FEnded then Result := ALL_TASK_COMPLETED else Result := 1; + end; end; procedure TSimpleJob.pTaskStarted(aTask: integer); diff --git a/components/lazmapviewer/source/mvmapprovider.pas b/components/lazmapviewer/source/mvmapprovider.pas index 37e714d3c..917835eea 100644 --- a/components/lazmapviewer/source/mvmapprovider.pas +++ b/components/lazmapviewer/source/mvmapprovider.pas @@ -78,17 +78,17 @@ end; procedure TMapProvider.SetLayer(AValue: integer); begin - if FLayer=AValue then Exit; - if (aValuehigh(FUrl)) then + if FLayer = AValue then Exit; + if (aValue < Low(FUrl)) and (aValue > High(FUrl)) then Begin - Raise Exception.create('bad Layer'); + Raise Exception.Create('bad Layer'); end; FLayer:=AValue; end; constructor TMapProvider.Create(aName: String); begin - FName:=aName; + FName := aName; end; destructor TMapProvider.Destroy; @@ -107,31 +107,31 @@ begin end; procedure TMapProvider.AddURL(Url: String; NbSvr: integer; - aMinZoom : integer;aMaxZoom : integer; - GetSvrStr: TGetSvrStr; GetXStr: TGetValStr; GetYStr: TGetValStr; - GetZStr: TGetValStr); -var nb : integer; + aMinZoom: integer; aMaxZoom: integer; GetSvrStr: TGetSvrStr; + GetXStr: TGetValStr; GetYStr: TGetValStr; GetZStr: TGetValStr); +var + nb: integer; begin - nb:=length(FUrl)+1; - SetLength(IdServer,nb); - SetLength(FUrl,nb); - SetLength(FNbSvr,nb); - SetLength(FGetSvrStr,nb); - SetLength(FGetXStr,nb); - SetLength(FGetYStr,nb); - SetLength(FGetZStr,nb); - SetLength(FMinZoom,nb); - SetLength(FMaxZoom,nb); - nb:=high(FUrl); - FUrl[nb]:=Url; - FNbSvr[nb]:=NbSvr; - FMinZoom[nb]:=aMinZoom; - FMaxZoom[nb]:=aMaxZoom; - FGetSvrStr[nb]:=GetSvrStr; - FGetXStr[nb]:=GetXStr; - FGetYStr[nb]:=GetYStr; - FGetZStr[nb]:=GetZStr; - FLayer:=low(FUrl); + nb := Length(FUrl)+1; + SetLength(IdServer, nb); + SetLength(FUrl, nb); + SetLength(FNbSvr, nb); + SetLength(FGetSvrStr, nb); + SetLength(FGetXStr, nb); + SetLength(FGetYStr, nb); + SetLength(FGetZStr, nb); + SetLength(FMinZoom, nb); + SetLength(FMaxZoom, nb); + nb := High(FUrl); + FUrl[nb] := Url; + FNbSvr[nb] := NbSvr; + FMinZoom[nb] := aMinZoom; + FMaxZoom[nb] := aMaxZoom; + FGetSvrStr[nb] := GetSvrStr; + FGetXStr[nb] := GetXStr; + FGetYStr[nb] := GetYStr; + FGetZStr[nb] := GetZStr; + FLayer := Low(FUrl); end; procedure TMapProvider.GetZoomInfos(out AZoomMin, AZoomMax: integer); diff --git a/components/lazmapviewer/source/mvmapviewer.pas b/components/lazmapviewer/source/mvmapviewer.pas index f335a1651..d71a42aa4 100644 --- a/components/lazmapviewer/source/mvmapviewer.pas +++ b/components/lazmapviewer/source/mvmapviewer.pas @@ -97,19 +97,23 @@ Type {$ENDIF} procedure DblClick; override; Procedure DoDrawTile(const TileId: TTileId; X,Y: integer; TileImg: TLazIntfImage); - function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override; + function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; + MousePos: TPoint): Boolean; override; procedure DoOnResize; override; - Function IsActive : Boolean; - procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y:Integer); override; - procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + function IsActive: Boolean; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; procedure MouseMove(Shift: TShiftState; X,Y: Integer); override; procedure Paint; override; - procedure OnGPSItemsModified(Sender: TObject; objs: TGPSObjList;Adding : boolean); + procedure OnGPSItemsModified(Sender: TObject; objs: TGPSObjList; + Adding: boolean); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure ClearBuffer; - procedure GetMapProviders(lstProviders : TStrings); + procedure GetMapProviders(lstProviders: TStrings); function GetVisibleArea: TRealArea; function LonLatToScreen(aPt: TRealPoint): TPoint; function ScreenToLonLat(aPt: TPoint): TRealPoint; @@ -134,9 +138,9 @@ Type property UseThreads: boolean read GetUseThreads write SetUseThreads; property Width default 150; property Zoom: integer read GetZoom write SetZoom; - property OnCenterMove: TNotifyEvent read GetOnCenterMove write SetOnCenterMove; - property OnZoomChange: TNotifyEvent read GetOnZoomChange write SetOnZoomChange; - property OnChange: TNotifyEvent Read GetOnChange write SetOnChange; + property OnCenterMove: TNotifyEvent read GetOnCenterMove write SetOnCenterMove; + property OnZoomChange: TNotifyEvent read GetOnZoomChange write SetOnZoomChange; + property OnChange: TNotifyEvent read GetOnChange write SetOnChange; property OnDrawGpsPoint: TDrawGpsPointEvent read FOnDrawGpsPoint write FOnDrawGpsPoint; property OnMouseDown; property OnMouseEnter; @@ -145,6 +149,7 @@ Type property OnMouseUp; end; + implementation uses @@ -212,24 +217,24 @@ Type { TDrawObjJob } - TDrawObjJob = Class(TJob) + TDrawObjJob = class(TJob) private - AllRun : boolean; - Viewer : TMapView; - FRunning : boolean; - FLst : TGPSObjList; - FStates : Array of integer; - FArea : TRealArea; + AllRun: boolean; + Viewer: TMapView; + FRunning: boolean; + FLst: TGPSObjList; + FStates: Array of integer; + FArea: TRealArea; protected - function pGetTask: integer;override; - procedure pTaskStarted(aTask: integer);override; - procedure pTaskEnded(aTask: integer; aExcept: Exception);override; + function pGetTask: integer; override; + procedure pTaskStarted(aTask: integer); override; + procedure pTaskEnded(aTask: integer; aExcept: Exception); override; public - procedure ExecuteTask(aTask: integer; FromWaiting: boolean);override; - function Running : boolean;override; + procedure ExecuteTask(aTask: integer; FromWaiting: boolean); override; + function Running: boolean;override; public - Constructor Create(aViewer: TMapView; aLst: TGPSObjList; const aArea: TRealArea); - destructor Destroy;override; + constructor Create(aViewer: TMapView; aLst: TGPSObjList; const aArea: TRealArea); + destructor Destroy; override; end; { TDrawObjJob } @@ -240,51 +245,49 @@ var begin if not(AllRun) and not(Cancelled) then begin - For i:=low(FStates) to high(FStates) do - if FStates[i]=0 then - Begin - result:=i+1; - Exit; - end; + for i := Low(FStates) to High(FStates) do + if FStates[i]=0 then + begin + result := i+1; + Exit; + end; AllRun:=True; end; - Result:=ALL_TASK_COMPLETED; - for i:=low(FStates) to high(FStates) do - if FStates[i]=1 then - begin - Result:=NO_MORE_TASK; - Exit; - end; + + Result := ALL_TASK_COMPLETED; + for i := Low(FStates) to High(FStates) do + if FStates[i]=1 then + begin + Result := NO_MORE_TASK; + Exit; + end; end; procedure TDrawObjJob.pTaskStarted(aTask: integer); begin - FRunning:=True; - FStates[aTask-1]:=1; + FRunning := True; + FStates[aTask-1] := 1; end; procedure TDrawObjJob.pTaskEnded(aTask: integer; aExcept: Exception); begin if Assigned(aExcept) then - FStates[aTask-1]:=3 + FStates[aTask-1] := 3 else - FStates[aTask-1]:=2; + FStates[aTask-1] := 2; end; procedure TDrawObjJob.ExecuteTask(aTask: integer; FromWaiting: boolean); -var iObj : integer; - Obj : TGpsObj; +var + iObj: integer; + Obj: TGpsObj; begin - iObj:=aTask-1; - Obj:=FLst[iObj]; - if Obj.InheritsFrom(TGPSTrack) then - begin - Viewer.DrawTrack(FArea,TGPSTrack(Obj)); - end; - if Obj.InheritsFrom(TGPSPoint) then - begin - Viewer.DrawPt(FArea,TGPSPoint(Obj)); - end; + iObj := aTask-1; + Obj := FLst[iObj]; + if Obj.InheritsFrom(TGPSTrack) then + Viewer.DrawTrack(FArea, TGPSTrack(Obj)); + if Obj.InheritsFrom(TGPSPoint) then + Viewer.DrawPt(FArea, TGPSPoint(Obj)); end; function TDrawObjJob.Running: boolean; @@ -451,8 +454,8 @@ begin Engine.MouseWheel(self,Shift,WheelDelta,MousePos,Result); end; -procedure TMapView.MouseDown(Button: TMouseButton; Shift: TShiftState; X, - Y: Integer); +procedure TMapView.MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); begin inherited MouseDown(Button, Shift, X, Y); if IsActive then @@ -521,9 +524,9 @@ begin end else begin - Canvas.Brush.Color:=InactiveColor; - Canvas.Brush.Style:=bsSolid; - Canvas.FillRect(0,0,ClientWidth,ClientHeight); + Canvas.Brush.Color := InactiveColor; + Canvas.Brush.Style := bsSolid; + Canvas.FillRect(0, 0, ClientWidth, ClientHeight); end; end; @@ -532,14 +535,14 @@ procedure TMapView.OnGPSItemsModified(Sender: TObject; objs: TGPSObjList; var Area,ObjArea,vArea: TRealArea; begin - if Adding and assigned(Objs) then + if Adding and Assigned(Objs) then begin ObjArea := GetAreaOf(Objs); vArea := GetVisibleArea; if hasIntersectArea(ObjArea,vArea) then begin - Area:=IntersectArea(ObjArea,vArea); - Engine.Jobqueue.AddJob(TDrawObjJob.Create(self,Objs,Area),Engine); + Area := IntersectArea(ObjArea, vArea); + Engine.Jobqueue.AddJob(TDrawObjJob.Create(self, Objs, Area), Engine); end else objs.Free; @@ -551,53 +554,54 @@ begin end; end; -procedure TMapView.DrawTrack(const Area : TRealArea;trk : TGPSTrack); -var Old,New : TPoint; - i : integer; - aPt : TRealPoint; - LastInside,IsInside : boolean; - trkColor : TColor; -Begin - if trk.Points.Count>0 then - Begin - trkColor:=clRed; - if trk.ExtraData<>nil then - Begin - if trk.ExtraData.inheritsFrom(TDrawingExtraData) then - trkColor:=TDrawingExtraData(trk.ExtraData).Color; - end; - LastInside:=false; - For i:=0 to pred(trk.Points.Count) do - Begin - aPt:=trk.Points[i].RealPoint; - IsInside:=PtInsideArea(aPt,Area); - if IsInside or LastInside then - Begin - New:=Engine.LonLatToScreen(aPt); - if i>0 then - Begin - if not(LastInside) then - Old:=Engine.LonLatToScreen(trk.Points[pred(i)].RealPoint); - {$IFDEF USE_RGBGRAPHICS} - Buffer.Canvas.OutlineColor := trkColor; - Buffer.Canvas.Line(Old.X, Old.y, New.X, New.Y); - {$ENDIF} - {$IFDEF USE_LAZINTFIMAGE} - BufferCanvas.Pen.FPColor := TColorToFPColor(trkColor); - BufferCanvas.Line(Old.X, Old.Y, New.X, New.Y); - {$ENDIF} - end; - Old := New; - LastInside := IsInside; - end; - end; - end; +procedure TMapView.DrawTrack(const Area: TRealArea; trk: TGPSTrack); +var + Old,New: TPoint; + i: integer; + aPt: TRealPoint; + LastInside, IsInside: boolean; + trkColor: TColor; +begin + if trk.Points.Count>0 then + begin + trkColor := clRed; + if trk.ExtraData <> nil then + begin + if trk.ExtraData.InheritsFrom(TDrawingExtraData) then + trkColor := TDrawingExtraData(trk.ExtraData).Color; + end; + LastInside := false; + for i:=0 to pred(trk.Points.Count) do + begin + aPt := trk.Points[i].RealPoint; + IsInside := PtInsideArea(aPt,Area); + if IsInside or LastInside then + begin + New := Engine.LonLatToScreen(aPt); + if i > 0 then + begin + if not LastInside then + Old := Engine.LonLatToScreen(trk.Points[pred(i)].RealPoint); + {$IFDEF USE_RGBGRAPHICS} + Buffer.Canvas.OutlineColor := trkColor; + Buffer.Canvas.Line(Old.X, Old.y, New.X, New.Y); + {$ENDIF} + {$IFDEF USE_LAZINTFIMAGE} + BufferCanvas.Pen.FPColor := TColorToFPColor(trkColor); + BufferCanvas.Line(Old.X, Old.Y, New.X, New.Y); + {$ENDIF} + end; + Old := New; + LastInside := IsInside; + end; + end; + end; end; procedure TMapView.DrawPt(const Area: TRealArea; aPOI: TGPSPoint); var - PT : TPoint; - PtColor : TColor; + PT: TPoint; + PtColor: TColor; begin if Assigned(FOnDrawGpsPoint) then begin {$IFDEF USE_RGBGRAPHICS} @@ -609,17 +613,17 @@ begin exit; end; - Pt:=Engine.LonLatToScreen(aPOI.RealPoint); - PtColor:=clRed; - if aPOI.ExtraData<>nil then - Begin - if aPOI.ExtraData.inheritsFrom(TDrawingExtraData) then - PtColor:=TDrawingExtraData(aPOI.ExtraData).Color; + Pt := Engine.LonLatToScreen(aPOI.RealPoint); + PtColor := clRed; + if aPOI.ExtraData <> nil then + begin + if aPOI.ExtraData.inheritsFrom(TDrawingExtraData) then + PtColor := TDrawingExtraData(aPOI.ExtraData).Color; end; {$IFDEF USE_RGBGRAPHICS} - Buffer.canvas.OutlineColor:=ptColor; - Buffer.canvas.Line(Pt.X,Pt.y-5,Pt.X,Pt.Y+5); - Buffer.canvas.Line(Pt.X-5,Pt.y,Pt.X+5,Pt.Y); + Buffer.Canvas.OutlineColor := ptColor; + Buffer.Canvas.Line(Pt.X, Pt.y-5, Pt.X, Pt.Y+5); + Buffer.Canvas.Line(Pt.X-5, Pt.y, Pt.X+5, Pt.Y); {$ENDIF} {$IFDEF USE_LAZINTFIMAGE} BufferCanvas.Pen.FPColor := TColorToFPColor(ptColor); @@ -633,29 +637,30 @@ end; procedure TMapView.CallAsyncInvalidate; Begin if not(AsyncInvalidate) then - Begin - AsyncInvalidate:=true; - Engine.Jobqueue.QueueAsyncCall(@DoAsyncInvalidate,0); + begin + AsyncInvalidate := true; + Engine.Jobqueue.QueueAsyncCall(@DoAsyncInvalidate, 0); end; end; -procedure TMapView.DrawObjects(const TileId: TTileId; aLeft, aTop,aRight,aBottom: integer); +procedure TMapView.DrawObjects(const TileId: TTileId; + aLeft, aTop,aRight,aBottom: integer); var aPt: TPoint; Area: TRealArea; lst: TGPSObjList; begin - aPt.X:=aLeft; - aPt.Y:=aTop; - Area.TopLeft:=Engine.ScreenToLonLat(aPt); - aPt.X:=aRight; - aPt.Y:=aBottom; - Area.BottomRight:=Engine.ScreenToLonLat(aPt); - if GPSItems.count>0 then + aPt.X := aLeft; + aPt.Y := aTop; + Area.TopLeft := Engine.ScreenToLonLat(aPt); + aPt.X := aRight; + aPt.Y := aBottom; + Area.BottomRight := Engine.ScreenToLonLat(aPt); + if GPSItems.Count > 0 then begin - lst:=GPSItems.GetObjectsInArea(Area); - if lst.Count>0 then - Engine.Jobqueue.AddJob(TDrawObjJob.Create(self,lst,Area),Engine) + lst := GPSItems.GetObjectsInArea(Area); + if lst.Count > 0 then + Engine.Jobqueue.AddJob(TDrawObjJob.Create(self, lst, Area), Engine) else begin FreeAndNil(Lst); @@ -669,31 +674,31 @@ end; procedure TMapView.DoAsyncInvalidate(Data: PtrInt); Begin Invalidate; - AsyncInvalidate:=false; + AsyncInvalidate := false; end; procedure TMapView.DoDrawTile(const TileId: TTileId; X, Y: integer; TileImg: TLazIntfImage); {$IFDEF USE_RGBGRAPHICS} var - temp : TRGB32Bitmap; - ri : TRawImage; - BuffLaz : TLazIntfImage; + temp: TRGB32Bitmap; + ri: TRawImage; + BuffLaz: TLazIntfImage; {$ENDIF} begin if Assigned(Buffer) then begin if Assigned(TileImg) then - Begin + begin {$IFDEF USE_RGBGRAPHICS} - if (X>=0) and (Y>=0) then //http://mantis.freepascal.org/view.php?id=27144 + if (X >= 0) and (Y >= 0) then //http://mantis.freepascal.org/view.php?id=27144 begin ri.Init; ri.Description.Init_BPP32_R8G8B8A8_BIO_TTB(Buffer.Width,Buffer.Height); - ri.Data:=Buffer.Pixels; - BuffLaz := TLazIntfImage.Create(ri,false); + ri.Data := Buffer.Pixels; + BuffLaz := TLazIntfImage.Create(ri, false); try - BuffLaz.CopyPixels(TileImg,X,y); + BuffLaz.CopyPixels(TileImg, X, Y); ri.Init; finally FreeandNil(BuffLaz); @@ -702,11 +707,11 @@ begin else begin //i think it take more memory then the previous method but work in all case - temp:=TRGB32Bitmap.CreateFromLazIntfImage(TileImg); + temp := TRGB32Bitmap.CreateFromLazIntfImage(TileImg); try - Buffer.Draw(X,Y,temp); + Buffer.Draw(X, Y, temp); finally - FreeAndNil(Temp); + FreeAndNil(temp); end; end; {$ENDIF} @@ -721,24 +726,24 @@ begin end else {$IFDEF USE_RGBGRAPHICS} - Buffer.Canvas.FillRect(X,Y,X+TILE_SIZE,Y+TILE_SIZE); + Buffer.Canvas.FillRect(X, Y, X + TILE_SIZE, Y + TILE_SIZE); {$ENDIF} {$IFDEF USE_LAZINTFIMAGE} - begin - BufferCanvas.Brush.FPColor := ColWhite; - BufferCanvas.FillRect(X, Y, X + TILE_SIZE, Y + TILE_SIZE); - end; + begin + BufferCanvas.Brush.FPColor := ColWhite; + BufferCanvas.FillRect(X, Y, X + TILE_SIZE, Y + TILE_SIZE); + end; {$ENDIF} end; - DrawObjects(TileId,X,Y,X+TILE_SIZE,Y+TILE_SIZE); + DrawObjects(TileId, X, Y, X + TILE_SIZE, Y + TILE_SIZE); end; function TMapView.IsActive: Boolean; begin if not(csDesigning in ComponentState) then - Result:=FActive + Result := FActive else - Result:=false; + Result := false; end; constructor TMapView.Create(AOwner: TComponent); @@ -750,7 +755,7 @@ begin FEngine := TMapViewerEngine.Create(self); FBuiltinDownloadEngine := TMvDEFpc.Create(self); {$IFDEF USE_RGBGRAPHICS} - Buffer := TRGB32Bitmap.Create(Width,Height); + Buffer := TRGB32Bitmap.Create(Width, Height); {$ENDIF} {$IFDEF USE_LAZINTFIMAGE} CreateLazIntfImageAndCanvas(Buffer, BufferCanvas, Width, Height); @@ -812,17 +817,19 @@ begin end; procedure TMapView.CenterOnObj(obj: TGPSObj); -var Area : TRealArea; - Pt : TRealPoint; +var + Area: TRealArea; + Pt: TRealPoint; begin obj.GetArea(Area); - Pt.Lon:=(Area.TopLeft.Lon+Area.BottomRight.Lon) /2; - Pt.Lat:=(Area.TopLeft.Lat+Area.BottomRight.Lat) /2; - Center:=Pt; + Pt.Lon := (Area.TopLeft.Lon + Area.BottomRight.Lon) /2; + Pt.Lat := (Area.TopLeft.Lat + Area.BottomRight.Lat) /2; + Center := Pt; end; procedure TMapView.ZoomOnObj(obj: TGPSObj); -var Area : TRealArea; +var + Area: TRealArea; begin obj.GetArea(Area); Engine.ZoomOnArea(Area); @@ -834,14 +841,15 @@ begin end; function TMapView.GetVisibleArea: TRealArea; -var aPt : TPoint; +var + aPt: TPoint; begin - aPt.X:=0; - aPt.Y:=0; - Result.TopLeft:=Engine.ScreenToLonLat(aPt); - aPt.X:=Width; - aPt.Y:=Height; - Result.BottomRight:=Engine.ScreenToLonLat(aPt);; + aPt.X := 0; + aPt.Y := 0; + Result.TopLeft := Engine.ScreenToLonLat(aPt); + aPt.X := Width; + aPt.Y := Height; + Result.BottomRight := Engine.ScreenToLonLat(aPt);; end; procedure TMapView.ClearBuffer;