• Mysql根据经纬度查询半径多少以内的数据,画个圈圈查数据库


    在地图上画个圈圈,那么就有一个点和半径,点是有经纬度的,根据经度、维度、半径到mysql数据库中去查询符合这个半径范围内的数据。

    下面这个SQL是一个函数,传入两个点,返回两点的距离,通过这个函数可以带入到SQL语句中查询,可是这样有个问题,如果数据量太大,那么就用不了索引,查询会非常慢

    1. CREATE DEFINER=`root`@`%` FUNCTION `fnGetDistance`(`longitude1` DECIMAL(18,8),`latitude1` DECIMAL(18,8),`longitude2` DECIMAL(18,8),`latitude2` DECIMAL(18,8)) RETURNS bigint(20)
    2. BEGIN
    3. DECLARE Distance REAL DEFAULT 0;
    4. SET Distance = ROUND(6378.137*2*ASIN(SQRT(POW(SIN((latitude1*PI()/180-latitude2*PI()/180)/2),2)+COS(latitude1*PI()/180)*COS(latitude2*PI()/180)*POW(SIN((longitude1*PI()/180-longitude2*PI()/180)/2),2)))*1000);
    5. RETURN Distance;
    6. END

    使用例子:由于我数据列大,非常慢,所以不采取

    SELECT * FROM bg_building_price WHERE fnGetDistance(@longitude,@latitude,longitude,latitude)<=@radiu

    如果要想快,只能把计算方法直接放条件上,这样就能使索引生效,不通过函数:

     SELECT * FROM bg_building_price WHERE (6378.137*2*ASIN(SQRT(POW(SIN(((@latitude-latitude)*PI()/180)/2),2)+COS(@latitude*PI()/180)*COS(latitude*PI()/180)*POW(SIN(((@longitude-longitude)*PI()/180)/2),2)))) < @radius

    补充:sql语句中@符号后表示变量,填写你地图上画圈圈的经纬度和半径。

  • 相关阅读:
    xml元素值需要保留space
    最新全流程GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟教程
    前端实现打字效果
    0031力扣191题---位1的个数
    latex的安装及设置(为学术服务)
    PHP:表达式
    外包干了9天,技术退步明显。。。。。
    RISC-V 芯片架构新规范
    【无标题】
    计算机网络初识
  • 原文地址:https://blog.csdn.net/superman26/article/details/125432215