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函数,请问达到这个目的的替换方案有吗,谢谢!
已知一个经纬度,和数据库里的经纬度对比,找出最近一点的位置
最近做快递上门取件业务,当获取用户位置经纬度时,如何快递查询出离用户最近的站点位置,以便让离用户最近的快递小哥上门取件,我的方式是直接在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数据库里面实现,求教谢谢!
把acos 用 atan转换一下,关系如下:
Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)
至于角度转弧度不需要解释了吧?
你还可以自定义一个计算两点间距离的函数,简化查询的语法。
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;
能否把详细的代码贴到帖子内啊,水平有限!还请帮忙!
你自己添加一个模块,贴上以下代码:
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经度)
查询使用方法:
SELECT id,code,name,city_name,address,CalcDistance(A纬度,A经度,B纬度,B经度) AS distance FROM bmz_site
其中(A维度,A经度,B维度,B经度)四个参数替换为你的数值或变量。
不好意思,这个能否不添加模块。就运用查询命令来解决问题啊!比如
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
第一个问题,不知道我这个计算距离的公式是否正确。第二我想能够按照算出来的距离进行一个排序,不知道这个语言命令如何写!
1、可以不用自定义函数,你对公式进行变换一下,可以在access2007的帮助中搜索“导出的数学函数”参考替代变换方法。
2、公式是否正确,需要你自己验证推导,我也是从度娘那里截获的。
3、select A,B,C,D from 表 order by D 就是按照D字段进行排序的,这是从小到大的顺序,如果要从大到小的逆序排序,就是 select A,B,C,D from 表 order by D desc
公式变换:
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
感谢您这么热心的解答,解决问题了。再次谢谢啦
问题解决了就结贴吧!
总记录:11篇 页次:1/1 9 1 :