我需要计算最大和最小纬度和经度,以便在计算两点之间的距离之前能够更轻松地过滤大量数据。
但是,我找不到距离可变的任何东西,所以我想出了以下内容,因为我想我可以逐步计算这些:
DECLARE @area int = (69 * FLOOR(@maxDist/69) + 1)
DECLARE @lonMin float = @originLon - @maxDist/abs(cos(radians(@originLat)) * @area);
DECLARE @lonMax float = @originLon + @maxDist/abs(cos(radians(@originLat)) * @area);
DECLARE @latMin float = @originLat - (@maxDist/@area);
DECLARE @latMax float = @originLat + (@maxDist/@area);
当我尝试使用where语句应用我得到的值时,搜索会在超过单度差异时失败。
WHERE
(endPoint.Longitude >= @lonMin and endPoint.Longitude <= @lonMax)
and
(endPoint.Latitude >= @latMin and endPoint.Longitude <= @latMax)
我最好的猜测是我的lonMin和lonMax是错的,但我不知道我在哪里打破它。我很确定我使用的是正确的公式 - 到目前为止我查看的其他公式是相同的 - 问题是我的计算@area
还是别的什么?
(我正在使用Miles和示例输入,如33.631701,
-111.877582)
答案 0 :(得分:0)
事实证明我对于我需要做的事情有正确的公式,但我错误地使用了它们。我没有意识到我插入了以英里为单位的度数(@area
)我想搜索我应该只是将基线设置为1度。
更改我输入的值可以提供所需的1度一次区域过滤扩展 - 因此搜索原点40mi内的某些内容将过滤掉所有不在69mi范围内的数据结果原点,并搜索94mi远将过滤掉不在138mi之内的那些
我意识到在这种情况下不必声明@degree
,但我发现这样做澄清了我的问题。
DECLARE @degree int = 69
DECLARE @area int = @degree * (FLOOR(@maxDist/@degree) + 1);
DECLARE @lonMin float = @originLon - @area/(abs(cos(radians(@originLat)) * @degree));
DECLARE @lonMax float = @originLon + @area/(abs(cos(radians(@originLat)) * @degree));
DECLARE @latMin float = @originLat - (@area/@degree);
DECLARE @latMax float = @originLat + (@area/@degree);