# [SciPy-User] helmert implementation (7 parameters - geometric transformation)

Charles R Harris charlesr.harris@gmail....
Tue Mar 2 00:18:34 CST 2010

```2010/3/1 Charles R Harris <charlesr.harris@gmail.com>

>
>
> On Mon, Mar 1, 2010 at 6:17 PM, Massimo Di Stefano <
> massimodisasha@yahoo.it> wrote:
>
>> Hi All,
>>
>> i'm tring to implement a function to perform a geometric trasformation
>> between a set of points in 2 different reference systems
>>
>> it is a 7 parameters trasformation (helmert) , based on last square method
>> it use as input 2 set of x,y,z coordinates in 2 different reference
>> systems
>> and give as output 7 parameters needed to performs transformation
>> from one reference system to the other one.
>>
>> http://en.wikipedia.org/wiki/Helmert_transformation
>>
>> this function is used in geodesy to "reproject" coordinates between 2
>> different Datum
>>
>> i wrote it as :
>>
>> import numpy as np
>> from scipy import linalg
>>
>> def helmert(p1, p2):
>>    A = np.zeros((3*L.shape[0],7),float)
>>    A[ ::3, 0] = 1.0
>>    A[1::3, 1] = 1.0
>>    A[2::3, 2] = 1.0
>>    A[ ::3, 3] = L[:,0]
>>    A[1::3, 3] = L[:,1]
>>    A[2::3, 3] = L[:,2]
>>    A[1::3, 4] = L[:,2]
>>    A[2::3, 4] = -L[:,1]
>>    A[ ::3, 5] = -L[:,2]
>>    A[2::3, 5] = L[:,0]
>>    A[ ::3, 6] = L[:,1]
>>    A[1::3, 6] = -L[:,0]
>>    Y = np.zeros((3*G.shape[0],1),float)
>>    Y[ ::3, 0] = G[:,0] - L[:,0]
>>    Y[1::3, 0] = G[:,1] - L[:,1]
>>    Y[2::3, 0] = G[:,2] - L[:,2]
>>    N = np.dot(A.T.conj(), A)
>>    T = np.dot(A.T.conj(), Y)
>>    C = np.dot(linalg.inv(N), T)
>>    print C
>>
>>
>> from a pdf i find online
>> it has numerical examples
>> and i get different results :'(
>>
>>
>> p1 :
>>
>> 4402553.334 727053.937 4542823.474
>> 4399375.347 703845.876 4549215.105
>> 4412911.150 701094.435 4536518.139
>>
>>
>> p2 :
>>
>> 4402553.569 727053.737 4542823.332
>> 4399375.518 703845.639 4549214.880
>> 4412911.336 701094.214 4536517.955
>>
>>
>> pdf results :
>>
>> x0    -9.256 m
>> y0    -23.701 m
>> z0    16.792 m
>> μ      0.00000046
>>
>>
> The angles here look like degrees, not radians. Also, the last factor is
> pretty definitely wrong. It is given directly as the square root of the
> ratio of the variance of the two sets of vectors around their means minus 1.
> For instance
>
> sqrt(pt2.var(0).sum()/pt1.var(0).sum()) - 1
>
>
>>
>> my results :
>>
>> [[ -9.91564629e+00]
>>  [ -2.36172028e+01]
>>  [  1.57283853e+01]
>>  [ -2.68063331e-07]
>>  [  3.04330048e-06]
>>  [ -2.76148185e-06]
>>  [ -2.31598150e-06]]
>>
>>
>>
> And my result agrees with neither ;) BTW, are you going from pt2 -> pt1 or
> vice versa?
>
>
Are you sure the data you gave is correct? Lengths don't seem to be
preserved under rotation.

Chuck
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/scipy-user/attachments/20100301/b09e2283/attachment.html
```