LazMapViewer: Added TGpxWriter (rudimentary) into mvGPX.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9266 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
alpine-a110 2024-03-04 13:38:29 +00:00
parent 58f994c821
commit f3338c7249

View File

@ -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;