Sql server SQL Server:计算纵横比的半径?

Sql server SQL Server:计算纵横比的半径?,sql-server,Sql Server,假设我有一个城市的经纬度,我需要找出离这个位置100英里以内的所有机场。我将如何做到这一点?我的数据驻留在SQL Server中。一个表包含所有城市信息和lat和long,另一个表包含机场信息和lat和long 这是我几年前用过/写过的,它离我所需要的足够近了。如果我没记错的话,公式的一部分考虑了地球的曲率,但这已经有一段时间了。我用的是邮政编码,但你可以很容易地适应城市——同样的逻辑 ALTER PROCEDURE [dbo].[sp_StoresByZipArea] (@zip nvarch

假设我有一个城市的经纬度,我需要找出离这个位置100英里以内的所有机场。我将如何做到这一点?我的数据驻留在SQL Server中。一个表包含所有城市信息和lat和long,另一个表包含机场信息和lat和long

这是我几年前用过/写过的,它离我所需要的足够近了。如果我没记错的话,公式的一部分考虑了地球的曲率,但这已经有一段时间了。我用的是邮政编码,但你可以很容易地适应城市——同样的逻辑

ALTER PROCEDURE [dbo].[sp_StoresByZipArea] (@zip nvarchar(5), @Radius float)  AS

DECLARE @LatRange float
DECLARE @LongRange float
DECLARE @LowLatitude float
DECLARE @HighLatitude  float
DECLARE @LowLongitude  float
DECLARE @HighLongitude  float

DECLARE @istartlat  float
DECLARE @istartlong  float

SELECT @iStartlat=Latitude, @iStartLong=Longitude from zipcodes where zipcode=@ZIP

SELECT @LatRange = @Radius / ((6076 / 5280) * 60)
SELECT @LongRange = @Radius / (((cos((@iStartLat * 3.141592653589 / 180)) * 6076.) /  5280.) * 60)

SELECT @LowLatitude = @istartlat - @LatRange
SELECT @HighLatitude = @istartlat + @LatRange
SELECT @LowLongitude = @istartlong - @LongRange
SELECT @HighLongitude = @istartlong + @LongRange

/** Now you can create a SQL statement which limits the recordset of cities in this manner:  **/

SELECT * FROM ZipCodes
 WHERE (Latitude <= @HighLatitude) AND (Latitude >= @LowLatitude) AND (Longitude >= @LowLongitude) AND (Longitude <= @HighLongitude)

首先。。。转换城市的数据点

DECLARE @point geography;

SELECT geography::STPointFromText('POINT(' + CAST(@lat AS VARCHAR(20)) + ' ' + 
                    CAST(@lon AS VARCHAR(20)) + ')', 4326)
其中,@lat和@lon是相关城市的纬度和经度

然后您可以查询表

SELECT [column1],[column2],[etc]
FROM [table]
WHERE @point.STBuffer(160934.4).STIntersects(geography::STPointFromText(
  'POINT(' + CAST([lat] AS VARCHAR(20)) + ' ' + 
  CAST([lon] AS VARCHAR(20)) + ')', 4326) );
其中160934.4是100英里内的米数

不过,这将是缓慢的。如果您想做更多的空间工作,可以添加一个持久化的计算列,因为lat和lon点实际上不会改变,然后使用空间索引

ALTER TABLE [table] 
  ADD geo_point AS geography::STPointFromText('POINT(' + CAST([lat] AS VARCHAR(20))
  + ' ' + CAST([lon] AS VARCHAR(20)) + ')', 4326) PERSISTED;

CREATE SPATIAL INDEX spix_table_geopt
   ON table(geo_point)
   WITH ( BOUNDING_BOX = ( 0, 0, 500, 200 ) ); --you'd have to know your data

您使用的是空间数据吗?不,它们只是以小数形式存储的sql server版本?您需要计算地球上两点之间的距离。看另一个答案也很好。我添加了这个作为一种替代方法,尤其是在SQL Server 2008中,尤其是如果你要做大量的空间工作。如果我想要100英里半径,数学会有所不同吗?只是出于好奇,你会如何对结果集进行排序,以显示离你所在位置最近的城市?