I have some control points from a local grid to a known grid (a national grid system).
What I am trying to do is come up with the appropriate parameters to define a local prj for the input data.
This involves finding the origin (or rotation point), the amount of rotation, and any shifts or scaling in X & Y.
So, I have been messing with this code found here :
how-to-perform-coordinates-affine-transformation-using-python-part-2
So, what I have got is (almost the same as the referenced post 😞
<SPAN class="keyword token">import</SPAN> sys<SPAN class="punctuation token">,</SPAN> os
<SPAN class="keyword token">import</SPAN> numpy <SPAN class="keyword token">as</SPAN> np
localData <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">"AJP1"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">5671.666</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">19466.156</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"GCP CR"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">9634.659</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">13064.567</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> \
<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"MHP2"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">10325.093</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">7797.802</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"MILE 8"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">6508.217</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">7511.953</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN>
refData <SPAN class="operator token">=</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">"AJP1"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">157171.409</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">75402.914</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"GCP CR"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">158414.820</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">67978.050</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> \
<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"MHP2"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">157059.513</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">62842.546</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"MILE 8"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">153418.976</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">64023.272</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN>
inArr <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>array<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">[</SPAN>l<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> l<SPAN class="punctuation token">[</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0.0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">for</SPAN> l <SPAN class="keyword token">in</SPAN> localData<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
refArr <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>array<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">[</SPAN>l<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> l<SPAN class="punctuation token">[</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0.0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">for</SPAN> l <SPAN class="keyword token">in</SPAN> refData<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
n <SPAN class="operator token">=</SPAN> inArr<SPAN class="punctuation token">.</SPAN>shape<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
pad <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">lambda</SPAN> x<SPAN class="punctuation token">:</SPAN> np<SPAN class="punctuation token">.</SPAN>hstack<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">[</SPAN>x<SPAN class="punctuation token">,</SPAN> np<SPAN class="punctuation token">.</SPAN>ones<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>x<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="number token">1</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
unpad <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">lambda</SPAN> x<SPAN class="punctuation token">:</SPAN> x<SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">:</SPAN><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>
X <SPAN class="operator token">=</SPAN> pad<SPAN class="punctuation token">(</SPAN>inArr<SPAN class="punctuation token">)</SPAN>
Y <SPAN class="operator token">=</SPAN> pad<SPAN class="punctuation token">(</SPAN>refArr<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># Solve the least squares problem X * A = Y</SPAN>
<SPAN class="comment token"># to find our transformation matrix A</SPAN>
A<SPAN class="punctuation token">,</SPAN> res<SPAN class="punctuation token">,</SPAN> rank<SPAN class="punctuation token">,</SPAN> s <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>linalg<SPAN class="punctuation token">.</SPAN>lstsq<SPAN class="punctuation token">(</SPAN>X<SPAN class="punctuation token">,</SPAN> Y<SPAN class="punctuation token">)</SPAN>
transform <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">lambda</SPAN> x<SPAN class="punctuation token">:</SPAN> unpad<SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>dot<SPAN class="punctuation token">(</SPAN>pad<SPAN class="punctuation token">(</SPAN>x<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> A<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"Target:"</SPAN>
<SPAN class="keyword token">print</SPAN> refArr
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"Result:"</SPAN>
<SPAN class="keyword token">print</SPAN> transform<SPAN class="punctuation token">(</SPAN>inArr<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"Max error:"</SPAN><SPAN class="punctuation token">,</SPAN> np<SPAN class="punctuation token">.</SPAN>abs<SPAN class="punctuation token">(</SPAN>refArr <SPAN class="operator token">-</SPAN> transform<SPAN class="punctuation token">(</SPAN>inArr<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>max<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</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>
which give me this :
<SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN>
Target<SPAN class="punctuation token">:</SPAN>
<SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">[</SPAN> <SPAN class="number token">157171.409</SPAN> <SPAN class="number token">75402.914</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">]</SPAN>
<SPAN class="punctuation token">[</SPAN> <SPAN class="number token">158414.82</SPAN> <SPAN class="number token">67978.05</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">]</SPAN>
<SPAN class="punctuation token">[</SPAN> <SPAN class="number token">157059.513</SPAN> <SPAN class="number token">62842.546</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">]</SPAN>
<SPAN class="punctuation token">[</SPAN> <SPAN class="number token">153418.976</SPAN> <SPAN class="number token">64023.272</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN>
Result<SPAN class="punctuation token">:</SPAN>
<SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">[</SPAN> <SPAN class="number token">157171.39578228</SPAN> <SPAN class="number token">75402.91459879</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">]</SPAN>
<SPAN class="punctuation token">[</SPAN> <SPAN class="number token">158414.84986487</SPAN> <SPAN class="number token">67978.04864706</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">]</SPAN>
<SPAN class="punctuation token">[</SPAN> <SPAN class="number token">157059.48564043</SPAN> <SPAN class="number token">62842.54723945</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">]</SPAN>
<SPAN class="punctuation token">[</SPAN> <SPAN class="number token">153418.98671243</SPAN> <SPAN class="number token">64023.2715147</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN>
Max error<SPAN class="punctuation token">:</SPAN> <SPAN class="number token">0.0298648653843</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>
So, I can see the fit is quite good.
But how do I use the solution from np.linalg.lstsq to derive the parameters I need for the projection definition of the localData?
In particular, the origin point 0,0 in the target coordinates, and the shifts and rotations that are going on here??
Tagging out very own numpy expert and all around math wiz Dan Patterson here.
Or is this not even possible with this approach.
My matrix math is extremely rusty to non-existent. But I am willing to try any methods offered 
Thanks in advance.
Neil