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中用format函数格式化字符串的用法
Apr 08 Python
Python中pip安装非PyPI官网第三方库的方法
Jun 02 Python
Python中optparser库用法实例详解
Jan 26 Python
如何用Python实现简单的Markdown转换器
Jul 16 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
使用python进行波形及频谱绘制的方法
Jun 17 Python
对Python3之方法的覆盖与super函数详解
Jun 26 Python
解决Tensorboard 不显示计算图graph的问题
Feb 15 Python
Python基于类路径字符串获取静态属性
Mar 12 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
May 09 Python
python 实现分组求和与分组累加求和代码
May 18 Python
浅谈对python中if、elif、else的误解
Aug 20 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上传
2011/07/14 PHP
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
解决vuex刷新状态初始化的方法实现
2019/08/15 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
openlayers4.6.5实现距离量测和面积量测
2020/09/25 Javascript
Python创建xml的方法
2015/03/10 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
如何通过python实现人脸识别验证
2020/01/17 Python
Python列表切片常用操作实例解析
2020/03/10 Python
Python ellipsis 的用法详解
2020/11/20 Python
中科前程Java笔试题
2016/11/20 面试题
求职意向书
2014/04/01 职场文书
安全生产管理责任书
2014/04/16 职场文书
爱心捐书活动总结
2014/07/05 职场文书
博士生专家推荐信
2014/09/26 职场文书
作风建设剖析材料
2014/10/06 职场文书
高中生旷课检讨书
2014/10/08 职场文书
会议欢迎词
2015/01/23 职场文书