火星座標和正常座標之間的轉換
轉換工具類:
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());
}
}
相關文章
- 利用齊次座標進行二維座標轉換
- Qt - 座標系及轉換QT
- GPS座標轉換為BIM
- 三維座標系旋轉——旋轉矩陣到旋轉角之間的換算矩陣
- 地心地固座標系(ECEF)與站心座標系(ENU)的轉換
- 三維空間座標系變換-旋轉矩陣矩陣
- 座標系定義和相互轉換演算法演算法
- 海康相機 畫素座標(px,py)到sdk ptz 座標轉換最後到onvif ptz座標
- pose座標變換
- 向量和矩陣的座標變換(下標記法)7矩陣
- 向量和矩陣的座標變換7矩陣
- Go版本的各座標系互相轉換的工具Go
- vue 實現高德座標轉GPS座標Vue
- iOS開發中常見定位座標轉換iOS
- Python pytorch 座標系變換與維度轉換PythonPyTorch
- JavaScript 空間座標JavaScript
- ArcGIS地圖投影與座標系轉換的方法地圖
- C++ opencv的圓轉矩形,極座標轉笛卡爾座標系C++OpenCV
- MathNet Ray3D座標系下轉換3D
- ROS TF :使用 TF 設定機器人 釋出座標變換 使用座標變換 將感測器資料轉換為機器人座標系下ROS機器人
- 張正友標定Opencv實現、標定流程以及影像座標轉為世界座標OpenCV
- 工程座標轉換方法C#程式碼實現C#
- 線性變換和矩陣的橋樑篇2——像的座標標示矩陣
- 各種座標系互相轉換(WGS84轉換BD-09主要)
- WGS84、BD09、GCJ02座標轉換GC
- 世界座標系到攝像機座標系的矩陣變換推導過程矩陣
- gps wgs4座標與高德gcj02座標互轉GC
- 大角度非迭代的空間座標旋轉C#實現C#
- AUTOCAD——座標標註
- 角度和弧度之間的轉換
- Qt/C++地址轉座標/座標轉地址/逆地址解析/支援百度高德騰訊和天地圖QTC++地圖
- 傾斜攝影osgb格式檔案,進行座標轉換
- ifccolumn在空間中的座標計算
- 形象化理解笛卡爾座標系和極座標系
- String和Date、Timestamp之間的轉換
- 座標系
- 座標系CM和ZONE的區別
- 座標系的生成
- 高德座標打點(點為正常的WGS84地球座標系,常見於 GPS 裝置,Google 地圖等國際標準的座標體系)偏移,調整偏移量Go地圖