大地坐标BLH转平面坐标xyh(高斯投影坐标正算) Java版
技术背景
做过位置数据处理的小伙伴基本上都会遇到坐标转换,而基于高斯投影原理的大地坐标转平面坐标就是其中一种坐标转换,坐标转换的目的就是方便后面数据的处理工作,大地坐标转高斯平面坐标常用的有两种,即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版的更多相关文章
- arcpy arcgis python实例教程--原点夹角距离定义线(坐标正算)
arcpy arcgis python实例教程--原点夹角距离定义线(坐标正算) 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 此地理处理工具 ...
- 高德SDK获取到的坐标转换为GPS真实坐标方法,Java版
发现高德SDK不提供高德的坐标转GPS坐标(GCJ_02转WGS_84),下面是一份Java版的 /**************************** 文件名:GCJ2WGS.java 创建时间 ...
- 经纬坐标(BLH)数据创建.kml文件小工具设计 Java版
技术背景 KML,是标记语言(Keyhole Markup Language)的缩写,最初由Keyhole公司开发,是一种基于XML 语法与格式的.用于描述和保存地理信息(如点.线.图像.多边形和模型 ...
- 使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换
[摘 要] 本文针对从事测绘工作者普遍遇到的坐标转换问题,简要介绍ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标转换原理和步骤. [关键词] ArcGIS 坐标转换 投影变换 1 坐标转换 ...
- 在ArcGIS中WGS84大地坐标和投影平面坐标的转换
以WGS84转换为北京54坐标为例: 首先你要先知道转化的参数,鉴于我国曾使用不同的坐标基准(BJ54.State80.Correct54),各地的重力值又有很大差异,所以很难确定一套适合全国且精度较 ...
- 火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版
火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图.导航设备都是采用的这一坐标系或在这一坐标的基础上进行二次加密得到的.火星坐标的真实名称应该是GCJ- ...
- 【转】火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版
原文地址:https://www.cnblogs.com/fwc1994/p/5884115.html 火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地 ...
- openlayer 4326与3857坐标互转之Java版
public class Transform { private static final double PI = Math.PI; private static final double merca ...
- 创建正真的Java不可变类
如果需要设计一个不可变类,尤其要注意其引用类型Field,如果其引用类型Field的类是可变的,就必须采取必要的措施来保护该Field所引用的对象不会被修改,这样才能创建真正的不可变类. class ...
随机推荐
- Flask_获取请求信息(三)
引用request的方法: from flask import request 与Django不同的是,flask是不需要将request对象作为第一个参数传入视图函数,他的request对象是来自于 ...
- Go语言系列之网络编程
现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其实是一个很庞大的领域,本 ...
- Word文档学习小练习链接
1. < Word2010初学> https://www.toutiao.com/i6487370439910752782/ 2. <Word2010格式化可爱的家乡> htt ...
- 服务限流 -- 自定义注解基于RateLimiter实现接口限流
1. 令牌桶限流算法 令牌桶会以一个恒定的速率向固定容量大小桶中放入令牌,当有浏览来时取走一个或者多个令牌,当发生高并发情况下拿到令牌的执行业务逻辑,没有获取到令牌的就会丢弃获取服务降级处理,提示一个 ...
- eclipse中配置Webdriver
安装JDK,配置好Java环境 下载Eclipse,并完成安装 下载Webdriver的JAR文件(访问Selenium官网,下载Java版的zip文件,并且解压到本地磁盘,解压后文件夹内容如下图:) ...
- 软件开发架构与网络之OSI七层协议(五层)
本期内容概要 python回顾 软件开发架构 网络理论前瞻 osi七层协议(五层) 以太网协议 IP协议 port协议 交换机 路由器 局域网 广域网 TCP协议 三次握手 四次挥手 UDP协议 内容 ...
- 《剑指offer》面试题10- II. 青蛙跳台阶问题
问题描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008, ...
- 【解决了一个小问题】gin框架中出现如下错误:"[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 500"
POST到数据到一条gin框架的接口后,客户端收到400错误,并且返回了业务中返回的"decode json fail". 关键代码是: func report(c *gin.Co ...
- pytest文档7-计算单元测试代码覆盖率(pytest-cov)
pytest-cov 先命令行安装 pytest-cov 2.10.1版本 pip install pytest-cov==2.10.1 环境要求:1.python3.6.6 版本备注:其它版本没试过 ...
- 外观模式(Facade模式)
外观模式的定义与特点 外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式.该模式对外有一个统一接口,外部应用程序不用关心内部子系 ...