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

yizhihongxing

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爬虫中的url下载器用法详解

    Python爬虫中的URL下载器用法详解 在Python爬虫中,URL下载器是一个重要的组件,用于下载网页内容并保存到本地或内存中。以下是两个示例,介绍了如何使用Python实现URL下载器。 示例一:使用Python实现URL下载器 以下是一个示例,可以使用Python实现URL下载器: import requests def download(url):…

    python 2023年5月15日
    00
  • 深入讲解Python中面向对象编程的相关知识

    深入讲解Python中面向对象编程的相关知识 面向对象编程是一种流行的程序设计范式,其核心思想是将程序中的对象抽象出来,然后定义它们的属性和方法,从而实现代码的复用和模块化。Python作为一种面向对象的编程语言,具有强大的面向对象特性,让程序员能够更高效地编写和管理复杂的程序。 什么是面向对象编程 在面向对象编程中,一个对象是一个具有状态和行为的实体。例如…

    python 2023年5月30日
    00
  • python实现给字典添加条目的方法

    当我们需要在Python中创建一个新的字典或修改一个已有的字典时,需要给该字典添加一个或多个条目。Python提供了多种方法来实现给字典添加条目的操作,下面是两个示例说明。 使用键值对进行添加 通过在字典名称后面使用方括号、添加新键和相应的值来创建新的键值对,实现给字典添加条目。 >>> my_dict = {‘name’: ‘John’,…

    python 2023年5月13日
    00
  • python3实现网络爬虫之BeautifulSoup使用详解

    Python3实现网络爬虫之BeautifulSoup使用详解 简介 BeautifulSoup是Python的一个第三方库,专门用于从HTML和XML中解析数据。它的优点是支持比正则表达式更宽泛的文本匹配,同时支持CSS Selector和XPath等具有强大灵活性的筛选方式,易于使用和理解。本文将详细讲解BeautifulSoup的使用方法,帮助读者轻松…

    python 2023年5月13日
    00
  • 如何在Python中删除Oracle数据库中的数据?

    在Python中,我们可以使用SQLAlchemy模块删除Oracle数据库中的数据。以下是如何在Python中删除Oracle数据库中的数据的完整使用攻略,包括连接数据库、删除数据等步骤。同时,提供了两个示例以便更好理解如何在Python中删除Oracle数据库中的数据。 步骤1:安SQLAlchemy模块 在Python中,我们需要安装SQLAlchem…

    python 2023年5月12日
    00
  • 利用Python发送邮件或发带附件的邮件

    利用Python发送邮件或带附件的邮件的攻略如下: 一、Python发送邮件的基本步骤 1. 导入smtplib和email模块 import smtplib from email.mime.text import MIMEText 2. 连接SMTP服务器 mail_host = "smtp.xxx.com" mail_port = 2…

    python 2023年6月3日
    00
  • Python得到弹幕并保存到Excel中怎么设置

    下面我将为你详细讲解Python如何获取弹幕并保存到Excel中。这个过程大致可以分为两个步骤: 获取弹幕数据 弹幕从哪里来?我们可以通过访问一些弹幕网站,例如B站或Acfun网站,获取弹幕数据。这里我以B站为例,首先我们需要找到弹幕API的地址,这里我们可以使用Fiddler等抓包工具,来获取弹幕信息相关的请求地址和参数。这里我提供一个B站获取弹幕API的…

    python 2023年5月13日
    00
  • Python接口自动化 之用例读取方法总结

    下面我将分步骤详细讲解“Python接口自动化 之用例读取方法总结”的完整攻略。 1. 确定测试用例的存放路径 首先,你需要明确测试用例在哪里存放。一般来说,测试用例可以存放在Excel表格或者CSV文件中。如果是Excel表格,可以使用pandas库中的read_excel()方法来读取,如果是CSV文件,可以使用pandas库中的read_csv()方法…

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