2017-04-13 46 views
0

私は、メジャーを持つマルチパートポリラインジオメトリのグループを持っています。私はトラフィックフローをよりよく追跡するためにジオメトリを並べ替えることを試みています。 GeometryBridgeを使用して、再注文セグメントをISegmentCollectionに追加しています。 問題は、セグメントにM値がリセットされているため、セグメントがIMSegmentation4セグメントでなければならないことです。これらをISegmentCollection VSに追加しようとすると、プログラムはコンパイルされません。 私は誰もが測定セグメントのセットを蓄積する方法を教えてもらえます?VS2010、ArcGISの10.2およびWindows 7マルチパートジオメトリの順序を変更する

pExGeomColl = (IGeometryCollection)new Polyline(); 
pExGeomColl = (IGeometryCollection)pBaseFeat.ShapeCopy; 
for (int i = 0; i < hGeomToFrom.Count; i++) 
{ 
    iTo = i; 
    iFrom = (int)hGeomToFrom[i]; 
    pGeom = pExGeomColl.Geometry[iFrom]; 
    pGeom.SpatialReference = pSpRef; 
    pMAware = (IMAware)pGeom; 
    pMAware.MAware = true; 

    pPolyline = (IPolyline6)new PolylineClass(); 
    if (pGeom.GeometryType != esriGeometryType.esriGeometryPolyline) 
    { 
     pPolyline = geometryToPolyline(pGeom, false, true, ref sError); 
     if (sError.Length > 0) 
     { 
      sError = "cmdReset\r\n" + sError; 
      clsMain.write_log(sError, clsMain.m_eLogType.FATAL); 
      MessageBox.Show(sError); 
      return; 
     } 

    } 
    else 
    { 
     pPolyline = (IPolyline)pGeom; 
    } 
    dLen = pPolyline.Length; 
    dFrom = dMeasure; 
    dTo = dFrom + dLen; 
    pSeg = (IMSegmentation4)pPolyline; 
    pSeg.SetAndInterpolateMsBetween(dFrom, dTo); 
    dMeasure = dTo; 

    pSegArray[i] = pSeg; 

    ProgressBar1.Value = iCount; 
    iCount++; 
} 

// Add the segment array to a segment collection 
pNewSegColl = (ISegmentCollection)new PolylineClass(); 
pMAware = (IMAware)pNewSegColl; 
pMAware.MAware = true; 

pGeomBridge = new GeometryEnvironmentClass(); 
pGeomBridge.AddSegments(pNewSegColl, pSegArray); // This doesn't work 

pGeom = (IGeometry)pNewSegColl; 
pGeom.SpatialReference = pSpRef; 
pBaseFeat.Shape = pGeom; 

pBaseFeat.Store(); 

を使用していますか

答えて

0

Segment Collectionを使用するのは間違ったアプローチです。セグメントは、ポリラインの頂点間の線分です。

トリックは、ポリラインをジオメトリコレクションに配置し、そのジオメトリコレクションの部分を新しい(並べ替えられた)コレクションに追加することです。

// Existing Geometry Collection 
pExGeomColl = (IGeometryCollection)new PolylineClass(); 
pExGeomColl = (IGeometryCollection)pBaseFeat.ShapeCopy; 
// New Geometry collection 
pNewGeomColl = (IGeometryCollection)new PolylineClass(); 
pMAware = (IMAware)pNewGeomColl; 
pMAware.MAware = true; 
pZAware = (IZAware)pNewGeomColl; 
pZAware.ZAware = bHasZ; 

for (int i = 0; i < hGeomToFrom.Count; i++) 
{ 
    iTo = i; 
    iFrom = (int)hGeomToFrom[i]; 
    pGeom = pExGeomColl.Geometry[iFrom]; 
    pGeom.SpatialReference = pSpRef; 
    pMAware = (IMAware)pGeom; 
    pMAware.MAware = true; 
    pZAware = (IZAware)pGeom; 
    pZAware.ZAware = bHasZ; 
    // Convert the geometry to a polyline 
    pPolyline = (IPolyline6)new PolylineClass(); 
    if (pGeom.GeometryType != esriGeometryType.esriGeometryPolyline) 
    { 
     pPolyline = geometryToPolyline(pGeom, bHasZ, true, ref sError); 
     if (sError.Length > 0) 
     { 
      sError = "cmdReset\r\n" + sError; 
      clsMain.write_log(sError, clsMain.m_eLogType.FATAL); 
      MessageBox.Show(sError); 
      return; 
     } 
    } 
    else 
    { 
     pPolyline = (IPolyline)pGeom; 
    } 
    pMAware = (IMAware)pPolyline; 
    pMAware.MAware = true; 
    pZAware = (IZAware)pPolyline; 
    pZAware.ZAware = bHasZ; 


    dLen = pPolyline.Length; 
    dFrom = dMeasure; 
    dTo = dFrom + dLen; 
    pSeg = (IMSegmentation4)pPolyline; 
    pSeg.SetAndInterpolateMsBetween(dFrom, dTo); 

    IGeometryCollection pXGeomColl = new PolylineClass(); 
    pMAware = (IMAware)pXGeomColl; 
    pMAware.MAware = true; 
    pZAware = (IZAware)pXGeomColl; 
    pZAware.ZAware = bHasZ; 
    pXGeomColl = (IGeometryCollection)pPolyline; 
    for (int j = 0; j < pXGeomColl.GeometryCount; j++) 
     pNewGeomColl.AddGeometry(pXGeomColl.Geometry[j]); 

    dMeasure = dTo; 

    ProgressBar1.Value = iCount; 
    iCount++; 
} 

pGeom = (IGeometry)pNewGeomColl; 
pGeom.SpatialReference = pSpRef; 
pMAware = (IMAware)pGeom; 
pMAware.MAware = true; 
pZAware = (IZAware)pGeom; 
pZAware.ZAware = bHasZ; 
pBaseFeat.Shape = pGeom; 

pBaseFeat.Store(); 
関連する問題