用java 写 经纬度范围是否在数据库中经纬度点的 范围内范围单位km
可以使用Haversine公式来计算两个经纬度点之间的距离,然后再与给定的范围进行比较。以下是一个示例代码:
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class GeoLocation {
private static final double EARTH_RADIUS = 6371; // 地球半径,单位km
public static void main(String[] args) {
double lat = 39.9042; // 纬度
double lon = 116.4074; // 经度
double range = 10; // 范围,单位km
List<Point> points = getPointsInRange(lat, lon, range);
System.out.println("Points in range:");
for (Point p : points) {
System.out.println(p);
}
}
public static List<Point> getPointsInRange(double lat, double lon, double range) {
List<Point> points = new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");
String sql = "SELECT * FROM locations WHERE " +
"acos(sin(?)*sin(radians(lat)) + cos(?)*cos(radians(lat))*cos(radians(lon)-?)) * ? <= ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setDouble(1, lat);
stmt.setDouble(2, lat);
stmt.setDouble(3, lon);
stmt.setDouble(4, EARTH_RADIUS);
stmt.setDouble(5, range);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
Point p = new Point(rs.getDouble("lat"), rs.getDouble("lon"));
if (distance(lat, lon, p.getLat(), p.getLon()) <= range) {
points.add(p);
}
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return points;
}
// 计算两个经纬度点之间的距离
public static double distance(double lat1, double lon1, double lat2, double lon2) {
double dLat = Math.toRadians(lat2 - lat1);
double dLon = Math.toRadians(lon2 - lon1);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return EARTH_RADIUS * c;
}
}
class Point {
private double lat;
private double lon;
public Point(double lat, double lon) {
this.lat = lat;
this.lon = lon;
}
public double getLat() {
return lat;
}
public double getLon() {
return lon;
}
@Override
public String toString() {
return "Point{" +
"lat=" + lat +
", lon=" + lon +
'}';
}
}
上面的代码假设有一个名为locations
的表,其中包含lat
和lon
两个字段,分别表示经纬度。使用预编译的SQL语句来查询符合条件的点,并使用distance
方法计算这些点与给定点之间的距离,如果距离小于等于给定范围,则将这些点加入到结果列表中。最后返回结果列表
原文地址: http://www.cveoy.top/t/topic/fETK 著作权归作者所有。请勿转载和采集!