示例#1
0
        //this method takes a lot of time, please do not use it if not necessary
        public IPolyline5 SetPolyline()
        {
            var cptlt = new List <CPoint>(2);

            cptlt.Add(_FrCpt);
            cptlt.Add(_ToCpt);
            _pPolyline = CGeoFunc.GetIplFromCptLt(cptlt);
            return(_pPolyline);
        }
        /// <summary>
        /// 通过线要素(IPolyline5)获取点数组
        /// </summary>
        /// <param name="ipl">线要素</param>
        /// <returns>点数组</returns>
        public static List <CPoint> GetCPtLtByIPl(IPolyline5 ipl)
        {
            IGeometryCollection pGeoCol = ipl as IGeometryCollection;

            if (pGeoCol.GeometryCount > 1)
            {
                throw new ArgumentException("I didn't consider the problem of multiple polylines!");
            }

            return(GetCptEbByICol((IPointCollection4)ipl).ToList());
        }
示例#3
0
        public CRiver(int intID, List <CPoint> cptlt0)
        {
            _intID     = intID;
            this.CptLt = cptlt0;

            IPointCollection4 pCol = new PolylineClass();

            for (int i = 0; i < cptlt0.Count; i++)
            {
                pCol.AddPoint((IPoint)cptlt0[i]);
            }

            IPolyline5 pPolyline = pCol as IPolyline5;

            this.pPolyline = pPolyline;
            //FormPolyline(cptlt0);
            _CTributaryLt = new List <CRiver>();
        }
示例#4
0
        private SortedList <double, int> Rotate(CPolyline frcpl, CPolyline tocpl, IPoint icentralpt)
        {
            IPointCollection4 pCol = new PolylineClass();

            pCol.AddPointCollection(tocpl as IPointCollection4);
            IPolyline5   newpolyline  = pCol as IPolyline5;
            ITransform2D pTransform2D = newpolyline as ITransform2D;

            SortedList <double, int> dblSimilaritySLt = new SortedList <double, int>(new CCmpDbl());
            double dblRotateAngle = 2 * Math.PI / 360;

            for (int i = 0; i < 360; i++)
            {
                pTransform2D.Rotate(icentralpt, dblRotateAngle);
                CPolyline        tocpl2        = new CPolyline(i, newpolyline);
                List <CCorrCpts> pCorrCptsLt   = BuildCorrespondences(frcpl, tocpl2);
                double           dblSimilarity = CalSimilarity(pCorrCptsLt);
                dblSimilaritySLt.Add(dblSimilarity, i);
            }

            return(dblSimilaritySLt);
        }
示例#5
0
        /// <summary>
        /// Adds a point collection as a Polyline to the Voyage Track feature class.
        /// </summary>
        /// <param name="pFeatureBuffer"></param>
        /// <param name="pPointCollection"></param>
        /// <param name="pSR"></param>
        /// <param name="pVoyageRow"></param>
        /// <param name="sID"></param>
        private void AddLineFeature(IFeatureBuffer pFeatureBuffer, IPointCollection pPointCollection, ISpatialReference pSR, IRow pVoyageRow, string sID)
        {
            int iVoyageID      = pFeatureBuffer.Fields.FindField("VoyageID");
            int iDestinationID = pFeatureBuffer.Fields.FindField("Destination");
            int iCargoID       = pFeatureBuffer.Fields.FindField("Cargo");
            int iDraughtID     = pFeatureBuffer.Fields.FindField("Draught");
            int iETAID         = pFeatureBuffer.Fields.FindField("ETA");
            int iStartTimeID   = pFeatureBuffer.Fields.FindField("StartTime");
            int iEndTimeID     = pFeatureBuffer.Fields.FindField("EndTime");
            int iMMSIID        = pFeatureBuffer.Fields.FindField("MMSI");

            IPolyline5 myPolyline = (IPolyline5)pPointCollection;

            myPolyline.SpatialReference = pSR;
            pFeatureBuffer.Shape        = (IGeometry)myPolyline;

            pFeatureBuffer.set_Value(iVoyageID, sID);

            if (pVoyageRow != null)
            {
                pFeatureBuffer.set_Value(iDestinationID, pVoyageRow.get_Value(pVoyageRow.Fields.FindField("Destination")));
                pFeatureBuffer.set_Value(iCargoID, pVoyageRow.get_Value(pVoyageRow.Fields.FindField("Cargo")));
                pFeatureBuffer.set_Value(iDraughtID, pVoyageRow.get_Value(pVoyageRow.Fields.FindField("Draught")));
                pFeatureBuffer.set_Value(iETAID, pVoyageRow.get_Value(pVoyageRow.Fields.FindField("ETA")));
                pFeatureBuffer.set_Value(iStartTimeID, pVoyageRow.get_Value(pVoyageRow.Fields.FindField("StartTime")));
                pFeatureBuffer.set_Value(iEndTimeID, pVoyageRow.get_Value(pVoyageRow.Fields.FindField("EndTime")));
                pFeatureBuffer.set_Value(iMMSIID, pVoyageRow.get_Value(pVoyageRow.Fields.FindField("MMSI")));
            }
            else
            {
                pFeatureBuffer.set_Value(iDestinationID, "");
                pFeatureBuffer.set_Value(iCargoID, 0);
                pFeatureBuffer.set_Value(iDraughtID, 0);
                pFeatureBuffer.set_Value(iETAID, 0);
                pFeatureBuffer.set_Value(iStartTimeID, 0);
                pFeatureBuffer.set_Value(iEndTimeID, 0);
                pFeatureBuffer.set_Value(iMMSIID, 0);
            }
        }
        private List <CPoint> BezierDetectPoint(List <CPoint> cptlt, double dblSmallDis, double dblErrorDis)
        {
            List <CPoint> crtptlt = new List <CPoint>();  //crtptlt:characteristicptlt

            crtptlt.Add(cptlt[0]);



            //List<CPoint> beziercptlt = new List<CPoint>();
            IPointCollection4 pOriginalCol = new PolylineClass();
            object            Missing      = Type.Missing;
            bool blnNew = true;

            for (int i = 1; i < cptlt.Count - 1; i++)
            {
                if (blnNew == true)
                {
                    pOriginalCol = new PolylineClass();
                    blnNew       = false;
                    pOriginalCol.AddPoint((IPoint)cptlt[i - 1], ref Missing, ref Missing);
                    pOriginalCol.AddPoint((IPoint)cptlt[i], ref Missing, ref Missing);
                    pOriginalCol.AddPoint((IPoint)cptlt[i + 1], ref Missing, ref Missing);

                    //beziercptlt.Add(cptlt[i - 1]);
                    //beziercptlt.Add(cptlt[i ]);
                    //beziercptlt.Add(cptlt[i + 1]);
                    i = i + 1;
                }
                else
                {
                    pOriginalCol.AddPoint((IPoint)cptlt[i], ref Missing, ref Missing);
                    //beziercptlt.Add(cptlt[i]);
                }

                IPolyline5 pOriginalpl   = pOriginalCol as IPolyline5;
                double     dblBuBeLength = pOriginalpl.Length / 3; //dblBuBeLength: dblBuildBezierLength
                int        intPointCount = pOriginalCol.PointCount;

                //确定始端控制点2
                IPointCollection4 pfrCol = new PolylineClass();
                pfrCol.AddPoint(pOriginalCol.get_Point(0), ref Missing, ref Missing);
                pfrCol.AddPoint(pOriginalCol.get_Point(1), ref Missing, ref Missing);
                IPolyline5 pfrpl   = pfrCol as IPolyline5;
                IPoint     froutpt = new PointClass(); //始端控制点2
                pfrpl.QueryPoint(esriSegmentExtension.esriExtendAtTo, dblBuBeLength, false, froutpt);

                //确定终端控制点2
                IPointCollection4 ptoCol = new PolylineClass();
                ptoCol.AddPoint(pOriginalCol.get_Point(intPointCount - 1), ref Missing, ref Missing);
                ptoCol.AddPoint(pOriginalCol.get_Point(intPointCount - 2), ref Missing, ref Missing);
                IPolyline5 ptopl   = ptoCol as IPolyline5;
                IPoint     tooutpt = new PointClass(); //终端控制点2
                ptopl.QueryPoint(esriSegmentExtension.esriExtendAtTo, dblBuBeLength, false, tooutpt);


                //创建BezierCurve
                IBezierCurve pBezierCurve = new BezierCurveClass();
                pBezierCurve.PutCoord(0, pOriginalCol.get_Point(0));
                pBezierCurve.PutCoord(1, froutpt);
                pBezierCurve.PutCoord(2, tooutpt);
                pBezierCurve.PutCoord(3, pOriginalCol.get_Point(intPointCount - 1));
                double dblMaxDis   = 0;
                int    intMaxIndex = 0;
                for (int j = 1; j < pOriginalCol.PointCount - 1; j++)
                {
                    IPoint Originalpt  = pOriginalCol.get_Point(j);
                    IPoint outpt       = new PointClass();
                    double dblAlongDis = new double();
                    double dblFromDis  = new double();
                    bool   blnRight    = new bool();

                    IPoint bezierpt = new PointClass();
                    pBezierCurve.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, Originalpt, false, outpt, ref dblAlongDis, ref dblFromDis, ref blnRight);
                    if (dblFromDis > dblMaxDis)
                    {
                        dblMaxDis   = dblFromDis;
                        intMaxIndex = i + j + 1 - pOriginalCol.PointCount;  //i为原始线段上的点号,j为当前顾及线段的点号,pOriginalCol.PointCount为当前顾及线段的点数
                    }
                }

                if (dblMaxDis > dblErrorDis)
                {
                    blnNew = true;
                    crtptlt.Add(cptlt[intMaxIndex]);
                    i = intMaxIndex + 1;
                }
            }



            crtptlt.Add(cptlt[cptlt.Count - 1]);
            return(crtptlt);
        }
示例#7
0
        private List <CPoint> SettleRailwayNetwork(List <CPoint> cptlt, double dblSmallDis, double dblErrorDis)
        {
            List <CPoint> crtptlt = new List <CPoint>();  //crtptlt:characteristicptlt

            crtptlt.Add(cptlt[0]);



            //List<CPoint> beziercptlt = new List<CPoint>();
            IPointCollection4 pOriginalCol = new PolylineClass();
            object            Missing      = Type.Missing;
            bool blnNew = true;

            for (int i = 1; i < cptlt.Count - 1; i++)
            {
                if (blnNew == true)
                {
                    pOriginalCol = new PolylineClass();
                    blnNew       = false;
                    pOriginalCol.AddPoint((IPoint)cptlt[i - 1], ref Missing, ref Missing);
                    pOriginalCol.AddPoint((IPoint)cptlt[i], ref Missing, ref Missing);
                    pOriginalCol.AddPoint((IPoint)cptlt[i + 1], ref Missing, ref Missing);

                    //beziercptlt.Add(cptlt[i - 1]);
                    //beziercptlt.Add(cptlt[i ]);
                    //beziercptlt.Add(cptlt[i + 1]);
                    i = i + 1;
                }
                else
                {
                    pOriginalCol.AddPoint((IPoint)cptlt[i], ref Missing, ref Missing);
                    //beziercptlt.Add(cptlt[i]);
                }

                IPolyline5 pOriginalpl   = pOriginalCol as IPolyline5;
                double     dblBuBeLength = pOriginalpl.Length / 3; //dblBuBeLength: dblBuildBezierLength
                int        intPointCount = pOriginalCol.PointCount;

                IPointCollection4 pfrCol = new PolylineClass();
                pfrCol.AddPoint(pOriginalCol.get_Point(0), ref Missing, ref Missing);
                pfrCol.AddPoint(pOriginalCol.get_Point(1), ref Missing, ref Missing);
                IPolyline5 pfrpl   = pfrCol as IPolyline5;
                IPoint     froutpt = new PointClass();
                pfrpl.QueryPoint(esriSegmentExtension.esriExtendAtTo, dblBuBeLength, false, froutpt);

                IPointCollection4 ptoCol = new PolylineClass();
                ptoCol.AddPoint(pOriginalCol.get_Point(intPointCount - 1), ref Missing, ref Missing);
                ptoCol.AddPoint(pOriginalCol.get_Point(intPointCount - 2), ref Missing, ref Missing);
                IPolyline5 ptopl   = ptoCol as IPolyline5;
                IPoint     tooutpt = new PointClass();
                ptopl.QueryPoint(esriSegmentExtension.esriExtendAtTo, dblBuBeLength, false, tooutpt);


                //创建BezierCurve
                IBezierCurve pBezierCurve = new BezierCurveClass();
                pBezierCurve.PutCoord(0, pOriginalCol.get_Point(0));
                pBezierCurve.PutCoord(1, froutpt);
                pBezierCurve.PutCoord(2, tooutpt);
                pBezierCurve.PutCoord(3, pOriginalCol.get_Point(intPointCount - 1));


                double dblQueryNum = pOriginalpl.Length / dblSmallDis;
                double dblMaxDis   = 0;
                for (int j = 0; j < dblQueryNum - 1; j++)
                {
                    IPoint originalpt = new PointClass();
                    pOriginalpl.QueryPoint(esriSegmentExtension.esriNoExtension, j / dblQueryNum, true, originalpt);

                    IPoint bezierpt = new PointClass();
                    pBezierCurve.QueryPoint(esriSegmentExtension.esriNoExtension, j / dblQueryNum, true, bezierpt);

                    double dblDis = CGeoFunc.CalDis(originalpt, bezierpt);
                    if (dblDis > dblMaxDis)
                    {
                        dblMaxDis = dblDis;
                    }
                }

                if (dblMaxDis > dblErrorDis)
                {
                    blnNew = true;
                    crtptlt.Add(cptlt[i]);
                }
            }



            crtptlt.Add(cptlt[cptlt.Count - 1]);
            return(crtptlt);
        }
        private void DWIntersect(CPolyline pBSCpl, ref List <CPoint> cptlt, double dblIgnorableDis)
        {
            IPointCollection4 pCol = new PolylineClass();

            for (int i = 0; i < cptlt.Count; i++)
            {
                cptlt[i].SetPoint();
                pCol.AddPoint(cptlt[i].pPoint);
            }
            IPolyline5 ipl = pCol as IPolyline5;

            pBSCpl.SetPolyline();
            IRelationalOperator pRel = pBSCpl.pPolyline as IRelationalOperator;
            bool isCrosses           = pRel.Crosses(ipl);

            if (isCrosses == true)
            {
                ITopologicalOperator pTop          = pBSCpl.pPolyline as ITopologicalOperator;
                IGeometry            pGeoIntersect = pTop.Intersect(ipl, esriGeometryDimension.esriGeometry0Dimension);
                IPointCollection4    pColIntersect = pGeoIntersect as IPointCollection4;

                double dblMaxDis = 0;
                for (int j = 0; j < pColIntersect.PointCount; j++)
                {
                    double dblDis = CGeoFunc.CalDistanceFromStartPoint(ipl, pColIntersect.get_Point(j), false);
                    if (dblDis > dblMaxDis)
                    {
                        dblMaxDis = dblDis;
                    }
                }

                ICurve pSubCurve;
                ipl.GetSubcurve(dblMaxDis, ipl.Length, false, out pSubCurve);
                //IPolyline5 Cutipl = pSubCurve as IPolyline5;
                IPointCollection4 iplCutCol = pSubCurve as IPointCollection4;

                //the new first segment
                IPointCollection4 pSegCol = new PolylineClass();
                pSegCol.AddPoint(ipl.FromPoint, _Missing, _Missing);
                pSegCol.AddPoint(iplCutCol.get_Point(1), _Missing, _Missing);
                IPolyline5 seg = pSegCol as IPolyline5;
                bool       isCrossesSeg;

                int intIndex = 0;
                while (intIndex < iplCutCol.PointCount - 1)
                {
                    intIndex++;
                    pSegCol.UpdatePoint(1, iplCutCol.get_Point(intIndex));
                    isCrossesSeg = pRel.Crosses(seg);
                    if (isCrossesSeg == false)
                    {
                        iplCutCol.RemovePoints(1, intIndex - 1);
                        iplCutCol.UpdatePoint(0, ipl.FromPoint);
                        break;
                    }
                    if (seg.Length >= dblIgnorableDis)
                    {
                        double dblOriginalIntersectionDis  = CGeoFunc.CalDistanceFromStartPoint(pBSCpl.pPolyline, pCol.get_Point(0), false);
                        double dblRealisticIntersectionDis = CGeoFunc.CalDistanceFromStartPoint(pBSCpl.pPolyline, iplCutCol.get_Point(0), false);

                        IPointCollection4 pColBSCpl = pBSCpl.pPolyline as IPointCollection4;
                        double            dblSumDis = 0;
                        for (int i = 0; i < pColBSCpl.PointCount - 1; i++)
                        {
                            double dblDis = CGeoFunc.CalDis(pColBSCpl.get_Point(i), pColBSCpl.get_Point(i + 1));
                            dblSumDis += dblDis;
                            if (dblSumDis >= dblRealisticIntersectionDis)
                            {
                                double dblDisPre   = Math.Abs(dblSumDis - dblDis - dblOriginalIntersectionDis);
                                double dblDisNext  = Math.Abs(dblSumDis - dblOriginalIntersectionDis);
                                IPoint intersectpt = new PointClass();
                                if (dblDisPre <= dblDisNext)
                                {
                                    intersectpt = pColBSCpl.get_Point(i);
                                }
                                else
                                {
                                    intersectpt = pColBSCpl.get_Point(i + 1);
                                }
                                iplCutCol.UpdatePoint(0, intersectpt);
                                break;
                            }
                        }
                        break;
                    }
                }
                cptlt = CHelpFunc.GetCptEbByICol(iplCutCol).ToList();
            }
        }
示例#9
0
 public CPolyline(int intID, IPolyline5 pPolyline)
     : this(intID, CHelpFunc.GetCPtLtByIPl(pPolyline), false)
 {
     this.pPolyline = pPolyline;
 }
示例#10
0
 public override void SetAEGeometryNull()
 {
     _pPolyline = null;
 }
        //to be improved, a vertical cutter may cause unexpected problems
        //
        public void CreateBufferWithoutEnds(IGeometry fBufferGeo, double dblBuffer)
        {
            //StartCutPolyline
            ILine pStartNormal = new LineClass();

            this.pPolyline.QueryNormal(esriSegmentExtension.esriNoExtension, 0, true, dblBuffer, pStartNormal);
            IPoint StartFrPt = new PointClass();

            pStartNormal.QueryPoint(esriSegmentExtension.esriExtendAtFrom, -1.5, true, StartFrPt);
            IPoint StartToPt = new PointClass();

            pStartNormal.QueryPoint(esriSegmentExtension.esriExtendAtTo, 1.5, true, StartToPt);

            IPointCollection4 pStartCutterCol = new PolylineClass();

            pStartCutterCol.AddPoint(StartFrPt);
            pStartCutterCol.AddPoint(StartToPt);
            IPolyline5 pStartCutter = pStartCutterCol as IPolyline5;

            //EndCutPolyline
            ILine pEndNormal = new LineClass();

            this.pPolyline.QueryNormal(esriSegmentExtension.esriNoExtension, 1, true, dblBuffer, pEndNormal);
            IPoint EndFrPt = new PointClass();

            pEndNormal.QueryPoint(esriSegmentExtension.esriExtendAtFrom, -1.5, true, EndFrPt);
            IPoint EndToPt = new PointClass();

            pEndNormal.QueryPoint(esriSegmentExtension.esriExtendAtTo, 1.5, true, EndToPt);

            IPointCollection4 pEndCutterCol = new PolylineClass();

            pEndCutterCol.AddPoint(EndFrPt);
            pEndCutterCol.AddPoint(EndToPt);
            IPolyline5 pEndCutter = pEndCutterCol as IPolyline5;

            //TopologicalOperators
            ITopologicalOperator pStartPtTop    = this.pPolyline.FromPoint as ITopologicalOperator;
            IGeometry            pStartPtBuffer = pStartPtTop.Buffer(dblBuffer);

            ITopologicalOperator pEndPtTop    = this.pPolyline.ToPoint as ITopologicalOperator;
            IGeometry            pEndPtBuffer = pEndPtTop.Buffer(dblBuffer);

            //Cut
            ITopologicalOperator pStartPtBufferTop = pStartPtBuffer as ITopologicalOperator;
            IGeometry            StartLeftOutGeometry;
            IGeometry            StartRightOutGeometry;

            pStartPtBufferTop.Cut(pStartCutter, out StartLeftOutGeometry, out StartRightOutGeometry);

            ITopologicalOperator pEndPtBufferTop = pEndPtBuffer as ITopologicalOperator;
            IGeometry            EndLeftOutGeometry;
            IGeometry            EndRightOutGeometry;

            pEndPtBufferTop.Cut(pEndCutter, out EndLeftOutGeometry, out EndRightOutGeometry);

            //Difference
            ITopologicalOperator pBufferTop    = fBufferGeo as ITopologicalOperator;
            IGeometry            pDiffStart    = pBufferTop.Difference(StartRightOutGeometry);
            ITopologicalOperator pDiffStartTop = pDiffStart as ITopologicalOperator;
            IGeometry            pDiffEnd      = pDiffStartTop.Difference(EndLeftOutGeometry);

            _pBufferGeoWithoutEnds = pDiffEnd;
        }
示例#12
0
        /// <summary>
        /// Creates voyage tracks based on chunks of time. The time interval is provided by the user.
        /// </summary>
        /// <param name="pFL"></param>
        /// <param name="pVoyageTable"></param>
        /// <param name="pNewFC"></param>
        /// <param name="iUserTime"></param>
        /// <param name="iUserUnits"></param>
        private void CreateUserTimeChunkTracks(IFeatureLayer pFL, ITable pVoyageTable, IFeatureClass pNewFC, int iUserTime, int iUserUnits)
        {
            ITable          pTable  = (ITable)pFL;
            ICursor         pCursor = pTable.Search(null, false);
            IDataStatistics pDS     = new DataStatisticsClass();

            pDS.Field  = "MMSI";
            pDS.Cursor = pCursor;
            IEnumerator pEnum = pDS.UniqueValues;

            IFeatureCursor pInsertCursor   = pNewFC.Insert(false);
            IFeatureBuffer myFeatureBuffer = pNewFC.CreateFeatureBuffer();

            ISpatialReference pSR = CreateGeographicSR();

            int iNewVoyageID      = pNewFC.Fields.FindField("VoyageID");
            int iVoyageID         = pVoyageTable.Fields.FindField("VoyageID");
            int iNewDestinationID = pNewFC.Fields.FindField("Destination");
            int iDestinationID    = pVoyageTable.Fields.FindField("Destination");
            int iNewCargoID       = pNewFC.Fields.FindField("Cargo");
            int iCargoID          = pVoyageTable.Fields.FindField("Cargo");
            int iNewDraughtID     = pNewFC.Fields.FindField("Draught");
            int iDraughtID        = pVoyageTable.Fields.FindField("Draught");
            int iNewETAID         = pNewFC.Fields.FindField("ETA");
            int iETAID            = pVoyageTable.Fields.FindField("ETA");
            int iNewStartTimeID   = pNewFC.Fields.FindField("StartTime");
            int iStartTimeID      = pVoyageTable.Fields.FindField("StartTime");
            int iNewEndTimeID     = pNewFC.Fields.FindField("EndTime");
            int iEndTimeID        = pVoyageTable.Fields.FindField("EndTime");
            int iNewMMSIID        = pNewFC.Fields.FindField("MMSI");
            int iMMSIID           = pVoyageTable.Fields.FindField("MMSI");

            object missing = Type.Missing;

            while (pEnum.MoveNext())
            {
                IQueryFilter pQF = new QueryFilterClass();
                pQF.WhereClause = "MMSI = " + pEnum.Current.ToString();
                IFeatureCursor pFeatureCursor = pFL.FeatureClass.Search(pQF, false);
                ITableSort     pTableSort     = new TableSortClass();
                pTableSort.Table  = (ITable)pFL;
                pTableSort.Cursor = (ICursor)pFeatureCursor;
                pTableSort.Fields = "BaseDateTime";
                pTableSort.set_Ascending("BaseDateTime", true);
                pTableSort.Sort(null);
                ICursor          pSortedCursor     = pTableSort.Rows;
                IRow             pRow              = pSortedCursor.NextRow();
                bool             bCreateNewFeature = true;
                DateTime         currDate          = new DateTime(1900, 1, 1);
                DateTime         endDate           = currDate;
                IPointCollection myCollection      = null;
                IPolyline5       myPolyline        = null;
                while (pRow != null)
                {
                    if (pRow is IFeature)
                    {
                        currDate = (DateTime)pRow.get_Value(pRow.Fields.FindField("BaseDateTime"));
                        if (bCreateNewFeature)
                        {
                            myCollection = new PolylineClass();
                            switch (iUserUnits)
                            {
                            case 0:     //seconds
                                endDate = currDate.AddSeconds(m_iUserTime);
                                break;

                            case 1:     //minutes
                                endDate = currDate.AddMinutes(m_iUserTime);
                                break;

                            case 2:     //hours
                                endDate = currDate.AddHours(m_iUserTime);
                                break;

                            case 3:     //days
                                endDate = currDate.AddDays(m_iUserTime);
                                break;

                            case 4:     //months
                                endDate = currDate.AddMonths(m_iUserTime);
                                break;

                            case 5:     //years
                                endDate = currDate.AddYears(m_iUserTime);
                                break;
                            }
                            bCreateNewFeature = false;
                        }

                        if (currDate < endDate)
                        {
                            IFeature pFeature = (IFeature)pRow;

                            IPoint myPoint = (IPoint)pFeature.Shape;
                            myCollection.AddPoint(myPoint, ref missing, ref missing);

                            pRow = pSortedCursor.NextRow();
                        }
                        else
                        {
                            myPolyline = (IPolyline5)myCollection;
                            myPolyline.SpatialReference = pSR;
                            myFeatureBuffer.Shape       = (IGeometry)myPolyline;

                            IQueryFilter pVoyageQF = new QueryFilterClass();
                            pQF.WhereClause = "VoyageID = " + pRow.get_Value(pRow.Fields.FindField("VoyageID"));
                            ICursor pVoyageCursor = pVoyageTable.Search(pQF, true);
                            IRow    pVoyageRow    = pVoyageCursor.NextRow();

                            if (pVoyageRow != null)
                            {
                                myFeatureBuffer.set_Value(iNewVoyageID, pVoyageRow.get_Value(iVoyageID));
                                myFeatureBuffer.set_Value(iNewDestinationID, pVoyageRow.get_Value(iDestinationID));
                                myFeatureBuffer.set_Value(iNewCargoID, pVoyageRow.get_Value(iCargoID));
                                myFeatureBuffer.set_Value(iNewDraughtID, pVoyageRow.get_Value(iDraughtID));
                                myFeatureBuffer.set_Value(iNewETAID, pVoyageRow.get_Value(iETAID));
                                myFeatureBuffer.set_Value(iNewStartTimeID, pVoyageRow.get_Value(iStartTimeID));
                                myFeatureBuffer.set_Value(iNewEndTimeID, pVoyageRow.get_Value(iEndTimeID));
                                myFeatureBuffer.set_Value(iNewMMSIID, pVoyageRow.get_Value(iMMSIID));
                            }
                            else
                            {
                                myFeatureBuffer.set_Value(iNewVoyageID, 0);
                                myFeatureBuffer.set_Value(iNewDestinationID, "");
                                myFeatureBuffer.set_Value(iNewCargoID, 0);
                                myFeatureBuffer.set_Value(iNewDraughtID, 0);
                                myFeatureBuffer.set_Value(iNewETAID, 0);
                                myFeatureBuffer.set_Value(iNewStartTimeID, 0);
                                myFeatureBuffer.set_Value(iNewEndTimeID, 0);
                                myFeatureBuffer.set_Value(iNewMMSIID, 0);
                            }

                            pInsertCursor.InsertFeature(myFeatureBuffer);
                            bCreateNewFeature = true;
                        }
                    }
                }
                myPolyline = (IPolyline5)myCollection;
                myPolyline.SpatialReference = pSR;
                myFeatureBuffer.Shape       = (IGeometry)myPolyline;

                pInsertCursor.InsertFeature(myFeatureBuffer);
            }
            pInsertCursor.Flush();
        }