ArcGIS Pro 3.4 API Reference Guide
ArcGIS.Core.Geometry Namespace / GeometryEngine Class / Centroid Method
The input geometry.
Example Version

Centroid Method (GeometryEngine)
Gets the centroid (center of gravity) of the geometry.
Syntax
public MapPoint Centroid( 
   Geometry geometry
)

Parameters

geometry
The input geometry.

Return Value

Returns the centroid of the geometry.
Exceptions
ExceptionDescription
Geometry is null or empty.
The method is not implemented for GeometryBag.
Remarks
If the geometry is a MapPoint, then the centroid returned is the same as the source; including Z and M-values (if any exist on the source geometry). The centroid of any other geometry type is a point with HasZ = false, HasM = false.
Example
Find the centroid of geometries
// simple polygon
List<Coordinate2D> list2D = new List<Coordinate2D>();
list2D.Add(new Coordinate2D(0, 0));
list2D.Add(new Coordinate2D(0, 2));
list2D.Add(new Coordinate2D(2, 2));
list2D.Add(new Coordinate2D(2, 0));

Polygon polygon = PolygonBuilderEx.CreatePolygon(list2D, SpatialReferences.WGS84);

// verify it is simple
bool isSimple = GeometryEngine.Instance.IsSimpleAsFeature(polygon);
// find the centroid
MapPoint centroid = GeometryEngine.Instance.Centroid(polygon);
// centroid.X = 1
// centroid.Y = 1

// map Point
MapPoint pt1 = MapPointBuilderEx.CreateMapPoint(1, 2, 3, 4, SpatialReferences.WGS84);
MapPoint pt2 = MapPointBuilderEx.CreateMapPoint(5, 2, double.NaN, 7);

// pt1.HasZ = true
// pt1.HasM = true
centroid = GeometryEngine.Instance.Centroid(pt1);
// centroid.HasZ = true
// centroid.HasM = true
// pt1.IsEqual(centroid) = true

// multipoint
List<MapPoint> list = new List<MapPoint>() { pt1, pt2 };
Multipoint multipoint = MultipointBuilderEx.CreateMultipoint(list);
// multipoint.HasZ = true
// multipoint.HasM = true

centroid = GeometryEngine.Instance.Centroid(multipoint);
// centroid.X = 3
// centroid.Y = 2
// centroid.HasZ = false
// centroid.HasM = false
Rotate or Move the Annotation
      await QueuedTask.Run(() =>
      {
          //Don't use 'Shape'....Shape is the bounding box of the annotation text. This is NOT what you want...
          //
          //var insp = new Inspector();
          //insp.Load(annoLayer, oid);
          //var shape = insp["SHAPE"] as Polygon;
          //...wrong shape...

          //Instead, we must get the TextGraphic from the anno feature.
          //The TextGraphic shape will be the anno baseline...
          //At 2.1 the only way to retrieve this textLine is to obtain the TextGraphic from the AnnotationFeature
          QueryFilter qf = new QueryFilter()
          {
              WhereClause = "OBJECTID = 1"
          };

  //annoLayer is ~your~ Annotation layer

  using (var rowCursor = annoLayer.Search(qf))
  {
    if (rowCursor.MoveNext())
    {
      using (var annoFeature = rowCursor.Current as 
                  ArcGIS.Core.Data.Mapping.AnnotationFeature)
      {
        var graphic = annoFeature.GetGraphic();
        var textGraphic = graphic as CIMTextGraphic;
        var textLine = textGraphic.Shape as Polyline;
        // rotate the shape 90 degrees
        var origin = GeometryEngine.Instance.Centroid(textLine);
        Geometry rotatedPolyline = GeometryEngine.Instance.Rotate(textLine, origin, System.Math.PI / 2);
        //Move the line 5 "units" in the x and y direction
        //GeometryEngine.Instance.Move(textLine, 5, 5);

        EditOperation op = new EditOperation();
        op.Name = "Change annotation angle";
        op.Modify(annoLayer, oid, rotatedPolyline);
        op.Execute();
      }
    }
  }
});
Requirements

Target Platforms: Windows 11, Windows 10

ArcGIS Pro version: 3 or higher.
See Also