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

Massimo Di Stefano massimodisasha at yahoo.it
Mon Mar 1 20:17:16 EST 2010


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):
    L = np.loadtxt(p1)
    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]
    G = np.loadtxt(p2)
    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
Rx    -0.0001990982 rad 
Ry    0.0001778762 rad
Rz    0.00015 rad 
μ      0.00000046


my results :

[[ -9.91564629e+00]
 [ -2.36172028e+01]
 [  1.57283853e+01]
 [ -2.68063331e-07]
 [  3.04330048e-06]
 [ -2.76148185e-06]
 [ -2.31598150e-06]]



anyone here can give it a try ?
the results seems wrong but
i haveb't yet find a solution.

thanks to ALL!

regards,

Massimo.








More information about the SciPy-User mailing list