oracle存储过程---获取数据库中到指定经纬度距离的坐标
admin
2023-06-09 16:03:30
0

新项目需求:

    结合百度地图,在地图中指定一个地点,获取此地点周围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 getMaitunitByProcedures(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;
		
	}

这里跟我之前转载的那篇关于oracle存储过程的文章有关联(如何调用一个返回集合的存储过程)

mapper.xml中的调用:


	 

	


dao中调用:

public List 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


相关内容

热门资讯

人民日报刊文:警惕日本军国主义... 警惕日本军国主义卷土重来(国际论坛)斯特凡·卢比奇《人民日报》(2026年05月25日 第 03 版...
一线调研|从太空到3000米深... 来源:券商中国 当一颗卫星以每秒7公里的速度驶入太空,或者一台机器人潜入3000米深的海底,它们在传...
第8次会师!神舟二十三号航天员... 新华社酒泉5月25日电(记者李国利、高蕊)神舟二十三号航天员乘组25日顺利进驻“天宫”,中国航天员完...
伊朗方面称现阶段伊尚未就核问题... △伊朗首都德黑兰(资料图)总台记者当地时间5月24日获悉,伊朗方面表示,以色列媒体此前关于伊朗在开始...
小米YU7 GT、小米17 M... 5月21日,小米连续发布全新小米YU7家族,新增小米YU7 GT、YU7 标准版两大车型。同场发布的...
持续深耕AI4S创新创业生态 ... 首期科学智能百团百项“科创训练营”近日在沪举办,来自近30个AI4S(AI for Science)...
特朗普:美伊协议“尚未完全谈妥... 新华社华盛顿5月24日电(记者颜亮 徐剑梅)美国总统特朗普24日说,美国和伊朗的协议“尚未完全谈妥”...
大幅升级改造!神舟二十三号飞船... 神舟二十三号飞船出征在即,作为新批次飞船的第二艘飞船,它有哪些改进?承担什么样的任务? 人机界面升...
原创 这... 在自然界,有一些动物通过模仿有毒的、有害的其它动物,来提高生存能力,也有一些动物通过模仿周围的环境来...
Windows竟然藏了一个工具... 快科技5月24日消息,据Neowin报道,Windows系统中有一个鲜为人知的“Windows To...