unit valuesunit; {$mode objfpc}{$H+} interface uses Classes, SysUtils, lowlevelunit; type tWert = record time: int64; // unix timestamp * 1000 vec: array['x'..'z'] of extended; end; tValues = class private werte: array of tWert; public constructor create; destructor destroy; override; procedure readFromFile(dat: string); overload; procedure readFromFile(ti: tInt64Point; dat: string); overload; procedure readFromFile(minT,maxT: int64; dat: string); overload; function count: int64; function timeInterval: tInt64Point; procedure intersect(v: tValues); procedure writeCombined(v: tValues; dat: string); end; function interpolate(w1,w2: tWert; x: extended): tWert; inline; function isoStrToDateTime(s: string): extended; inline; function timeToInt64(s: string): int64; implementation uses dateutils; constructor tValues.create; begin inherited create; setlength(werte,0); end; destructor tValues.destroy; begin setlength(werte,0); inherited destroy; end; procedure tValues.readFromFile(dat: string); begin readFromFile(low(int64),high(int64),dat); end; procedure tValues.readFromFile(ti: tInt64Point; dat: string); begin readFromFile(ti['x'],ti['y'],dat); end; procedure tValues.readFromFile(minT,maxT: int64; dat: string); var f: textfile; s: string; i,delta,cnt: int64; ws: tWert; c: char; isXml: boolean; begin setlength(werte,0); fillchar(ws,sizeOf(tWert),0); cnt:=0; assignFile(f,dat); reset(f); isXml:=false; s:=''; while (s<>'') or not eof(f) do begin if s='' then readln(f,s); if s='' then continue; if (not isXml) and (not (s[1] in ['0'..'9'])) then begin if copy(s,1,6)='1 then raise exception.create('Syntax error in '''+dat+''' (lon) - no valid gpx file.'#10'Hickup: '''+copy(s,1,40)+' ...'''); delete(s,1,pos('"',s)); ws.vec['x']:=strtofloat(erstesArgument(s,'"')); if pos('>',s)<>1 then raise exception.create('Syntax error in '''+dat+''' (lat) - no valid gpx file.'#10'Hickup: '''+copy(s,1,40)+' ...'''); delete(s,1,pos('>',s)); delete(s,1,pos('>',s)); ws.vec['z']:=strtofloat(erstesArgument(s,'<')); if pos('/ele>