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