oracle預存程序---擷取資料庫中到指定經緯度距離的座標

來源:互聯網
上載者:User

標籤:oracle   預存程序   

新項目需求:

    結合百度地圖,在地圖中指定一個地點,擷取此地點周圍1km範圍內所有資料庫中存的單位的地點和資訊標記在地圖上。於是初寫了一把oracle的預存程序,純靠摸索寫的。


後台需要的函數如下:


首先,計算圓弧函數

CREATE OR REPLACE FUNCTION RAD(d number) RETURN NUMBERisPI number :=3.141592625;beginreturn  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)ISv_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調用如下:

@Overridepublic 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


本文出自 “java程式猿的部落格” 部落格,請務必保留此出處http://chengxuyuan.blog.51cto.com/5789198/1787169

oracle預存程序---擷取資料庫中到指定經緯度距離的座標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.