一,坐标体系
wgs坐标系是国际上通用的坐标系,也称地球坐标系,gps和北斗系统都使用的是wgs坐标系。谷歌地图使用的是wgs坐标系(中国部分除外),openstreetmap使用的也是这种坐标系
gcj02坐标系是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系,也称火星坐标系,谷歌中国地图、搜搜中国地图、高德地图采用的是GCJ02地理坐标系。
BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系,由百度公司独创,百度地图使用的就是这个坐标系。
应用中大多使用wgs坐标系,我们在计算经纬度的时候,使用wgs坐标系。
二,坐标计算
引用jar包
<dependency>
<groupId>org.gavaghan</groupId>
<artifactId>geodesy</artifactId>
<version>1.1.3</version>
</dependency>
以下计算使用的都是WGS84坐标系
1,计算两点坐标的距离
2,已知其中一点坐标、角度方向、距离,计算另一点坐标
这里的角度方向就是上图中的a角,正北方向是0,正东方向是90
public class JingWeiDuTest {
public static void main(String[] args) {
//计算两点坐标的距离
getDistance(114.008919919000230, 22.727150549443284, 114.008919967000230, 22.727150537443284,3);
//已知起点坐标、角度方向、距离(示例3.2mm),计算另一个坐标的经纬度
getGlobalCoordinates(114.008919919000230, 22.727150549443284, 90, 0.0032);
}
/**
* 根据经纬度,计算两点间的距离、方位、反方位
* @param longitudeFrom 第一个点的经度
* @param latitudeFrom 第一个点的纬度
* @param longitudeTo 第二个点的经度
* @param latitudeTo 第二个点的纬度
* @param accurate 保留小数点几位
*/
public static void getDistance(double longitudeFrom, double latitudeFrom, double longitudeTo, double latitudeTo,int accurate) {
GlobalCoordinates source = new GlobalCoordinates(latitudeFrom, longitudeFrom);
GlobalCoordinates target = new GlobalCoordinates(latitudeTo, longitudeTo);
//创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度得到GeodeticCurve,用GeodeticCurve获取距离、方位、反方位
GeodeticCurve geodeticCurve = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.WGS84, source, target);
//获取两点的方位
double azimuth = geodeticCurve.getAzimuth();
//获取两点之间的距离
double distance = geodeticCurve.getEllipsoidalDistance();
double v = distance*1000;//距离转为毫米
//保留数据小数点位数且四舍五入
BigDecimal bigDecimal = new BigDecimal(v).setScale(accurate,BigDecimal.ROUND_HALF_UP);
double result = bigDecimal.doubleValue();
System.out.println("两个坐标之间的距离是"+ result + "mm");
System.out.println("两个坐标的方向是"+azimuth);
}
/**
* 根据开始坐标点,角度,计算结束点坐标
* @param longitudeFrom 开始点经度
* @param latitudeFrom 开始点纬度
* @param startAngle 方向(以起点为中心)如果是90角,startAngle=90,表示纬度不变,经度向东移动增大
* @param distance 距离(单位:m)
*/
public static void getGlobalCoordinates(double longitudeFrom, double latitudeFrom, double startAngle, double distance){
//经纬度对象
GlobalCoordinates startGlobalCoordinates = new GlobalCoordinates(latitudeFrom, longitudeFrom);
//计算的坐标对象
GlobalCoordinates globalCoordinates = new GeodeticCalculator().calculateEndingGlobalCoordinates(Ellipsoid.WGS84, startGlobalCoordinates, startAngle, distance);
//获取纬度
double latitude = globalCoordinates.getLatitude();
//获取经度
double longitude = globalCoordinates.getLongitude();
System.out.println("坐标经度="+longitude+",坐标纬度="+latitude);
}
}
结果
两个坐标之间的距离是5.107mm
两个坐标的方向是105.08285909485609
坐标经度=114.00891995015058,坐标纬度=22.72715054944328