MySql纬度和经度

时间:2014-10-01 06:08:19

标签: mysql

我想知道是否有一种快速的方法来计算牵引点lat和lng之间的距离我有这个代码但它很慢

SELECT * FROM `hotels` WHERE (SQRT(POW(`lat` - 32.171253 , 2) + POW(`lng` - 35.057362, 2)) * 100) < 1

此返回的点数在1公里左右

提前谢谢

1 个答案:

答案 0 :(得分:1)

CREATE FUNCTION dbo.DistanceKMFromLatLong
(
    @srcLatitude decimal(9,6),
    @srcLongitude decimal(9,6),
    @destLatitude decimal(9,6),
    @destLongitude decimal(9,6)
)
RETURNS TABLE
AS
RETURN
(
    SELECT DistanceKM = ACOS(SIN(PI()*@srcLatitude/180.0)*SIN(PI()*@destLatitude/180.0)+COS(PI()*@srcLatitude/180.0)*COS(PI()*@destLatitude/180.0)*COS(PI()*@destLongitude/180.0-PI()*@srcLongitude/180.0))*6371        
)
GO

参考:Haversine formula

您可以通过连接到包含源和目标纬度/长度的两个表来使用它,如下所示:

select 
    p.Latitude,
    p.Longitude,
    s.Latitude,
    s.Longitude,
    DistanceFromStoreKMNew = d.DistanceKM
from
    Staging.PostcodesToLatLong p 
    join dbo.Store s on s.StoreId = p.StoreId 
    cross apply dbo.DistanceKMFromLatLong(p.Latitude, p.Longitude, s.Latitude, s.Longitude) d

您还可以使用半正公式创建一个标量值函数。

如果您希望更快,请创建CLR存储过程。