当前位置: 澳门新濠3559 > 数据库 > 正文

查找数据库中附近5公里或10公里附近的所有信息

时间:2019-10-06 19:55来源:数据库
SELECT  ISNULL((2 * 6378.137 * ASIN(SQRT(POWER(SIN((117.223372-ISNULL(Latitude,0))*PI()/360),2) COS(117.223372*PI()/180)*COS(117.223372*PI()/180)*POWER(SIN((117.223372-ISNULL(Longitude,0) )*PI()/360),2)))),0)   AS Distance  FROMRequirem

SELECT  ISNULL((2 * 6378.137 * ASIN(SQRT(POWER(SIN((117.223372- ISNULL(Latitude,0) )*PI()/360),2) COS(117.223372*PI()/180)*COS(117.223372*PI()/180)*POWER(SIN((117.223372- ISNULL(Longitude,0) )*PI()/360),2)))),0)   AS Distance  FROM RequirementOrder r where r.RequirementOrderID not in (SELECT O.RequirementOrderID from OrdersDetail O)

函数表示对输入参数返回一个特殊计算结果的值。PostgreSQL中的函数种类比较丰富,主要分为以下几类:数值型函数、字符型函数、日期和时间函数、条件判断函数、系统函数、加密函数以及其他函数。这篇文章只介绍数学函数,其他几种函数会在后续文章中逐一介绍。

具体参考这个链接 http://www.arubin.org/files/geo_search.pdf

在数据库中根据经纬度查找数据中所有附近的经纬度点

数学函数

完整sql公式:
SELECT *, 3956 * 2 * ASIN(SQRT(
POWER(SIN((@orig_lat - abs(dest.lat)) * pi()/180 / 2), 2) COS(@orig_lat * pi()/180 ) * COS(abs(dest.lat) * pi()/180) * POWER(SIN((@orig_lon - dest.lon) *
pi()/180 / 2), 2) )) as distance FROM hotels dest
having distance < @dist ORDER BY distance limit 10G;

根据当前所在的坐标点也即经纬度,查找数据库中附近5公里或10公里附近的所有信息的实现,经过查找资料,原来是我高二学的,就是求弦长,数学忘完了,没想到数学还这么有用,数学啊 真是用途太大了。

数学函数主要用来处理数值型数据,主要的数学函数有:绝对值函数、三角函数、对数函数、随机数函数等。

快速公式
SELECT destination.*,
3956 * 2 * ASIN(SQRT( POWER(SIN((orig.lat - dest.lat) * pi()/180 / 2), 2)
COS(orig.lat * pi()/180) * COS(dest.lat * pi()/180) * POWER(SIN((orig.lon -dest.lon) * pi()/180 / 2), 2) )) as
distance FROM hotels dest ORDER BY Distance limit 10;

用到的什么余弦,角度、弧度全忘完了,澳门新濠3559 1但是通过找资料,还是实现了,误差相对还是比较小的,我在mssql数据库中实现的,具体如下:

1. 绝对值函数ABS(A)

test=# select ABS(-1),ABS(1),ABS(-2.2),ABS(0);
 abs | abs | abs | abs
----- ----- ----- -----
   1 |   1 | 2.2 |   0
(1 row)

test=#

 

2. 返回圆周率函数PI()

test=# SELECT PI();

mssql函数:

        pi        

 3.14159265358979
(1 row)

test=#

ALTER FUNCTION [GetDistance]

3. 平方根函数SQRT(A)

注意:负数没有平方根

test=# SELECT SQRT(4),SQRT(20);
 sqrt |       sqrt       
------ ------------------
    2 | 4.47213595499958
(1 row)

test=#


@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=6371.004*ACOS(SIN(@GPSLat/180*PI())*SIN(@Lat/180*PI()) COS(@GPSLat/180*PI())*COS(@Lat/180*PI())*COS((@GPSLng-@Lng)/180*PI()))
   RETURN @result

4. 取余函数MOD(A,B)

注意:小数取余的原则是,返回值精确到被除数的小数位数,即返回值的小数位数和被除数的小数位数相同。

test=# SELECT MOD(4,2),MOD(3,2),MOD(3.5,3),MOD(3.55,3);
 mod | mod | mod | mod  
----- ----- ----- ------
   0 |   1 | 0.5 | 0.55
(1 row)

test=#

END

5. 取整函数CEIL(A)、CEILING(A)和FLOOR(A)

CEIL(A)、CEILING(A)返回大于A的最小整数,FLOOR(A)返回小于A的最大整数

test=# SELECT CEIL(-2.22),CEILING(-2.22),CEIL(2.22),CEILING(2.22),FLOOR(-2.22),FLOOR(2.22);
 ceil | ceiling | ceil | ceiling | floor | floor
------ --------- ------ --------- ------- -------
   -2 |      -2 |    3 |       3 |    -3 |     2
(1 row)

test=#

 

6. 四舍五入函数ROUND(A)和ROUND(A,B)

ROUND(A)对A进行四舍五入,返回最接近A的整数;

ROUND(A,B)对A进行四舍五入,返回最接近A的数值,结果保留B位。

注意:在ROUND(A,B)中,当B为负数时,表示保留A值的小数点左边B位,小数点左边的相应位数用‘0’补充。

test=# SELECT ROUND(-1),ROUND(1),ROUND(-1.65),ROUND(1.65);
 round | round | round | round
------- ------- ------- -------
    -1 |     1 |    -2 |     2
(1 row)

test=# SELECT ROUND(-1,2),ROUND(1.2345,-2),ROUND(1.2345,2);
 round | round | round
------- ------- -------
 -1.00 |     0 |  1.23
(1 row)

 

澳门新濠3559,7. 符号函数SIGN(A)

返回参数的符号,A的值为负、零或正时,返回结果依次为-1,0,1。

test=# SELECT SIGN(-10),SIGN(0),SIGN(10);
 sign | sign | sign
------ ------ ------
   -1 |    0 |    1
(1 row)

test=#

sql查询语句:

8. 幂运算函数POW(A,B)、POWER(A,B)和EXP(A)

POW(A,B)和POWER(A,B)都返回A的B次方的值;

EXP(A)返回e的A次方的值。

test=# SELECT POW(2,2),POWER(2,2),POW(2,-2),POWER(2,-2);
 pow | power | pow  | power
----- ------- ------ -------
   4 |     4 | 0.25 |  0.25
(1 row)

test=#

SELECT *,GetDistance(某一点的经度,某一点的纬度,数据库中经度,数据库中纬度)AS dis FROM 表名   dis<5

9. 对数函数LOG(A)

返回A的自然对数,A不能为负数。

test=# SELECT LOG(2);

   查找数据库中5公里内的记录

        log        

 0.301029995663981
(1 row)

test=#

 

10. 角度和弧度转换函数RADIANS(A)、DEGREES(A)

RADIANS(A)将角度转换为弧度;

DEGREES(A)将弧度转换为角度。

test=# SELECT RADIANS(90),RADIANS(180),DEGREES(PI()),DEGREES(PI()/2);
     radians     |     radians      | degrees | degrees
----------------- ------------------ --------- ---------
 1.5707963267949 | 3.14159265358979 |     180 |      90
(1 row)

test=#

注:

11. 正弦函数SIN(A)和反正弦函数ASIN(A)

SIN(A)返回A的正弦值,其中A是弧度值;

ASIN(A)返回A的反正弦值,其中A为-1和1之间的数值。

SIN(A)和ASIN(A)互为反函数。

test=# SELECT SIN(1),ASIN(0.841470984807897);
        sin        | asin
------------------- ------
 0.841470984807897 |    1
(1 row)

test=#

 

6371.004  地球半径

12. 余弦函数COS(A)和反余弦函数ACOS(A)

 

COS(A)返回A的正弦值,其中A是弧度值;

ACOS(A)返回A的反正弦值,其中A为-1和1之间的数值。

COS(A)和ACOS(A)互为反函数。

test=# SELECT COS(1),ACOS(0.54030230586814);
       cos        | acos
------------------ ------
 0.54030230586814 |    1
(1 row)

test=#

6371.004*ACOS(SIN(@GPSLat/180*PI())*SIN(@Lat/180*PI()) COS(@GPSLat/180*PI())*COS(@Lat/180*PI())*COS((@GPSLng-@Lng)/180*PI()))  计算公式 可查球面弧长计算公式的详细解释

13. 正切函数TAN(A)、反正切函数ATAN(A)和余切函数COT(A)

TAN(A)和ATAN(A)互为反函数,TAN(A)和COT(A)互为倒数。

test=# SELECT TAN(1),ATAN(1.5574077246549),COT(1);
       tan       |       atan        |        cot        
----------------- ------------------- -------------------
 1.5574077246549 | 0.999999999999999 | 0.642092615934331
(1 row)

test=#

The End!

 

编辑:数据库 本文来源:查找数据库中附近5公里或10公里附近的所有信息

关键词: 澳门新濠3559