java关于地图经纬度的计算

一,坐标体系

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

猜你喜欢

转载自blog.csdn.net/ybsgsg/article/details/128102165