Sql server 按纬度/经度搜索半径

Sql server 按纬度/经度搜索半径,sql-server,database,sql-server-2008,geolocation,Sql Server,Database,Sql Server 2008,Geolocation,我使用mysql找到了这个问题的一系列答案,但我无法将任何内容转换为ms sql 2008可以使用的查询。对于数据库中的每一行,我都有一个经度和纬度列。我将得到用户所在位置的纬度和经度。我希望能够找到距离用户纬度/经度x英里以内的所有行。另外,当尝试使用我在上找到的其他查询时,我不断得到错误-“pow”不是一个可识别的内置函数名。这很奇怪,因为我很确定我以前在sql 2008中使用过pow。在此方面的任何帮助都将不胜感激。到目前为止,这是最接近的 select * from tbl_MyTabl

我使用mysql找到了这个问题的一系列答案,但我无法将任何内容转换为ms sql 2008可以使用的查询。对于数据库中的每一行,我都有一个经度和纬度列。我将得到用户所在位置的纬度和经度。我希望能够找到距离用户纬度/经度x英里以内的所有行。另外,当尝试使用我在上找到的其他查询时,我不断得到错误-
“pow”不是一个可识别的内置函数名。
这很奇怪,因为我很确定我以前在sql 2008中使用过
pow
。在此方面的任何帮助都将不胜感激。到目前为止,这是最接近的

select * from tbl_MyTable
WHERE (
POW( ( 69.1 * ( Longitude - @longitude ) * cos( @latitude / 57.3 ) ) , 2 ) + POW( ( 69.1 * ( Latitude - @latitude ) ) , 2 )
) < ( 5 *5 );
从tbl\u MyTable中选择*
在哪里(
功率((69.1*(经度-经度)*cos(@纬度/57.3)),2)+功率((69.1*(纬度-纬度)),2)
) < ( 5 *5 );

我想你想要的是权力而不是权力


因为你在SQL 2008上,考虑使用本地地理空间能力。你可以做一些奇特的事情,比如:

  • 创建表示点的地理类型的持久化计算列
  • 在计算列上创建空间索引。这将使类似于
    yourPoint.STDistance(@otherPoint)
    声明@CurrentLocation-geography;
    设置@CurrentLocation=geography::Point(12.822222,80.2222224326)
    选择*,圆形(GeoLocation.STDistance(@CurrentLocation),0)作为与[地标]的距离
    
    在哪里GeoLocation.STDistance(@CurrentLocation)您有用于设置它的链接吗?我认为这是ms sql 2012中的新内容Wesome,谢谢,伙计,这是一个更好的答案,我不想从derek的接受答案中删除,因为他从技术上确实回答了我的问题,而且是第一个哦,等等,4326是什么?北美是否需要4152?4226是所谓的SRID或空间参考标识符。与许多事物一样,地理空间数据表示有许多相互竞争的标准。SQL Server知道的所有SRID都在一个名为sys.spatial\u reference\u systems的系统视图中。您可以在SQL Server 2012中持久化地理计算列。这确实解决了问题,但Ben编写了一个完整的索引更快、更智能的查询方法。用一位匿名国际象棋大师的话说,这一切都很好:“当我找到一个好的移动,我会寻找一个更好的移动”。
    alter table [yourTable] add [p] as geography::Point(Latitude, Longitude, 4326) persisted;
    create spatial index [yourSpatialIndex] on [yourTable] ([p])
    
    declare @Latitude float = <somevalue>, @Longitude float = <somevalue>;
    declare @point geography = geography::Point(@Latitude, @Longitude, 4326);
    declare @distance int = <distance in meters>;
    
    select * from [yourTable] where @point.STDistance([p]) <= @distance;
    
    DECLARE @CurrentLocation geography; 
    SET @CurrentLocation  = geography::Point(12.822222, 80.222222, 4326)
    
    SELECT * , Round (GeoLocation.STDistance(@CurrentLocation ),0) AS Distance FROM [Landmark]
    WHERE GeoLocation.STDistance(@CurrentLocation )<= 2000 -- 2 Km