技术背景

  做过位置数据处理的小伙伴基本上都会遇到坐标转换,而基于高斯投影原理的大地坐标转平面坐标就是其中一种坐标转换,坐标转换的目的就是方便后面数据的处理工作,大地坐标转高斯平面坐标常用的有两种,即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. postgresql使用pg_dump工具进行数据库迁移

    一.使用管理员身份打开cmd,切换到postgresqlp安装目录下的bin目录 必须要以管理员身份打开cmd,否则报拒绝访问 二.把生成的文件上传到服务器上,同样cd 到postgresql的安装b ...

  2. react中label标签的作用

    当我们点击输入内容触发input焦点的时候,就需要使用到label标签里的htmlFor属性来扩大点击的区域 代码如下:

  3. Go语言系列之网络编程

    现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其实是一个很庞大的领域,本 ...

  4. vue2.0多页面开发

    我们平常用vue开发的时候总觉得vue好像就是专门为了单页面应用而诞生的,其实不是.因为vue在工程化开发的时候很依赖webpack,而webpack是将所有的资源整合到一块,弄成一个单页面.但是vu ...

  5. MCU软件最佳实践——独立按键

    1. 引子 在进行mcu驱动和应用开发时,经常会遇到独立按键驱动的开发,独立按键似乎是每一个嵌入式工程师的入门必修课.笔者翻阅了许多书籍(包括上大学时候用的书籍)同时查阅了网上许多网友的博客,无一例外 ...

  6. 《剑指offer》面试题14- I. 剪绳子

    问题描述 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] .请问 k[0]*k[1]* ...

  7. 【算法】Manacher算法

    最长回文串问题 manacher算法是用来求解最长回文串的问题.最长回文串的解法一般有暴力法.动态规划.中心扩展法和manacher算法. 暴力法的时间复杂度为\(O(n^3)\),一般都会超时: 动 ...

  8. 虚拟化架构与Centos7系统部署

    1.什么是虚拟化(Virtualization) 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可 ...

  9. 利用词向量进行推理(Reasoning with word vectors)

    The amazing power of word vectors | the morning paper (acolyer.org) What is a word vector? At one le ...

  10. AOP-基本概念

    AOP(概念) 1,什么是AOP (1)面向切面(方面)编程 :利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. (2)通 ...