From f3338c7249f31df6dbaf6983127968eba1be55f5 Mon Sep 17 00:00:00 2001 From: alpine-a110 Date: Mon, 4 Mar 2024 13:38:29 +0000 Subject: [PATCH] LazMapViewer: Added TGpxWriter (rudimentary) into mvGPX. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9266 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/lazmapviewer/source/mvgpx.pas | 80 +++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/components/lazmapviewer/source/mvgpx.pas b/components/lazmapviewer/source/mvgpx.pas index fc1b3fc0b..f6f078219 100644 --- a/components/lazmapviewer/source/mvgpx.pas +++ b/components/lazmapviewer/source/mvgpx.pas @@ -16,10 +16,13 @@ unit mvGPX; interface uses - Classes, SysUtils, laz2_DOM, laz2_XMLRead, DateUtils, + Classes, SysUtils, laz2_DOM, laz2_XMLRead, laz2_XMLWrite, DateUtils, mvTypes, mvGpsObj; type + + { TGpxReader } + TGpxReader = class private ID: Integer; @@ -39,6 +42,14 @@ type function LoadFromStream(AStream: TStream; AList: TGpsObjectList; out ABounds: TRealArea): Integer; end; + { TGpxWriter } + + TGpxWriter = class + public + class procedure SaveToStream(AStream: TStream; AList: TGpsObjectList); + class procedure SaveToFile(AFileName: String; AList: TGPSObjectList); + end; + implementation @@ -257,6 +268,73 @@ begin end; end; +class procedure TGpxWriter.SaveToStream(AStream: TStream; AList: TGpsObjectList + ); +var + Doc: TXMLDocument; + RootNode: TDOMNode; + I: Integer; + O: TGPSObj; + + function CreateTextElement(ANode: TDOMNode; ATag, AValue: DOMString): TDOMNode; + begin + Result := ANode; + Result.AppendChild(Doc.CreateElement(ATag)).AppendChild( + Doc.CreateTextNode(AValue)); + end; + + function CreatePoint(AName: String; APOI: TGPSPoint): TDOMElement; + begin + Result := Doc.CreateElement(AName); + Result.SetAttribute('lat', APOI.Lat.ToString); + Result.SetAttribute('lon', APOI.Lon.ToString); + if APOI.Name <> '' then + CreateTextElement(Result, 'name', APOI.Name); + if APOI.Elevation <> NO_ELE then + CreateTextElement(Result, 'ele', APOI.Elevation.ToString); + if APOI.DateTime <> NO_DATE then + CreateTextElement(Result, 'time', DateToISO8601(APOI.DateTime)); + end; + +begin + Doc := TXMLDocument.Create; + try + RootNode := Doc.CreateElement('gpx'); + Doc.AppendChild(RootNode); + RootNode := Doc.DocumentElement; + TDOMElement(RootNode).SetAttribute('version', '1.1'); + TDOMElement(RootNode).SetAttribute('creator', + 'LazMapViewer https://wiki.lazarus.freepascal.org/LazMapViewer'); + + for I := 0 to Pred(AList.Count) do + begin + O := AList[I]; + if O is TGPSPointOfInterest then + RootNode.AppendChild(CreatePoint('wpt', TGPSPoint(O))) + else if O is TGPSPoint then + RootNode.AppendChild(CreatePoint('wpt', TGPSPoint(O))) + else if O is TGPSTrack then + {TODO}; + end; + WriteXMLFile(doc, AStream); + + finally + Doc.Free; + end; +end; + +class procedure TGpxWriter.SaveToFile(AFileName: String; AList: TGPSObjectList); +var + Stream: TStream; +begin + Stream := TFileStream.Create(AFileName, fmCreate); + try + SaveToStream(Stream, AList); + finally + Stream.Free; + end; +end; + function TGpxReader.LoadFromStream(AStream: TStream; AList: TGpsObjectList): Integer; var area: TRealArea;