可以使用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的表,其中包含latlon两个字段,分别表示经纬度。使用预编译的SQL语句来查询符合条件的点,并使用distance方法计算这些点与给定点之间的距离,如果距离小于等于给定范围,则将这些点加入到结果列表中。最后返回结果列表

用java 写 经纬度范围是否在数据库中经纬度点的 范围内范围单位km

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

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