首页 > 编程知识 正文

python 坐标转换,python经纬度转化为xy坐标系

时间:2023-05-03 17:30:00 阅读:273265 作者:299

使用Numpy我想在坐标系之间转换位置向量。

我有两个三维空间的飞机。

每个平面由其中心定义:C[0] = (X0, Y0, Z0)

C[1] = (X1, Y1, Z1)

(X,Y,Z指全球坐标系)C = np.array([[0,0,0],[-4,2,1]])

以及它的法向量:H[0] = (cos(alpha[0])*sin(A[0]), cos(alpha[0])*cos(A[0]), sin(A[0])

H[1] = (cos(alpha[1])*sin(A[1]), cos(alpha[1])*cos(A[1]), sin(A[1])

alpha=仰角

A=方位角H = np.array([[-0.23, -0.45, 0.86], [-0.12, -0.24, 0.86]])

我有一个点p(xp, yp, 0)位于平面0(xp,yp指的是一个具有中心C[0]的局部坐标系,当alpha = A = 0时,其xyz轴与全局XYZ轴对齐)

我使用以下函数从平面0的局部坐标系转换为全局坐标系:import numpy as np

def rotateAxisX(alpha):

'''

Rotation about x axis

:param alpha: plane altitude angle in degrees

:return: x-axis rotation matrix

'''

rotX = np.array([[1, 0, 0], [0, np.cos(np.deg2rad(alpha)), np.sin(np.deg2rad(alpha))], [0, -np.sin(np.deg2rad(alpha)), np.cos(np.deg2rad(alpha))]])

return rotX

def rotateAxisZ(A):

'''

Rotation about z axis

:param A: plane azimuth angle in degrees

:return: z-axis rotation matrix

'''

rotZ = np.array([[np.cos(np.deg2rad(A)), np.sin(np.deg2rad(A)), 0], [-np.sin(np.deg2rad(A)), np.cos(np.deg2rad(A)), 0], [0, 0, 1]])

return rotZ

def local2Global(positionVector, planeNormalVector, positionVectorLocal):

'''

Convert point from plane's local coordinate system to global coordinate system

:param positionVector: plane center in global coordinates

:param planeNormalVector: the normal vector of the plane

:param positionVectorLocal: a point on plane (xp,yp,0) with respect to the local coordinate system of the plane

:return: the position vector of the point in global coordinates

>>> C = np.array([-10,20,1200])

>>> H = np.array([-0.23, -0.45, 0.86])

>>> p = np.array([-150, -1.5, 0])

>>> P = local2Global(C, H, p)

>>> np.linalg.norm(P-C) == np.linalg.norm(p)

True

'''

alpha = np.rad2deg(np.arcsin(planeNormalVector[2]))

A = np.where(planeNormalVector[1] > 0, np.rad2deg(np.arccos(planeNormalVector[1] / np.cos(np.deg2rad(alpha)))), 360 - np.rad2deg(np.arccos(planeNormalVector[1] / np.cos(np.deg2rad(alpha)))))

positionVectorGlobal = positionVector + np.dot(np.dot(rotateAxisZ(A), rotateAxisX(90 - alpha)), positionVectorLocal)

return positionVectorGlobal

上面的工作似乎和预期的一样。

然后我计算一条线从平面0p(xp,yp,0)上的一个点经过的交点,它的方向向量是S = (0.56, -0.77, 0.3)>>> C = np.array([[0,0,0],[-4,2,1]]) # plane centers

>>> H = np.array([[-0.23, -0.45, 0.86], [-0.12, -0.24, 0.86]]) # plane normal vectors

>>> S = np.array([0.56, -0.77, 0.3]) # a direction vector

>>> p = np.array([-1.5, -1.5, 0]) # a point on a plane

>>> intersectingPlaneIndex = 0 # choose intersecting plane, this plane has the point p on it

>>> intersectedPlaneIndex = 1 # this plane intersects with the line passing from p with direction vector s

>>> P = local2Global(C[intersectingPlaneIndex], H[intersectingPlaneIndex], p) # point p in global coordinates

>>> np.isclose(np.linalg.norm(p), np.linalg.norm(P - C[intersectingPlaneIndex]), 10e-8)

True

所以第一个转变是成功的。

现在让我们在全局坐标系中找到交点E>>> t = np.dot(H[intersectedPlaneIndex], C[intersectedPlaneIndex, :] - P) / np.dot(H[intersectedPlaneIndex], S)

>>> E = P + S * t

>>> np.around(E, 2)

array([ 2.73, -0.67, 1.19])

到目前为止,我找到了位于平面1上的点E(全局坐标)。

问题是:

如何将点E从全局坐标转换为平面1的坐标系并获得e(xe, ye, 0)?

我试过:def global2Local(positionVector, planeNormalVector, positionVectorGlobal):

'''

Convert point from global coordinate system to plane's local coordinate system

:param positionVector: plane center in global coordinates

:param planeNormalVector: the norm快三大小单双稳赚买法ctedPlaneIndex], C[intersectedPlaneIndex, :] - P) / np.dot(H[intersectedPlaneIndex], S)

>>> E = P + S * t

>>> np.around(E, 2)

array([ 2.73, -0.67, 1.19])

到目前为止,我找到了位于平面1上的点E(全局坐标)。

问题是:

如何将点E从全局坐标转换为平面1的坐标系并获得e(xe, ye, 0)?

我试过:def global2Local(positionVector, planeNormalVector, positionVectorGlobal):

'''

Convert point from global coordinate system to plane's local coordinate system

:param positionVector: plane center in global coordinates

:param planeNormalVector: the normal vector of the plane

:param positionVectorGlobal: a point in global coordinates

:note: This function translates the given position vector by the positionVector and rotates the basis axis in order to obtain the positionVectorCoordinates in plane's coordinate system

:warning: it does not function as it should

'''

alpha = np.rad2deg(np.arcsin(planeNormalVector[2]))

A = np.where(planeNormalVector[1] > 0, np.rad2deg(np.arccos(planeNormalVector[1] / np.cos(np.deg2rad(alpha)))), 360 - np.rad2deg(np.arccos(planeNormalVector[1] / np.cos(np.deg2rad(alpha)))))

positionVectorLocal = np.dot(np.dot(np.linalg.inv(rotateAxisZ(A)), np.linalg.inv(rotateAxisX(90 - alpha))), positionVectorGlobal - positionVector) + positionVectorGlobal

return positionVectorLocal

以及:>>> e = global2Local(C[intersectedPlaneIndex], H[intersectedPlaneIndex], E)

>>> e

array([ -2.54839059e+00, -5.48380179e+00, -1.42292121e-03])

首先,只要e[2]接近于零,这看起来是可以的,但是>>> np.linalg.norm(E-C[intersectedPlaneIndex])

7.2440723159783182

>>> np.linalg.norm(e)

6.0470140356703537

所以转换是错误的。有什么想法吗?

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。