// define with a radius, arcLength and chord direction varcircularArcDef=newCircularArcDefinition{Radius=-201.0,ArcLength=45.29,ChordDirection=ParcelUtilities.Instance.ConvertQuadrantBearingDMSToNorthAzimuthDecDeg("N21-47-57W")};varcogoCircArc=COGOLineBuilder.CreateCOGOCircularArc(circularArcDef);// define with a radius, chordLength and tangent direction varcircularArcDef2=newCircularArcDefinition{Radius=-201.0,ChordLength=44.0,TangentDirection=340.0};varcogoCircArc2=COGOLineBuilder.CreateCOGOCircularArc(circularArcDef2);// define with a radius, central angle and radial directionvarcircularArcDef3=newCircularArcDefinition{Radius=-201.0,CentralAngle=44.0,RadialDirection=340.0};varcogoCircArc3=COGOLineBuilder.CreateCOGOCircularArc(circularArcDef3);
if(cogoLine.IsStraightLine){vardist=cogoLine.Distance;vardir=cogoLine.Direction;}elseif(cogoLine.IsCircularArc){varcircArcDefinition=cogoLine.ToCircularArcDefinition();strings="";//show Arc length, either entered or calculatedif(circArcDefinition.IsDefinedByArcLength){if(circArcDefinition.ArcLength.HasValue){s+="<entered> Arc Length: "+circArcDefinition.ArcLength.Value.ToString("F3")+Environment.NewLine;}}else{if(circArcDefinition.CanCalculateArcLength()){s+="<calc> Arc Length: "+circArcDefinition.CalculateArcLength().ToString("F3")+Environment.NewLine;}elses+="<calc> not able to calc arc length."+Environment.NewLine;}// chordLengthif(circArcDefinition.IsDefinedByChordLength){if(circArcDefinition.ChordLength.HasValue){s+="<entered> Chord Length: "+circArcDefinition.ChordLength.Value.ToString("F3")+Environment.NewLine;}}else{if(circArcDefinition.CanCalculateChordLength()){s+="<calc> Chord Length: "+circArcDefinition.CalculateChordLength().ToString("F3")+Environment.NewLine;}elses+="<calc> not able to calc chord length."+Environment.NewLine;}// central Angleif(circArcDefinition.IsDefinedByCentralAngle){if(circArcDefinition.CentralAngle.HasValue){s+="<entered> Central Angle: "+circArcDefinition.CentralAngle.Value.ToString("F3")+Environment.NewLine;}}else{if(circArcDefinition.CanCalculateCentralAngle()){s+="<calc> Central Angle: "+circArcDefinition.CalculateCentralAngle().ToString("F3")+Environment.NewLine;}elses+="<calc> not able to calc Central Angle."+Environment.NewLine;}}
Create a Traverse
List<COGOLine>lstCOGOLines=new();vardirection=ParcelUtilities.Instance.ConvertQuadrantBearingDMSToNorthAzimuthDecDeg("S7-46-51-E");lstCOGOLines.Add(COGOLineBuilder.CreateCOGOStraightLine(nAzDirection,61.45));//1lstCOGOLines.Add(COGOLineBuilder.CreateCOGOStraightLine(166.2625,37.22));//2lstCOGOLines.Add(COGOLineBuilder.CreateCOGOStraightLine(255.2833333,71.4));//3varcircArcDef=newCircularArcDefinition{Radius=-201.0,ArcLength=45.29,ChordDirection=ParcelUtilities.Instance.ConvertQuadrantBearingDMSToNorthAzimuthDecDeg("N21-47-57W")};lstCOGOLines.Add(COGOLineBuilder.CreateCOGOCircularArc(circArcDef));//4vartangentCurveDef=newTangentCurveDefinition{Radius=169.0,ArcLength=52.40};lstCOGOLines.Add(COGOLineBuilder.CreateCOGOCircularArc(tangentCurveDef));//5tangentCurveDef=newTangentCurveDefinition{Radius=13.0,ArcLength=22.98};lstCOGOLines.Add(COGOLineBuilder.CreateCOGOCircularArc(tangentCurveDef));//6tangentCurveDef=newTangentCurveDefinition{Radius=-281.0,ArcLength=73.68};lstCOGOLines.Add(COGOLineBuilder.CreateCOGOCircularArc(tangentCurveDef));//7varspatialReference=map?.SpatialReference;vartravParcel=newTraverse(spatialReference);awaittravParcel.AddCoursesAsync(lstCOGOLines);if(travParcel.IsValid()){;//insert code to use the traverse}
Iterate Traverse Courses
// iterate thru coursesforeach(varcourseintravParcel.Courses){varcourseCOGOLine=course.COGOLine;varentranceTangentDir=course.EntranceTangentDirection;varexitTangentDir=course.ExitTangentDirection;// tangent to prior course if one of the following// - defined with a ArcGIS.Desktop.Editing.COGO.TangentCurveDefinition// - defined as a straight line defined with a 0 deflection angle.varisTangentToPriorCourse=course.IsDefinedAsTangentToPriorCourse;// IsTangent if one of the following// - IsTangentToPriorCourse// - is implied tangent - ie difference between entranceTangentDirection and previous courses ExitTangentDirection < tolerancevarisTangent=course.IsTangent;}
varstartPoint=MapPointBuilderEx.CreateMapPoint(7500500.0,445900.0,spatialReference);travParcel.StartPoint=startPoint;// The geometry of the features created is affected by the ground to grid correction.// This correction is also assigned to the traverse and in the following code the// active map's ground to grid correction is used.varg2gCorrection=map?.GetDefinition()?.GroundToGridCorrection;if(g2gCorrection!=null){travParcel.UseGroundToGridCorrections=true;travParcel.GroundToGridCorrection=g2gCorrection;}elsetravParcel.UseGroundToGridCorrections=false;// calculate coordinates if(travParcel.CanCalculateCoordinates()){varcoords=travParcel.CalculateCoordinates();varsb=newStringBuilder();sb.AppendLine("Calculated Coordinates:");foreach(varcoordincoords){sb.AppendLine($"{coord.X:F2}, {coord.Y:F2}");}}
Create Features
varlayerName="Lot_Lines";//Name of the COGO enabled line layer in the mapvarfLayer=MapView.Active?.Map?.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(l =>l.Name.Equals(layerName,StringComparison.OrdinalIgnoreCase)).FirstOrDefault();vartemplateLotLines=fLayer.GetTemplates().FirstOrDefault();//get the feature templatevareditOper=newEditOperation{Name="Create Traverse",SelectNewFeatures=false};vardirOffset=g2gCorrection.GetDirectionOffset();varscaleFactor=g2gCorrection.GetConstantScaleFactor();vardictAttributes=newDictionary<string,object>();dictAttributes["Rotation"]=dirOffset;dictAttributes["Scale"]=scaleFactor;if(editOper.CanCreateTraverse(travParcel,templateLotLines)){awaiteditOper.CreateTraverse(travParcel,templateLotLines,dictAttributes);}if(!editOper.IsEmpty){editOper.Execute();// access the mapMember, OID for each created feature foreach(varcourseintravParcel.Courses){varmapMember=course.MapMember;varoid=course.ObjectID;varinsp=newArcGIS.Desktop.Editing.Attributes.Inspector();insp.Load(mapMember,oid);varshape=insp.Shape;}}
Loading a traverse into the Traverse UI
varisValidTrav=travParcel.IsValid();//confirm it's a valid traverseif(!isValidTrav)return;//Load the traverse into the traverse gridawaitTraverseManager.Current.LoadTraverse(travParcel,"Load my custom traverse");