Usted parece estar buscando para llevar a cabo una transformación afín entre el sistema de coordenadas local y un sistema de coordenadas georreferenciadas.
Afín transforma causantes de todos los sistemas de coordenadas y puede ser representada por la ecuación de matriz a continuación.
|x_1 y_1 1| |a d| |x'_1 y'_1|
|x_2 y_2 1| |b e| = |x'_2 y'_2|
|x_3 y_3 1| |c f| |x'_3 y'_3|
input transform. output
coords matrix coords
(n x 3) (3 x 2) (n x 2)
Sin embargo, usted tiene dos etapas problema.
-
Encontrar la matriz de transformación a partir de la conocida emparejamientos de entrada y salida de coordenadas (puntos GPS y sus respectivas ubicaciones en su localmente definidos por la red).
-
El uso de esta matriz de transformación para la georreferencia de su nube de puntos.
Proj.4 destaca en #2: la transferencia entre sistemas de coordenadas georreferenciadas con conocidas las matrices de transformación. No puede a mi conocimiento se utiliza para encontrar una matriz de transformación de datos de punto. Sin embargo, usted puede hacer toda la cosa fácilmente mediante el uso de un poco de luz de álgebra lineal (mínimos cuadrados de la matriz de inversión) en Numpy. He utilizado una versión de esta clase para la reducción de los datos a partir de varios estudios de campo:
import numpy as N
def augment(a):
"""Add a final column of ones to input data"""
arr = N.ones((a.shape[0],a.shape[1]+1))
arr[:,:-1] = a
return arr
class Affine(object):
def __init__(self, array=None):
self.trans_matrix = array
def transform(self, points):
"""Transform locally projected data using transformation matrix"""
return N.dot(augment(N.array(points)), self.trans_matrix)
@classmethod
def from_tiepoints(cls, fromCoords, toCoords):
"Produce affine transform by ingesting local and georeferenced coordinates for tie points"""
fromCoords = augment(N.array(fromCoords))
toCoords = N.array(toCoords)
trans_matrix, residuals, rank, sv = N.linalg.lstsq(fromCoords, toCoords)
affine = cls(trans_matrix) # Setup affine transform from transformation matrix
sol = N.dot(fromCoords,affine.trans_matrix) # Compute model solution
print "Pixel errors:"
print (toCoords - sol)
return affine
Puede ser utilizado como tal:
transform = Affine.from_tiepoints(gps_points_local,gps_points_geo)
projected_data = transform.transform(local_point_cloud)
projected_coordinates
ahora está en WGS84, UTM, o cualquiera que sea el sistema de coordenadas de su registrados por el GPS. Una característica importante de este método es que puede ser utilizado con cualquier número de puntos de fijación (3 o más) y las ganancias de la precisión de las más puntos de fijación se utilizan. Se trata de encontrar el mejor ajuste a través de todos sus puntos de fijación.