技术背景

  做过位置数据处理的小伙伴基本上都会遇到坐标转换,而基于高斯投影原理的大地坐标转平面坐标就是其中一种坐标转换,坐标转换的目的就是方便后面数据的处理工作,大地坐标转高斯平面坐标常用的有两种,即3°带和6°带,具体采用哪种根据实际情况而定。

计算原理

  6°带带号n与相应的中央子午线L0经度的关系为:

  3°带带号n’与相应的中央子午线L0’经度的关系为:

  设参考椭球的长半轴为 a,第一偏心率为 e,并令:

  设中央子午线的经度为 L0,再记:

  则高斯投影正算公式为:

  其中:

  没学过测绘的同学对以上原理不是很理解,也很正常,大家可以查阅相关《大地测量学》书籍,具体武大版还是矿大版的,没什么区别。

具体实现

  具体实现平台依然是IBM的Eclipse软件,编程语言为Java,下面是以3°带为例,进行高斯投影坐标正算,具体内容请看代码

  1 package package1;
2
3 public class BLH_xyh {
4
5 public static double a = 6378137;
6 public static double e = Math.sqrt(0.0066943799013);
7 public static double scale_wide = 3;
8 public static double π = 3.14159265358979323846;
9
10 public static void main(String[] args) {
11 // TODO 自动生成的方法存根
12 Point3d xyh = the_coordinates_are_counting(36.0307523111,120.184664478,9.7065);
13 System.out.println(xyh.getX()+","+xyh.getY()+","+xyh.getZ());
14 }
15 public static Point3d the_coordinates_are_counting(double B,double L,double H){
16 double A_ = 1
17 +3*e*e/4
18 +45*e*e*e*e/64
19 +175*e*e*e*e*e*e/256
20 +11025*e*e*e*e*e*e*e*e/16384
21 +43659*e*e*e*e*e*e*e*e*e*e/65536;
22 double B_ = 3*e*e/4+15*e*e*e*e/16
23 +525*e*e*e*e*e*e/512
24 +2205*e*e*e*e*e*e*e*e/2048
25 +72765*e*e*e*e*e*e*e*e*e*e/65536;
26 double C_ = 15*e*e*e*e/64
27 +105*e*e*e*e*e*e/256
28 +2205*e*e*e*e*e*e*e*e/4096
29 +10395*e*e*e*e*e*e*e*e*e*e/16384;
30 double D_ = 35*e*e*e*e*e*e/512
31 +315*e*e*e*e*e*e*e*e/2048
32 +31185*e*e*e*e*e*e*e*e*e*e/13072;
33 /*
34 double E_ = 315*e*e*e*e*e*e*e*e/16384
35 +3465*e*e*e*e*e*e*e*e*e*e/65536;
36 double F_ = 693*e*e*e*e*e*e*e*e*e*e/13072;
37 */
38
39 double α = A_*a*(1-e*e);
40 double β = -B_*a*(1-e*e)/2;
41 double γ = C_*a*(1-e*e)/4;
42 double δ = -D_*a*(1-e*e)/6;
43 /*
44 double ε = E_*a*(1-e*e)/8;
45 double ζ = -F_*a*(1-e*e)/10;
46 */
47
48 double C0 = α;
49 double C1 = 2*β+4*γ+6*δ;
50 double C2 = -8*γ-32*δ;
51 double C3 = 32*δ;
52
53 double x,y,sign;
54 double scale_number = Math.floor(L/scale_wide);
55 if(L > (scale_number * scale_wide + scale_wide/2)){
56 scale_number =scale_number + 1;
57 sign = -1;
58 }else{
59 sign = 1;
60 }
61
62 double L0 = scale_wide*scale_number;
63 double l = Math.abs(L-L0);
64 B = B*π/180;
65 l = l*π/180;
66 double t = Math.tan(B);
67 double m0 = Math.cos(B)*l;
68 double η = Math.sqrt(e*e*Math.pow(Math.cos(B),2)/(1-e*e));
69 double N = a/Math.sqrt(1-e*e*Math.pow(Math.sin(B), 2));
70
71 double X0 = C0*B+Math.cos(B)*(C1*Math.sin(B)+C2*Math.pow(Math.sin(B),3)+C3*Math.pow(Math.sin(B), 5));
72
73 x = X0
74 +N*t*m0*m0/2
75 +N*t*m0*m0*m0*m0*(5-t*t+9*η*η+4*η*η*η*η)/24
76 +N*t*m0*m0*m0*m0*m0*m0*(61-58*t*t+t*t*t*t)/720;
77 y = N*m0+
78 N*m0*m0*m0*(1-t*t+η*η)/6+
79 N*m0*m0*m0*m0*m0*m0*(5-18*t*t+t*t*t*t+14*η*η-58*η*η*t*t)/120;
80
81 y = y*sign+500000;
82
83 double h = H;
84
85 Point3d xyh = new Point3d(x,y,h);
86 return xyh;
87 }
88 }

其中Point3d的定义如下:

  1 package package1;
2
3 public class Point3d {
4 private double x;
5 private double y;
6 private double z;
7 public Point3d(double x,double y,double z){
8 this.x=x;
9 this.y=y;
10 this.z=z;
11 }
12 public double getX() {
13 return x;
14 }
15 public void setX(double x) {
16 this.x = x;
17 }
18 public double getY() {
19 return y;
20 }
21 public void setY(double y) {
22 this.y = y;
23 }
24 public double getZ() {
25 return z;
26 }
27 public void setZ(double z) {
28 this.z = z;
29 }
30 }

测试数据为36.0307523111,120.184664478,9.7065,运行结果如下:

至此结束

致谢

  感谢山东科技大学北斗星光创客兴趣学习小组的王老师对于原理文档的整理以及郑** C++代码的技术分享!

参考文档

1、山东科技大学”北斗星光创客”兴趣学习小组GNSS技术文档

大地坐标BLH转平面坐标xyh(高斯投影坐标正算) Java版的更多相关文章

  1. arcpy arcgis python实例教程--原点夹角距离定义线(坐标正算)

    arcpy arcgis python实例教程--原点夹角距离定义线(坐标正算) 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 此地理处理工具 ...

  2. 高德SDK获取到的坐标转换为GPS真实坐标方法,Java版

    发现高德SDK不提供高德的坐标转GPS坐标(GCJ_02转WGS_84),下面是一份Java版的 /**************************** 文件名:GCJ2WGS.java 创建时间 ...

  3. 经纬坐标(BLH)数据创建.kml文件小工具设计 Java版

    技术背景 KML,是标记语言(Keyhole Markup Language)的缩写,最初由Keyhole公司开发,是一种基于XML 语法与格式的.用于描述和保存地理信息(如点.线.图像.多边形和模型 ...

  4. 使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换

    [摘 要] 本文针对从事测绘工作者普遍遇到的坐标转换问题,简要介绍ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标转换原理和步骤. [关键词] ArcGIS 坐标转换 投影变换 1 坐标转换 ...

  5. 在ArcGIS中WGS84大地坐标和投影平面坐标的转换

    以WGS84转换为北京54坐标为例: 首先你要先知道转化的参数,鉴于我国曾使用不同的坐标基准(BJ54.State80.Correct54),各地的重力值又有很大差异,所以很难确定一套适合全国且精度较 ...

  6. 火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版

    火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图.导航设备都是采用的这一坐标系或在这一坐标的基础上进行二次加密得到的.火星坐标的真实名称应该是GCJ- ...

  7. 【转】火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版

    原文地址:https://www.cnblogs.com/fwc1994/p/5884115.html 火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地 ...

  8. openlayer 4326与3857坐标互转之Java版

    public class Transform { private static final double PI = Math.PI; private static final double merca ...

  9. 创建正真的Java不可变类

    如果需要设计一个不可变类,尤其要注意其引用类型Field,如果其引用类型Field的类是可变的,就必须采取必要的措施来保护该Field所引用的对象不会被修改,这样才能创建真正的不可变类. class ...

随机推荐

  1. 本地Java大数据环境基础配置(Maven)

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6812623309138559500/ 创建项目 准备pom.xml文件配置(附在文档最后) 在下载jar过程中极其 ...

  2. css编写规则BEM

    简单来说,格式如下: .block { /* styles */ } .block__element { /* styles */ } .block--modifier { /* styles */ ...

  3. 网络协议学习笔记(二)物理层到MAC层,交换机和VLAN,ICMP与ping原理

    概述 之前网络学习笔记主要讲解了IP的诞生,或者说整个操作系统的诞生,一旦有了IP,就可以在网络的环境里和其他的机器展开沟通了.现在开始给大家讲解关于网络底层的相关知识. 从物理层到MAC层:如何在宿 ...

  4. kafka学习笔记(四)kafka的日志模块

    概述 日志段及其相关代码是 Kafka 服务器源码中最为重要的组件代码之一.你可能会非常关心,在 Kafka 中,消息是如何被保存和组织在一起的.毕竟,不管是学习任何消息引擎,弄明白消息建模方式都是首 ...

  5. Python垃圾回收和Linux Fork

    前言 在口袋助理看到了其他部门的同事针对Python2内存占用做的一点优化工作,自己比较感兴趣,遂记录下. Linux fork简介 fork是Linux提供的创建子进程的系统调用.为了优化创建进程速 ...

  6. 浅解XXE与Portswigger Web Sec

    XXE与Portswigger Web Sec ​ 相关链接: ​ 博客园 ​ 安全脉搏 ​ FreeBuf 简介XML XML,可扩展标记语言,标准通用标记语言的子集.XML的简单易于在任何应用程序 ...

  7. day 9 scanf输入和gets输入的区别

    (1).计算机高级语言程序运行方法有编译执行和编译解释两种,一下叙述中正确的是[A] A.C语言程序仅可以编译执行 B.C语言程序仅可以解释执行 C.C语言程序既可以编译执行又可以解释执行 D.以上说 ...

  8. 在Linux系统(centos7)中,安装VScode,并在VScode上编写HTML网页

    [实验目的] 在Linux系统中,搭建编写HTML网页的环境.在VS code官网上,下载VS code安装程序,进行安装.在VS code软件中编写HTML页面,并正确运行. [实验步骤] 1)   ...

  9. 18个示例详解 Spring 事务传播机制(附测试源码)

    什么是事务传播机制 事务的传播机制,顾名思义就是多个事务方法之间调用,事务如何在这些方法之间传播. 举个例子,方法 A 是一个事务的方法,方法 A 执行的时候调用了方法 B,此时方法 B 有无事务以及 ...

  10. 【linux】Ubuntu20.04使用apt下载和卸载openJDK

    Ubuntu20.04使用apt下载和卸载openJDK 前言 由于最近电脑装了ubuntu和win双系统,想再ubuntu上学习.在成功配置完系统之后,开始了配学习环境的旅程.... 这次的是使用u ...