{"id":764,"date":"2012-02-20T22:36:57","date_gmt":"2012-02-20T21:36:57","guid":{"rendered":"http:\/\/jgeo.nl\/o\/?p=764"},"modified":"2016-03-16T00:34:46","modified_gmt":"2016-03-15T23:34:46","slug":"hackerdehack","status":"publish","type":"post","link":"https:\/\/jgeo.nl\/o\/2012\/02\/20\/hackerdehack\/","title":{"rendered":"Hackerdehack"},"content":{"rendered":"<p>Herken je dit? Je hebt een GPS track, van een tracklogger (in .gpx formaat) of van je Garmin horloge (in .tcx formaat), maar er zitten geen splits in, omdat je niet bij elke post op het knopje hebt gedrukt. En de club gebruikt niet Winsplits in combinatie met die ene specifieke server waar Quickroute mee praat, dus je kan de splits niet automatisch in Quickroute krijgen.<\/p>\n<p>Herkenbaar? Je zult handmatig de tijden in moeten voeren, door op de juiste plaatsen op de kaart te klikken.<\/p>\n<p>Of je schrijft een klein programmatje in Matlab (of gebruikt mijn code) om de .tcx files te voorzien van de splits die je eenvoudig van de Slitsbrowser pagina haalt (de regel in de Results Table met jouw naam er voor; copy &#8211; paste).<\/p>\n<p>Heb je geen Garmin .tcx file, maar een generieke .gpx file van een tracklogger, maak er dan eerst een .tcx file van met <a href=\"http:\/\/www.gpsbabel.org\">GPSbabel<\/a>.<br \/>\n<code>gpsbabel -t -i gpx -f dit_track_bestand.gpx -o gtrnctr,course=0 -F het_nieuwe_bestand.tcx<\/code><\/p>\n<p>En zo heb ik bijvoorbeeld <a href=\"http:\/\/jgeo.nl\/quickroute\/show_map.php?user=jg&amp;map=33\">deze kaart van Hamont<\/a> gemaakt, met de controls direct op de juiste plek.<\/p>\n<p>Er zit een slimmigheidje in de functie om te detecteren hoeveel tijdverschil er tussen de GPS gegevens zit en de start. Mocht dat niet werken, knip dan handmatig tevoren het stuk van de track tot vlak voor de start, en vlak na de finish af.<\/p>\n<p>Mochten ze in QuickRoute het inladen van SplitsBrowser files ondersteuen, dan zal het wel op het <a href=\"http:\/\/www.matstroeng.se\/quickroute\/forum\/index.php?\" target=\"_blank\">QuickRoute Forum<\/a> te lezen zijn. En dat is wellicht ook de plaats om om deze feature te vragen. Hoe meer mensen het hier over hebben, hoe groter de kans.<\/p>\n<pre lang=\"matlab\">function splits2tcx(in_file,splits)\r\n% om een extra neutralisatie-post in mee te nemen die niet in de splits zat, voeg een\r\n% +0:17 (of andere tijd) toe op de plaats. \r\n\r\n% gpsbabel = 'c:\\localdata\\bin\\gpsbabel\\gpsbabel.exe'\r\n\r\n% CHECK various splits strings\r\n\r\nforce_tcx_conversion = 1; % force gpsbabel to convert tcx to tcx (to fix for example Android Garmin Uploader files)\r\nif nargin support for %s files not yet implemented.\\n',fe);\r\n    end\r\n    if nok\r\n        error('err-&gt; conversion to .tcx file failed');\r\n    else\r\n        fprintf('done.\\n'); % JHH\r\n    end\r\nend\r\n\r\nfprintf('** acquiring splits **\\n');\r\nif nargin0) % absolute times\r\n    if splits(1)~=splits(end)\r\n        warning('I expected the total time (1st data point) to be equal to the finish time (last data point). Netralized leg compensation?');\r\n    end\r\n    splittimes = [0 splits(2:end)];\r\nelse % relative times\r\n    splittimes = [0 cumsum(splits)];\r\nend\r\n\r\nfprintf('** using split times: \"%s\" **\\n',reshape(strvcat(m2ms(splittimes'\/60,1)',' '),1,[]));\r\n\r\nfprintf('** reading tcx file: \"%s\" **\\n',tcx_file);\r\nt = []; tp = [];\r\nd = []; dp = [];\r\nll = []; lp = [];\r\n\r\n[fid,err] = fopen(tcx_file,'r');\r\nif fid failed opening file \"%s\" for reading, with error: %s',tcx_file,err);\r\nend\r\n\r\narm = 0;\r\nwhile ~feof(fid)\r\n    l = fgetl(fid);\r\n    hms = sscanf(l,'%*[^&lt;]<time>%*[^T]T%d:%d:%dZ<\/time>');\r\n    if ~isempty(hms)\r\n        t(max(length(d),size(ll,1))+1) = [60*60 60 1]*hms;\r\n        tp(max(length(d),size(ll,1))+1) = ftell(fid);\r\n        arm = 1;\r\n    else\r\n        dm = sscanf(l,'%*[^&lt;]%f');\r\n        if arm &amp;&amp; ~isempty(dm)\r\n            d(length(t)) = dm;\r\n            dp(length(t)) = ftell(fid);\r\n            if length(d)&gt;length(t)\r\n                l\r\n            elseif length(d)&lt;length(t)\r\n                l\r\n            end\r\n            arm = 0;\r\n        else\r\n            la = sscanf(l,'%*[^&lt;]%f');\r\n            if arm &amp;&amp; ~isempty(la)\r\n                ll(length(t),1) = la;\r\n                lp(length(t)) = ftell(fid);\r\n            else\r\n                lo = sscanf(l,'%*[^&lt;]%f');\r\n                if arm &amp;&amp; ~isempty(lo)\r\n                    ll(length(t),2) = lo;\r\n                else\r\n                    ls = sscanf(l,'%*[^&lt;]');\r\n                    if ~isempty(ls)\r\n                        arm = 0;\r\n                    end\r\n                end\r\n            end\r\n        end\r\n    end\r\nend\r\nif arm % last timepoint has no location or distance\r\n    if ~isempty(d)\r\n        t = t(1:length(d));\r\n    elseif ~isempty(ll)\r\n        t = t(1:size(ll,1));\r\n    end\r\nend\r\n\r\nfindmin = inline('min(find(a(:)==min(a(:))))','a');\r\nif ~isempty(d)\r\n    fprintf('%d timestamps; %d distances; %d splits; %d gaps\\n',length(t),length(d),length(find(diff(t)==0)),length(find(diff(t)&gt;1)));\r\nelse\r\n    fprintf('%d timestamps; %d distances; %d splits; %d gaps\\n',length(t),length(ll),length(find(diff(t)==0)),length(find(diff(t)&gt;1)));\r\nend\r\nlapsplit = find(diff(t)==0);\r\nt(lapsplit) = [];\r\nll(lapsplit,:) = [];\r\nif ~isempty(d)\r\n    d(lapsplit) = [];\r\n    dd = diff(d);\r\nelse\r\n    [x,y] = deg2utm(ll(:,1),ll(:,2));\r\n    dd = sqrt(sum(diff([x y]).^2,2));\r\nend\r\n\r\ndd = dd(:).';\r\n\r\nif 1\r\n    %%\r\n    dt = diff(t);\r\n    if any(dt&gt;1)\r\n        fprintf('missing track-points at: \\n%s',sprintf('%d:%02d : %d [s]\\n',[round(m2ms((t(find(diff(t)&gt;1))-t(1))\/60)).';dt(dt&gt;1)]));\r\n        %         if any(diff(t)&gt;2)\r\n        %             error('only solves single missing points');\r\n        %         end\r\n        for ii = fliplr(find(dt&gt;1))\r\n            dd(1:end+dt(ii)-1) = [dd(1:ii-1) repmat(dd(ii)\/dt(ii),1,dt(ii)) dd(ii+1:end)];\r\n        end\r\n        t = t(1):t(end);\r\n        %         t1(cumsum([1 (diff(t)&gt;1)+1])) = t;\r\n        %         d1(cumsum([1 (diff(t)&gt;1)+1])) = dd;\r\n        %         d1(find(~t1))   = d1(find(~t1)-1)\/2;\r\n        %         d1(find(~t1)-1) = d1(find(~t1));\r\n        %         t1(~t1) = t1(find(~t1)-1);\r\n    end\r\n    \r\n%     comb = repmat(round(splittimes),2,1)+repmat([1:2]',1,length(splittimes));\r\n%     window(comb(:)) = 1;\r\n%     xc = xcorr(window,dd);\r\n%     those = length(xc)-length(dd)-[0:length(dd)-splittimes(end)];\r\n%     xcdt = detrend(xc(those),'linear',ceil(length(those)\/2));\r\n%     %plot(xcdt)\r\n%     offset = findmin(xcdt);\r\n%     figure(12345);\r\n%     s1=subplot(211);plot(dd);line(offset,0,'marker','o','color','r');line(offset+splittimes,0,'marker','s','color','g');\r\n%     s2=subplot(212);plot(xc(those));line(offset,xc(those(offset)),'marker','o','color','r');\r\n%     set(s2,'xlim',get(s1,'xlim'));\r\n    %%\r\n    m = 2;\r\n    comb = repmat(round(splittimes),m,1)+repmat([1:m]',1,length(splittimes));\r\n    window = [];\r\n    window(comb(:)) = 1;\r\n    if length(window)&gt;length(dd)\r\n        dd = [zeros(1,2*(length(window)-length(dd))) dd zeros(1,2*(length(window)-length(dd)))];\r\n    end\r\n    xc = xcorr(window,dd);\r\n    those = length(xc)-length(dd)-[0:length(dd)-splittimes(end)];\r\n    xcdt = detrend(xc(those),'linear',ceil(length(those)\/2));\r\n    %plot(xcdt)\r\n    offset = findmin(xcdt)+floor(m\/2)\r\n    figure(12345);\r\n    s1=subplot(2,4,1:4);plot(dd*3600\/1000);line(offset,0,'marker','o','color','r');line(offset+splittimes,0,'marker','s','color','g');\r\n    s2=subplot(2,4,5:6);plot([1:length(those)],xc(those));line(offset-floor(m\/2),xc(those(offset-floor(m\/2))),'marker','o','color','r');\r\n    n = 20;\r\n    x=reshape(offset+repmat(0*splittimes(:)',2*n+2,1)+repmat([-n:n nan]',1,length(splittimes)),1,[]);\r\n    y=reshape(offset+repmat(splittimes(:)',2*n+2,1)+repmat([-n:n nan]',1,length(splittimes)),1,[]);\r\n    s3=subplot(2,4,[7 8]);plot(x,dd(min(max(y,1),length(dd))));line(offset,0,'marker','s','color','r');\r\n    %%\r\nelse\r\n    %%\r\n    [b,a] = butter(2,0.9);\r\n    dd = filtfilt(b,a,dd);\r\n    for ii = 1:(t(end)-t(1))-splittimes(end)+1\r\n        td(ii) = 0;\r\n        ti = ii+(1:splittimes(end))-1;\r\n        for jj = 1:length(splittimes)\r\n            deze(jj) = findmin(abs((t(ti)-t(1))-splittimes(jj)));\r\n            td(ii) = td(ii)+dd(deze(jj));\r\n        end\r\n    end\r\n    offset = t(max(find(abs(td)==min(abs(td)))))-t(1);\r\n    %%\r\nend\r\n\r\ns = sprintf('Estimated offset of GPS (nr of seconds the GPS was started before the splittimer): %0.1f [s]',offset);\r\nfprintf('%s\\n',s);\r\n\r\nnew_offset = inputdlg(strvcat(s,'Keep this value, or enter a different offset (based on the graphs):'),'Corect estimated offset',1,{sprintf('%0.1f',offset)});\r\ndrawnow;\r\nif ~isempty(new_offset{1}), \r\n    if isempty(str2num(new_offset{1}))\r\n        error('err-&gt; invalid value: \"%s\"',new_offset{1});\r\n    end\r\n    offset = str2num(new_offset{1});\r\n    s3=subplot(2,4,[7 8]);\r\n    line(offset,0,'marker','s','color','m');\r\nend\r\n\r\n\r\nt_sync = t-t(1)-offset;\r\nfor jj = 1:length(splittimes)\r\n    splittimes_sync(jj) = t_sync(findmin(abs(t_sync-splittimes(jj))));\r\nend\r\nsplittimes_abs = splittimes_sync+t(1)+offset;\r\n\r\nfprintf('** finished reading tcx file **\\n');\r\n\r\nfrewind(fid);\r\n[fp,fn,fe] = fileparts(in_file);\r\noutfile = fullfile(fp,[fn '_splits.tcx']);\r\nfprintf('** writing output file: \"%s\" **\\n',outfile);\r\nfod = fopen(outfile,'w');\r\n[fod,err] = fopen(outfile,'w');\r\nif fod failed opening file \"%s\" for writing, with error: %s',outfile,err);\r\nend\r\n\r\ndistance_offset = 0;\r\n\r\nphase = 0;\r\n% phases:\r\n% 0 header\r\n% 1 first track header, until first point to be included\r\n% 2 first trackpoints being included\r\n% 3 other trackpoints being included\r\n% 4 buffering last point of current lap\r\n% 5 obsolete lap header\r\n% 6 last trackpoint writing\r\n% 7 trackpoints after last trackpoint\r\n% 8 trailer\r\n\r\ntrackpointbuffer = {};\r\nlap = 0;\r\nwhile ~feof(fid)\r\n    l = fgets(fid);\r\n    \r\n    if phase==0\r\n        lp = sscanf(l,'%*[^&lt;]&lt;Lap%s'); % StartTime=%s');\r\n        if ~isempty(lp) &amp;&amp; phase==0\r\n            phase = 1;\r\n            % do not parse from here\r\n        end\r\n    else\r\n        lp = sscanf(l,'%*[^&lt;]%c');\r\n        if ~isempty(lp) &amp;&amp; phase&gt;0\r\n            phase = 8;\r\n            % do parse trailer from here\r\n        else\r\n            lp = sscanf(l,'%*[^&lt;]&lt;Creator%s'); if ~isempty(lp) &amp;&amp; phase&gt;0\r\n                phase = 8;\r\n                % do parse trailer from here\r\n            end\r\n        end\r\n    end\r\n\r\n    if any(phase==[2 3 4])\r\n        lp = sscanf(l,'%*[^&lt;]%c');\r\n        if ~isempty(lp)\r\n            if any(phase==[2 3]) % not if phase is 4, since then already a lap was included here\r\n                phase = 5;\r\n                % do not parse from here, until next lap started\r\n            elseif phase==4 % buffered, but continue including lap\r\n                phase = 3; % continue writing; lap is OK here\r\n                trackpointbuffer = {};\r\n                lap = lap+1;\r\n            end\r\n        end\r\n    end\r\n\r\n    laptext = [0 0];\r\n\r\n    if any(phase==[4 5 6])\r\n        lp = sscanf(l,'%*[^&lt;]%c');\r\n        if ~isempty(lp)\r\n            if phase==6\r\n                % last point passed, no output anymore except trailer\r\n                phase = 7;\r\n                fprintf(fod,l);\r\n                l = '';\r\n                laptext = [0 1];\r\n            elseif phase==4\r\n                % copying last trackpoint for new track\r\n                % inlude lap split\r\n                fprintf(fod,l);\r\n                laptext = [1 1]; % implicitly include trackpointbuffer\r\n            elseif phase==5\r\n                % skip first trackpoint after lap, since it is identical\r\n                phase = 3;\r\n                l = '';\r\n            end\r\n        end\r\n    end\r\n    \r\n    hms = sscanf(l,'%*[^&lt;]<time>%*[^T]T%d:%d:%dZ<\/time>');\r\n    if ~isempty(hms)\r\n        timestr = sscanf(l,'%*[^&lt;]<time>%[^Z]Z<\/time>');\r\n        if [60*60 60 1]*hms&gt;=splittimes_abs(1) &amp;&amp; phase=splittimes_abs(end) &amp;&amp; phase=splittimes_abs(lap+1) &amp;&amp; phase%f');\r\n        if ~isempty(lp)\r\n            if phase==2\r\n                distance_offset = lp;\r\n            end\r\n            l = sprintf('            %0.7f\\n',lp-distance_offset);\r\n        end\r\n    end\r\n    \r\n    if laptext(2)\r\n        fprintf(fod,'         \\n');\r\n        fprintf(fod,'       \\n');\r\n    end\r\n    if laptext(1)\r\n        lap = lap+1;\r\n        fprintf(fod,'       \\n',timestr);\r\n        fprintf(fod,'         %0.7f\\n',diff(splittimes_abs(lap+[0:1])));\r\n        fprintf(fod,'         Active\\n');\r\n        fprintf(fod,'         Manual\\n');\r\n        fprintf(fod,'         \\n');\r\n        fprintf(fod,'           \\n');\r\n    end\r\n    if phase==4\r\n        if all(laptext)\r\n            fprintf(fod,'%s',trackpointbuffer{:});\r\n            trackpointbuffer = {};\r\n            phase = 3;\r\n        else\r\n            trackpointbuffer{end+1} = l;\r\n        end\r\n    end\r\n\r\n    if any(phase==[0 2 3 4 6 8])\r\n        fprintf(fod,'%s',l);\r\n    end\r\n\r\nend\r\nfclose(fod);\r\nfclose(fid);\r\nfclose('all');\r\n\r\nfprintf('** finished successfully: splits were included in tcx file **\\n');\r\n\r\n\r\n\r\n\r\nfunction times = readtimes(in)\r\ntimes = [];\r\noffset = 0;\r\nfor ii = 1:length(in)\r\n    this = sscanf(in{ii},'%d%*[.:]%d%*[.:]%d');\r\n    if length(this)==2\r\n        if in{ii}(1)=='+'\r\n            offset = offset+[60 1]*this;\r\n            times(end+1) = times(end)+offset;\r\n        else\r\n            times(end+1) = [60 1]*this+offset;\r\n        end\r\n    elseif length(this)==3\r\n        if in{ii}(1)=='+'\r\n            offset = offset+[60*60 60 1]*this;\r\n            times(end+1) = times(end)+offset;\r\n        else\r\n            times(end+1) = [60*60 60 1]*this+offset;\r\n        end\r\n    end\r\nend\r\n\r\n\r\n% function strs = split(str,sep,include,num)\r\n% % SPLIT - split a string in substrings by separator\r\n% matches = [1 strfind(str,sep)+1 length(str)+2];\r\n% for ii = 1:length(matches)-1\r\n%     strs{ii} = str(matches(ii)+(ii&gt;1)*(size(sep,2)-1):matches(ii+1)-2);\r\n% end\r\n\r\n\r\n\r\nfunction  [x,y,utmzone] = deg2utm(Lat,Lon)\r\n% -------------------------------------------------------------------------\r\n% [x,y,utmzone] = deg2utm(Lat,Lon)\r\n%\r\n% Description: Function to convert lat\/lon vectors into UTM coordinates (WGS84).\r\n% Some code has been extracted from UTM.m function by Gabriel Ruiz Martinez.\r\n%\r\n% Inputs:\r\n%    Lat: Latitude vector.   Degrees.  +ddd.ddddd  WGS84\r\n%    Lon: Longitude vector.  Degrees.  +ddd.ddddd  WGS84\r\n%\r\n% Outputs:\r\n%    x, y , utmzone.   See example\r\n%\r\n% Example 1:\r\n%    Lat=[40.3154333; 46.283900; 37.577833; 28.645650; 38.855550; 25.061783];\r\n%    Lon=[-3.4857166; 7.8012333; -119.95525; -17.759533; -94.7990166; 121.640266];\r\n%    [x,y,utmzone] = deg2utm(Lat,Lon);\r\n%    fprintf('%7.0f ',x)\r\n%       458731  407653  239027  230253  343898  362850\r\n%    fprintf('%7.0f ',y)\r\n%      4462881 5126290 4163083 3171843 4302285 2772478\r\n%    utmzone =\r\n%       30 T\r\n%       32 T\r\n%       11 S\r\n%       28 R\r\n%       15 S\r\n%       51 R\r\n%\r\n% Example 2: If you have Lat\/Lon coordinates in Degrees, Minutes and Seconds\r\n%    LatDMS=[40 18 55.56; 46 17 2.04];\r\n%    LonDMS=[-3 29  8.58;  7 48 4.44];\r\n%    Lat=dms2deg(mat2dms(LatDMS)); %convert into degrees\r\n%    Lon=dms2deg(mat2dms(LonDMS)); %convert into degrees\r\n%    [x,y,utmzone] = deg2utm(Lat,Lon)\r\n%\r\n% Author: \r\n%   Rafael Palacios\r\n%   Universidad Pontificia Comillas\r\n%   Madrid, Spain\r\n% Version: Apr\/06, Jun\/06, Aug\/06, Aug\/06\r\n% Aug\/06: fixed a problem (found by Rodolphe Dewarrat) related to southern \r\n%    hemisphere coordinates. \r\n% Aug\/06: corrected m-Lint warnings\r\n%-------------------------------------------------------------------------\r\n\r\n% Argument checking\r\n%\r\nerror(nargchk(2, 2, nargin));  %2 arguments required\r\nn1=length(Lat);\r\nn2=length(Lon);\r\nif (n1~=n2)\r\n   error('Lat and Lon vectors should have the same length');\r\nend\r\n\r\n\r\n% Memory pre-allocation\r\n%\r\nx=zeros(n1,1);\r\ny=zeros(n1,1);\r\nutmzone(n1,:)='60 X';\r\n\r\n% Main Loop\r\n%\r\nfor i=1:n1\r\n   la=Lat(i);\r\n   lo=Lon(i);\r\n\r\n   sa = 6378137.000000 ; sb = 6356752.314245;\r\n         \r\n   %e = ( ( ( sa ^ 2 ) - ( sb ^ 2 ) ) ^ 0.5 ) \/ sa;\r\n   e2 = ( ( ( sa ^ 2 ) - ( sb ^ 2 ) ) ^ 0.5 ) \/ sb;\r\n   e2cuadrada = e2 ^ 2;\r\n   c = ( sa ^ 2 ) \/ sb;\r\n   %alpha = ( sa - sb ) \/ sa;             %f\r\n   %ablandamiento = 1 \/ alpha;   % 1\/f\r\n\r\n   lat = la * ( pi \/ 180 );\r\n   lon = lo * ( pi \/ 180 );\r\n\r\n   Huso = fix( ( lo \/ 6 ) + 31);\r\n   S = ( ( Huso * 6 ) - 183 );\r\n   deltaS = lon - ( S * ( pi \/ 180 ) );\r\n\r\n   if (la&lt;-72), Letra='C';\r\n   elseif (la&lt;-64), Letra='D';\r\n   elseif (la&lt;-56), Letra='E';\r\n   elseif (la&lt;-48), Letra='F';\r\n   elseif (la&lt;-40), Letra='G';\r\n   elseif (la&lt;-32), Letra='H';\r\n   elseif (la&lt;-24), Letra='J';\r\n   elseif (la&lt;-16), Letra='K';\r\n   elseif (la&lt;-8), Letra='L';\r\n   elseif (la&lt;0), Letra='M';\r\n   elseif (la&lt;8), Letra='N';\r\n   elseif (la&lt;16), Letra='P';\r\n   elseif (la&lt;24), Letra='Q';\r\n   elseif (la&lt;32), Letra='R';\r\n   elseif (la&lt;40), Letra='S';\r\n   elseif (la&lt;48), Letra='T';\r\n   elseif (la&lt;56), Letra='U';\r\n   elseif (la&lt;64), Letra='V';\r\n   elseif (la&lt;72), Letra='W';\r\n   else Letra='X';\r\n   end\r\n\r\n   a = cos(lat) * sin(deltaS);\r\n   epsilon = 0.5 * log( ( 1 +  a) \/ ( 1 - a ) );\r\n   nu = atan( tan(lat) \/ cos(deltaS) ) - lat;\r\n   v = ( c \/ ( ( 1 + ( e2cuadrada * ( cos(lat) ) ^ 2 ) ) ) ^ 0.5 ) * 0.9996;\r\n   ta = ( e2cuadrada \/ 2 ) * epsilon ^ 2 * ( cos(lat) ) ^ 2;\r\n   a1 = sin( 2 * lat );\r\n   a2 = a1 * ( cos(lat) ) ^ 2;\r\n   j2 = lat + ( a1 \/ 2 );\r\n   j4 = ( ( 3 * j2 ) + a2 ) \/ 4;\r\n   j6 = ( ( 5 * j4 ) + ( a2 * ( cos(lat) ) ^ 2) ) \/ 3;\r\n   alfa = ( 3 \/ 4 ) * e2cuadrada;\r\n   beta = ( 5 \/ 3 ) * alfa ^ 2;\r\n   gama = ( 35 \/ 27 ) * alfa ^ 3;\r\n   Bm = 0.9996 * c * ( lat - alfa * j2 + beta * j4 - gama * j6 );\r\n   xx = epsilon * v * ( 1 + ( ta \/ 3 ) ) + 500000;\r\n   yy = nu * v * ( 1 + ta ) + Bm;\r\n\r\n   if (yy&lt;0)\r\n       yy=9999999+yy;\r\n   end\r\n\r\n   x(i)=xx;\r\n   y(i)=yy;\r\n   utmzone(i,:)=sprintf('%02d %c',Huso,Letra);\r\nend\r\n\r\n\r\n\r\n\r\nfunction ms = m2ms(m,textout)\r\n% min to min:sec\r\n% if second argument is true, then text is output\r\n\r\nif nargin1 &amp;&amp; ~~textout)\r\n    if any(ms(:,1)&gt;=60)\r\n        f = '%d:%02d';\r\n        hms = [floor(ms(:,1)\/60) mod(ms,60)];\r\n    else\r\n        f = '%02d';\r\n        hms = ms;\r\n    end\r\n    if any(abs(m*60-round(m*60))&gt;1e-3)\r\n        f = [f ':%06.3f'];\r\n    else\r\n        f = [f ':%02.0f'];\r\n    end\r\n    if ~nargout\r\n        fprintf([f '\\n'],hms.');\r\n        clear ms;\r\n    else\r\n        ms = num2str(hms,f);\r\n    end\r\nend\r\n<\/pre>\n<p>Wie weet maak in nog een keer een .exe file hier van, of een online tool zodat je op mijn website jouw gpx\/tcx files van splits kan voorzien. Laat hier onder, als commentaar, opmerkingen, wensen of suggesties achter. Mocht je handig zijn met Perl, PHP, Python, of zo, dan kan je wellicht deze, op zich redelijke simpele, code herschrijven.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Herken je dit? Je hebt een GPS track, van een tracklogger (in .gpx formaat) of van je Garmin horloge (in .tcx formaat), maar er zitten geen splits in, omdat je niet bij elke post op het knopje hebt gedrukt. En de club gebruikt niet Winsplits in combinatie met die ene specifieke server waar Quickroute mee &hellip; <a href=\"https:\/\/jgeo.nl\/o\/2012\/02\/20\/hackerdehack\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Hackerdehack<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_s2mail":"yes","footnotes":""},"categories":[5,8],"tags":[],"class_list":["post-764","post","type-post","status-publish","format-standard","hentry","category-materiaal","category-website"],"_links":{"self":[{"href":"https:\/\/jgeo.nl\/o\/wp-json\/wp\/v2\/posts\/764","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jgeo.nl\/o\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jgeo.nl\/o\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jgeo.nl\/o\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jgeo.nl\/o\/wp-json\/wp\/v2\/comments?post=764"}],"version-history":[{"count":16,"href":"https:\/\/jgeo.nl\/o\/wp-json\/wp\/v2\/posts\/764\/revisions"}],"predecessor-version":[{"id":3820,"href":"https:\/\/jgeo.nl\/o\/wp-json\/wp\/v2\/posts\/764\/revisions\/3820"}],"wp:attachment":[{"href":"https:\/\/jgeo.nl\/o\/wp-json\/wp\/v2\/media?parent=764"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jgeo.nl\/o\/wp-json\/wp\/v2\/categories?post=764"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jgeo.nl\/o\/wp-json\/wp\/v2\/tags?post=764"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}