Springboot mysql 獲取當(dāng)前位置最近的店鋪

mysql創(chuàng)建函數(shù)

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

數(shù)據(jù)表


數(shù)據(jù)表.jpg

java代碼

    /**
     * 根據(jù)經(jīng)緯度和半徑 計(jì)算
     *
     * @param longitude 經(jīng)度
     * @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是轉(zhuǎn)換成米的系數(shù)
        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) {
        //當(dāng)前經(jīng)度
        String longitude = request.getLongitude();
        //當(dāng)前緯度
        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是當(dāng)前位置到店鋪的距離)

    /**
     * 查詢最近的店鋪
     *
     * @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>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容