新項(xiàng)目需求:
堅(jiān)守“ 做人真誠(chéng) · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價(jià)值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都公路鉆孔機(jī)小微創(chuàng)業(yè)公司專業(yè)提供企業(yè)網(wǎng)站制作營(yíng)銷(xiāo)網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺(jué)設(shè)計(jì)、底層架構(gòu)、網(wǎng)頁(yè)布局、功能開(kāi)發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。
結(jié)合百度地圖,在地圖中指定一個(gè)地點(diǎn),獲取此地點(diǎn)周?chē)?km范圍內(nèi)所有數(shù)據(jù)庫(kù)中存的單位的地點(diǎn)和信息標(biāo)記在地圖上。于是初寫(xiě)了一把oracle的存儲(chǔ)過(guò)程,純靠摸索寫(xiě)的。
后臺(tái)需要的函數(shù)如下:
首先,計(jì)算圓弧函數(shù)
CREATE OR REPLACE FUNCTION RAD(d number) RETURN NUMBER is PI number :=3.141592625; begin return d* PI/180.0; end ;
然后,計(jì)算距離函數(shù)
CREATE OR REPLACE FUNCTION GetDistance(lat1 number, lng1 number, lat2 number, lng2 number) RETURN NUMBER is earth_padius number := 6378.137; radLat1 number := rad(lat1); radLat2 number := rad(lat2); a number := radLat1 - radLat2; b number := rad(lng1) - rad(lng2); s number := 0; begin s := 2 * Asin(Sqrt(power(sin(a / 2), 2) + cos(radLat1) * cos(radLat2) * power(sin(b / 2), 2))); s := s * earth_padius; s := Round(s * 10000) / 10000; return s; end;
接下來(lái)是我自己寫(xiě)的存儲(chǔ)過(guò)程:
CREATE OR REPLACE PROCEDURE distance_maintunit(p_cur out sys_refcursor, center_lat in number , center_lng in number) IS v_muids VARCHAR(200); v_distance NUMERIC(9,6); BEGIN FOR L_RECORD IN (select * from M_MAINTENACEUNIT) LOOP SELECT GetDistance(L_RECORD.Lat,L_RECORD.Longitude,center_lat,center_lng) INTO v_distance FROM dual; /*dbms_output.put_line('distance:' || v_distance);*/ IF (v_distance <=1) THEN v_muids:= v_muids || L_RECORD.muid || ','; END IF; END LOOP; v_muids:= v_muids || '-1'; dbms_output.put_line(v_muids); open p_cur for 'select * from m_maintenaceunit where muid in ('||v_muids||')'; EXCEPTION WHEN OTHERS THEN ROLLBACK; dbms_output.put_line(SQLERRM); END;
由于使用mybatis,所以service調(diào)用如下:
@Override public ListgetMaitunitByProcedures(Double lat, Double lng) { Map map=new HashMap (); map.put("lng", lng); map.put("lat", lat); try { geoDao.getMaitunitByProcedures(map); }catch(UncategorizedSQLException e) { // System.out.println(e); e.printStackTrace(); } @SuppressWarnings("unchecked") List siteList=(List )map.get("maintunits"); return siteList; }
這里跟我之前轉(zhuǎn)載的那篇關(guān)于oracle存儲(chǔ)過(guò)程的文章有關(guān)聯(lián)(如何調(diào)用一個(gè)返回集合的存儲(chǔ)過(guò)程)
mapper.xml中的調(diào)用:
dao中調(diào)用:
public ListgetMaintUnitList(@Param("lng") Double lng, @Param("lat") Double lat);
由于第一次寫(xiě)oracle存儲(chǔ)過(guò)程,代碼只是實(shí)現(xiàn)了功能,有待改進(jìn)。
參考:http://www.storyday.com/wp-content/uploads/2008/09/latlung_dis.html
http://blog.csdn.net/iw1210/article/details/9164573
http://www.cnblogs.com/microsoft-jiang/archive/2008/07/24/1250644.html