2017-04-13 5 views
0

J'ai un groupe de Géométries Multiples de Polylignes qui ont des mesures. J'essaie de réorganiser les géométries pour mieux suivre le flux de circulation. J'utilise un GeometryBridge pour ajouter les segments re-orderd à un ISegmentCollection. Le problème est que mes segments ont leurs valeurs M réinitialisées donc ils doivent être des segments IMSegmentation4. Quand j'essaye d'ajouter ceci à un ISegmentCollection VS le programme ne compilera pas. J'utilise VS2010, ArcGis 10.2 et Windows 7.Changement de l'ordre des Géométries en plusieurs parties

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(); 

Quelqu'un peut-il me dire comment accumuler un ensemble de segments de mesure?

Répondre

0

J'ai trouvé que l'utilisation d'une collection de segments est la mauvaise approche. Un segment est le segment de droite entre les sommets d'une polyligne.

L'astuce consiste à placer la polyligne dans une collection de géométrie, puis à ajouter les parties de cette collection de géométrie dans la nouvelle collection (réorganisée).

// 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();