Public Class Form1 Public Structure Posn Public Timestamp As Integer Public Lat As Double Public Lon As Double Public Course As Double Public Speed As Double End Structure Public Structure TracksStruct Public Title As String Public TrackDate As Date Public NumberofPoints As Integer Public OrigFile As String Public Colour As Integer Public Trackpoints() As Posn End Structure Dim folderBrowserDialog1 As FolderBrowserDialog Public Tracks() As TracksStruct Public AISTracks() As TracksStruct Public Track As TracksStruct Public deDupedTracks() As TracksStruct Public SkipTrack() As Boolean Public Trackpoints() As Posn Public NumberofTracks = 0 Public NumberofAISTracks = 0 Public NumberofTrackPoints = 0 Public DateOffset As Date Dim textfile2 As System.IO.StreamWriter Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load textfile2 = My.Computer.FileSystem.OpenTextFileWriter("c:\trk.txt", False, System.Text.Encoding.ASCII) DateOffset = CDate("january 1, 1970") End Sub Dim fn As String Private Sub OpenTLOG_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenTLOG.Click Dim TLOGDir As String Dim result As DialogResult folderBrowserDialog1 = New System.Windows.Forms.FolderBrowserDialog() folderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer folderBrowserDialog1.SelectedPath = "C:\" result = folderBrowserDialog1.ShowDialog() If (result = System.Windows.Forms.DialogResult.OK) Then TLOGDir = folderBrowserDialog1.SelectedPath If Not (TLOGDir Is Nothing) Then ReadTLOG(TLOGDir) End If End If End Sub Private Sub ReadTLOG(ByVal TlogDIR As String) Dim Textfile As System.IO.StreamReader Dim Seq As Integer Dim Line As String Dim i As Integer Dim recs As Integer For Seq = 1 To 9999 fn = TlogDIR & "\tlog" & Seq & ".txt" Try Textfile = My.Computer.FileSystem.OpenTextFileReader(fn, System.Text.Encoding.ASCII) Catch ex As Exception Exit For End Try Do Line = Textfile.ReadLine If Microsoft.VisualBasic.Left(Line, 4) = "4002" Then recs = ProcessHeader(Line) NumberofTrackPoints = 0 ' Object Variable "Track" points to the currentt entry If recs > 0 Then For i = 1 To recs Line = Textfile.ReadLine ProcessTrackLine(Line) Next textfile2.WriteLine(Track.Trackpoints(1).Timestamp & " " & Track.Title & " " & fn) Track.TrackDate = DateTime.FromOADate(Track.Trackpoints(1).Timestamp / 86400 + DateOffset.ToOADate) ' TestStr = Format(Track.TrackDate, "yyyyMMdd") If Track.Colour = 16776960 Then NumberofAISTracks = NumberofAISTracks + 1 ReDim Preserve AISTracks(NumberofAISTracks) AISTracks(NumberofAISTracks) = Track Else NumberofTracks = NumberofTracks + 1 ReDim Preserve Tracks(NumberofTracks) Tracks(NumberofTracks) = Track End If End If Else ' Debug.Print(Line) End If Loop Until Textfile.EndOfStream Textfile.Close() Next Debug.Print(NumberofTracks) Debug.Print(NumberofAISTracks) End Sub Function ProcessHeader(ByVal Line) As Integer Dim Seq As Integer Dim Title As String Dim Field3 As String Dim Field4 As String Dim Colour As Integer Dim Field6 As Integer Dim Field7 As String Dim Field8 As String Dim Field9 As String Dim RecCount As Integer Dim i As Integer, Start As Integer i = InStr(Mid(Line, 6), Chr(9)) Start = 6 Seq = Mid(Line, Start, i) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Title = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Field3 = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Field4 = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Colour = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Field6 = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Field7 = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Field8 = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Field9 = Mid(Line, Start, i - 1) Start = Start + i RecCount = Mid(Line, Start) ' If Colour = 16776960 Then Return 0 ' AIS Track If (RecCount < 3) Then Debug.Print(Title & " " & fn & " " & RecCount) RecCount = 0 Else Track.NumberofPoints = RecCount Track.Title = Title Track.OrigFile = fn Track.Colour = Colour ReDim Preserve Track.Trackpoints(RecCount) End If Return RecCount End Function Sub ProcessTrackLine(ByVal Line) Dim Seq As Integer Dim Title As String Dim Field3 As String Dim Lat As Double Dim Lon As Double Dim Field6 As String Dim Field7 As String Dim Field8 As String Dim Field9 As String Dim Field10 As String Dim COG As Double Dim SOG As Double Dim i As Integer, Start As Integer i = InStr(Mid(Line, 6), Chr(9)) Start = 6 Seq = Mid(Line, Start, i) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Title = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Field3 = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Lat = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Lon = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Field6 = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Field7 = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Field8 = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Field9 = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) Field10 = Mid(Line, Start, i - 1) Start = Start + i i = InStr(Mid(Line, Start), Chr(9)) COG = Mid(Line, Start, i - 1) Start = Start + i SOG = Mid(Line, Start) NumberofTrackPoints = NumberofTrackPoints + 1 Track.Trackpoints(NumberofTrackPoints).Timestamp = Field3 Track.Trackpoints(NumberofTrackPoints).Course = COG Track.Trackpoints(NumberofTrackPoints).Speed = SOG Track.Trackpoints(NumberofTrackPoints).Lat = Lat Track.Trackpoints(NumberofTrackPoints).Lon = Lon End Sub Private Sub LookforDups_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RemoveDups.Click Dim i As Integer, j As Integer, Dups As Integer, n As Integer ReDim SkipTrack(NumberofTracks) Dim textfile As System.IO.StreamWriter ReDim deDupedTracks(NumberofTracks) Dups = 0 For i = 1 To NumberofTracks - 1 For j = i + 1 To NumberofTracks If (Tracks(i).Trackpoints(1).Timestamp = Tracks(j).Trackpoints(1).Timestamp) Then If (Tracks(i).NumberofPoints = Tracks(j).NumberofPoints) Then ' Print it titles different If Tracks(i).Title <> Tracks(j).Title Then Debug.Print(Tracks(i).Title) Debug.Print(Tracks(j).Title) End If SkipTrack(j) = True Dups = Dups + 1 Exit For End If End If Next j Next i ' n = n + 1 ' deDupedTracks(n) = Tracks(i) n = 0 Debug.Print(Dups) If Dups > 0 Then textfile = My.Computer.FileSystem.OpenTextFileWriter("c:\trkdup.txt", False, System.Text.Encoding.ASCII) For i = 1 To NumberofTracks If SkipTrack(i) Then textfile.WriteLine(Tracks(i).Trackpoints(1).Timestamp & " " & Tracks(i).Title & " " & Tracks(i).OrigFile) Else n = n + 1 deDupedTracks(n) = Tracks(i) End If Next ' For i = 1 To n ReDim Preserve deDupedTracks(n) Tracks = deDupedTracks ' ' Next NumberofTracks = n textfile.Close() End If End Sub Private Sub CreateV3TLOG_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CreateV3TLOG.Click Dim textfile As System.IO.StreamWriter Dim Line As String Dim i As Integer, j As Integer Dim Tab As Char = Chr(9) Dim Tkp As Posn ' 4002 1 20070619 Isle of Lewis 20070619 0 255 0 00:00:10 0.1 0.005 90 textfile = My.Computer.FileSystem.OpenTextFileWriter("c:\TLOGV3.txt", False, System.Text.Encoding.ASCII) For i = 1 To NumberofTracks Line = "4002" & Tab & i & Tab & Tracks(i).Title & Tab & " " & Tab & "0" & Tab & Tracks(i).Colour & Tab & "0" & Tab & "00:00:10" & Tab & "0.1" & Tab & "0.005" & Tab & Tracks(i).NumberofPoints textfile.WriteLine(Line) For j = 1 To Tracks(i).NumberofPoints '4001 0 1 1182247303 3478.614532 321.892103 TK0001 0 255 0 0.000000 0.000000 Trackpoints = Tracks(i).Trackpoints Tkp = Trackpoints(j) Line = "4001" & Tab & "0" & Tab & j & Tab & Tkp.Timestamp & Tab & Tkp.Lat & Tab & Tkp.Lon & Tab & "TK" & j & Tab & " " & Tab & "0" & Tab & Tracks(i).Colour & Tab & "0" & Tab & Tkp.Course & Tab & Tkp.Speed textfile.WriteLine(Line) Next Next textfile.Close() End Sub Private Sub EditTitles_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EditTitles.Click EditTracksForm.Visible = True End Sub Private Sub SortButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SortButton.Click Dim keys(NumberofTracks) As Integer Dim Pointers(NumberofTracks) As Integer Dim SortedTracks() As TracksStruct Dim i As Integer keys(0) = -2000000000 For i = 1 To NumberofTracks keys(i) = Tracks(i).Trackpoints(1).Timestamp Pointers(i) = i Next ReDim SortedTracks(NumberofTracks) Array.Sort(keys, Pointers) For i = 1 To NumberofTracks SortedTracks(i) = Tracks(Pointers(i)) Next Tracks = SortedTracks End Sub Private Sub CreateV5CSV_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CreateV5CSV.Click Dim textfile As System.IO.StreamWriter Dim Line As String Dim i As Integer, j As Integer Dim Quote As Char = Chr(34) Dim Tkp As Posn Dim Mins As Double, Degs As Double Dim LatString As String Dim LonString As String Dim startdate As Date = CDate("jan 1, 1900") Dim enddate As Date = CDate("dec 31, 2100") ' Dim startdate As Date = CDate("may 8, 2004") ' Dim enddate As Date = CDate("may 28, 2004") ' 4002 1 20070619 Isle of Lewis 20070619 0 255 0 00:00:10 0.1 0.005 90 ' TK01, "Port Appin to Ballachulish", "Track", 1, 1, 1000, 0, 255, 3600, 900, 15, 10 ' TP02, 56.553617, -5.41615, 0.0, 1157454701, 0.0, 0.0, 0 ' TP02, 56.5535, -5.416317, 0.0, 1157455441, 0.04, 218.3, 0 textfile = My.Computer.FileSystem.OpenTextFileWriter("c:\TLOGV5.CSV", False, System.Text.Encoding.ASCII) For i = 1 To NumberofTracks If Tracks(i).TrackDate > startdate And Tracks(i).TrackDate <= enddate Then Line = "TK01, " & Quote & Tracks(i).Title & Quote & ", " & Quote & Mid(Tracks(i).Title, 1, 4) & " Tracks" & Quote & ", 1,1, 1000, 0, " & Tracks(i).Colour & ", 3600, 900, 15, 10" textfile.WriteLine(Line) For j = 1 To Tracks(i).NumberofPoints ' TP02, 56.5535, -5.416317, 0.0, 1157455441, 0.04, 218.3, 0 Trackpoints = Tracks(i).Trackpoints Tkp = Trackpoints(j) Mins = Tkp.Lat Mod 60 Degs = (Tkp.Lat - Mins) / 60 Degs = Degs + Mins / 60 LatString = Format(Degs, "0.#######") Mins = Tkp.Lon Mod 60 Degs = (Tkp.Lon - Mins) / 60 Degs = Degs + Mins / 60 LonString = Format(-Degs, "0.#######") Line = "TP02, " & LatString & ", " & LonString & ", " & "0.0" & ", " & Tkp.Timestamp & ", " & Tkp.Course & ", " & Tkp.Speed & ", " textfile.WriteLine(Line) Next End If Next textfile.Close() End Sub Private Sub Archive_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Archive.Click FileOpen(1, "c:\SaveTracks.bin", OpenMode.Binary) FilePut(1, Tracks, 1, True, False) FileClose(1) End Sub Private Sub LoadArchive_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LoadArchive.Click, LoadArchive.Click FileOpen(1, "c:\SaveTracks.bin", OpenMode.Binary) ReDim Tracks(1) FileGet(1, Tracks, 1, True, False) NumberofTracks = Tracks.Length - 1 FileClose(1) End Sub Private Sub DateStamp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateStamp.Click Dim i As Integer Dim Title As String, DateStr As String For i = 1 To NumberofTracks Title = Tracks(i).Title If Microsoft.VisualBasic.Left(Title, 4) = "1970" Or Microsoft.VisualBasic.Left(Title, 3) = "200" Then Title = LTrim(RTrim(Mid(Title, 9))) End If If LCase(Microsoft.VisualBasic.Left(Title, 9)) = "track of " Then Title = LTrim(RTrim(Mid(Title, 10))) End If If LCase(Microsoft.VisualBasic.Left(Title, 5)) = "track" Then Title = Mid(Title, 6) End If DateStr = Format(Tracks(i).TrackDate, "yyyyMMdd") Tracks(i).Title = DateStr & " " & LTrim(RTrim(Title)) Next End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Read_CSV.Click Dim tim As Long, Lat As Double, Lon As Double, COG As Double, SOG As Double Dim i As Integer Dim val As String Dim fileReader As System.IO.StreamReader fileReader = My.Computer.FileSystem.OpenTextFileReader("c:\Oban-Canna 1.csv") Dim line As String Do line = fileReader.ReadLine() If line Is Nothing Then Exit Do ' TP02, 55.641467, -4.819167, 0.0, 1207743623, 0.0, 0.0, 0 'Public Title As String 'Public TrackDate As Date 'Public NumberofPoints As Integer 'Public OrigFile As String 'Public Colour As Integer 'Public Trackpoints() As Posn ' TK01, "20080628 Oban Marina to Canna 1", "2008 Tracks", 1, 0, 255, 0, 255, 3600, 300, 15, 10 If Microsoft.VisualBasic.Left(line, 4) = "TK01" Then Dim Seq As Integer Dim Title As String Dim Field3 As String Dim Field4 As String Dim Field5 As Integer Dim RecCount As Integer Dim Start As Integer Start = 6 i = InStr(Mid(line, Start), ",") Title = Mid(line, Start, i - 1) Start = Start + i i = InStr(Mid(line, Start), ",") Field3 = Mid(line, Start, i - 1) Start = Start + i i = InStr(Mid(line, Start), ",") Field4 = Mid(line, Start, i - 1) Start = Start + i i = InStr(Mid(line, Start), ",") Field5 = Mid(line, Start, i - 1) Start = Start + i i = InStr(Mid(line, Start), ",") RecCount = Mid(line, Start, i - 1) Track.NumberofPoints = RecCount Track.Title = Title Track.OrigFile = fn Track.Colour = 255 ReDim Preserve Track.Trackpoints(RecCount) NumberofTracks = NumberofTracks + 1 ReDim Preserve Tracks(NumberofTracks) Tracks(NumberofTracks) = Track NumberofTrackPoints = 0 End If If Microsoft.VisualBasic.Left(line, 4) = "TP02" Then ' TP02, 56.417967, -5.4971, 0.0, 1199167087, 0.0, 0.0, 0 i = InStr(Mid(line, 6), ",") val = Mid(line, 6, i - 1) Lat = val line = Mid(line, i + 6) i = InStr(line, ",") val = Mid(line, 1, i - 1) Lon = val line = Mid(line, i + 1) i = InStr(line, ",") val = Mid(line, 1, i - 1) line = Mid(line, i + 1) i = InStr(line, ",") val = Mid(line, 1, i - 1) tim = val line = Mid(line, i + 1) i = InStr(line, ",") val = Mid(line, 1, i - 1) SOG = val line = Mid(line, i + 1) i = InStr(line, ",") val = Mid(line, 1, i - 1) COG = val NumberofTrackPoints = NumberofTrackPoints + 1 If NumberofTrackPoints = 1 Then Tracks(NumberofTracks).TrackDate = DateTime.FromOADate(tim / 86400 + DateOffset.ToOADate) End If Tracks(NumberofTracks).Trackpoints(NumberofTrackPoints).Timestamp = tim Tracks(NumberofTracks).Trackpoints(NumberofTrackPoints).Course = SOG Tracks(NumberofTracks).Trackpoints(NumberofTrackPoints).Speed = COG Tracks(NumberofTracks).Trackpoints(NumberofTrackPoints).Lat = Lat * 60 Tracks(NumberofTracks).Trackpoints(NumberofTrackPoints).Lon = Lon * -60 End If Loop fileReader.Close() End Sub End Class