oracle存储过程---获取数据库中到指定经纬度距离的坐标
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,新项目需求:结合百度地图,在地图中指定一个地点,获取此地点周围1km范围内所有数据库中存的单位的地点和信息标记在地图上。于是初写了一把oracle的存储过程,纯靠摸索写的。后台需要的函数如下:首先,计
千家信息网最后更新 2025年01月22日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安全错误
数据库的锁怎样保障安全
国家网络安全宣传周龙岩活动
数据库中的禁用索引
东阿软件开发者
ps5cod18连不上服务器
网络安全检查承诺书
软件开发工程师执业环境
做网络安全的倡议
网络丢包数据库数据传输
小学网络技术课程
奥维 企业服务器 谷歌地图
linux软件开发面试题
北京软件开发价位
贵州电视台6频道网络安全
电脑服务器做固定资产
数据库设计第一范式
华科网络安全学院研究生招生
网络安全知识提升调研问卷答案
华为网络安全认证难不难
服务器开局送神装
烟草企业网络安全防护体系建设
雅安网络技术推荐厂家
建行软件开发面试
asp 删除数据库记录
如何进数据库查资料
哪里有好的app软件开发
富士康网络技术员是做什么的
情报驱动的网络安全
南京可瑞塔互联网科技
丹东悠逸网络技术有限公司分公司
网络安全板报图片 宣传