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实现partial改变方法默认参数
Aug 18 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 Python
详解python3实现的web端json通信协议
Dec 29 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
python添加菜单图文讲解
Jun 04 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
Jul 22 Python
python异常触发及自定义异常类解析
Aug 06 Python
python创建ArcGIS shape文件的实现
Dec 06 Python
python PIL/cv2/base64相互转换实例
Jan 09 Python
基于virtualenv创建python虚拟环境过程图解
Mar 30 Python
Python 的 __str__ 和 __repr__ 方法对比
Sep 02 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
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
php数组中删除元素的实现代码
2012/06/22 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
2015/02/12 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
php服务器的系统详解
2019/10/12 PHP
ext监听事件方法[初级篇]
2008/04/27 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
js 通过cookie实现刷新不变化树形菜单
2014/10/30 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
python list使用示例 list中找连续的数字
2014/01/27 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
python全局变量引用与修改过程解析
2020/01/07 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
资深财务管理人员自我评价
2013/09/22 职场文书
超市5.1促销活动
2014/01/15 职场文书
会计电算化学生个人的自我评价
2014/02/08 职场文书
大学生优秀自荐信范文
2014/02/25 职场文书
银行金融服务方案
2014/06/11 职场文书
关于工作经历的证明书
2014/10/11 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
关于CSS浮动与取消浮动的问题
2021/06/28 HTML / CSS
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers