mysql 半径,mysql – 根据半径从地图数据库中选择点

我有一个数据库,其中包含纬度/经度.如果我想选择在特定点中心的特定范围内的所有点,它可以正常工作但是如果在该中心有任何点,它将不会被选中!

我用这个查询:

SELECT *, ( 6371 * acos( cos( radians(-27.5796498) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-48.543221) ) + sin( radians(-27.5796498) ) * sin( radians( latitude ) ) ) ) AS distance FROM map HAVING distancia <= 2

在上面的情况下,半径是“2”,地图的中心是[-27.5796498,-27.5796498].这个查询工作得很好但是如果某个点位于这个非常精确的中心,它将不会被选中.为什么?

编辑:我发现上面的公式为所有点返回一个好的值但是位于中心的点MYSQL将值NULL返回到列“距离”!专业人士如何处理这种或使用SQL来选择包括中心点在内的范围内的点的问题?

EDIT2:我可以创建另一个查询来选择位于半径正中心的所有点,但这样效率不高,也许某些数学向导可以提出更好的公式.

解决方法:

有时ACOS()的参数可能略大于1 – 稍微超出该函数的域 – 当距离很小时.由于Vincenty,有一个更好的距离公式.它使用ATAN2(y,x)函数而不是ACOS()函数,因此在数值上更稳定.

就是这个.

DEGREES(

ATAN2(

SQRT(

POW(COS(RADIANS(lat2))*SIN(RADIANS(lon2-lon1)),2) +

POW(COS(RADIANS(lat1))*SIN(RADIANS(lat2)) -

(SIN(RADIANS(lat1))*COS(RADIANS(lat2)) *

COS(RADIANS(lon2-lon1))) ,2)),

SIN(RADIANS(lat1))*SIN(RADIANS(lat2)) +

COS(RADIANS(lat1))*COS(RADIANS(lat2))*COS(RADIANS(lon2-lon1))))

有一个更完整的写法,包括MySQL的存储函数定义,here.

另一个解决方案是使用ISNULL(ACOS(公式),0.0)

标签:sql,sql-server,mysql,api,maps

来源: https://codeday.me/bug/20191007/1868187.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值