public bool Load(string filename, ref Form1.WayPointInfo WayPoints, int vector_size, ref float[] dataLat, ref float[] dataLong, ref Int16[] dataZ, ref Int32[] dataT, ref Int32[] dataD, ref Form1.TrackSummary ts, ref int data_size, bool append) { bool Status = false; int DecimateCount = 0, Decimation = 1; double OldLat = 0.0, OldLong = 0.0; UtmUtil utmUtil = new UtmUtil(); Int16 ReferenceAlt; if (!append) { data_size = 0; WayPoints.Count = 0; ts.Clear(); } if (data_size == 0) { ReferenceAlt = Int16.MaxValue; } else { ReferenceAlt = dataZ[data_size - 1]; } Cursor.Current = Cursors.WaitCursor; try { XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; StreamReader sr = new StreamReader(filename, System.Text.Encoding.UTF8); //use StreamReader to overwrite encoding ISO-8859-1, which is not supported by .NETCF (no speed drawback) XmlReader reader = XmlReader.Create(sr, settings); ts.filename = filename; //reader.MoveToContent(); //reader.Read(); while (reader.ReadToFollowing("Placemark")) { while (reader.NodeType == XmlNodeType.Element) { if (reader.Name == "Placemark") { bool addLevel = false; string tmpname = ""; string tmpdescription = ""; bool waypoint = false; double lon = 0; double lat = 0; reader.Read(); while (reader.NodeType == XmlNodeType.Element) { if (reader.Name == "name") { tmpname = reader.ReadElementString(); } else if (reader.Name == "description") { tmpdescription = reader.ReadElementString(); } else if (reader.Name == "MultiGeometry") { reader.Read(); addLevel = true; } else if (reader.Name == "LineString") { ts.name = tmpname; ts.desc = tmpdescription; reader.Read(); while (reader.NodeType == XmlNodeType.Element) { if (reader.Name == "coordinates") { reader.ReadStartElement(); while (true) { string line = ""; char[] buf = new char[1]; int count = 1; for (int i = 0; i < 100; i++) //read one line { count = reader.ReadValueChunk(buf, 0, 1); if (buf[0] == '\n' || buf[0] == ' ' || buf[0] == '\r' || buf[0] == '\t' || count == 0) { break; } line += buf[0]; } if (data_size >= vector_size) // check if we need to decimate arrays { for (int i = 0; i < vector_size / 2; i++) { dataLat[i] = dataLat[i * 2]; dataLong[i] = dataLong[i * 2]; dataZ[i] = dataZ[i * 2]; dataT[i] = dataT[i * 2]; dataD[i] = dataD[i * 2]; } data_size = vector_size / 2; Decimation *= 2; } string[] numbers = line.Split(','); if (numbers.Length >= 2) //read data { lon = Convert.ToDouble(numbers[0], IC); lat = Convert.ToDouble(numbers[1], IC); if (!utmUtil.referenceSet) { utmUtil.setReferencePoint(lat, lon); OldLat = lat; OldLong = lon; } double deltax = (lon - OldLong) * utmUtil.longit2meter; double deltay = (lat - OldLat) * utmUtil.lat2meter; ts.Distance += Math.Sqrt(deltax * deltax + deltay * deltay); OldLong = lon; OldLat = lat; Int16 z_int = Int16.MinValue; //preset invalid Alt in case there is no <ele> field if (numbers.Length >= 3) { z_int = (Int16)Convert.ToDouble(numbers[2], IC); //altitude // compute elevation gain //if (ts.AltitudeStart == Int16.MinValue) // ts.AltitudeStart = z_int; if (z_int > ReferenceAlt) { ts.AltitudeGain += z_int - ReferenceAlt; ReferenceAlt = z_int; } else if (z_int < ReferenceAlt - (short)Form1.AltThreshold) { ReferenceAlt = z_int; } if (z_int > (short)ts.AltitudeMax) { ts.AltitudeMax = z_int; } if (z_int < (short)ts.AltitudeMin) { ts.AltitudeMin = z_int; } } if (DecimateCount == 0) //when decimating, add only first sample, ignore rest of decimation { dataLat[data_size] = (float)lat; dataLong[data_size] = (float)lon; dataZ[data_size] = z_int; if (data_size == 0) { dataT[data_size] = 0; } else { dataT[data_size] = dataT[data_size - 1] + Decimation; //every point 1 sec apart } dataD[data_size] = (int)ts.Distance; data_size++; } DecimateCount++; if (DecimateCount >= Decimation) { DecimateCount = 0; } } if (count == 0) { break; } } reader.Skip(); //advances reader to the next (End) Element reader.ReadEndElement(); //coordinates } else { reader.Skip(); } } reader.ReadEndElement(); //LineString } else if (reader.Name == "Point") { reader.Read(); while (reader.NodeType == XmlNodeType.Element) { if (reader.Name == "coordinates") { string line = reader.ReadElementString(); string[] numbers = line.Split(','); if (numbers.Length >= 2) { lon = Convert.ToDouble(numbers[0], IC); lat = Convert.ToDouble(numbers[1], IC); waypoint = true; } } else { reader.Skip(); } } reader.ReadEndElement(); //Point } else { reader.Skip(); } } if (addLevel) { reader.ReadEndElement(); } if (waypoint && WayPoints.Count < WayPoints.DataSize) { WayPoints.name[WayPoints.Count] = tmpname; WayPoints.lon[WayPoints.Count] = (float)lon; WayPoints.lat[WayPoints.Count] = (float)lat; WayPoints.Count++; } reader.ReadEndElement(); // Placemark } else { reader.Skip(); } } } reader.Close(); sr.Close(); Status = true; } catch (Exception e) { Utils.log.Error(" LoadKml ", e); } Cursor.Current = Cursors.Default; return(Status); }
public bool Load(string filename, ref Form1.WayPointInfo WayPoints, int vector_size, ref float[] dataLat, ref float[] dataLong, ref Int16[] dataZ, ref Int32[] dataT, ref Int32[] dataD, ref Form1.TrackSummary ts, ref int data_size, bool append) { bool Status = false; TimeSpan tspan; UtmUtil utmUtil = new UtmUtil(); double OldLat = 0.0, OldLong = 0.0; int DecimateCount = 0, Decimation = 1; Int16 ReferenceAlt; if (!append) { data_size = 0; WayPoints.Count = 0; ts.Clear(); } if (data_size == 0) { ReferenceAlt = Int16.MaxValue; } else { ReferenceAlt = dataZ[data_size - 1]; } Cursor.Current = Cursors.WaitCursor; try { //XmlParserContext xmlpc = new XmlParserContext(null, null, "", XmlSpace.Default, System.Text.Encoding.UTF8); does not work XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; StreamReader sr = new StreamReader(filename, System.Text.Encoding.UTF8); //use StreamReader to overwrite encoding ISO-8859-1, which is not supported by .NETCF (no speed drawback) XmlReader reader = XmlReader.Create(sr, settings); ts.filename = filename; //reader.MoveToContent(); reader.ReadToFollowing("gpx"); reader.Read(); while (reader.NodeType == XmlNodeType.Element) { bool isTrack; if ((isTrack = reader.Name == "trk") || reader.Name == "rte") { if (isTrack) { reader.Read(); } while (reader.NodeType == XmlNodeType.Element) { if (reader.Name == "trkseg" || reader.Name == "rte") { reader.Read(); while (reader.NodeType == XmlNodeType.Element) { if (reader.Name == "trkpt" || reader.Name == "rtept") { trkpt: bool jumptrkpt = false; if (data_size >= vector_size) // check if we need to decimate arrays { for (int i = 0; i < vector_size / 2; i++) { dataLat[i] = dataLat[i * 2]; dataLong[i] = dataLong[i * 2]; dataZ[i] = dataZ[i * 2]; dataT[i] = dataT[i * 2]; dataD[i] = dataD[i * 2]; } data_size = vector_size / 2; Decimation *= 2; } double lat = Convert.ToDouble(reader.GetAttribute("lat"), IC); double lon = Convert.ToDouble(reader.GetAttribute("lon"), IC); if (!utmUtil.referenceSet) { utmUtil.setReferencePoint(lat, lon); OldLat = lat; OldLong = lon; } double deltax = (lon - OldLong) * utmUtil.longit2meter; double deltay = (lat - OldLat) * utmUtil.lat2meter; ts.Distance += Math.Sqrt(deltax * deltax + deltay * deltay); OldLong = lon; OldLat = lat; tspan = TimeSpan.Zero; //clear data in case there is no <time> field Int16 z_int = Int16.MinValue; //preset invalid Alt in case there is no <ele> field reader.Read(); while (reader.NodeType == XmlNodeType.Element) //read subtree { switch (reader.Name) { case "ele": z_int = (Int16)reader.ReadElementContentAsDouble(); // compute elevation gain //if (ts.AltitudeStart == Int16.MinValue) // ts.AltitudeStart = z_int; if (z_int > ReferenceAlt) { ts.AltitudeGain += z_int - ReferenceAlt; ReferenceAlt = z_int; } else if (z_int < ReferenceAlt - (short)Form1.AltThreshold) { ReferenceAlt = z_int; } if (z_int > (short)ts.AltitudeMax) { ts.AltitudeMax = z_int; } if (z_int < (short)ts.AltitudeMin) { ts.AltitudeMin = z_int; } break; case "time": if (ts.StartTime == DateTime.MinValue) { ts.StartTime = reader.ReadElementContentAsDateTime(); } else { tspan = reader.ReadElementContentAsDateTime() - ts.StartTime; } break; case "speed": reader.Skip(); break; case "trkpt": //trkpt without EndElement <trkpt lat="47.2615199999997" lon="10.2016400000003"/> case "rtept": jumptrkpt = true; goto savepoint; default: reader.Skip(); break; } } reader.ReadEndElement(); //trkpt savepoint: if (DecimateCount == 0) //when decimating, add only first sample, ignore rest of decimation { dataLat[data_size] = (float)lat; dataLong[data_size] = (float)lon; dataZ[data_size] = z_int; dataT[data_size] = (int)tspan.TotalSeconds; dataD[data_size] = (int)ts.Distance; data_size++; } DecimateCount++; if (DecimateCount >= Decimation) { DecimateCount = 0; } if (jumptrkpt) { goto trkpt; } } else { reader.Skip(); } } if (isTrack) { reader.ReadEndElement(); //trkseg } } else if (reader.Name == "name") { ts.name = reader.ReadElementString(); } else if (reader.Name == "desc") { ts.desc = reader.ReadElementString(); } else { reader.Skip(); } } reader.ReadEndElement(); //trk } else if (reader.Name == "wpt") { float lat = (float)Convert.ToDouble(reader.GetAttribute("lat"), IC); float lon = (float)Convert.ToDouble(reader.GetAttribute("lon"), IC); string name = ""; string desc = ""; reader.Read(); while (reader.NodeType == XmlNodeType.Element) { if (reader.Name == "name") { name = reader.ReadElementString(); } else if (reader.Name == "desc") { desc = reader.ReadElementString(); //prepared for later use } else { reader.Skip(); } } if (WayPoints.Count < WayPoints.DataSize) { WayPoints.lat[WayPoints.Count] = lat; WayPoints.lon[WayPoints.Count] = lon; WayPoints.name[WayPoints.Count] = name; WayPoints.Count++; } reader.ReadEndElement(); } else { reader.Skip(); } } //reader.ReadEndElement(); reader.Close(); Status = true; } catch (Exception e) { Utils.log.Error(" LoadGpx ", e); } Cursor.Current = Cursors.Default; return(Status); }
{ //load as T2F (WayPoints) public bool Load(string filename, ref Form1.WayPointInfo WayPoints, int vector_size, ref float[] dataLat, ref float[] dataLong, ref Int16[] dataZ, ref Int32[] dataT, ref Int32[] dataD, ref Form1.TrackSummary ts, ref int data_size, bool append) { int DecimateCount = 0, Decimation = 1; double OriginShiftX = 0.0; double OriginShiftY = 0.0; bool Status = false; UtmUtil utmUtil = new UtmUtil(); Int16 ReferenceAlt; if (!append) { data_size = 0; WayPoints.Count = 0; ts.Clear(); } if (data_size == 0) { ReferenceAlt = Int16.MaxValue; } else { ReferenceAlt = dataZ[data_size - 1]; } Cursor.Current = Cursors.WaitCursor; do { try { ts.filename = filename; FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); BinaryReader rd = new BinaryReader(fs, System.Text.Encoding.Unicode); // load header "GCC1" (1 is version in binary) if (rd.ReadByte() != 'G') { break; } if (rd.ReadByte() != 'C') { break; } if (rd.ReadByte() != 'C') { break; } if (rd.ReadByte() != 1) { break; } // read time as 6 bytes: year, month... int tyear = (int)rd.ReadByte(); tyear += 2000; int tmonth = (int)rd.ReadByte(); int tday = (int)rd.ReadByte(); int thour = (int)rd.ReadByte(); int tmin = (int)rd.ReadByte(); int tsec = (int)rd.ReadByte(); ts.StartTime = new DateTime(tyear, tmonth, tday, thour, tmin, tsec); // read lat/long for the starting point double data_lat = rd.ReadDouble(); double data_long = rd.ReadDouble(); utmUtil.setReferencePoint(data_lat, data_long); Int16 x_int = 0; Int16 y_int = 0; Int16 z_int = 0; Int16 s_int = 0; UInt16 t_16 = 0; UInt16 t_16last = 0; Int32 t_high = 0; double out_lat = 0.0, out_long = 0.0; double OldX = 0.0; double OldY = 0.0; UInt64 recordError = 0UL; bool loop = true; while (loop) //break with EndOfStreamException { // get 5 short ints try { x_int = rd.ReadInt16(); y_int = rd.ReadInt16(); z_int = rd.ReadInt16(); s_int = rd.ReadInt16(); t_16 = rd.ReadUInt16(); } catch (EndOfStreamException) { break; } catch (Exception e) { Utils.log.Error(" LoadGcc - get 5 short ints ", e); break; } // check if this is a special record if ((s_int == -1) && (t_16 == 0xFFFF)) { switch (z_int) { case 0: // origin shift: z_int = 0 OriginShiftX += x_int; OriginShiftY += y_int; break; case 1: // battery: z_int = 1 break; case 2: // which GPS options were selected: z_int = 2 break; case 3: // waypoint // read waypoint name, if not blank string name = ""; for (int i = 0; i < x_int; i++) { name += (char)(rd.ReadUInt16()); } // store new waypoint if (WayPoints.Count < WayPoints.DataSize) { WayPoints.name[WayPoints.Count] = name; WayPoints.lat[WayPoints.Count] = (float)out_lat; WayPoints.lon[WayPoints.Count] = (float)out_long; WayPoints.Count++; } break; case 4: // heart rate not supported in T2F break; case 32: // name ts.name = rd.ReadString(); break; case 33: // desc ts.desc = rd.ReadString(); break; default: if ((1UL << z_int & recordError) == 0) { if (MessageBox.Show("unknown special record " + z_int + " at " + data_size + "\ntry to continue load anyway?", "Load Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) == DialogResult.Cancel) { loop = false; } ; recordError |= 1UL << z_int; } if (loop && z_int >= 32) { rd.ReadString(); //read unknown string in order to have correct record bounds } break; } } else // "normal" record { // check if we need to decimate arrays if (data_size >= vector_size) { for (int i = 0; i < vector_size / 2; i++) { dataLat[i] = dataLat[i * 2]; dataLong[i] = dataLong[i * 2]; dataZ[i] = dataZ[i * 2]; dataT[i] = dataT[i * 2]; dataD[i] = dataD[i * 2]; } data_size /= 2; Decimation *= 2; } // take into account the origin shift double real_x = OriginShiftX + x_int; double real_y = OriginShiftY + y_int; double deltax = real_x - OldX; double deltay = real_y - OldY; ts.Distance += Math.Sqrt(deltax * deltax + deltay * deltay); OldX = real_x; OldY = real_y; // compute elevation gain if (z_int != Int16.MinValue) //MinValue = invalid { //if (ts.AltitudeStart == Int16.MinValue) // ts.AltitudeStart = z_int; if (z_int > ReferenceAlt) { ts.AltitudeGain += z_int - ReferenceAlt; ReferenceAlt = z_int; } else if (z_int < ReferenceAlt - (short)Form1.AltThreshold) { ReferenceAlt = z_int; } if (z_int > (short)ts.AltitudeMax) { ts.AltitudeMax = z_int; } if (z_int < (short)ts.AltitudeMin) { ts.AltitudeMin = z_int; } } if (DecimateCount == 0) //when decimating, add only first sample, ignore rest of decimation { //but calculate distance and elevation from all points utmUtil.getLatLong(real_x, real_y, out out_lat, out out_long); dataLat[data_size] = (float)out_lat; dataLong[data_size] = (float)out_long; dataZ[data_size] = z_int; if (t_16 < t_16last) // handle overflow { t_high += 65536; } t_16last = t_16; dataT[data_size] = t_high + t_16; dataD[data_size] = (int)ts.Distance; data_size++; } DecimateCount++; if (DecimateCount >= Decimation) { DecimateCount = 0; } } } rd.Close(); fs.Close(); Status = true; } catch (Exception e) { Utils.log.Error(" LoadGcc ", e); } } while (false); Cursor.Current = Cursors.Default; return(Status); }