中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 數據庫 > 
  • oracle存儲過程---獲取數據庫中到指定經緯度距離的坐標

oracle存儲過程---獲取數據庫中到指定經緯度距離的坐標

發布時間:2020-07-26 03:16:34 來源:網絡 閱讀:1951 作者:java程序猿 欄目:數據庫

新項目需求:

    結合百度地圖,在地圖中指定一個地點,獲取此地點周圍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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万山特区| 上高县| 大丰市| 呈贡县| 越西县| 怀化市| 红河县| 聂拉木县| 惠水县| 鸡东县| 温宿县| 台前县| 江城| 金门县| 罗源县| 吉首市| 宜兰县| 大冶市| 广东省| 武宣县| 宜宾市| 都兰县| 巴塘县| 西峡县| 大田县| 承德市| 手游| 科技| 金平| 册亨县| 江北区| 通江县| 濮阳县| 三河市| 松潘县| 义马市| 牙克石市| 德昌县| 黄冈市| 华宁县| 卢湾区|