GPS 偏移校正(WGS-84) 到(GCJ-02) java版本实现

public class EvilTransform {

	final static double pi = 3.14159265358979324;

    //
    //
    // a = 6378245.0, 1/f = 298.3
    // b = a * (1 - f)
    // ee = (a^2 - b^2) / a^2;
	final static double a = 6378245.0;
	final static double ee = 0.00669342162296594323;

    //
    // World Geodetic System ==> Mars Geodetic System
    public static double[] transform(double wgLat, double wgLon)
    {
    	double mgLat=0;
		double mgLon=0;
        if (outOfChina(wgLat, wgLon))
        {
            mgLat = wgLat;
            mgLon = wgLon;

        }else{
	        double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
	        double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
	        double radLat = wgLat / 180.0 * pi;
	        double magic = Math.sin(radLat);
	        magic = 1 - ee * magic * magic;
	        double sqrtMagic = Math.sqrt(magic);
	        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
	        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
	        mgLat = wgLat + dLat;
	        mgLon = wgLon + dLon;
        }
        double[] point={mgLat,mgLon};
        return point;
    }

    private static boolean outOfChina(double lat, double lon)
    {
        if (lon < 72.004 || lon > 137.8347)
            return true;
        if (lat < 0.8293 || lat > 55.8271)
            return true;
        return false;
    }

    private static double transformLat(double x, double y)
    {
        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
        ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
        return ret;
    }

    private static double transformLon(double x, double y)
    {
        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
        ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
        return ret;
    }
}

GPS 偏移校正(WGS-84) 到(GCJ-02) java版本实现

时间: 2024-10-05 09:17:57

GPS 偏移校正(WGS-84) 到(GCJ-02) java版本实现的相关文章

GPS定位的偏移校正(WGS84与火星坐标互转)

原文:GPS定位的偏移校正(WGS84与火星坐标互转) 地图坐标系目前包括: 地球坐标 (WGS84) WGS84:World Geodetic System 1984,是为GPS全球定位系统使用而建立的坐标系统. 国际标准,从 GPS 设备中取出的数据的坐标系 国际地图提供商使用的坐标系 火星坐标 (GCJ-02)也叫国测局坐标系 GCJ-02是由中国国家测绘局(民间说的火星坐标系)制订的地理信息系统的坐标系统. 它是一种对经纬度数据的加密算法,即加入随机的偏差. 国内出版的各种地图系统(包括

02 java 程序环境

java 安装与设置 1. 安装 jdk 2. 设置执行路径 unix: set path=(/usr/local/jdk/bin $path) ( 在~/.cshrc文件里增加) linux: export PATH=/usr/local/jdk/bin:$PATH (在 ~/.bashrc 或 ~/.bash_profile 文件里增加) windows: 我的电脑右键属性- 设置完后, java –version 可以确定是否设置成功 3. 安装源代码库和文档 1). 确保jdk已经安装完

使用GCJ编译Java程序供Matlab调用Java对象方法实践

1 引言 以Matlab作为开发平台,进行数值计算,具有直接.高效的特点. 然而,在面向对象程序设计方面,现有的Matlab支持特性在开发和运行效率上并不高. 将Java语言面向对象及其平台特性引入Matlab,能够拓展其模型表达能力与手段.此外,Java本身的特性,也决定了其具有良好的开发性能. 与C语言编写mex动态链接库的开发目的不同(mex主要以速度见长),基于Java的matlab扩展能为matlab带来更大的灵活性.甚至于,Java平台下更多的类库,能够丰富matlab平台功能. 2

Hadoop 1.2.1 安装笔记02: Java安装

采用ftp 或在线wget方式获取jdk安装包 ,放置于新创建的/usr/java 目录中 ,解压安装 [[email protected] java]$ sudo tar -zxvf jdk-7u65-linux-x64.gz 配置 /etc/profile里的Java参数 # JAVA environment  export JAVA_HOME=/usr/java/jdk1.7.0_65 export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_H

02 Java类的加载机制

1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并向程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个类被"首次主动使用"时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.c

02 java语言基础

常量:字面值常量(字符串,字符,整数,小数,布尔,null),自定义常量,''这个不是字符常量,""这个是字符串常量 进制: 02.01_Java语言基础(常量的概述和使用)(掌握) A:什么是常量 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 字符串常量 用双引号括起来的内容 整数常量 所有整数 小数常量 所有小数 字符常量 用单引号括起来的内容,里面只能放单个数字,单个字母或单个符号 布尔常量 较为特

Java面试02|Java集合

Java中一般接触到的集合如下图: 关于Java中并发集合有: (1)CouncurrentHashMap (2)CopyOnWriteArrayList (3)LinkedBlockingQueue (4)ArrayBlockingQueue 这些的适用场景及其实现原理是必须要掌握的. 1.Hash的死锁原因 参考:HashMap 死锁分析 http://github.thinkingbar.com/hashmap-infinite-loop/ 2.关于ConcurrentHashMap相关的

2017/05/02 java 基础 随笔

1.PrtSc键是截屏键   打开画图软件  ctrl+v就可以复制到 2.win7以上可以  在当前目录下shift+右键 3.junit和javaweb应用的main函数在哪里? java程序跑起来,一般是通过主类的main方法启动的.对于Web应用,是tomcat中按照Servlet等规范实现,我们的应用中写规范定义好的API逻辑,tomcat按请求去调用这些Servlet,从而启动Web应用.tomcat的主类是BootStrap类,也是以此类的main方法作为入口启动的,如果要验证你可

02 Java 基础语法

在开始 Java 基本语法之前,先说明 Java 程序的基本规范: 大小写敏感,例如 Person 和 person 是不同的 类名首字母大写,如果类名由多个单词组成,每个单词首字母都大写,例如 HelloWorld 方法名应遵守驼峰命名法,以小写字母开头,若含有多个单次,后面单次大写,例如 findMinNumber 源文件名必须和类名相同 Java 程序由 public static void main(string [] args) 方法开始执行 Java 标识符,例如类名.变量名.方法名