Provides access to additional linear referencing operations on polylines.
Members
| Name | Description | |
|---|---|---|
![]() |
CalculateNonSimpleMs | Redefines the non-simple Ms to be values obtained from interpolation of surrounding defined Ms, or extrapolation of Ms. |
![]() |
CalibrateByDistance | Calibrates Ms of existing vertices using new Ms from the input points and the shortest path distances along the polyline between those points. The update method is given as a combination of esriGeometryUpdateMEnum values. |
![]() |
CalibrateByMs | Calibrates Ms of existing vertices using new Ms from the input points and existing Ms along shortest paths between those points. The update method is given as a combination of esriGeometryUpdateMEnum values. |
![]() |
ExtrapolateMs | Extrapolates the Ms at one or both ends of the geometry based on the M interval between the fromIndex and the toIndex. |
![]() |
GetDistancesAtM | Returns an array of distances along the polyline at which is located the specified M. If the geometry's M's are monotonic along the geometry then the array will only have one element. |
![]() |
GetMsAtDistance | Returns M values at the distance along the geometry. An array of one or two Ms is returned. Two Ms can be returned if the given distance is exactly at the beginning or ending of a part. |
![]() |
GetPointsAtM | Returns a multipoint geometry corresponding to the locations along the geometry where the specified M occurs. |
![]() |
GetSubcurveBetweenMs | Returns a polyline geometry corresponding to the subcurve(s) between the fromM and the toM. |
![]() |
GetSubcurveBetweenMsEx | Returns a polyline geometry corresponding to the subcurve(s) between the fromM and the toM values. The 'details' arguments are composed of esriMCurveRelationEnum values. |
![]() |
InsertMAtDistance | Sets the M value at the given distance along the geometry; creates a point at that distance if no point exists there. |
![]() |
InterpolateMsBetween | Generates Ms by linear interpolation of segment distances for all vertices in the range [start+1, end-1]. |
![]() |
MMax | The maximum M value. |
![]() |
MMin | The minimum M value. |
![]() |
MMonotonic | A value indicating whether Ms are monotonic, and if so, whether they are ascending or descending. |
![]() |
MultiplyMs | Multiplies all the M values by a factor. |
![]() |
OffsetMs | Offsets all the M values by an offset value. |
![]() |
ReverseMsOrder | Reverses the order of the Ms along the geometry. |
![]() |
SetAndInterpolateMsBetween | Sets the Ms at the beginning and the end of the geometry and interpolates the M values between these values. |
![]() |
SetMsAsDistance | Sets the M values to the cumulative length from the origin of the geometry. |
![]() |
SetMsAsDistance2 | Sets Ms on vertices as scaled and offset distances from the input origin as measured along the polyline. Shortest path distances from the origin are used. Optionally ignores distances between parts of the polyline. |
![]() |
UpdateMsByDistance | Updates Ms along the shortest path between the specified endpoints. The interpolation ratio is determined by the input ms and euclidean distance along that path. The update method is given as a combination of esriGeometryUpdateMEnum values. |
![]() |
UpdateMsByMs | Updates Ms along the shortest path between the specified endpoints. The interpolation ratio is determined by the existing ms along that path and the input ms. The update method is given as a combination of esriGeometryUpdateMEnum values. |
IMSegmentation2.CalibrateByDistance Method
Calibrates Ms of existing vertices using new Ms from the input points and the shortest path distances along the polyline between those points. The update method is given as a combination of esriGeometryUpdateMEnum values.
Public Function CalibrateByDistance ( _
    ByVal Points As IEnumVertex, _
    ByVal updateHow As Integer, _
    ByVal ignoreGaps As Boolean, _
    ByVal cutoffDistance As Double _
) As IEnumSplitPoint
public IEnumSplitPoint CalibrateByDistance (
    IEnumVertex Points,
    int updateHow,
    bool ignoreGaps,
    double cutoffDistance
);
Remarks
The updateHow argument is given as a combination of esriGeometryUpdateMEnum values. When combining multiple values, the bitwise Or operator should always be used. This assures an error-free combination of the values (as long as the attempted combination is valid). Do not use the addition operator (+) to combine the values as unexpected results may occur.
For example, to interpolate between the input points and to extrapolate before and after the input points, you would use 7, which equates to: esriGeometryInterpolate OR esriGeometryExtrapolateBefore OR esriGeometryExtrapolateAfter. A value of 0 will only split the input polyline and assign the Ms value to the new created vertex. If an input point has the same X (or projected to the same X) as an existing vertex the Ms value of the existing vertex will be updated.
Note : The "After" and "Before" for the updateHow parameter is define by the order of the points in the multipoints. Ex : If the points are define from left to right the "Before" will be at the left of the first point and the "After" will be at the right of the last point.
The cutoffDistance parameter is an input Double that represents the distance from the polyline from where points are not considered anymore as being valid calibration points.
The following picture demonstrates graphically the method behavior. A updateHow paramater of 7 has been used.

esriGeometryInterpolate = 0001 (1) esriGeometryExtrapolateBefore = 0010 (2) esriGeometryExtrapolateAfter = 0100 (4)
0001
0010
0100
----
0111
public void CalibratePolyLineByDistance(IPolyline polyline, IMultipoint multipoint, int updateHow, bool ignoreGaps, double cutOffDistance)
{
/*
This function will use IMSegmentation2.CalibrateByDistance. This method
calibrates the Ms using geometric distance. If you want to calibrate using
some existing M values, then use IMSegmentation2.CalibrateByMs
updateHow is a bitwise combination of these three values:
esriGeometryInterpolate = 1
esriGeometryExtrapolateBefore = 2
esriGeometryExtrapolateAfter = 4
Note that CalibrateByDistance does not require that MultiPoint's points
fall on top of the PolyLine. You might consider adding some logic to make
sure that the points fall on top of (e.g. ITopologicalOperator.Intersect)
or are within a tolerance (e.g. IProximityOperator.ReturnDistance)
If you pass in a PolyLine that is from a data source of unknown quality,
you may consider calling IGeometryCollection.GeometriesChanged before
you call IPolyLine.SimplifyNetwork below. This is because SimplifyNetwork
will not do anything if the geometry is assumed to be simple. Calling
GeometriesChanged tells the geometry that it is not simple.
*/
//This operation must be performed on a simple geometry
polyline.SimplifyNetwork();
//The MultiPoint's points should have Ms
IMAware mAware = multipoint as IMAware;
if(!mAware.MAware)
{
return;
}
//The PolyLine should be M Aware as well.
mAware = polyline as IMAware;
if(!mAware.MAware)
{
return;
}
IMSegmentation2 mSegmentation = polyline as IMSegmentation2;
IPointCollection pointCollection = multipoint as IPointCollection;
IEnumVertex enumVertex = pointCollection.EnumVertices;
IEnumSplitPoint enumSplitPoint = mSegmentation.CalibrateByDistance(enumVertex, updateHow, ignoreGaps, cutOffDistance);
//Note that we do nothing with enumSplitPoint. IEnumSplitPoint specializes
//IEnumVertex and gives additional information about the locations in a
//PolyLine where it was split by a set of input points
}
Public Sub CalibratePolyLineByDistance(ByVal pPl As ESRI.ArcGIS.Geometry.IPolyline, ByVal pMP As ESRI.ArcGIS.Geometry.IMultipoint, _
       ByVal updateHow As Long, ByVal ignoreGaps As Boolean, ByVal dCOffDist As Double)
       '+++ This function will use IMSegmentation2::CalibrateByDistance. This function
       '+++ calibrates the Ms using geometric distance. If you want to calibrate using
       '+++ some existing M values, then use IMSegmentation2::CalibrateByMs
       '+++ updateHow is a bitwise combination of these three values:
       '+++      esriGeometryInterpolate = 1
       '+++      esriGeometryExtrapolateBefore = 2
       '+++      esriGeometryExtrapolateAfter = 4
       '+++ Note that CalibrateByDistance does not require that MultiPoint's points
       '+++ fall on top of the PolyLine. You might consider adding some logic to make
       '+++ sure that the points fall on top of (e.g. ITopologicalOperator::Intersect)
       '+++ or are within a tolerance (e.g. IProximityOperator::ReturnDistance)
       '+++ If you pass in a PolyLine that is from a data source of unknown quality,
       '+++ you may consider calling IGeometryCollection::GeometriesChanged before
       '+++ you call IPolyLine::SimplifyNetwork below. This is because SimplifyNetwork
       '+++ will not do anything if the geometry is assumed to be simple. Calling
       '+++ GeometriesChanged tells the geometry that it is not simple.
       '+++ This operation must be performed on a simple geometry
       pPl.SimplifyNetwork()
       Dim pMA As ESRI.ArcGIS.Geometry.IMAware
       Dim pMSeg As ESRI.ArcGIS.Geometry.IMSegmentation2
       '+++ The MultiPoint's points should have Ms
       pMA = pMP
       If Not pMA.MAware Then _
         Err.Raise(vbObjectError + 11282000, "CalibratePolyLineByDistance", "MultiPoint Not M Aware")
       '+++ The PolyLine should be M Aware as well.
       pMA = Nothing
       pMA = pPl
       If Not pMA.MAware Then
           Err.Raise(vbObjectError + 11282000, "CalibratePolyLineByDistance", "PolyLine Not M Aware")
       Else
           Dim pPC As ESRI.ArcGIS.Geometry.IPointCollection
           Dim pEnumV As ESRI.ArcGIS.Geometry.IEnumVertex
           Dim pEnumSp As ESRI.ArcGIS.Geometry.IEnumSplitPoint
           pMSeg = pMA
           pPC = pMP
           pEnumV = pPC.EnumVertices
           pEnumSp = pMSeg.CalibrateByDistance(pEnumV, updateHow, ignoreGaps, dCOffDist)
       End If
       '+++ Note that we do nothing with pEnumSp. IEnumSplitPoint specializes
       '+++ IEnumVertex and gives additional information about the locations in a
       '+++ PolyLine where it was split by a set of input points
   End Sub
IMSegmentation2.CalibrateByMs Method
Calibrates Ms of existing vertices using new Ms from the input points and existing Ms along shortest paths between those points. The update method is given as a combination of esriGeometryUpdateMEnum values.
Public Function CalibrateByMs ( _
    ByVal Points As IEnumVertex, _
    ByVal updateHow As Integer, _
    ByVal cutoffDistance As Double _
) As IEnumSplitPoint
public IEnumSplitPoint CalibrateByMs (
    IEnumVertex Points,
    int updateHow,
    double cutoffDistance
);
Remarks
The updateHow argument is given as a combination of esriGeometryUpdateMEnum values. When combining multiple values, the bitwise Or operator should always be used. This assures an error-free combination of the values (as long as the attempted combination is valid). Do not use the addition operator (+) to combine the values as unexpected results may occur.
The cutoffDistance parameter is an input Double that represents the distance from the polyline from where points are not considered anymore as being valid calibration points.
For example, to interpolate between the input points and to extrapolate before and after the input points, you would use 7, which equates to: esriGeometryInterpolate OR esriGeometryExtrapolateBefore OR esriGeometryExtrapolateAfter
esriGeometryInterpolate = 0001 (1) esriGeometryExtrapolateBefore = 0010 (2) esriGeometryExtrapolateAfter = 0100 (4)
public void CalibratePolyLineByMs(IPolyline polyline, IMultipoint multipoint, int updateHow, double cutOffDistance)
{
 /*
  This function will use IMSegmentation2.CalibrateByMs. This function
  calibrates the Ms using measure distance. If you want to calibrate using
  some existing geometric distance, then use IMSegmentation2.CalibrateByDistance
Â
  updateHow is a bitwise combination of these three values:
        esriGeometryInterpolate = 1
        esriGeometryExtrapolateBefore = 2
        esriGeometryExtrapolateAfter = 4
Â
  Note that CalibrateByMs does not require that the MultiPoint's points
  fall on top of the PolyLine. You might consider adding some logic to make
  sure that the points fall on top of (e.g. ITopologicalOperator.Intersect)
  or are within a tolerance (e.g. IProximityOperator.ReturnDistance)
Â
  If you pass in a PolyLine that is from a data source of unknown quality,
  you may consider calling IGeometryCollection.GeometriesChanged before
  you call IPolyLine.SimplifyNetwork below. This is because SimplifyNetwork
  will not do anything if the geometry is assumed to be simple. Calling
  GeometriesChanged tells the geometry that it is not simple.
Â
  This operation must be performed on a simple geometry
 */
 //This operation must be performed on a simple geometry
 polyline.SimplifyNetwork();
 Â
 //The MultiPoint's points should have Ms
 IMAware mAware = multipoint as IMAware;
 if(!mAware.MAware)
 {
   return;
 }
 //The PolyLine should be M Aware as well.
 mAware = polyline as IMAware;
 if(!mAware.MAware)
 {
   return;
 }
 IMSegmentation2 mSegmentation = polyline as IMSegmentation2;
 IPointCollection pointCollection = multipoint as IPointCollection;
 IEnumVertex enumVertex = pointCollection.EnumVertices;
 IEnumSplitPoint enumSplitPoint = mSegmentation.CalibrateByMs(enumVertex, updateHow, cutOffDistance);
 //Note that we do nothing with enumSplitPoint. IEnumSplitPoint specializes
 //IEnumVertex and gives additional information about the locations in a
 //PolyLine where it was split by a set of input points
Â
}
Public Sub CalibratePolyLineByMs(ByVal pPl As ESRI.ArcGIS.Geometry.IPolyline, ByVal pMP As ESRI.ArcGIS.Geometry.IMultipoint, ByVal updateHow As Long, ByVal dCutOffDist As Double)
       '+++ This function will use IMSegmentation2::CalibrateByMs. This functionÂ
       '+++ calibrates the Ms using measure distance. If you want to calibrate usingÂ
       '+++ some existing geometric distance, then use IMSegmentation2::CalibrateByDistance  Â
       '+++ updateHow is a bitwise combination of these three values:Â
       '+++      esriGeometryInterpolate = 1Â
       '+++      esriGeometryExtrapolateBefore = 2Â
       '+++      esriGeometryExtrapolateAfter = 4  Â
       '+++ Note that CalibrateByMs does not require that the MultiPoint's pointsÂ
       '+++ fall on top of the PolyLine. You might consider adding some logic to makeÂ
       '+++ sure that the points fall on top of (e.g. ITopologicalOperator::Intersect)Â
       '+++ or are within a tolerance (e.g. IProximityOperator::ReturnDistance)  Â
       '+++ If you pass in a PolyLine that is from a data source of unknown quality,Â
       '+++ you may consider calling IGeometryCollection::GeometriesChanged beforeÂ
       '+++ you call IPolyLine::SimplifyNetwork below. This is because SimplifyNetworkÂ
       '+++ will not do anything if the geometry is assumed to be simple. CallingÂ
       '+++ GeometriesChanged tells the geometry that it is not simple.  Â
       '+++ This operation must be performed on a simple geometryÂ
       pPl.SimplifyNetwork()
       Dim pMA As ESRI.ArcGIS.Geometry.IMAware
       Dim pMSeg As ESRI.ArcGIS.Geometry.IMSegmentation2
       '+++ The MultiPoint's points should have MsÂ
       pMA = pMP
       If Not pMA.MAware Then
           Err.Raise(vbObjectError + 11282000, "CalibratePolyLineByMs", "MultiPoint Not M Aware")
       End If
       '+++ The PolyLine should be M Aware as well.Â
       pMA = Nothing
       pMA = pPl
       If Not pMA.MAware Then
           Err.Raise(vbObjectError + 11282000, "CalibratePolyLineByMs", "PolyLine Not M Aware")
       Else
           Dim pPC As ESRI.ArcGIS.Geometry.IPointCollection
           Dim pEnumV As ESRI.ArcGIS.Geometry.IEnumVertex
           Dim pEnumSp As ESRI.ArcGIS.Geometry.IEnumSplitPoint
           pMSeg = pMA
           pPC = pMP
           pEnumV = pPC.EnumVertices
           pEnumSp = pMSeg.CalibrateByMs(pEnumV, updateHow, dCutOffDist)
       End If
       '+++ Note that we do nothing with pEnumSp. IEnumSplitPoint specializesÂ
       '+++ IEnumVertex and gives additional information about the locations in aÂ
       '+++ PolyLine where it was split by a set of input points
   End Sub
IMSegmentation2.GetSubcurveBetweenMsEx Method
Returns a polyline geometry corresponding to the subcurve(s) between the fromM and the toM values. The 'details' arguments are composed of esriMCurveRelationEnum values.
Public Function GetSubcurveBetweenMsEx ( _
    ByVal fromM As Double, _
    ByVal toM As Double, _
    ByRef fromMDetails As Integer, _
    ByRef toMDetails As Integer _
) As IGeometryCollection
public IGeometryCollection GetSubcurveBetweenMsEx (
    double fromM,
    double toM,
    ref int fromMDetails,
    ref int toMDetails
);
IMSegmentation2.SetMsAsDistance2 Method
Sets Ms on vertices as scaled and offset distances from the input origin as measured along the polyline. Shortest path distances from the origin are used. Optionally ignores distances between parts of the polyline.
Public Sub SetMsAsDistance2 ( _
    ByVal Origin As IPoint, _
    ByVal Scale As Double, _
    ByVal Offset As Double, _
    ByVal ignoreGaps As Boolean _
)
public void SetMsAsDistance2 (
    IPoint Origin,
    double Scale,
    double Offset,
    bool ignoreGaps
);
IMSegmentation2.UpdateMsByDistance Method
Updates Ms along the shortest path between the specified endpoints. The interpolation ratio is determined by the input ms and euclidean distance along that path. The update method is given as a combination of esriGeometryUpdateMEnum values.
Public Sub UpdateMsByDistance ( _
    ByVal fromPart As Integer, _
    ByVal FromPoint As Integer, _
    ByVal toPart As Integer, _
    ByVal ToPoint As Integer, _
    ByVal fromM As Double, _
    ByVal toM As Double, _
    ByVal updateHow As Integer, _
    ByVal ignoreGaps As Boolean _
)
public void UpdateMsByDistance (
    int fromPart,
    int FromPoint,
    int toPart,
    int ToPoint,
    double fromM,
    double toM,
    int updateHow,
    bool ignoreGaps
);
Remarks
The updateHow argument is given as a combination of esriGeometryUpdateMEnum values. When combining multiple values, the bitwise Or operator should always be used. This assures an error-free combination of the values (as long as the attempted combination is valid). Do not use the addition operator (+) to combine the values as unexpected results may occur.
For example, to interpolate between the input points and to extrapolate before and after the input points, you would use 7, which equates to: esriGeometryInterpolate OR esriGeometryExtrapolateBefore OR esriGeometryExtrapolateAfter
esriGeometryInterpolate = 0001 (1)
esriGeometryExtrapolateBefore = 0010 (2)
esriGeometryExtrapolateAfter = 0100 (4)
0001
0010
0100
----
0111
IMSegmentation2.UpdateMsByMs Method
Updates Ms along the shortest path between the specified endpoints. The interpolation ratio is determined by the existing ms along that path and the input ms. The update method is given as a combination of esriGeometryUpdateMEnum values.
Public Sub UpdateMsByMs ( _
    ByVal fromPart As Integer, _
    ByVal FromPoint As Integer, _
    ByVal toPart As Integer, _
    ByVal ToPoint As Integer, _
    ByVal fromM As Double, _
    ByVal toM As Double, _
    ByVal updateHow As Integer _
)
public void UpdateMsByMs (
    int fromPart,
    int FromPoint,
    int toPart,
    int ToPoint,
    double fromM,
    double toM,
    int updateHow
);
Remarks
The updateHow argument is given as a combination of esriGeometryUpdateMEnum values. When combining multiple values, the bitwise Or operator should always be used. This assures an error-free combination of the values (as long as the attempted combination is valid). Do not use the addition operator (+) to combine the values as unexpected results may occur.
For example, to interpolate between the input points and to extrapolate before and after the input points, you would use 7, which equates to: esriGeometryInterpolate OR esriGeometryExtrapolateBefore OR esriGeometryExtrapolateAfter
esriGeometryInterpolate = 0001 (1) esriGeometryExtrapolateBefore = 0010 (2) esriGeometryExtrapolateAfter = 0100 (4)
Inherited Interfaces
| Interfaces | Description |
|---|---|
| IMSegmentation | Provides access to members for defining an M-based linear coordinate system on a polyline or polygon. |
| IMCollection | Provides access to members that control operations on M-aware multipoints, polylines, polygons and multipatches. |
Classes that implement IMSegmentation2
| Classes | Description |
|---|---|
| Polyline | An ordered collection of paths; optionally has measure, height and ID attributes. |
Remarks
The IMSegmentation2 interface (like the IMSegmenation interface) also provides methods designed to work with the dynamic segmentation functionality in ArcObjects. These methods offer extended ways to interpolate and update the m attributes on a PolyLine, by cumulative distance and also by existing m values.

