1. 程式人生 > >GPS 偏移校正(WGS-84) 到(GCJ-02) java版本實現

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版本實現

public class EvilTransform { final static double pi = 3.14159265358979324; // // // a = 6378245.0, 1/f = 298.3 // b =

WGS-84,GCJ-02,BD-09等地理座標系互轉

var GPS = { PI: 3.14159265358979324, x_pi: 3.14159265358979324 * 3000.0 / 180.0, delta: function (lat, lon) { // Kra

UCloud 雲服務內容稽核 Java 版本實現

前言 最近不少小夥伴反映上傳小黃圖偶爾性的異常,並且不能上傳動態圖片,很是苦惱!無她,鑑黃API還沒有這麼智慧,畢竟是自己訓練的,不是那麼專業!為了更好的服務廣大網友,擼主決定接入更加智慧快速的鑑黃服務。 UCloud UCloud內容稽核產品,基於海量訓練資料,結合深度學習識別技術,基於UCloud底層

GPS座標互轉、測距:WGS-84(GPS)、GCJ-02(Google地圖)、BD-09(百度地圖)

GPS轉換類,BD-09(百度GPS標準)、GCJ-02(中國國家測繪局標準)、WGS-84(全球GPS標準)相互轉換 WGS-84:是國際標準,GPS座標(Google Earth使用、或者GPS模組) GCJ-02:中國座標偏移標準,Google Map、高德、騰訊使用

iOS WGS-84:轉為 GCJ-02

近來開發的專案涉及地圖位置分享模組,android組的同事先開工,用的是百度地圖sdk,本人後面開工,用的是iOS SDK的mapkit做,之後問題來了,同一個經緯度座標在iOS端和Android端出現了比較大偏差。查了下資料蘋果地圖在大陸的資料來源是高德的,查了下高德採用GCJ-02, 百度map sdk

地球座標系 (WGS-84) 到火星座標系 (GCJ-02) 的轉換演算法

原文 WGS-84 到 GCJ-02 的轉換(即 GPS 加偏)演算法是一個普通青年輕易無法接觸到的“公開”的祕密。這個演算法的程式碼在網際網路上是公開的,詳情請使用 Google 搜尋 "wgtochina_lb" 。 至於 GCJ-02 到 WGS-84 的轉換

GCJ-02火星坐標系和WGS-84坐標系轉換關系

.com dst lse 4.0 magic fabs return int odin GCJ-02火星坐標系和WGS-84坐標系轉換關系 WGS-84:GPS坐標系 GCJ-02:火星坐標系,國測局02年發布的坐標體系,高德,騰訊等使用。 BD-09:百度坐標系,百度自研

中國地圖座標(GCJ-02)偏移演算法破解小史

2006年,Google開始與AutoNavi合作使用後者所提供的中國地圖。這應該是外企首次接觸到這個問題。 從2009年開始,中國地圖的座標偏移開始為外界所知。Garmin的使用者發現在美國購買的GPS到了中國幾乎無法使用,而在中國購買的Garmin產品則沒有問題。Google Maps API的使用

WGS-84經緯度轉Web墨卡托投影(C#版)

clas double light param urn static 實測 坐標 [1] /// <summary> /// WGS84經緯度轉Web墨卡托投影 /// </summary>

Java面試02|Java集合

策略 prot -1 ins return object true 實現 pac Java中一般接觸到的集合如下圖: 關於Java中並發集合有: (1)CouncurrentHashMap (2)CopyOnWriteArrayList (3)LinkedBlocki

02 Java 基礎語法

變量 mar ans int long 類型 per java 數組 不同的 在開始 Java 基本語法之前,先說明 Java 程序的基本規範: 大小寫敏感,例如 Person 和 person 是不同的 類名首字母大寫,如果類名由多個單詞組成,每個單詞首字母都大寫,例如

麻省理工18年春軟件構造課程閱讀02Java基礎”

signature 正常 -h ive ise string對象 情況下 實現類 log 本文內容來自MIT_6.031_sp18: Software Construction課程的Readings部分,采用CC BY-SA 4.0協議。 由於我們學校(哈工大)大二軟件構

20180826(02)-Java集合框架

但是 pro 然而 你會 map.entry seq iterator dha dma Java 集合框架 早在Java 2中之前,Java就提供了特設類。比如:Dictionary, Vector, Stack, 和Properties這些類用來存儲和操作對象組。 雖

20180827(02)- Java發送郵件

rac 獲取 per str 需要 [] work abc 系統 Java 發送郵件 使用Java應用程序發送E-mail十分簡單,但是首先你應該在你的機器上安裝JavaMail API 和Java Activation Framework (JAF) 。 你可以在 J

02 java 簡單了解 垃圾回收機制

負責 變量 無法 都是 內存不足 了解 nbsp 回收機制 java 程序運行時,一些分配出去的內存得不到及時回收,就會引起系統運行速度下降,甚至導出程序癱瘓,這種現象被稱為內存泄漏 java 程序裏的 內存分配和回收都是由 jre 在後臺自定進行的, jre 會負責回收那

02.Java使用鍵盤輸入 && Java呼叫函式(方法)

 一、Java使用鍵盤輸入 import java.util.Scanner; Scanner sc = new Scanner(System.in); int enterNumber = sc.nextInt(); 如果輸入字串: String str = sc.n

20180827(02)- Java傳送郵件

  Java 傳送郵件 使用Java應用程式傳送E-mail十分簡單,但是首先你應該在你的機器上安裝JavaMail API 和Java Activation Framework (JAF) 。 你可以在 JavaMail (Version 1.2) 下載最新的版本。你可以再 在JAF (Ve

02-Java難點攻克-String

String類 一,String類概念 字串在Java中屬於物件,Java提供String類來建立和操作字串,在程式碼中遇到字串常量時編譯器會使用該值建立一個String物件。 二,建立字串 String 變數名 = " " ; 一旦建立String物件,該值

Java SE基礎部分--02.Java資料型別轉換、運算子、方法入門

學習目標: 1、資料型別轉換、 2、算數運算子、 3、賦值運算子、 4、比較運算子、 5、邏輯運算子、 6、三元運算子、 7、方法定義和呼叫 一、資料型別轉換: 1、資料型別轉換分為:隱式型別轉換、強制型別轉換。 隱式轉換:是將容量小的型別自動轉成容量大的

JAVA學習02-Java JVM 執行機制及基本原理

Java JVM 執行機制及基本原理   將知識用文字記錄下來,供以後溫故知新。 JVM的基礎概念 JVM的中文名稱叫Java虛擬機器,它是由軟體技術模擬出計算機執行的一個虛擬的計算機。 JVM也充當著一個翻譯官的角色,我們編寫出的Java程式,是不能夠被作業系統所直接