使用 Java 代码和 MySQL 函数判断经纬度是否在 2 公里范围内

本文介绍了使用 Java 代码和 MySQL 函数来判断给定经纬度是否在数据库中存储的经纬度范围(2 公里)内的方法。示例代码展示了如何利用 Haversine 公式计算距离,并在 Java 和 MySQL 环境中实现该功能。

Java 代码

public boolean isWithin2Kilometers(double latitude, double longitude) {
    double R = 6371; // 地球半径,单位:千米
    double lat1 = Math.toRadians(latitude); // 要判断的点的纬度
    double lon1 = Math.toRadians(longitude); // 要判断的点的经度
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    try {
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "password");
        stmt = conn.createStatement();
        String sql = "SELECT latitude, longitude FROM locations";
        rs = stmt.executeQuery(sql);
        while (rs.next()) {
            double lat2 = Math.toRadians(rs.getDouble('latitude')); // 数据库中的纬度
            double lon2 = Math.toRadians(rs.getDouble('longitude')); // 数据库中的经度
            double dLat = lat2 - lat1;
            double dLon = lon2 - lon1;
            double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon/2) * Math.sin(dLon/2);
            double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
            double distance = R * c;
            if (distance <= 2) { // 判断距离是否小于等于2公里
                return true;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return false;
}

MySQL 函数

CREATE FUNCTION is_within_2_kilometers(lat1 DOUBLE, lng1 DOUBLE)
RETURNS BOOLEAN
BEGIN
    DECLARE R DOUBLE DEFAULT 6371;
    DECLARE lat2 DOUBLE;
    DECLARE lng2 DOUBLE;
    DECLARE dLat DOUBLE;
    DECLARE dLng DOUBLE;
    DECLARE a DOUBLE;
    DECLARE c DOUBLE;
    DECLARE distance DOUBLE;
    DECLARE done INT DEFAULT FALSE;
    DECLARE cur CURSOR FOR SELECT latitude, longitude FROM locations;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO lat2, lng2;
        IF done THEN
            CLOSE cur;
            RETURN FALSE;
        END IF;
        SET lat1 = RADIANS(lat1);
        SET lng1 = RADIANS(lng1);
        SET lat2 = RADIANS(lat2);
        SET lng2 = RADIANS(lng2);
        SET dLat = lat2 - lat1;
        SET dLng = lng2 - lng1;
        SET a = SIN(dLat/2) * SIN(dLat/2) + COS(lat1) * COS(lat2) * SIN(dLng/2) * SIN(dLng/2);
        SET c = 2 * ATAN2(SQRT(a), SQRT(1-a));
        SET distance = R * c;
        IF distance <= 2 THEN
            CLOSE cur;
            RETURN TRUE;
        END IF;
    END LOOP;
END;

使用方法

Java 代码调用

if (isWithin2Kilometers(31.2304, 121.4737)) {
    System.out.println("在 2 公里范围内");
} else {
    System.out.println("不在 2 公里范围内");
}

MySQL 函数调用

SELECT is_within_2_kilometers(31.2304, 121.4737);

注意:

  • 以上代码示例中,locations 表包含经纬度数据。
  • 代码示例中使用了 Haversine 公式来计算地球上两点之间的距离。
  • 代码示例中的 R 值为地球半径,单位为千米。
  • 代码示例中使用的经纬度数据是示例数据,请根据实际情况进行修改。
  • 使用 MySQL 函数时,需要先创建函数,然后才能使用。
  • 使用 Java 代码时,需要引入相应的数据库驱动包。
  • 代码示例中假设数据库连接信息已配置好,请根据实际情况进行修改。
Java 和 MySQL 函数判断经纬度是否在 2 公里范围内

原文地址: https://www.cveoy.top/t/topic/oid6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录