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实现斐波那契递归函数的方法
Sep 08 Python
python运行时间的几种方法
Jun 17 Python
python一键升级所有pip package的方法
Jan 16 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
Jul 06 Python
python3 发送任意文件邮件的实例
Jan 23 Python
替换python字典中的key值方法
Jul 06 Python
实例介绍Python中整型
Feb 11 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
Jun 20 Python
在python中创建指定大小的多维数组方式
Nov 28 Python
python——全排列数的生成方式
Feb 26 Python
解决jupyter notebook 出现In[*]的问题
Apr 13 Python
python实现录制全屏和选择区域录屏功能
Feb 05 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为php增加openssl模块的方法
2011/06/14 PHP
PHP正确配置mysql(apache环境)
2011/08/28 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
php实现字符串翻转的方法
2015/03/27 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
2010/04/23 Javascript
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
js 动态文字滚动的例子
2011/01/17 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
2011/10/03 Javascript
innerText 使用示例
2014/01/23 Javascript
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
JavaScript表格常用操作方法汇总
2015/04/15 Javascript
DOM 高级编程
2015/05/06 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
jQuery实现内容定时切换效果完整实例
2016/04/06 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
python 基于TCP协议的套接字编程详解
2019/06/29 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
简单了解python的内存管理机制
2019/07/08 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
复核员上岗演讲稿
2014/01/05 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
2014年售票员工作总结
2014/11/19 职场文书
采购员岗位职责
2015/02/03 职场文书
财政局个人总结
2015/03/04 职场文书
赵氏孤儿观后感
2015/06/09 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js