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 拷贝对象(深拷贝deepcopy与浅拷贝copy)
Sep 06 Python
wxPython 入门教程
Oct 07 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
深入理解Django的自定义过滤器
Oct 17 Python
python读取中文txt文本的方法
Apr 12 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
Apr 18 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
Jan 15 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
python cv2截取不规则区域图片实例
Dec 21 Python
python有几个版本
Jun 17 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
详解Pandas 处理缺失值指令大全
Jul 30 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程序占用多少内存(memory_get_usage)
2012/09/23 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
JavaScript中null与undefined分析
2009/07/25 Javascript
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
Js控制滑轮左右滑动实例
2015/02/13 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
从Node.js事件触发器到Vue自定义事件的深入讲解
2020/06/26 Javascript
python两种遍历字典(dict)的方法比较
2014/05/29 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
python实现飞机大战微信小游戏
2020/03/21 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
基于python 微信小程序之获取已存在模板消息列表
2019/08/05 Python
python软件都是免费的吗
2020/06/18 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
管理部副部长岗位职责范文
2014/03/09 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
海洋科学专业求职信
2014/08/10 职场文书
实习介绍信模板
2015/01/30 职场文书
小学主题班会教案
2015/08/17 职场文书
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android