java 實現微信搜尋附近功能
阿新 • • 發佈:2019-02-02
一、需求:使用者訪問頁面時獲取使用者的經緯度,傳輸至後端,和後端文章表中的經緯度進行匹配,若存在當前使用者經緯度附近的文章,則返回該文章
二、資料庫表設計(簡要):
1.文章表:article
2欄位:
①unid-主鍵
②title-文章標題
③經度-longitude
④緯度-latitude
三、前端獲取經緯度,此處省略(本人利用的是HTML5+百度地圖),若用pc訪問獲取會比較慢,但是在手機端訪問則沒有影響,本身我們的專案就是用在手機端,所以pc端獲取較慢的問題暫時先不處理。
四、後端邏輯演算法(根據前端傳入的經緯度) 參考:點選開啟連結
1.據前端傳入的經緯度生成中心店為中心的四方形經緯度(最小緯度,最小經度,最大緯度,最大經度)
程式碼:
/** * 生成以中心點為中心的四方形經緯度 * * @param lat 緯度 * @param lon 精度 * @param raidus 半徑(以米為單位) * @return */ public static double[] getAround(double lat, double lon, int raidus) { Double latitude = lat; Double longitude = lon; Double degree = (24901 * 1609) / 360.0; double raidusMile = raidus; Double dpmLat = 1 / degree; Double radiusLat = dpmLat * raidusMile; Double minLat = latitude - radiusLat; Double maxLat = latitude + radiusLat; Double mpdLng = degree * Math.cos(latitude * (Math.PI / 180)); Double dpmLng = 1 / mpdLng; Double radiusLng = dpmLng * raidusMile; Double minLng = longitude - radiusLng; Double maxLng = longitude + radiusLng; return new double[] { minLat, minLng, maxLat, maxLng }; }
2.得到四方形經緯度後進行sql查詢,本人專案用的是mybatis
sql如下:
select * from 文章表
where 1=1
and 文章表.latitude <> 0
and 文章表.longitude > 最小經度
and 文章表.longitude < 最大經度
and 文章表.latitude > 最小緯度
and 文章表.latitude < 最大緯度
3.sql根據距離由近到遠排序
order by ACOS(SIN((當前緯度 * 3.1415) / 180 ) * SIN((文章表.latitude * 3.1415) / 180 ) +COS((當前緯度 * 3.1415) / 180 ) * COS((文章表.latitude * 3.1415) / 180 ) *COS((當前精度 * 3.1415) / 180 - (文章表.longitude * 3.1415) / 180 ) ) * 6380 asc