火星座標和正常座標之間的轉換
轉換工具類:
import java.io.InputStream;
import java.io.ObjectInputStream;
/**
* 火星地球座標轉化.地圖座標修偏
*
*/
public class ModifyOffset {
private static ModifyOffset modifyOffset;
static double[] X = new double[660 * 450];
static double[] Y = new double[660 * 450];
private ModifyOffset(InputStream inputStream) throws Exception {
init(inputStream);
}
public synchronized static ModifyOffset getInstance(InputStream is) throws Exception {
if (modifyOffset == null) {
modifyOffset = new ModifyOffset(is);
}
return modifyOffset;
}
public void init(InputStream inputStream) throws Exception {
ObjectInputStream in = new ObjectInputStream(inputStream);
try {
int i = 0;
while (in.available() > 0) {
if ((i & 1) == 1) {
Y[(i - 1) >> 1] = in.readInt() / 100000.0d;
;
} else {
X[i >> 1] = in.readInt() / 100000.0d;
;
}
i++;
}
} finally {
if (in != null)
in.close();
}
}
// standard -> china
public PointDouble s2c(PointDouble pt) {
int cnt = 10;
double x = pt.x, y = pt.y;
while (cnt-- > 0) {
if (x < 71.9989d || x > 137.8998d || y < 9.9997d || y > 54.8996d)
return pt;
int ix = (int) (10.0d * (x - 72.0d));
int iy = (int) (10.0d * (y - 10.0d));
double dx = (x - 72.0d - 0.1d * ix) * 10.0d;
double dy = (y - 10.0d - 0.1d * iy) * 10.0d;
x = (x + pt.x + (1.0d - dx) * (1.0d - dy) * X[ix + 660 * iy] + dx
* (1.0d - dy) * X[ix + 660 * iy + 1] + dx * dy
* X[ix + 660 * iy + 661] + (1.0d - dx) * dy
* X[ix + 660 * iy + 660] - x) / 2.0d;
y = (y + pt.y + (1.0d - dx) * (1.0d - dy) * Y[ix + 660 * iy] + dx
* (1.0d - dy) * Y[ix + 660 * iy + 1] + dx * dy
* Y[ix + 660 * iy + 661] + (1.0d - dx) * dy
* Y[ix + 660 * iy + 660] - y) / 2.0d;
}
return new PointDouble(x, y);
}
// china -> standard
public PointDouble c2s(PointDouble pt) {
int cnt = 10;
double x = pt.x, y = pt.y;
while (cnt-- > 0) {
if (x < 71.9989d || x > 137.8998d || y < 9.9997d || y > 54.8996d)
return pt;
int ix = (int) (10.0d * (x - 72.0d));
int iy = (int) (10.0d * (y - 10.0d));
double dx = (x - 72.0d - 0.1d * ix) * 10.0d;
double dy = (y - 10.0d - 0.1d * iy) * 10.0d;
x = (x + pt.x - (1.0d - dx) * (1.0d - dy) * X[ix + 660 * iy] - dx
* (1.0d - dy) * X[ix + 660 * iy + 1] - dx * dy
* X[ix + 660 * iy + 661] - (1.0d - dx) * dy
* X[ix + 660 * iy + 660] + x) / 2.0d;
y = (y + pt.y - (1.0d - dx) * (1.0d - dy) * Y[ix + 660 * iy] - dx
* (1.0d - dy) * Y[ix + 660 * iy + 1] - dx * dy
* Y[ix + 660 * iy + 661] - (1.0d - dx) * dy
* Y[ix + 660 * iy + 660] + y) / 2.0d;
}
return new PointDouble(x, y);
}
}
class PointDouble {
double x, y;
PointDouble(double x, double y) {
this.x = x;
this.y = y;
}
public String toString() {
return "x=" + x + ", y=" + y;
}
}
測試類:
public class Demo {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
//載入火星座標和正常座標對應的資料庫檔案
ModifyOffset mo = ModifyOffset.getInstance(Demo.class.getClassLoader().getResourceAsStream("axisoffset.dat"));
//將標準座標轉換成火星座標
PointDouble np = mo.s2c(new PointDouble(116.290855191, 40.0432369051));
System.out.println(np.toString());
}
}
相關文章
- iOS地球座標、火星座標和百度座標之間轉換(Swift3.0)iOSSwift
- 火星座標轉換
- ogre世界座標魚螢幕座標相互轉換
- 利用齊次座標進行二維座標轉換
- Qt - 座標系及轉換QT
- 三維座標系旋轉——旋轉矩陣到旋轉角之間的換算矩陣
- ArcEngine下投影座標和經緯度座標的相互轉換
- 地心地固座標系(ECEF)與站心座標系(ENU)的轉換
- GPS座標轉換為BIM
- 三維空間座標系變換-旋轉矩陣矩陣
- 座標系定義和相互轉換演算法演算法
- pose座標變換
- 百度座標轉換API使用API
- 向量和矩陣的座標變換(下標記法)7矩陣
- 向量和矩陣的座標變換7矩陣
- GIS中的座標系定義與轉換 (轉)
- JavaScript 空間座標JavaScript
- vue 實現高德座標轉GPS座標Vue
- Go版本的各座標系互相轉換的工具Go
- iOS開發中常見定位座標轉換iOS
- C++ opencv的圓轉矩形,極座標轉笛卡爾座標系C++OpenCV
- ArcGIS地圖投影與座標系轉換的方法地圖
- gcoord: 轉換WGS84、GCJ02、BD09座標,轉換百度高德地圖座標系GC地圖
- 關於Unity中的世界座標和區域性座標Unity
- iOS中地圖經緯度座標轉換iOS地圖
- ROS TF :使用 TF 設定機器人 釋出座標變換 使用座標變換 將感測器資料轉換為機器人座標系下ROS機器人
- 理解SVG transform座標變換SVGORM
- 線性變換和矩陣的橋樑篇2——像的座標標示矩陣
- 張正友標定Opencv實現、標定流程以及影像座標轉為世界座標OpenCV
- OpenGL中的座標變換、矩陣變換矩陣
- Python pytorch 座標系變換與維度轉換PythonPyTorch
- MathNet Ray3D座標系下轉換3D
- 工程座標轉換方法C#程式碼實現C#
- OpenGL ES on iOS --- 座標系統與矩陣轉換iOS矩陣
- utc時間轉換成標準時間
- 形象化理解笛卡爾座標系和極座標系
- 理解SVG座標系統和變換: transform屬性SVGORM
- Qt/C++地址轉座標/座標轉地址/逆地址解析/支援百度高德騰訊和天地圖QTC++地圖