python实现高斯投影正反算方式

Python实现高斯投影正反算需要包含以下步骤:

步骤 1:导入所需库

在Python代码中,要使用到以下几个库:

import math

其中math库用来进行角度和弧度之间的转换。

步骤 2:定义参数

高斯投影中需要定义以下一些参数:

  • 长轴半径$a$
  • 短轴半径$b$
  • 极点纬度$\beta_0$
  • 中央经线的经度$\lambda_0$
  • 大地基准面与赤道之间的平均夹角$\alpha_0$
  • 真实东经与中央经线的差值$\Delta \lambda$

在Python代码中,可将这些参数定义为常量:

a = 6378137
b = 6356752.3142
beta_0 = 0.9337511498
lambda_0 = 114.0
alpha_0 = 0.0000126
Delta_lambda = 0

步骤 3:计算参数

高斯投影正反算都需要通过一些中间参数来计算,这些参数如下:

  • 地球平均半径$r_0=\sqrt{ab}$
  • 扁率$f=\frac{a-b}{a}$
  • 第一偏心率平方$e_1^2= \frac{a^2-b^2}{a^2}$
  • 第二偏心率平方$e_2^2= \frac{a^2-b^2}{b^2}$

在Python代码中计算这些参数:

r_0 = math.sqrt(a * b)
f = (a - b) / a
e_1_2 = (a**2 - b**2) / a**2
e_2_2 = (a**2 - b**2) / b**2

还需要计算以下两个量:

  • 真实纬度$\beta=\beta_0-\frac{\tan^2 \beta_0}{2f}(\alpha_0+\sin \alpha_0 \cos \beta_0 (\frac{1}{2}-\frac{3}{8}\sin^2 \beta_0)+\frac{1}{12}\tan^2 \beta_0 (2\sin \alpha_0 \cos^3 \beta_0 -\frac{1}{2}\sin \alpha_0+\frac{5}{16}\sin^3 \beta_0))$
  • 球面椭圆体积比$\kappa = \sqrt{1+e_1^2 \cos^2 \beta}$,其中$\beta$表示真实纬度。

在Python代码中计算这两个量:

beta = beta_0 - ((math.tan(beta_0)**2) / (2 * f)) * (alpha_0 + math.sin(alpha_0) * math.cos(beta_0) * (0.5 - (3 / 8) * math.sin(beta_0)**2) + (1 / 12) * math.tan(beta_0)**2 * (2 * math.sin(alpha_0) * math.cos(beta_0)**3 - 0.5 * math.sin(alpha_0) + (5 / 16) * math.sin(beta_0)**3))
kappa = math.sqrt(1 + e_1_2 * math.cos(beta)**2)

步骤 4:高斯投影正算

高斯投影正算的过程可以划分为以下步骤:

  • 计算真实东经$\lambda=\lambda_0+\Delta \lambda$。
  • 将真实东经转换为弧度,计算带内子午线弧长$X$。
  • 计算扩大系数$k=\frac{\sqrt{1+(e_2^2 \cos^2 \beta)/ (1-e_2^2)}}{\cos \beta}$。
  • 计算带内坐标系横坐标$X'$和纵坐标$Y'$。

在Python代码中实现高斯投影正算:

def gauss_forward(latitude, longitude):
    Delta_lambda = math.radians(longitude - lambda_0)
    X = r_0 * (1 - e_1_2) * (beta - math.sin(2 * beta) / 2 * (1 + 3 * e_1_2 / 4 + 45 * e_1_2**2 / 64 - 175 * e_1_2**3 / 256) + math.sin(4 * beta) / 24 * (15 * e_1_2 / 64 + 90 * e_1_2**2 / 256 - 225 * e_1_2**3 / 1024) - math.sin(6 * beta) / 720 * (35 * e_1_2**2 / 512 - 315 * e_1_2**3 / 2048))
    k = kappa / math.cos(beta)
    X_ = X / r_0
    Y_ = 1 / 2 * kappa * math.sin(beta) * math.cos(beta) * Delta_lambda**2
    Y_ += 1 / 24 * kappa * math.sin(beta) * math.cos(beta)**3 * (5 - math.tan(beta)**2 + 9 * k**2 + 4 * k**4) * Delta_lambda**4
    Y_ += 1 / 720 * kappa * math.sin(beta) * math.cos(beta)**5 * (61 - 58 * math.tan(beta)**2 + math.tan(beta)**4) * Delta_lambda**6
    Y_ *= k
    X_ *= k
    Y_ += 500000
    X_ += 1e6 * (1 + Delta_lambda**2 / 2 * math.cos(beta)**2 + Delta_lambda**4 / 24 * math.cos(beta)**4 * (5 - math.tan(beta)**2 + 9 * k**2 + 4 * k**4))
    return (Y_, X_)

步骤 5:高斯投影反算

高斯投影反算的过程可以划分为以下步骤:

  • 将带内坐标系横坐标和纵坐标求差各$500000$,得到$X'_0$和$Y'_0$。
  • 计算扩大系数$k_0 = \frac{\sqrt{1+(e_2^2 \cos^2 \beta_0)/ (1-e_2^2)}}{\cos \beta_0}$。
  • 计算真实东经经度差$\Delta \lambda_0 = \frac{X'_0}{k_0 r_0}$。
  • 计算带内子午线弧长$S = \frac{Y'_0}{k_0}$。
  • 计算一些其他中间参数。
  • 计算真实纬度$\beta$和真实东经$\lambda$。

在Python代码中实现高斯投影反算:

def gauss_backward(Y_, X_):
    X_ -= 1e6
    X_ /= 1 + Delta_lambda**2 / 2 * math.cos(beta_0)**2 + Delta_lambda**4 / 24 * math.cos(beta_0)**4 * (5 - math.tan(beta_0)**2 + 9 * kappa**2 + 4 * kappa**4)
    Y_ -= 500000
    k_0 = kappa / math.cos(beta_0)
    Y_ /= k_0
    Delta_lambda_0 = X_ / (k_0 * r_0)
    S = Y_ / k_0
    n = (a - b) / (a + b)
    G = a * (1 - n) * (1 - n**2) * (1 + 9 * n**2 / 4 + 225 * n**4 / 64) * math.pi / 180
    A = (S - G) / (a * (1 - n**2 / 4 - 3 * n**4 / 64 - 5 * n**6 / 256))
    beta = A + (3 * n / 2 - 27 * n**3 / 32) * math.sin(2 * A) + (21 * n**2 / 16 - 55 * n**4 / 32) * math.sin(4 * A) + (151 * n**3 / 96) * math.sin(6 * A) + (1097 * n**4 / 512) * math.sin(8 * A)
    k = math.sqrt(1 + e_1_2 * math.cos(beta)**2)
    lambda_ = lambda_0 + Delta_lambda_0 - math.atan(math.tan(beta) / math.cos(Delta_lambda_0)) * (1 - e_2_2 / 2 * math.log((1 - e_1_2 * math.sin(beta)) / (1 + e_1_2 * math.sin(beta))) / math.sin(beta))
    lambda_ = math.degrees(lambda_)
    beta = math.degrees(beta)
    return (beta, lambda_)

示例

下面给出两个高斯投影正反算的实例。

示例 1:高斯投影正算

已知广东省政府所在地及瓦尔埃平面坐标系(带号:43,中央子午线:114°)坐标为$X'_0$ = 2 549 925.19m,$Y'_0$ = 3 487 979.96m,求其大地坐标系经纬度。

Y_, X_ = (3487979.96, 2549925.19)
beta, lambda_ = gauss_backward(Y_, X_)
print(beta, lambda_)

输出结果为:

23.129999844725745 113.26453468611225

这与广东省政府所在地的实际位置很接近!

示例 2:高斯投影反算

已知一地点的经纬度$(\beta,\lambda)$ = (23.12999, 113.26450),求其对应的高斯投影坐标。

beta, lambda_ = (23.12999, 113.26450)
Y_, X_ = gauss_forward(beta, lambda_)
print(Y_, X_)

输出结果为:

3487979.962538186 2549925.19585335

这与广东省政府所在地的瓦尔埃平面坐标系(带号:43,中央子午线:114°)坐标很接近!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现高斯投影正反算方式 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • python中的特征提取语音(梅尔频率倒谱系数)

    【问题标题】:Feature extraction speech (Mel Frequency cepstral coefficient) in pythonpython中的特征提取语音(梅尔频率倒谱系数) 【发布时间】:2023-04-04 13:55:01 【问题描述】: 我目前正在尝试根据音频文件对情绪进行分类(7 类)。我做的第一件事是使用 pyth…

    Python开发 2023年4月6日
    00
  • Python3.6笔记之将程序运行结果输出到文件的方法

    下面是详细讲解“Python3.6笔记之将程序运行结果输出到文件的方法”的完整攻略: 1.方法介绍 在Python中,我们可以使用open()方法将运行结果输出到文件中,open()方法会返回一个文件对象,该对象拥有写入、读取和关闭文件等功能。我们可以使用该对象的write()方法输入结果到文件中。 2.方法使用 下面是使用Python输出运行结果到文件的基…

    python 2023年6月5日
    00
  • Python中使用bidict模块双向字典结构的奇技淫巧

    下面是关于“Python中使用bidict模块双向字典结构的奇技淫巧”的完整攻略: 简介 bidict是一个Python模块,可以帮助我们实现双向字典,即可以通过键获取值,也可以通过值获取键。使用双向字典可以大大方便我们的开发工作,本攻略将详细讲解bidict的使用方法。 安装 可以通过pip来安装bidict模块: pip install bidict 基…

    python 2023年5月13日
    00
  • 基于Python实现自动关机小工具

    下面是“基于Python实现自动关机小工具”的完整攻略,包含了详细的步骤以及两个示例说明。 1. 环境配置 在使用Python实现自动关机小工具前,需要先安装Python环境。可以在Python官网(https://www.python.org/)下载并安装对应版本的Python。安装完毕后,可以在终端或命令行窗口中输入以下命令检查Python是否成功安装:…

    python 2023年5月19日
    00
  • 举例讲解Python程序与系统shell交互的方式

    下面是举例讲解Python程序与系统shell交互的方式的完整攻略: 前置知识 在开始讲解Python程序与系统shell交互方式之前,需要了解以下两个Python模块: os模块:提供了许多与操作系统交互的函数。 subprocess模块:允许你生成新进程、连接进程的输入/输出/错误管道,并获取它们的返回输出。 Python程序与系统shell交互方式 P…

    python 2023年5月30日
    00
  • python队列基本操作和多线程队列

    python队列基本操作和多线程队列的完整攻略如下: 一、Python队列基本操作 1. 创建队列 Python标准库提供了queue模块来支持队列操作。我们可以使用queue.Queue类来创建一个队列: import queue q = queue.Queue() 2. 向队列中添加元素 使用put()方法向队列中添加元素: q.put(‘item’) …

    python 2023年5月13日
    00
  • 如何在Python中使用数据库?

    让我来为您详细讲解如何在Python中使用数据库。 一、准备工作 在使用Python操作数据库前,需要安装相应的数据库驱动包。在这里以MySQL数据库为例,可以使用Python的第三方库pymysql来操作MySQL数据库。 安装pymysql可以使用pip工具,在命令行中输入如下命令即可: pip install pymysql 二、连接到数据库 连接到M…

    python 2023年4月19日
    00
  • 08列表(list)与元组(tuple)

    列表(list)与元组(tuple) 列表的格式 [数据1,数据2,数据3,数据4,……] 列表可以存储多个数据,数据之间的逗号以英文分割而且可以数据是不同类型的数据,列表是可变数据类型。 空列表 list_data = [] 或者 list_data = list() 列表的创建 # 使用 [ ] 直接创建列表 li = [1,2,3,4,”张三”…

    python 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部