PolylineBuilderEx polylineBuilder = new PolylineBuilderEx(polyline);
polylineBuilder.HasZ = true;
// The HasZ property is set to true for all the points in
// polyline3D when you call ToGeometry().
Polyline polyline3D = polylineBuilder.ToGeometry();
// For this example, create Z-values.
// You may want to pass them in as a parameter.
int numPoints = polyline3D.PointCount;
double[] zValues = new double[numPoints];
for (int i = 0; i < numPoints; i++)
{
zValues[i] = i % 2 == 0 ? 2 : 1;
}
// We need to know at which point index each part starts
int partPointIndex = 0;
int numParts = polyline3D.PartCount;
for (int i = 0; i < numParts; i++)
{
var part = polyline3D.Parts[i];
int numSegments = part.Count;
for (int j = 0; j < numSegments; j++)
{
Segment segment = part[j];
MapPointBuilderEx pointBuilder = new MapPointBuilderEx(segment.StartPoint);
pointBuilder.Z = zValues[partPointIndex++];
MapPoint startPoint = pointBuilder.ToGeometry();
// Make sure that the end point of this segment is the same as the start point of the next segment
pointBuilder = new MapPointBuilderEx(segment.EndPoint);
pointBuilder.Z = zValues[partPointIndex];
MapPoint endPoint = pointBuilder.ToGeometry();
SegmentType segmentType = segment.SegmentType;
SegmentBuilderEx segmentBuilder = null;
switch (segmentType)
{
case SegmentType.Line:
segmentBuilder = new LineBuilderEx((LineSegment)segment);
break;
case SegmentType.Bezier:
segmentBuilder = new CubicBezierBuilderEx((CubicBezierSegment)segment);
break;
case SegmentType.EllipticArc:
segmentBuilder = new EllipticArcBuilderEx((EllipticArcSegment)segment);
break;
}
// Only change the start and end point which now have Z-values set.
// This will preserve the curve if the segment is an EllipticArcSegment or CubicBezierSegment.
segmentBuilder.StartPoint = startPoint;
segmentBuilder.EndPoint = endPoint;
segment = segmentBuilder.ToSegment();
polylineBuilder.ReplaceSegment(i, j, segment);
}
// Move point index for the next part
partPointIndex++;
}
polyline3D = polylineBuilder.ToGeometry();
return polyline3D;