Start at a point. You are given a list of bearings and distances. Where do you end up.
This comes up fairly often and the COGO tools allow you to create them from scratch.
Here is how you can do it using numpy and arcpy.
First a picture... given a location, you are instructed to move 100m in 10 degree increments between points. You will obviously track a circle. The traverse point locations can be constructed from base geometry. The locations can then be saved to a featureclass. The point featureclass can be converted to a continuous line, which can be segmented if you desire. Total time, not much.
The image above, shows the results of such a venture.
- I created my geometry using python/numpy
- I save the results to a featureclass using Numpyarraytofeatureclass (hence points)
- From those points I used Points to Line available at all license levels
- The continuous line was blown apart to segments using Split Lines at Vertices but alas, only available at the Advance level. .... ( I will save this obstruction to another blog, where I will show you how to do it with a standard license
EDIT... From the second incarnation, you can produce a featureclass and use the XY to Line tool which is available at all license levels) - Add Geometry Attributes enabled me to obtain the coordinates of the start, middle and end locations of the line. This could have been done during the construction of the geometry as well.
An how many of us have taught a class where this happens....

More to come....
Oh yes... code... NOW the origin needs to be given in projected coordinates (ie UTM, State Plane, Web Mercator etc) since the calculations are done in planar units. See my Vincenty implementation if you want to work with geodesic calculations.
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">dist_bearing</SPAN><SPAN class="punctuation token">(</SPAN>orig<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> bearings<SPAN class="operator token">=</SPAN>None<SPAN class="punctuation token">,</SPAN> dists<SPAN class="operator token">=</SPAN>None<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">"""point locations given distance and bearing
:Notes: for sample calculations
:-----
: - bearings = np.arange(0, 361, 10.)
: - dists = np.random.randint(10, 500, 36) * 1.0
: - dists = np.ones((len(bearings),))
: dists.fill(100.)
"""</SPAN>
rads <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>deg2rad<SPAN class="punctuation token">(</SPAN>bearings<SPAN class="punctuation token">)</SPAN>
sines <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>sin<SPAN class="punctuation token">(</SPAN>rads<SPAN class="punctuation token">)</SPAN>
coses <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>cos<SPAN class="punctuation token">(</SPAN>rads<SPAN class="punctuation token">)</SPAN>
dx <SPAN class="operator token">=</SPAN> sines <SPAN class="operator token">*</SPAN> dists
dy <SPAN class="operator token">=</SPAN> coses <SPAN class="operator token">*</SPAN> dists
x_n <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>cumsum<SPAN class="punctuation token">(</SPAN>dx<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> orig<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
y_n <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>cumsum<SPAN class="punctuation token">(</SPAN>dy<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> orig<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN>
data <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>vstack<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>bearings<SPAN class="punctuation token">,</SPAN> dists<SPAN class="punctuation token">,</SPAN> dx<SPAN class="punctuation token">,</SPAN> dy<SPAN class="punctuation token">,</SPAN> x_n<SPAN class="punctuation token">,</SPAN> y_n<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>T
frmt <SPAN class="operator token">=</SPAN> <SPAN class="string token">"Origin (0,0)\n"</SPAN> <SPAN class="operator token">+</SPAN> <SPAN class="string token">"{:>10s}"</SPAN><SPAN class="operator token">*</SPAN><SPAN class="number token">6</SPAN>
names <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"bearings"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"dist"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"dx"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"dy"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"Xn"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"Yn"</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>frmt<SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN><SPAN class="operator token">*</SPAN>names<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> i <SPAN class="keyword token">in</SPAN> data<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"{: 10.2f}"</SPAN><SPAN class="operator token">*</SPAN><SPAN class="number token">6</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN><SPAN class="operator token">*</SPAN>i<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN> data<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>Optionally create a structured array that you can produce a featureclass from using this incarnation.
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">dist_bearing</SPAN><SPAN class="punctuation token">(</SPAN>orig<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> bearings<SPAN class="operator token">=</SPAN>None<SPAN class="punctuation token">,</SPAN> dists<SPAN class="operator token">=</SPAN>None<SPAN class="punctuation token">,</SPAN> prn<SPAN class="operator token">=</SPAN><SPAN class="token boolean">False</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">"""point locations given distance and bearing
"""</SPAN>
orig <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>array<SPAN class="punctuation token">(</SPAN>orig<SPAN class="punctuation token">)</SPAN>
rads <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>deg2rad<SPAN class="punctuation token">(</SPAN>bearings<SPAN class="punctuation token">)</SPAN>
dx <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>sin<SPAN class="punctuation token">(</SPAN>rads<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">*</SPAN> dists
dy <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>cos<SPAN class="punctuation token">(</SPAN>rads<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">*</SPAN> dists
x_t <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>cumsum<SPAN class="punctuation token">(</SPAN>dx<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> orig<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
y_t <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>cumsum<SPAN class="punctuation token">(</SPAN>dy<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> orig<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN>
xy_f <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>array<SPAN class="punctuation token">(</SPAN>list<SPAN class="punctuation token">(</SPAN>zip<SPAN class="punctuation token">(</SPAN>x_t<SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> y_t<SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
xy_f <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>vstack<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>orig<SPAN class="punctuation token">,</SPAN> xy_f<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
stack <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">(</SPAN>xy_f<SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> xy_f<SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> x_t<SPAN class="punctuation token">,</SPAN> y_t<SPAN class="punctuation token">,</SPAN> dx<SPAN class="punctuation token">,</SPAN> dy<SPAN class="punctuation token">,</SPAN> dists<SPAN class="punctuation token">,</SPAN> bearings<SPAN class="punctuation token">)</SPAN>
data <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>vstack<SPAN class="punctuation token">(</SPAN>stack<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>T
names <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'X_f'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'Y_f'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"X_t"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"Yt"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"dx"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"dy"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"dist"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"bearing"</SPAN><SPAN class="punctuation token">]</SPAN>
N <SPAN class="operator token">=</SPAN> len<SPAN class="punctuation token">(</SPAN>names<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> prn<SPAN class="punctuation token">:</SPAN> <SPAN class="comment token"># ---- just print the results ----------------------------------</SPAN>
frmt <SPAN class="operator token">=</SPAN> <SPAN class="string token">"Origin (0,0)\n"</SPAN> <SPAN class="operator token">+</SPAN> <SPAN class="string token">"{:>10s}"</SPAN><SPAN class="operator token">*</SPAN>N
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>frmt<SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN><SPAN class="operator token">*</SPAN>names<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
frmt <SPAN class="operator token">=</SPAN> <SPAN class="string token">"{: 10.2f}"</SPAN><SPAN class="operator token">*</SPAN>N
<SPAN class="keyword token">for</SPAN> i <SPAN class="keyword token">in</SPAN> data<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>frmt<SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN><SPAN class="operator token">*</SPAN>i<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN> data
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="comment token"># ---- produce a structured array from the output ----------------</SPAN>
kind <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"<f8"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">*</SPAN>N
dt <SPAN class="operator token">=</SPAN> list<SPAN class="punctuation token">(</SPAN>zip<SPAN class="punctuation token">(</SPAN>names<SPAN class="punctuation token">,</SPAN> kind<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
out <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>zeros<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>data<SPAN class="punctuation token">.</SPAN>shape<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> dtype<SPAN class="operator token">=</SPAN>dt<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> i <SPAN class="keyword token">in</SPAN> range<SPAN class="punctuation token">(</SPAN>N<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
nm <SPAN class="operator token">=</SPAN> names<SPAN class="punctuation token">[</SPAN>i<SPAN class="punctuation token">]</SPAN>
out<SPAN class="punctuation token">[</SPAN>nm<SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> data<SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="punctuation token">,</SPAN> i<SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">return</SPAN> out
<SPAN class="comment token"># --- from the structured array, use NumPyArrayToFeatureclass</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>Again... more later