Java 和 MySQL 函数判断经纬度是否在 2 公里范围内
使用 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 代码时,需要引入相应的数据库驱动包。
- 代码示例中假设数据库连接信息已配置好,请根据实际情况进行修改。
原文地址: https://www.cveoy.top/t/topic/oid6 著作权归作者所有。请勿转载和采集!