oracle存储过程---获取数据库中到指定经纬度距离的坐标
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,新项目需求:结合百度地图,在地图中指定一个地点,获取此地点周围1km范围内所有数据库中存的单位的地点和信息标记在地图上。于是初写了一把oracle的存储过程,纯靠摸索写的。后台需要的函数如下:首先,计
千家信息网最后更新 2025年11月07日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安全错误
数据库的锁怎样保障安全
apex 服务器列表
部落冲突苹果服务器找不到
域控服务器安全威胁
校园建立网络安全演讲稿
专业直销软件开发的博客
java 改变数据库表语句
服务器屏幕点不亮怎么回事
武汉掌易乐游网络技术公司
tb级排序索引数据库
汽车显示服务器
网络安全审计器
网络安全自查报告个人
邯郸人工智能软件开发有用吗
就是生成数据库中所有用户的所有
花生壳能映射ftp服务器吗
网络安全模式不能连接usb
中国联通网络技术大会那一年
静安区企业网络技术咨询信息推荐
p2p网络技术的应用
数据库的设计基础是什么
apex 服务器列表
凌波微步 软件开发
小程序云函数读写数据库
会员服务器
网络安全检测器
武汉掌易乐游网络技术公司
无法连接至逃脱者服务器
阜阳点拓互联网科技
数据库技术原理与设计 朱烨
数据仓库中是什么数据库