获取数据库中到指定经纬度距离的坐标
oracle存储过程
新项目需求:
结合百度地图,在地图中指定一个地点,获取此地点周围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 isearth_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;
begins := 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);
BEGINFOR L_RECORD IN (select * from M_MAINTENACEUNIT)
LOOPSELECT 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)THENv_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||')';EXCEPTIONWHEN OTHERS THENROLLBACK;dbms_output.put_line(SQLERRM);END;
由于使用mybatis
,所以service
调用如下:
@Overridepublic 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
存储过程,代码只是实现了功能,有待改进。
在 Oracle 中根据经纬度计算两地之间的距离
在 Oracle 中根据经纬度计算两地之间的距离
获得弧度的函数:
CREATE OR REPLACE FUNCTION Radian(d number) RETURN NUMBER
is
PI number :=3.141592625;begin
return d* PI/180.0;
end ;
测试一下这个函数:
select Radian(360) from dual;
根据经纬度计算距离的函数:
CREATE OR REPLACE FUNCTION GetDistance(lat1 number,lng1 number,lat2 number,lng2 number) RETURN NUMBER isearth_padius number := 6378.137;radLat1 number := Radian(lat1);radLat2 number := Radian(lat2);a number := radLat1 - radLat2;b number := Radian(lng1) - Radian(lng2);s number := 0;
begins := 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;
示例,根据城市名计算距离:
东方明珠塔的经纬度是:121.506656,31.245087
陆家嘴地铁站的经纬度是:121.508883,31.243481
SQL> select GetDistance('121.506656','31.245087','121.508883','31.243481') from dual;
输出结果是 0.2649 千米
sql server 计算两个经纬度点之间的距离
这里用到的算法和地球半径等数据均来自网络,此文只作整理记录。
地球半径值采用赤道半径 6378137.0
米,这是1980
年的国际标准数据。
下面是在数据库中写的自定义函数,传入两个经纬度点的数据,共4个参数,返回以米为单位的两点之间的距离
CREATE FUNCTION [f_GetDistance] ( @GPSLng DECIMAL(12,6), @GPSLat DECIMAL(12,6), @Lng DECIMAL(12,6), @Lat DECIMAL(12,6) ) RETURNS DECIMAL(12,4) AS BEGIN DECLARE @result DECIMAL(12,4) SELECT @result = 6378137.0*ACOS(SIN(@GPSLat/180*PI())*SIN(@Lat/180*PI())+COS(@GPSLat/180*PI())*COS(@Lat/180*PI())*COS((@GPSLng-@Lng)/180*PI())) RETURN @result END GO
获取数据库中到指定经纬度距离的坐标相关推荐
- 关于C#中使用SQLDMO来获取数据库中的一些操作
首先添加SQLDMO的引用 1:通过SQLDMO来获取可用的网络数据库(区域网当中) public static List<string> get可用SQL服务器() { ...
- 如何获取数据库中标的所有字段和数据类型?
如何获取数据库中标的所有字段和数据类型? 目录 如何获取数据库中标的所有字段和数据类型? #获取表中所有字段
- Java中获取数据库中两个时间的相差秒数
场景 Java中获取数据库中结束时间与开始时间相差的秒数. 实现 Long betweenTime=0l;betweenTime =((b.getFinishTime().getTime()-b.ge ...
- php 获取数据库中的信息,php获取数据库中数据的实现方法
废话不多说,直接上代码 header("Content-type:text/html;charset=utf-8");//字符编码设置 $servername = "lo ...
- html使用thymeleaf模板时,获取数据库中字符串值,拆分为list根据下标获取对应的值的方法
1. 需求 html使用thymeleaf模板时,获取数据库中字符串值,拆分为list根据下标获取对应的值的方法 2. 方法 2.1 参考官网:https://www.thymeleaf.org/do ...
- mysql 获取数据库中最大的日期
mysql 获取数据库中最大的日期 select DATE_FORMAT(max(over_time),'%Y-%m-%d') from 表名格式化参考 %a 缩写星期名 %b 缩写月名 %c 月,数 ...
- Js获取URL中的指定参数
平时项目中页面跳转需要携带参数,为方便获取URL中指定参数 整理了两个方法 方法1:URLSearchParams() URLSearchParams对象定义了操作 URL传递参数的方法 //获取ur ...
- android 读取mysql中的图片_Android 通过API获取数据库中的图片文件方式
Overview 今天复习了一下Android 如何将我们数据库中图片获取出来,并且将其转换为bitmap进行显示. 开发环境以及技术 使用Visual Studio 2019 Android Stu ...
- server sql 数据总行数_SqlServer中获取数据库中每个表的行数
CREATE TABLE #RowCounts(NumberOfRows BIGINT,TableName VARCHAR(128)) EXEC sp_MSForEachTable 'INSERT I ...
最新文章
- Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译)
- JAVA基础5——与String相关的系列(1)
- HDU多校4 - 6988 Display Substring(后缀自动机+二分)
- [python opencv 计算机视觉零基础到实战] 一 opencv的helloworld
- java php html,java和html的区别是什么
- SOLOv2论文简读
- python电脑版-mPython
- 数据库期末总结笔记( 零基础 )-第二章 关系数据库
- 【Vegas原创】红烧肉的做法
- React Hooks 起手式,实现一个「高颜值实用」的色彩设计工具
- 响应式编程笔记三:一个简单的HTTP服务器
- PDF论文--字体未嵌入解决办法
- Hive指定位置增加字段及解决columns have types incompatible with the existing columns in their respective positio
- make[1]: *** Waiting for unfinished jobs....
- Highcharts3D环形图
- ssh远程No route to host问题解决
- ABAP CDS编写
- TIA博途中通过关键字AT实现变量覆盖的具体方法及示例程序
- 安装目录里无法找到计算机,Win7系统下programdata文件夹找不到怎么办?
- 被骗几十万总结出来的Ddos攻击防护经验!(转载)