//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()); }
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>(); }
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); }
/// <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); }
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(); } }
public CPolyline(int intID, IPolyline5 pPolyline) : this(intID, CHelpFunc.GetCPtLtByIPl(pPolyline), false) { this.pPolyline = pPolyline; }
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; }
/// <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(); }