Create a COGOLine defined by direction and distance
var nAzDirection = ParcelUtilities.Instance.ConvertQuadrantBearingDMSToNorthAzimuthDecDeg("S7-46-51-E");
var cogoStraightLine = COGOLineBuilder.CreateCOGOStraightLine(nAzDirection, 61.45);
Create a COGOLine defined by deflection angle and distance
// define with a radius, arcLength and chord direction
var circularArcDef = new CircularArcDefinition
{
Radius = -201.0,
ArcLength = 45.29,
ChordDirection = ParcelUtilities.Instance.ConvertQuadrantBearingDMSToNorthAzimuthDecDeg("N21-47-57W")
};
var cogoCircArc = COGOLineBuilder.CreateCOGOCircularArc(circularArcDef);
// define with a radius, chordLength and tangent direction
var circularArcDef2 = new CircularArcDefinition
{
Radius = -201.0,
ChordLength = 44.0,
TangentDirection = 340.0
};
var cogoCircArc2 = COGOLineBuilder.CreateCOGOCircularArc(circularArcDef2);
// define with a radius, central angle and radial direction
var circularArcDef3 = new CircularArcDefinition
{
Radius = -201.0,
CentralAngle = 44.0,
RadialDirection = 340.0
};
var cogoCircArc3 = COGOLineBuilder.CreateCOGOCircularArc(circularArcDef3);
Create a COGOLine defined by a tangent curve
var tangentCircArcDef = new TangentCurveDefinition
{
Radius = 169.0,
ArcLength = 52.40
};
var cogoTangentArc = COGOLineBuilder.CreateCOGOCircularArc(tangentCircArcDef);
var tangentCircArcDef2 = new TangentCurveDefinition
{
Radius = -201.0,
ChordLength = 23.24
};
var cogoTangentArc2 = COGOLineBuilder.CreateCOGOCircularArc(tangentCircArcDef2);
var tangentCircArcDef3 = new TangentCurveDefinition
{
Radius = 169.0,
CentralAngle = 44.0
};
var cogoTangentArc3 = COGOLineBuilder.CreateCOGOCircularArc(tangentCircArcDef3);
Get COGOLine parameter information
if (cogoLine.IsStraightLine)
{
var dist = cogoLine.Distance;
var dir = cogoLine.Direction;
}
else if (cogoLine.IsCircularArc)
{
var circArcDefinition = cogoLine.ToCircularArcDefinition();
string s = "";
//show Arc length, either entered or calculated
if (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;
}
else
s += "<calc> not able to calc arc length." + Environment.NewLine;
}
// chordLength
if (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;
}
else
s += "<calc> not able to calc chord length." + Environment.NewLine;
}
// central Angle
if (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;
}
else
s += "<calc> not able to calc Central Angle." + Environment.NewLine;
}
}
Create a Traverse
List<COGOLine> lstCOGOLines = new();
var direction = ParcelUtilities.Instance.ConvertQuadrantBearingDMSToNorthAzimuthDecDeg("S7-46-51-E");
lstCOGOLines.Add(COGOLineBuilder.CreateCOGOStraightLine(nAzDirection, 61.45)); //1
lstCOGOLines.Add(COGOLineBuilder.CreateCOGOStraightLine(166.2625, 37.22));//2
lstCOGOLines.Add(COGOLineBuilder.CreateCOGOStraightLine(255.2833333, 71.4));//3
var circArcDef = new CircularArcDefinition
{
Radius = -201.0,
ArcLength = 45.29,
ChordDirection = ParcelUtilities.Instance.ConvertQuadrantBearingDMSToNorthAzimuthDecDeg("N21-47-57W")
};
lstCOGOLines.Add(COGOLineBuilder.CreateCOGOCircularArc(circArcDef));//4
var tangentCurveDef = new TangentCurveDefinition
{
Radius = 169.0,
ArcLength = 52.40
};
lstCOGOLines.Add(COGOLineBuilder.CreateCOGOCircularArc(tangentCurveDef));//5
tangentCurveDef = new TangentCurveDefinition
{
Radius = 13.0,
ArcLength = 22.98
};
lstCOGOLines.Add(COGOLineBuilder.CreateCOGOCircularArc(tangentCurveDef));//6
tangentCurveDef = new TangentCurveDefinition
{
Radius = -281.0,
ArcLength = 73.68
};
lstCOGOLines.Add(COGOLineBuilder.CreateCOGOCircularArc(tangentCurveDef));//7
var spatialReference = map?.SpatialReference;
var travParcel = new Traverse(spatialReference);
await travParcel.AddCoursesAsync(lstCOGOLines);
if (travParcel.IsValid())
{
; //insert code to use the traverse
}
Iterate Traverse Courses
// iterate thru courses
foreach (var course in travParcel.Courses)
{
var courseCOGOLine = course.COGOLine;
var entranceTangentDir = course.EntranceTangentDirection;
var exitTangentDir = 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.
var isTangentToPriorCourse = course.IsDefinedAsTangentToPriorCourse;
// IsTangent if one of the following
// - IsTangentToPriorCourse
// - is implied tangent - ie difference between entranceTangentDirection and previous courses ExitTangentDirection < tolerance
var isTangent = course.IsTangent;
}
Traverse Closure
if (travParcel.IsValid())
{
string sReport = "";
TraverseClosure travClosure = travParcel.GetClosure();
var miscDistance = travClosure.MiscloseDistance;
var miscDirection = travClosure.MiscloseDirection;
var miscX = travClosure.MiscloseX;
var miscY = travClosure.MiscloseY;
var calcArea = travClosure.CalculatedArea;
sReport = "Misclose distance: " + miscDistance.ToString("F2");
}
Traverse Adjustment
if (travParcel.IsValid())
{
TraverseClosure travClosure = travParcel.GetClosure();
if (travClosure.MiscloseDistance < 0.1)
{
if (travParcel.CanAdjust(TraverseAdjustmentMethod.Compass))
{
travParcel.Adjust(TraverseAdjustmentMethod.Compass);
TraverseAdjustmentResults adjResults = travParcel.AdjustmentResults;
var adjCoords = adjResults.AdjustedCoordinates;
var adjustedCourses = adjResults.AdjustedCourses;
var distanceResiduals = adjResults.DistanceResiduals;
var directionResiduals = adjResults.DirectionalResiduals;
}
}
}
Calculating Coordinates
var startPoint = 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.
var g2gCorrection = map?.GetDefinition()?.GroundToGridCorrection;
if (g2gCorrection != null)
{
travParcel.UseGroundToGridCorrections = true;
travParcel.GroundToGridCorrection = g2gCorrection;
}
else
travParcel.UseGroundToGridCorrections = false;
// calculate coordinates
if (travParcel.CanCalculateCoordinates())
{
var coords = travParcel.CalculateCoordinates();
var sb = new StringBuilder();
sb.AppendLine("Calculated Coordinates:");
foreach (var coord in coords)
{
sb.AppendLine($"{coord.X:F2}, {coord.Y:F2}");
}
}
Create Features
var layerName = "Lot_Lines"; //Name of the COGO enabled line layer in the map
var fLayer = MapView.Active?.Map?.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(l => l.
Name.Equals(layerName, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
var templateLotLines = fLayer.GetTemplates().FirstOrDefault(); //get the feature template
var editOper = new EditOperation
{
Name = "Create Traverse",
SelectNewFeatures = false
};
var dirOffset = g2gCorrection.GetDirectionOffset();
var scaleFactor = g2gCorrection.GetConstantScaleFactor();
var dictAttributes = new Dictionary<string, object>();
dictAttributes["Rotation"] = dirOffset;
dictAttributes["Scale"] = scaleFactor;
if (editOper.CanCreateTraverse(travParcel, templateLotLines))
{
await editOper.CreateTraverse(travParcel, templateLotLines, dictAttributes);
}
if (!editOper.IsEmpty)
{
editOper.Execute();
// access the mapMember, OID for each created feature
foreach (var course in travParcel.Courses)
{
var mapMember = course.MapMember;
var oid = course.ObjectID;
var insp = new ArcGIS.Desktop.Editing.Attributes.Inspector();
insp.Load(mapMember, oid);
var shape = insp.Shape;
}
}
Loading a traverse into the Traverse UI
var isValidTrav = travParcel.IsValid(); //confirm it's a valid traverse
if (!isValidTrav)
return;
//Load the traverse into the traverse grid
await TraverseManager.Current.LoadTraverse(travParcel, "Load my custom traverse");
Import a traverse file
var pathAndNameOfTraverseFile = "C:\\MyTraverseFileFolder\\MyTraverseFile.txt";
var traverse = await Traverse.ImportAsync(pathAndNameOfTraverseFile, spatialReference);
Export a traverse to a file
var directionDecimalPlaces = 0;
var distanceDecimalPlaces = 3;
var exportOptions = new TraverseExportOptions("C:\\MyTraverseFileFolder\\MyTraverseFile.txt",
ArcGIS.Core.CIM.DirectionType.QuadrantBearing,
ArcGIS.Core.CIM.DirectionUnits.DegreesMinutesSeconds,
directionDecimalPlaces, distanceDecimalPlaces);
travParcel.Export(exportOptions);