proj4j庫在在業界很出名的。有開源的c代碼,這個如果要編譯到android 的so完整調用就好了。不過有很多問題。我在Java上找到純Java寫的proj4j庫。使用這個庫跟epsg就可以很好對應起來。就是每個投影都是有世界通用的編號。
1、庫
把epsg定義都放在jar包下面,就是打包進行了。
可以查看,查找你想要的epsg代號,以及裏面內容
epsg:2345 大概是廣州用的範圍。你可以做找到你想要的。
2、看代碼轉換
第一種創建座標投影對象,直接使用完整文本進行解析。目標投影
String proj4 ="+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs";
CRSFactory targetFactory = new CRSFactory();
CoordinateReferenceSystem target = targetFactory.createFromParameters("target", proj4);
第二種直接用代碼調用jar下面的epsg文件。然後輸入編號,就能找到具體的參數。
Proj4FileReader proj4FileReader = new Proj4FileReader();
String[] paramStr = new String[0];
try {
paramStr = proj4FileReader.readParametersFromFile("epsg","2435");
} catch (IOException e) {
e.printStackTrace();
}
CRSFactory targetFactory = new CRSFactory();
//目標座標系統
CoordinateReferenceSystem target = targetFactory.createFromParameters("2435", paramStr);
一般來說是轉WGS84經緯度轉換到地方座標。或者反過來,地方座標轉到WGS84經緯度。
示例WGS84經緯度轉換到2435地方座標
Proj4FileReader proj4FileReader = new Proj4FileReader();
String[] paramStr = new String[0];
try {
paramStr = proj4FileReader.readParametersFromFile("epsg","2435");
} catch (IOException e) {
e.printStackTrace();
}
CRSFactory targetFactory = new CRSFactory();
//目標座標系統
CoordinateReferenceSystem target = targetFactory.createFromParameters("2435", paramStr);
//源座標系統
String wgs84_param = "+title=long/lat:WGS84 +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degress";
CoordinateReferenceSystem wgs84 = crsFactory.createFromParameters("WGS84", wgs84_param);
CoordinateTransformFactory ctf = new CoordinateTransformFactory();
transform = ctf.createTransform(wgs84, target);
3、使用
public void transform(double x, double y, double z) {
if (transform != null) {
ProjCoordinate projCoordinate = new ProjCoordinate(x, y);
transform.transform(projCoordinate, projCoordinate);
dNorth = projCoordinate.y;
dEast = projCoordinate.x;
dHight = z;
}
}
使用這個庫,也可以把.prj文件讀取轉換成上面那種格式,進行使用。
轉換結果在圖上了。
歡迎推薦gis行業的開源庫。或者idea