Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
    {                                                                   //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);
        }