ArcGIS Pro 3.2 API Reference Guide
ArcGIS.Core.Geometry Namespace / MultipartBuilderEx Class / HasZ Property
Example

In This Topic
    HasZ Property (MultipartBuilderEx)
    In This Topic
    Gets or sets the HasZ flag which indicates whether the geometry contains Zs.
    Syntax
    public override bool HasZ {get; set;}
    Public Overrides Property HasZ As Boolean
    Example
    Builder Properties
    // list of points
    List<MapPoint> points = new List<MapPoint>
    {
      MapPointBuilderEx.CreateMapPoint(0, 0, 2, 3, 1),
      MapPointBuilderEx.CreateMapPoint(1, 1, 5, 6),
      MapPointBuilderEx.CreateMapPoint(2, 1, 6),
      MapPointBuilderEx.CreateMapPoint(0, 0)
    };
    
    // will have attributes because it is created with convenience method
    Polyline polylineWithAttrs = PolylineBuilderEx.CreatePolyline(points);
    bool hasZ = polylineWithAttrs.HasZ;          // hasZ = true
    bool hasM = polylineWithAttrs.HasM;          // hasM = true
    bool hasID = polylineWithAttrs.HasID;        // hasID = true
    
    // will not have attributes because it is specified as a parameter
    Polyline polylineWithoutAttrs = 
      PolylineBuilderEx.CreatePolyline(points, AttributeFlags.None);
    hasZ = polylineWithoutAttrs.HasZ;          // hasZ = false
    hasM = polylineWithoutAttrs.HasM;          // hasM = false
    hasID = polylineWithoutAttrs.HasID;        // hasID = false
    
    // will have attributes because it is created with convenience method
    Polygon polygonWithAttrs = PolygonBuilderEx.CreatePolygon(points);
    hasZ = polygonWithAttrs.HasZ;               // hasZ = true
    hasM = polygonWithAttrs.HasM;               // hasM = true
    hasID = polygonWithAttrs.HasID;             // hasID = true
    
    // will not have attributes because it is specified as a parameter
    Polygon polygonWithoutAttrs = 
          PolygonBuilderEx.CreatePolygon(points, AttributeFlags.None);
    hasZ = polygonWithoutAttrs.HasZ;               // hasZ = false
    hasM = polygonWithoutAttrs.HasM;               // hasM = false
    hasID = polygonWithoutAttrs.HasID;             // hasID = false
    
    // will not have attributes because it is specified as a parameter
    PolylineBuilderEx polylineB = 
               new PolylineBuilderEx(points, AttributeFlags.None);
    hasZ = polylineB.HasZ;                      // hasZ = false
    hasM = polylineB.HasM;                      // hasM = false
    hasID = polylineB.HasID;                    // hasID = false
    
    // will have attributes because it is passed an attributed polyline
    polylineB = new PolylineBuilderEx(polylineWithAttrs);
    hasZ = polylineB.HasZ;                      // hasZ = true
    hasM = polylineB.HasM;                      // hasM = true
    hasID = polylineB.HasID;                    // hasID = true
    
    // will not have attributes because it is passed a non-attributed polyline
    polylineB = new PolylineBuilderEx(polylineWithoutAttrs);
    hasZ = polylineB.HasZ;                      // hasZ = false
    hasM = polylineB.HasM;                      // hasM = false
    hasID = polylineB.HasID;                    // hasID = false
    
    // will not have attributes because it is specified as a parameter
    PolygonBuilderEx polygonB = new PolygonBuilderEx(points, AttributeFlags.None);
    hasZ = polygonB.HasZ;                       // hasZ = false
    hasM = polygonB.HasM;                       // hasM = false
    hasID = polygonB.HasID;                     // hasID = false
    
    // will have attributes because it is passed an attributed polygon
    polygonB = new PolygonBuilderEx(polygonWithAttrs);
    hasZ = polygonB.HasZ;                       // hasZ = true
    hasM = polygonB.HasM;                       // hasM = true
    hasID = polygonB.HasID;                     // hasID = true
    
    // will not have attributes because it is passed a non-attributed polygon
    polygonB = new PolygonBuilderEx(polygonWithoutAttrs);
    hasZ = polygonB.HasZ;                       // hasZ = true
    hasM = polygonB.HasM;                       // hasM = true
    hasID = polygonB.HasID;                     // hasID = true
    
    Create 3D Polyline and set Z-values while preserving curve segments
    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;
    
    Requirements

    Target Platforms: Windows 11, Windows 10

    ArcGIS Pro version: 3 or higher.
    See Also