计算与某个位置之间具有可变距离的 MAX 和最小纬度和经度



我需要计算一个最大和最小经纬度,以便能够在计算两点之间的距离之前更容易地过滤大量一组数据。
但是,我没有找到任何距离可变的东西,所以我想出了以下内容,因为我想我也许可以分步计算这些:

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)

事实证明,我有正确的公式来做我需要做的事情,但我用错了它们。 我没有意识到我正在插入以英里(@area)为单位的度数,我想搜索我应该把1度的基线放在哪里。

更改我输入的值可以一次扩展 1 度的区域过滤 - 因此搜索距离原点 40 英里以内的内容将过滤掉不在原点 69 英里范围内的所有数据库结果,搜索 94 英里外将过滤掉不在 138 英里范围内的数据库结果,依此类推。

我意识到在这种情况下不必声明@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);

最新更新