计算距离位置

时间:2017-01-31 18:49:37

标签: sql math latitude-longitude scalar

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

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)

1 个答案:

答案 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);