您好,登錄后才能下訂單哦!
新項目需求:
結(jié)合百度地圖,在地圖中指定一個地點,獲取此地點周圍1km范圍內(nèi)所有數(shù)據(jù)庫中存的單位的地點和信息標記在地圖上。于是初寫了一把oracle的存儲過程,純靠摸索寫的。
后臺需要的函數(shù)如下:
首先,計算圓弧函數(shù)
CREATE OR REPLACE FUNCTION RAD(d number) RETURN NUMBER is PI number :=3.141592625; begin return d* PI/180.0; end ;
然后,計算距離函數(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;
接下來是我自己寫的存儲過程:
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 List<MaintunitDto> getMaitunitByProcedures(Double lat, Double lng) { Map<String ,Object> map=new HashMap<String, Object>(); map.put("lng", lng); map.put("lat", lat); try { geoDao.getMaitunitByProcedures(map); }catch(UncategorizedSQLException e) { // System.out.println(e); e.printStackTrace(); } @SuppressWarnings("unchecked") List<MaintunitDto> siteList=(List<MaintunitDto>)map.get("maintunits"); return siteList; }
這里跟我之前轉(zhuǎn)載的那篇關(guān)于oracle存儲過程的文章有關(guān)聯(lián)(如何調(diào)用一個返回集合的存儲過程)
mapper.xml中的調(diào)用:
<select id="getMaitunitByProcedures" statementType="CALLABLE" parameterType="java.util.Map"> <![CDATA[ {call distance_maintunit( #{maintunits,jdbcType=CURSOR,mode=OUT,resultMap=MAINTUNIT_MAP,javaType=ResultSet}, #{lat,jdbcType=DOUBLE,mode=IN}, #{lng,jdbcType=DOUBLE,mode=IN} )} ]]> </select> <resultMap type="com.cseds.geo.dto.MaintunitDto" id="MAINTUNIT_MAP"> </resultMap>
dao中調(diào)用:
public List<MaintunitDto> getMaintUnitList(@Param("lng") Double lng, @Param("lat") Double lat);
由于第一次寫oracle存儲過程,代碼只是實現(xià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
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。