Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

请教经纬度算距离使用的SQL语句在ACCESS里面的替换方案

曾晓军  发表于:2019-08-14 13:05:45  
复制

SELECT id,code,name,city_name,address,
(6371 * acos(cos(radians(31.2433336586)) * cos(radians(latitude)) * cos(radians(longitude) - radians(121.4579772949)) + sin(radians(31.2433336586)) * sin(radians(latitude)))) AS distance 

FROM bmz_site ORDER BY distance LIMIT 0,10;


在ACCESS语句中没有acos和radians函数,请问达到这个目的的替换方案有吗,谢谢!


 

Top
曾晓军 发表于:2019-08-14 13:25:20

已知一个经纬度,和数据库里的经纬度对比,找出最近一点的位置



最近做快递上门取件业务,当获取用户位置经纬度时,如何快递查询出离用户最近的站点位置,以便让离用户最近的快递小哥上门取件,我的方式是直接在sql语句中计算最近的点

SELECT id,code,name,city_name,address,
(6371 * acos(cos(radians(31.2433336586)) * cos(radians(latitude)) * cos(radians(longitude) - radians(121.4579772949)) + sin(radians(31.2433336586)) * sin(radians(latitude)))) AS distance
FROM bmz_site ORDER BY distance LIMIT 0,10;
想在ACCESS数据库里面实现,求教谢谢! 





西出阳关无故人 发表于:2019-08-14 14:30:15

把acos 用 atan转换一下,关系如下:

Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)

至于角度转弧度不需要解释了吧?

你还可以自定义一个计算两点间距离的函数,简化查询的语法。



曾晓军 发表于:2019-08-14 14:35:28
SELECT id,code,name,city_name,address,

(6371 * acos(cos(radians(31.2433336586)) * cos(radians(latitude)) * cos(radians(longitude) - radians(121.4579772949)) + sin(radians(31.2433336586)) * sin(radians(latitude)))) AS distance FROM bmz_site ORDER BY distance LIMIT 0,10;


能否把详细的代码贴到帖子内啊,水平有限!还请帮忙!



西出阳关无故人 发表于:2019-08-14 15:36:26

你自己添加一个模块,贴上以下代码:



Public Function CalcDistance(ByVal lat1 As Double, ByVal lon1 As Double, ByVal lat2 As Double, ByVal lon2 As Double) As Double
'经纬度计算距离公式,得出结果单位为米
    CalcDistance = 6378137 * 2 * Arcsin(Sqr(SumSq(Sin((Radians(lat1) - Radians(lat2)) / 2)) + Cos(Radians(lat1)) * Cos(Radians(lat2)) * SumSq(Sin((Radians(lon1) - Radians(lon2)) / 2))))
End Function
Private Function Radians(latORlon As Double) As Double
'度转换成弧度公式为X*π/180
    PI14 = 3.14159265358979
    Radians = latORlon * PI14 / 180
End Function
Private Function SumSq(xx As Double) As Double
    SumSq = xx * xx
End Function
Private Function Arcsin(X As Double) As Double
    Arcsin = Atn(X / Sqr(-X * X + 1))
End Function


使用方法:距离=CalcDistance(A纬度,A经度,B纬度,B经度)




西出阳关无故人 发表于:2019-08-14 15:38:56

查询使用方法:

SELECT id,code,name,city_name,address,CalcDistance(A纬度,A经度,B纬度,B经度) AS distance  FROM bmz_site 

其中(A维度,A经度,B维度,B经度)四个参数替换为你的数值或变量。



曾晓军 发表于:2019-08-16 16:23:02

不好意思,这个能否不添加模块。就运用查询命令来解决问题啊!比如

select * from ccbd where sqr(  
    (  
     ((121.4177549103-经度)*3.1415926535897932384626*12656*cos(((31.2796010892+纬度)/2)*3.1415926535897932384626/180)/180)  
     *  
     ((121.4177549103-经度)*3.1415926535897932384626*12656*cos (((31.2796010892+纬度)/2)*3.1415926535897932384626/180)/180)  
    )  
    +  
    (  
     ((31.2796010892-纬度)*3.1415926535897932384626*12656/180)  
     *  
     ((31.2796010892-纬度)*3.1415926535897932384626*12656/180)  
    )  
)<0.5



曾晓军 发表于:2019-08-16 16:24:58
第一个问题,不知道我这个计算距离的公式是否正确。第二我想能够按照算出来的距离进行一个排序,不知道这个语言命令如何写!

西出阳关无故人 发表于:2019-08-17 09:50:56

1、可以不用自定义函数,你对公式进行变换一下,可以在access2007的帮助中搜索“导出的数学函数”参考替代变换方法。

2、公式是否正确,需要你自己验证推导,我也是从度娘那里截获的。

3、select A,B,C,D from 表 order by D    就是按照D字段进行排序的,这是从小到大的顺序,如果要从大到小的逆序排序,就是  select A,B,C,D from 表 order by D desc



西出阳关无故人 发表于:2019-08-17 10:00:41

公式变换:

Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)   左边是access里没有的,右边是access里存在的

Radians公式是access里没有的,可以在模块中自定义函数代替:

Private Function Radians(latORlon As Double) As Double
'度转换成弧度公式为X*π/180
    PI14 = 3.14159265358979
    Radians = latORlon * PI14 / 180
End Function

也可以不使用自定义函数,直接使用变换:

弧度=角度*pi/180



曾晓军 发表于:2019-08-18 09:39:19
感谢您这么热心的解答,解决问题了。再次谢谢啦

西出阳关无故人 发表于:2019-08-20 11:32:42
问题解决了就结贴吧!

总记录:11篇  页次:1/1 9 1 :