美文网首页
Springboot mysql 获取当前位置最近的店铺

Springboot mysql 获取当前位置最近的店铺

作者: 皮皮铭 | 来源:发表于2021-04-21 16:13 被阅读0次

    mysql创建函数

    CREATE FUNCTION `lat_lng_distance` ( lat1 FLOAT, lng1 FLOAT, lat2 FLOAT, lng2 FLOAT ) RETURNS FLOAT DETERMINISTIC BEGIN
        RETURN 6371 * 2 * ASIN(
            SQRT(
                POWER( SIN(( lat1 - abs( lat2 )) * pi()/ 180 / 2 ), 2 )+ COS( lat1 * pi()/ 180 ) * COS( abs( lat2 ) * pi()/ 180 ) * POWER( SIN(( lng1 - lng2 ) * pi()/ 180 / 2 ), 2 ) 
            ));
    END
    

    数据表


    数据表.jpg

    java代码

        /**
         * 根据经纬度和半径 计算
         *
         * @param longitude 经度
         * @param latitude  纬度
         * @param radius    搜索半径 米
         * @return
         */
        public static Map<String, String> lonLatCalculation(double longitude, double latitude, Integer radius) {
            Map<String, String> map = new HashMap<>();
            // 赤道周长24901英里 1609是转换成米的系数
            double degree = (24901 * 1609) / 360.0;
            double radiusMile = radius;
            double dpmLat = 1 / degree;
            double radiusLat = dpmLat * radiusMile;
            double minLat = latitude - radiusLat;
            double maxLat = latitude + radiusLat;
            double mpdLng = degree * Math.cos(latitude * (Math.PI / 180));
            double dpmLng = 1 / mpdLng;
            double radiusLng = dpmLng * radiusMile;
            double minLng = longitude - radiusLng;
            double maxLng = longitude + radiusLng;
            map.put("minLat", Double.toString(minLat));
            map.put("maxLat", Double.toString(maxLat));
            map.put("minLng", Double.toString(minLng));
            map.put("maxLng", Double.toString(maxLng));
            return map;
        }
    

    Impl

        public ApiResult getStoreAddress(GetStoreAddressRequest request) {
            //当前经度
            String longitude = request.getLongitude();
            //当前纬度
            String latitude = request.getLatitude();
            //搜索范围
            String radius = request.getRadius();
            Map<String, String> map;
            map = CalculateUtil.lonLatCalculation(Double.valueOf(longitude), Double.valueOf(latitude), Integer.valueOf(radius));
            map.put("longitude", longitude);
            map.put("latitude", latitude);
            //分页
            PageMethod.startPage(request.getPageNum(), request.getPageSize());
            List<StoreInfo> test = storeInfoMapper.listStoreAddress(map.get("longitude"), map.get("latitude"), map.get("minLat"),
                    map.get("maxLat"), map.get("minLng"), map.get("maxLng"));
            PageInfo<StoreInfo> pageInfo = new PageInfo<>(test);
            return ApiResultUtil.success(pageInfo);
        }
    

    mapper(distance是当前位置到店铺的距离)

        /**
         * 查询最近的店铺
         *
         * @param longitude
         * @param latitude
         * @param minLat
         * @param maxLat
         * @param minLng
         * @param maxLng
         * @return
         */
        List<StoreInfo> listStoreAddress(@Param("longitude") String longitude,
                                         @Param("latitude") String latitude,
                                         @Param("minLat") String minLat,
                                         @Param("maxLat") String maxLat,
                                         @Param("minLng") String minLng,
                                         @Param("maxLng") String maxLng);
    
        <select id="listStoreAddress" resultMap="BaseResultMap">
         select
         id,
         store_name,
         address,
         create_time,
         update_time,
         lat,
         lon,
         ROUND(lat_lng_distance(#{latitude}, #{longitude}, lat, lon), 2) AS distance
         from store_info
         where
         and lat &gt; #{minLat} and lat &lt; #{maxLat}
         and lon &gt; #{minLng} and lon &lt; #{maxLng}
         order by distance asc
        </select>
    

    相关文章

      网友评论

          本文标题:Springboot mysql 获取当前位置最近的店铺

          本文链接:https://www.haomeiwen.com/subject/yjdzlltx.html