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多线程抓取天涯帖子内容示例
Apr 03 Python
python字典get()方法用法分析
Apr 17 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
使用pandas对矢量化数据进行替换处理的方法
Apr 11 Python
python实现对求解最长回文子串的动态规划算法
Jun 02 Python
详解python单元测试框架unittest
Jul 02 Python
python多进程并行代码实例
Sep 30 Python
基于Python脚本实现邮件报警功能
May 20 Python
Opencv求取连通区域重心实例
Jun 04 Python
Python变量格式化输出实现原理解析
Aug 06 Python
python获取本周、上周、本月、上月及本季的时间代码实例
Sep 08 Python
python中对列表的删除和添加方法详解
Feb 24 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&&mysql)二
2006/10/09 PHP
PHP中其实也可以用方法链
2011/11/10 PHP
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
JS 弹出层 定位至屏幕居中示例
2014/05/21 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
jQuery 重复加载错误以及修复方法
2014/12/16 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
JavaScript中数组的22种方法必学(推荐)
2016/07/20 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
js实现仿购物车加减效果
2017/03/01 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
2017/08/25 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
Python的Django框架中URLconf相关的一些技巧整理
2015/07/18 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
DataFrame中去除指定列为空的行方法
2018/04/08 Python
Python封装原理与实现方法详解
2018/08/28 Python
Python实现二叉树的常见遍历操作总结【7种方法】
2019/03/06 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
巧克力蛋糕店创业计划书
2014/01/14 职场文书
学习党章的体会
2014/11/07 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL