java 计算两点之间的距离

本文介绍了如何在Java中利用勾股定理计算二维平面上两点之间的欧几里得距离,适用于地理坐标或其他需要计算距离的场景。通过实例代码详细展示了具体的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//地球半径
 private final double EARTH_RADIUS = 6378.137;
/**
     * 计算两坐标点之间的距离,单位KM <br>
     * Math.PI 圆周率
     * @param lng1 起始点经度
     * @param lat1 起始点纬度
     * @param lng2 终止点经度
     * @param lat2 终止点纬度
     * @return 距离(KM)
     * @createTime 2013-5-7 下午7:27:02
     * @ChangeLog
     * @since 1.0
     */
    public double getDistance(double lng1, double lat1, double lng2, double lat2) {
        double distance = 0;
        double dLat = (lat2 - lat1) * Math.PI / 180;
        double dLon = (lng2 - lng1) * Math.PI / 180;
        distance = Math.sin(dLat / 2) * Math.sin(dLat / 2)
                + Math.cos(lat1 * Math.PI / 180)
                * Math.cos(lat2 * Math.PI / 180) * Math.sin(dLon / 2)
                * Math.sin(dLon / 2);
        distance = (2 * Math.atan2(Math.sqrt(distance), Math.sqrt(1 - distance))) * EARTH_RADIUS;
        return Math.round(distance * (double) 1000) / (double) 1000;
    }
    public void getdistance(){
    	// 计算两点间距离公式
		double distance = Math.sqrt(Math.abs((p1.getX() - p2.getX())* (p1.getX() - p2.getX())+(p1.getY() - p2.getY())* (p1.getY() - p2.getY())));
	}
SELECT
			t.*,
			ROUND(2 * 6378.137 * ASIN(
			SQRT(
			POW( SIN(3.141592653589793 * (#{lat} - t.latitude ) / 360 ), 2 ) +
			COS( 3.141592653589793 * #{lat} / 180 ) * COS( t.latitude * 3.141592653589793 / 180 )
			* POW( SIN( 3.141592653589793 * ( #{lon} - t.longitude ) / 360 ), 2 )
			)
			)
			,1) AS distance
		FROM
			sys_user t
			where
			#{range}
			>=
			ROUND(2 * 6378.137 * ASIN(
			SQRT(
			POW( SIN(3.141592653589793 * (#{lat} - t.latitude ) / 360 ), 2 ) +
			COS( 3.141592653589793 * #{lat} / 180 ) * COS( t.latitude * 3.141592653589793 / 180 )
			* POW( SIN( 3.141592653589793 * ( #{lon} - t.longitude ) / 360 ), 2 )
			)
			)
			,1)
		and
			user_type_code = '2'
		order by
		distance asc
		Limit 10
//判断经纬度trans是否在范围district内
private boolean ptInPolyYOrN(double[] trans, String district) {
        /**
         * 参数结构
         * [{"id":"0250f96484105bd93efc3c149393ea03","type":"Feature","properties":{},"geometry":{"coordinates":[[[114.04544445764657,22.57523317714316],[114.03664091017083,22.576809088184916],[114.03688021993037,22.574216565807433],[114.03985164942128,22.57419662332711],[114.04082883093542,22.574715127802676],[114.04082083962942,22.574814233671248],[114.04157810196364,22.574796737123336],[114.04191782065413,22.57497577115447],[114.04201038039218,22.57390250232504],[114.0427270001145,22.57394221302269],[114.04449489286242,22.574267257882923],[114.04544445764657,22.57523317714316]]],"type":"Polygon"}}]
         */
        boolean isTrue = false;
        JSONArray array = JSONUtil.parseArray(district);
        for (int i = 0; i < array.size(); i++) {
            JSONArray jsonArray = JSONUtil.parseArray(JSONUtil.parseArray(JSONUtil.parseObj(JSONUtil.parseObj(array.get(i)).get("geometry")).get("coordinates")).get(0));
            Point[] ps = new Point[jsonArray.size()];
            for (int j = 0; j < jsonArray.size(); j++) {
                Double lng = (Double) jsonArray.getJSONArray(j).get(0);
                Double lat = (Double) jsonArray.getJSONArray(j).get(1);
                Point point = new Point(lng, lat);
                ps[j] = point;
            }
            //按区域
            boolean ptInPoly = IsPtInpoly.isPtInPoly(trans[0], trans[1], ps);
            if (ptInPoly) {
                isTrue = true;
            }
        }
        return isTrue;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值