oracle存储过程---获取数据库中到指定经纬度距离的坐标
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,新项目需求:结合百度地图,在地图中指定一个地点,获取此地点周围1km范围内所有数据库中存的单位的地点和信息标记在地图上。于是初写了一把oracle的存储过程,纯靠摸索写的。后台需要的函数如下:首先,计
千家信息网最后更新 2026年10月31日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调用如下:
@Override public ListgetMaitunitByProcedures(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 ListgetMaintUnitList(@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
过程
存储
函数
地图
地点
数据
数据库
接下来
中指
代码
信息
功能
单位
只是
后台
圆弧
文章
新项目
标记
第一次
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
深圳恒合互联网络科技有限公司
互联网科技未来
有马互联网科技
嘟嘟瓜互联网科技
有木互联网科技
互联网实体化科技化
成都互联网科技公司100强
承德科技产业互联网发展
互联网金融科技公司干啥的
受益于互联网科技的高速发展
南平创想时代互联网科技有限公司
宝灵互联网科技有限公司
和信科技工业互联网
民营互联网公司国防科技
互联网新科技动漫ppt素材
工业互联网科技成果转化
米泉互联网科技专业怎么样
悟空问答互联网科技
互联网科技和医药行业
现代互联网科技公司
小米移动互联网科技园
博彦科技互联网金融
科技制造互联网公司
杭州互联网科技公司
居家互联网科技有限公司
互联网企业和科技型企业
互联网科技大奖都有哪些公司
晋城互联网科技
山东有哪些互联网科技公司
互联网第三次科技革命特征