sql查询附近的人

通过经纬度,用sql语句查询出附近的人,欢迎加入技术交流QQ群201923866、320205320、370648191。

 

user表结构,分别是自增ID,名称,城市ID,经纬度

id name city_id lng lat

1 Yoper 1901 22.982087 113.318505

2 baidu 1901 23.079377 113.298556

$sql = "select * ,(ROUND( (2 * asin(sqrt(pow(sin(('".$lat."'-(lat*3.1415926535898 / 180.0))/2),2)+cos('".$lat."')*cos(lat*3.1415926535898 / 180.0)*pow(sin(('".$lng."'-lng*3.1415926535898 / 180.0)/2),2))))* 6378.137 *10000)/10)as distance from user where uid!='".$uid."' order by distance asc limit 0,50";

 

 

 

 

 

欢迎关注我时不时就瞎吐槽的个人公众号零零糖,一个软件工程师每天晚上陪你在枕边聊天就问你怕不怕!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

### Java 实现附近功能的解决方案与示例代码 在实现“附近”功能时,通常需要根据用户的位置(经纬度)计算出与其距离较近的其他用户,并按照一定的条件筛选。以下是一个完整的解决方案示例代码。 #### 1. 引入依赖库 为了简化球面距离计算,可以使用 `Spatial4j` 库[^2]。该库提供了高效的地理空间计算方法,包括两点之间的球面距离计算。 Maven 依赖如下: ```xml <dependency> <groupId>com.spatial4j</groupId> <artifactId>spatial4j</artifactId> <version>0.5</version> </dependency> ``` #### 2. 示例代码:计算两点间的距离 以下代码展示了如何使用 `Spatial4j` 计算两个点之间的距离(以米为单位)。 ```java import com.spatial4j.core.context.SpatialContext; import com.spatial4j.core.shape.Point; import com.spatial4j.core.shape.Shape; public class DistanceCalculator { public static double calculateDistance(double centerLon, double centerLat, double targetLon, double targetLat) { SpatialContext ctx = SpatialContext.GEO; Point centerPoint = ctx.makePoint(centerLon, centerLat); Point targetPoint = ctx.makePoint(targetLon, targetLat); // 计算球面距离(以米为单位) double distanceInMeters = centerPoint.distance(targetPoint) * 1000; // 转换为米 return distanceInMeters; } public static void main(String[] args) { double centerLon = 116.397428; // 中心点经度 double centerLat = 39.90923; // 中心点纬度 double targetLon = 116.407428; // 目标点经度 double targetLat = 39.91923; // 目标点纬度 double distance = calculateDistance(centerLon, centerLat, targetLon, targetLat); System.out.println("两点之间的距离: " + distance + " 米"); } } ``` #### 3. 数据库查询优化 为了提高性能,可以在数据库中存储用户的经纬度信息,并通过 SQL 查询筛选出符合条件的用户。以下是一个基于 MySQL查询示例[^4]: ```sql SELECT id, name, ( 6371 * acos( cos( radians(center_lat) ) * cos( radians(lat) ) * cos( radians(lng) - radians(center_lng) ) + sin( radians(center_lat) ) * sin( radians(lat) ) ) ) AS distance FROM users HAVING distance < #{distance} ORDER BY distance ASC; ``` - `center_lat` `center_lng` 是中心点的纬度经度。 - `lat` `lng` 是目标点的纬度经度。 - `6371` 是地球半径(以公里为单位),如果需要以米为单位,则乘以 1000。 #### 4. 自定义距离计算逻辑 如果不使用第三方库,也可以通过简单的数学公式计算两点之间的距离[^5]。以下是一个自定义实现: ```java public static double distance(double centerLon, double centerLat, double targetLon, double targetLat) { double jl_jd = 102834.74258026089786013677476285; // 每经度单位米 double jl_wd = 111712.69150641055729984301412873; // 每纬度单位米 double b = Math.abs((centerLat - targetLat) * jl_jd); double a = Math.abs((centerLon - targetLon) * jl_wd); return Math.sqrt((a * a + b * b)); } ``` #### 5. 分页与返回 JSON 数据 为了支持分页返回 JSON 数据,可以结合 Spring Boot 或其他框架实现[^3]。以下是一个简单的示例: ```java @RestController @RequestMapping("/nearby") public class NearbyController { @Autowired private UserRepository userRepository; @GetMapping public ResponseEntity<List<UserDto>> getNearbyUsers( @RequestParam double centerLon, @RequestParam double centerLat, @RequestParam int page, @RequestParam int size) { List<User> users = userRepository.findNearbyUsers(centerLon, centerLat, page, size); List<UserDto> userDtos = users.stream() .map(user -> new UserDto(user.getId(), user.getName(), calculateDistance(centerLon, centerLat, user.getLon(), user.getLat()))) .collect(Collectors.toList()); return ResponseEntity.ok(userDtos); } private double calculateDistance(double centerLon, double centerLat, double targetLon, double targetLat) { // 使用 Spatial4j 或自定义公式计算距离 return DistanceCalculator.calculateDistance(centerLon, centerLat, targetLon, targetLat); } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值