1. 程式人生 > >java 實現微信搜尋附近功能

java 實現微信搜尋附近功能

一、需求:使用者訪問頁面時獲取使用者的經緯度,傳輸至後端,和後端文章表中的經緯度進行匹配,若存在當前使用者經緯度附近的文章,則返回該文章

二、資料庫表設計(簡要):

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