這篇文章主要講解了“怎么用java實現(xiàn)根據(jù)一個經(jīng)緯度查詢附近的樓盤信息”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么用java實現(xiàn)根據(jù)一個經(jīng)緯度查詢附近的樓盤信息”吧!
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于網(wǎng)站設計、網(wǎng)站建設、美蘭網(wǎng)絡推廣、小程序定制開發(fā)、美蘭網(wǎng)絡營銷、美蘭企業(yè)策劃、美蘭品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)建站為所有大學生創(chuàng)業(yè)者提供美蘭建站搭建服務,24小時服務熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
先算出該點周圍的矩形的四個點,然后使用經(jīng)緯度去直接匹配數(shù)據(jù)庫中的記錄。
/** * 根據(jù)傳入的經(jīng)緯度和半徑范圍確定附近的經(jīng)緯度范圍 * * @param longitude 經(jīng)度 * @param latitude 緯度 * @param distance 距離 多少千米 * @return */ public static Location getNearbyLocation(double longitude, double latitude, double distance) { boolean b = LocationUtil.checkItude(longitude + "", latitude + ""); if (!b) { return null; } //先計算查詢點的經(jīng)緯度范圍 double r = 6371;//地球半徑千米 double dlng = 2 * Math.asin(Math.sin(distance / (2 * r)) / Math.cos(latitude * Math.PI / 180)); dlng = dlng * 180 / Math.PI;//角度轉(zhuǎn)為弧度 double dlat = distance / r; dlat = dlat * 180 / Math.PI; double minlat = latitude - dlat; double maxlat = latitude + dlat; double minlng = longitude - dlng; double maxlng = longitude + dlng; Location location = new Location(); location.setLatitude(latitude); location.setLongitude(longitude); location.setMaxLatitude(maxlat + ""); location.setMinLatitude(minlat + ""); location.setMaxLongitude(maxlng + ""); location.setMinLongitude(minlng + ""); return location; }
/** * 經(jīng)緯度校驗 * 經(jīng)度longitude: (?:[0-9]|[1-9][0-9]|1[0-7][0-9]|180)\\.([0-9]{6}) * 緯度latitude: (?:[0-9]|[1-8][0-9]|90)\\.([0-9]{6}) * * @return */ public static boolean checkItude(String longitude, String latitude) { String reglo = "((?:[0-9]|[1-9][0-9]|1[0-7][0-9])\\.([0-9]{0,6}))|((?:180)\\.([0]{0,6}))"; String regla = "((?:[0-9]|[1-8][0-9])\\.([0-9]{0,6}))|((?:90)\\.([0]{0,6}))"; longitude = longitude.trim(); latitude = latitude.trim(); return longitude.matches(reglo) == true ? latitude.matches(regla) : false; }
/** * 求兩點之間的距離 * @param lng1 A點經(jīng)度 * @param lat1 A點緯度 * @param lng2 B點經(jīng)度 * @param lat2 B點緯度 * @return 兩點距離 */ public static double getDistance(double lng1, double lat1, double lng2, double lat2) { double EARTH_RADIUS = 6371; double radiansAX = Math.toRadians(lng1); // A經(jīng)弧度 double radiansAY = Math.toRadians(lat1); // A緯弧度 double radiansBX = Math.toRadians(lng2); // B經(jīng)弧度 double radiansBY = Math.toRadians(lat2); // B緯弧度 // 公式中“cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2”的部分,得到∠AOB的cos值 double cos = Math.cos(radiansAY) * Math.cos(radiansBY) * Math.cos(radiansAX - radiansBX) + Math.sin(radiansAY) * Math.sin(radiansBY); double acos = Math.acos(cos); // 反余弦值 return EARTH_RADIUS * acos; // 最終結(jié)果 }
拿到4個確定范圍的經(jīng)緯度就可以去數(shù)據(jù)庫查詢了,由于數(shù)據(jù)庫經(jīng)緯度存的是一個字段需要切割下字段(使用的是MySQL),在 原本的條件下拼接上范圍條件就完成!
substring( location, 1, LOCATE ( ',', location ) - 1 ) >= #{minLongitude} AND substring( location, 1, LOCATE ( ',', location ) - 1 ) <= #{maxLongitude} AND substring( location, LOCATE ( ',', location ) + 1, LENGTH ( a.location ) - 1 ) >= #{minLatitude} AND substring( location, LOCATE ( ',', location ) + 1, LENGTH ( a.location ) - 1 ) <= #{maxLatitude}
因為得到的結(jié)果是個正方形方位內(nèi)的數(shù)據(jù),想要在地圖上顯示,會發(fā)現(xiàn)超過了地圖上圓圈外也有數(shù)據(jù),這時候就需要再做一下處理。
//判斷兩點之間的距離是否大于半徑,大于的刪除 for (int i = 0; i < 之前查詢結(jié)果的len; i++) { double distance = LocationUtil.getDistance(longitude, latitude, longitude1, latitude1); if (distance > kilometer) { list.remove(i); i--; len--; } }
感謝各位的閱讀,以上就是“怎么用java實現(xiàn)根據(jù)一個經(jīng)緯度查詢附近的樓盤信息”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對怎么用java實現(xiàn)根據(jù)一個經(jīng)緯度查詢附近的樓盤信息這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!