sql (mysql)实现查询某一个经纬度周围500米距离的餐馆,数据库存放所有餐馆的经纬度。

mysql两点间距,

公式如下,单位米:
第一点经纬度:lng1 lat1
第二点经纬度:lng2 lat2
round(6378.138*2*asin(sqrt(pow(sin(
(lat1*pi()/180-lat2*pi()/180)/2),2)+cos(lat1*pi()/180)*cos(lat2*pi()/180)*
pow(sin( (lng1*pi()/180-lng2*pi()/180)/2),2)))*1000)

例如:
SELECT store_id,lng,lat,
ROUND(6378.138*2*ASIN(SQRT(POW(SIN((22.299439*PI()/180-lat*PI()/180)/2),2)+COS(22.299439*PI()/180)*COS(lat*PI()/180)*POW(SIN((114.173881*PI()/180-lng*PI()/180)/2),2)))*1000)
AS
juli
FROM store_info
ORDER BY juli DESC
LIMIT 316
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现这个功能,需要先计算出每个数据点与传入的经纬度距离,然后选择距离最近的三个数据点,最后按照距离升序排序。 下面是一个 Java 示例代码: ```java import java.sql.*; import java.util.*; public class Main { public static void main(String[] args) { double lat = 31.23; // 传入的纬度 double lng = 121.47; // 传入的经度 int limit = 3; // 返回数据的条数 try { // 连接数据库 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password"); // 构造 SQL 查询语句 String sql = "SELECT id, lat, lng, " + " 6371 * 2 * ASIN(SQRT(POWER(SIN((? - lat) * PI() / 180 / 2), 2) + COS(? * PI() / 180) * COS(lat * PI() / 180) * POWER(SIN((? - lng) * PI() / 180 / 2), 2))) AS distance " + "FROM locations " + "ORDER BY distance ASC " + "LIMIT ?"; // 预编译 SQL 语句 PreparedStatement stmt = conn.prepareStatement(sql); // 设置参数 stmt.setDouble(1, lat); stmt.setDouble(2, lat); stmt.setDouble(3, lng); stmt.setInt(4, limit); // 执行查询并获取结果集 ResultSet rs = stmt.executeQuery(); // 遍历结果集并输出 while (rs.next()) { int id = rs.getInt("id"); double distance = rs.getDouble("distance"); System.out.println("id: " + id + ", distance: " + distance); } // 关闭连接 rs.close(); stmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` 在这个代码中,我们首先连接数据库,然后构造 SQL 查询语句。其中,我们使用 Haversine 公式计算经纬度之间的距离。然后,我们预编译 SQL 语句并设置参数,执行查询并获取结果集。最后,我们遍历结果集并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值