利用七参数实现求解坐标转换

         利用两个空间直角坐标系的7个转换参数(3个平移参数ΔX,ΔY,ΔZ ,3个旋转参数εX,εY,εZ ,一个尺度变化参数m),请根据空间点在A空间直角坐标系中的坐标求该空间点在B空间直角坐标系中的坐标。

代码如下:

import math as m
import os


class Parameter():    # 设置参数
    def __init__(self):
# ax,ay,az是三个旋转参数,bx,by,bz是三个平移参数,m是尺度变化参数
        self.ax = m.radians(eval(input('请输入转换参数ax(度分秒): ')))
        self.ay = m.radians(eval(input('请输入转换参数ay(度分秒):')))
        self.az = m.radians(eval(input('请输入转换参数az(度分秒):')))
        self.bx = eval(input('请输入转换参数bx:'))
        self.by = eval(input('请输入转换参数by:'))
        self.bz = eval(input('请输入转换参数bz:'))
        self.m = eval(input('请输入转换参数m:'))


# 将角度转换为弧度
# self.b = m.radians(B)

class coordinate_transformation():   # 坐标转换

    def __init__(self):
        self.p = Parameter()  # 导入参数

    def parameter_transformation(self, x1, y1, z1):
        self.R11 = m.cos(self.p.ay)*m.cos(self.p.az)
        self.R12 = m.cos(self.p.ay)*m.sin(self.p.az)
        self.R13 = -m.sin(self.p.ay)
        self.R21 = -m.cos(self.p.ax)*m.sin(self.p.az) + m.sin(self.p.ax)*m.sin(self.p.ay)*m.cos(self.p.az)
        self.R22 = m.cos(self.p.ax)*m.cos(self.p.az) + m.sin(self.p.ax)*m.sin(self.p.ay)*m.sin(self.p.az)
        self.R23 = m.sin(self.p.ax)*m.cos(self.p.ay)
        self.R31 = m.sin(self.p.ax)*m.sin(self.p.az) + m.cos(self.p.ax)*m.sin(self.p.ay)*m.cos(self.p.az)
        self.R32 = -m.sin(self.p.ax)*m.cos(self.p.az) + m.cos(self.p.ax)*m.sin(self.p.ay)*m.sin(self.p.az)
        self.R33 = m.cos(self.p.ax)*m.cos(self.p.ay)
        self.x2 = (1 + self.p.m)*(self.R11 * x1 + self.R12 * y1 + self.R13 * z1) + self.p.bx
        self.y2 = (1 + self.p.m) * (self.R21 * x1 + self.R22 * y1 + self.R23 * z1) + self.p.by
        self.z2 = (1 + self.p.m) * (self.R31 * x1 + self.R32 * y1 + self.R33 * z1) + self.p.bz

class Point():
    # 建立点类
    def point(self, x, y, z):  # 建立大地坐标点类
        self.x1 = x
        self.y1 = y
        self.z1 = z
        self.P = coordinate_transformation()
        self.P.parameter_transformation(x1, y1, z1)
        self.x = self.P.x2
        self.y = self.P.y2
        self.z = self.P.z2



SolveType = input('请输入要转换的坐标x,y,z')
while True:
    I = input('请输入空间直角坐标x、y、z,中间用空格隔开:\n')
    while True:
        if I:
            pass
        else:
            s.exit(0)
        try:
            [x1, y1, z1] = [float(n) for n in I.split()]
            break
        except:
            I = input('输入错误,请重新输入空间直角坐标x、y、z,中间用空格隔开:\n')
        else:
            pass

    # 开始转换
    P = Point()  # 创建一个实例对象
    P.point(x1, y1, z1)
    x = str(x1)
    y = str(y1)
    z = str(z1)
    x2 = str(P.x)
    y2 = str(P.y)
    z2 = str(P.z)
    massege = '\n您输入的空间直角坐标为:(' + x + ', ' + y + ', ' + z + ')\n转换得到空间直角坐标为:(' + x2 + ', ' + y2 + ', ' + z2 + ')'
    print(massege)
    break
os.system('pause')  # 暂停命令

运行结果示例如下:

请输入要转换的坐标x,y,z30 30 30
请输入空间直角坐标x、y、z,中间用空格隔开:
30 30 30
请输入转换参数ax(度分秒): 30
请输入转换参数ay(度分秒):30
请输入转换参数az(度分秒):30
请输入转换参数bx:3
请输入转换参数by:3
请输入转换参数bz:3
请输入转换参数m:3

您输入的空间直角坐标为:(30.0, 30.0, 30.0)
转换得到空间直角坐标为:(84.96152422706632, 133.98076211353316, 142.01923788646684)
�밴���������. . . 

你可能感兴趣的:(测绘专业相关编程,python,开发语言,学习,经验分享,学习方法)