您好,登錄后才能下訂單哦!
新項目需求:
結合百度地圖,在地圖中指定一個地點,獲取此地點周圍1km范圍內所有數據庫中存的單位的地點和信息標記在地圖上。于是初寫了一把oracle的存儲過程,純靠摸索寫的。
后臺需要的函數如下:
首先,計算圓弧函數
CREATE OR REPLACE FUNCTION RAD(d number) RETURN NUMBER is PI number :=3.141592625; begin return d* PI/180.0; end ;
然后,計算距離函數
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調用如下:
@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; }
這里跟我之前轉載的那篇關于oracle存儲過程的文章有關聯(如何調用一個返回集合的存儲過程)
mapper.xml中的調用:
<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中調用:
public List<MaintunitDto> getMaintUnitList(@Param("lng") Double lng, @Param("lat") Double lat);
由于第一次寫oracle存儲過程,代碼只是實現了功能,有待改進。
參考: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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。