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


Posted in Python onJanuary 17, 2020

使用Python实现了一下我们同事的C++高斯投影正反算,实际跑通,可用。

#!/ usr/bin/python
# -*- coding:utf-8 -*-

import math


def LatLon2XY(latitude, longitude):
  a = 6378137.0
  # b = 6356752.3142
  # c = 6399593.6258
  # alpha = 1 / 298.257223563
  e2 = 0.0066943799013
  # epep = 0.00673949674227


  #将经纬度转换为弧度
  latitude2Rad = (math.pi / 180.0) * latitude

  beltNo = int((longitude + 1.5) / 3.0) #计算3度带投影度带号
  L = beltNo * 3 #计算中央经线
  l0 = longitude - L #经差
  tsin = math.sin(latitude2Rad)
  tcos = math.cos(latitude2Rad)
  t = math.tan(latitude2Rad)
  m = (math.pi / 180.0) * l0 * tcos
  et2 = e2 * pow(tcos, 2)
  et3 = e2 * pow(tsin, 2)
  X = 111132.9558 * latitude - 16038.6496 * math.sin(2 * latitude2Rad) + 16.8607 * math.sin(
    4 * latitude2Rad) - 0.0220 * math.sin(6 * latitude2Rad)
  N = a / math.sqrt(1 - et3)

  x = X + N * t * (0.5 * pow(m, 2) + (5.0 - pow(t, 2) + 9.0 * et2 + 4 * pow(et2, 2)) * pow(m, 4) / 24.0 + (
  61.0 - 58.0 * pow(t, 2) + pow(t, 4)) * pow(m, 6) / 720.0)
  y = 500000 + N * (m + (1.0 - pow(t, 2) + et2) * pow(m, 3) / 6.0 + (
  5.0 - 18.0 * pow(t, 2) + pow(t, 4) + 14.0 * et2 - 58.0 * et2 * pow(t, 2)) * pow(m, 5) / 120.0)

  return x, y


def XY2LatLon(X, Y, L0):

  iPI = 0.0174532925199433
  a = 6378137.0
  f= 0.00335281006247
  ZoneWide = 3 #按3度带进行投影

  ProjNo = int(X / 1000000)
  L0 = L0 * iPI
  X0 = ProjNo * 1000000 + 500000
  Y0 = 0
  xval = X - X0
  yval = Y - Y0

  e2 = 2 * f - f * f #第一偏心率平方
  e1 = (1.0 - math.sqrt(1 - e2)) / (1.0 + math.sqrt(1 - e2))
  ee = e2 / (1 - e2) #第二偏心率平方

  M = yval
  u = M / (a * (1 - e2 / 4 - 3 * e2 * e2 / 64 - 5 * e2 * e2 * e2 / 256))

  fai = u \
     + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * math.sin(2 * u) \
     + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * math.sin(4 * u) \
     + (151 * e1 * e1 * e1 / 96) * math.sin(6 * u)\
     + (1097 * e1 * e1 * e1 * e1 / 512) * math.sin(8 * u)
  C = ee * math.cos(fai) * math.cos(fai)
  T = math.tan(fai) * math.tan(fai)
  NN = a / math.sqrt(1.0 - e2 * math.sin(fai) * math.sin(fai))
  R = a * (1 - e2) / math.sqrt(
    (1 - e2 * math.sin(fai) * math.sin(fai)) * (1 - e2 * math.sin(fai) * math.sin(fai)) * (1 - e2 * math.sin(fai) * math.sin(fai)))
  D = xval / NN

  #计算经纬度(弧度单位的经纬度)
  longitude1 = L0 + (D - (1 + 2 * T + C) * D * D * D / 6 + (
  5 - 2 * C + 28 * T - 3 * C * C + 8 * ee + 24 * T * T) * D * D * D * D * D / 120) / math.cos(fai)
  latitude1 = fai - (NN * math.tan(fai) / R) * (
  D * D / 2 - (5 + 3 * T + 10 * C - 4 * C * C - 9 * ee) * D * D * D * D / 24 + (
  61 + 90 * T + 298 * C + 45 * T * T - 256 * ee - 3 * C * C) * D * D * D * D * D * D / 720)

  #换换为deg
  longitude = longitude1 / iPI
  latitude = latitude1 / iPI

  return latitude, longitude

# 
# print LatLon2XY(40.07837722329, 116.23514827596)
# print XY2LatLon(434760.7611718801, 4438512.040474475, 117.0)

以上这篇python实现高斯投影正反算方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python解析json实例方法
Nov 19 Python
Python实例分享:快速查找出被挂马的文件
Jun 08 Python
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
python各种语言间时间的转化实现代码
Mar 23 Python
Python调用系统底层API播放wav文件的方法
Aug 11 Python
用Django实现一个可运行的区块链应用
Mar 08 Python
python的concat等多种用法详解
Nov 28 Python
python linecache 处理固定格式文本数据的方法
Jan 08 Python
使用Windows批处理和WMI设置Python的环境变量方法
Aug 14 Python
Anaconda详细安装步骤图文教程
Nov 12 Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 Python
Python Selenium异常处理的实例分析
Feb 28 Python
python中图像通道分离与合并实例
Jan 17 #Python
Python-opencv 双线性插值实例
Jan 17 #Python
如何通过python实现人脸识别验证
Jan 17 #Python
Python-openCV读RGB通道图实例
Jan 17 #Python
OpenCV python sklearn随机超参数搜索的实现
Jan 17 #Python
python numpy 矩阵堆叠实例
Jan 17 #Python
Python利用Scrapy框架爬取豆瓣电影示例
Jan 17 #Python
You might like
实用函数4
2007/11/08 PHP
php函数的常用方法及注意之处小结
2011/07/10 PHP
使用PHP编写的SVN类
2013/07/18 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
destoon调用discuz论坛中带图片帖子的实现方法
2014/08/21 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
javascript事件模型代码
2007/07/01 Javascript
javascript数组使用调用方法汇总
2007/12/08 Javascript
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
使用Python构造hive insert语句说明
2020/06/06 Python
Python调用飞书发送消息的示例
2020/11/10 Python
Python实现疫情地图可视化
2021/02/05 Python
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
中秋节超市促销方案
2014/01/30 职场文书
三年级语文教学反思
2014/02/01 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
培训通知
2015/04/17 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
教师外出学习心得体会
2016/01/18 职场文书
JavaScript实现简单拖拽效果
2021/09/15 Javascript