• 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语句中@符号后表示变量,填写你地图上画圈圈的经纬度和半径。

  • 相关阅读:
    xyhcms getshell
    利用python的Matplotlib库进行基本绘图
    tf卡数据可以保存多久?如何恢复被格式化的tf卡数据
    VBA调用宏的方式总结大全
    Java入门 集合框架、泛型和Collection(补充)(第二十三天)
    cargo介绍
    【前端杂文】 axios的AxiosResponse分析
    2.6一个小工具的使用snipaste
    软件测试基础篇(3)
    多态的讲解
  • 原文地址:https://blog.csdn.net/superman26/article/details/125432215