sql基於座標計算距離的優化

2021-10-01 02:24:36 字數 1426 閱讀 4030

如題,下面是最初版的sql,取與目標座標150千公尺範圍內的記錄

select top 10 * from t_temple a with(nolock) where dbo.[fngetdistance](37.356976,116.8425,lat,lon)<150 order by a.id asc

因為我們知道,如果要與目標座標在150公里,所以經緯度應該在目標座標點的正負2度範圍內(粗略這麼認為啊),所以加上乙個前提條件,如下:

select top 10 * from t_temple a with(nolock) where lat between 37.356976-2 and 37.356976+2 and lon between 116.8425-2 and 116.8425+2 and dbo.[fngetdistance](37.356976,116.8425,lat,lon)<150 order by a.id asc

這樣的話,相比於方案1,方案2還是有效能上的提公升,特別是t_temple表記錄比較多時,可在lat,lon上可以建立座標。

附上ms sql 版的fngetdistance

create function [dbo].[fngetdistance](@latbegin real, @lngbegin real, @latend real, @lngend real) returns float 

as begin

--距離(千公尺)

declare @distance real

declare @earth_radius real

set @earth_radius = 6378.137

declare @radlatbegin real,@radlatend real,@radlatdiff real,@radlngdiff real

set @radlatbegin = @latbegin *pi()/180.0

set @radlatend = @latend *pi()/180.0

set @radlatdiff = @radlatbegin - @radlatend

set @radlngdiff = @lngbegin *pi()/180.0 - @lngend *pi()/180.0

set @distance = 2 *asin(sqrt(power(sin(@radlatdiff/2), 2)+cos(@radlatbegin)*cos(@radlatend)*power(sin(@radlngdiff/2), 2)))

set @distance = @distance * @earth_radius

set @distance = round(@distance * 10000,4) / 10000

return @distance

end

PHP計算座標距離

php 計算兩點地理座標之間的距離 param decimal longitude1 起點經度 param decimal latitude1 起點緯度 param decimal longitude2 終點經度 param decimal latitude2 終點緯度 param int unit...

mysql 座標查詢計算距離

6378.138這個是地球的直徑,單位千公尺.latitude是使用者位置的緯度,longitude是使用者位置經度.latitude 為商戶的緯度字段,longitude為商戶的經度字段。上面一段sql計算得出根據使用者經緯度計算與商戶的距離。30.5821398542,select round ...

基於距離的計算方法

1.歐氏距離 euclidean distance 歐氏距離是最易於理解的一種距離計算方法,源自歐氏空間中兩點間的距離公式。1 二維平面上兩點a x1,y1 與b x2,y2 間的歐氏距離 2 三維空間兩點a x1,y1,z1 與b x2,y2,z2 間的歐氏距離 3 兩個n維向量a x11,x12...