21

我已经使用 mysql 找到了很多关于这个问题的答案,但我无法将任何内容转换为 ms sql 2008 可以使用的查询。我在数据库中的每一行都有一个经度和纬度列。我将有一个用户所在位置的纬度和经度。我希望能够找到距离用户纬度/经度 x 英里范围内的所有行。此外,当尝试使用我在 SO 上找到的其他查询时,我不断收到错误 - 'pow' is not a recognized built-in function name. 这很奇怪,因为我很确定我pow以前在 sql 2008 中使用过。对此的任何帮助将不胜感激。到目前为止,这是最接近的。

select * from tbl_MyTable
WHERE (
POW( ( 69.1 * ( Longitude - @longitude ) * cos( @latitude / 57.3 ) ) , 2 ) + POW( ( 69.1 * ( Latitude - @latitude ) ) , 2 )
) < ( 5 *5 );
4

3 回答 3

41

由于您使用的是 SQL 2008,因此请考虑使用本机地理空间功能。你可以做一些花哨的事情,比如:

  • 创建一个表示您的点的地理类型的持久计算列。
  • 在计算列上创建空间索引。这将使事情变得yourPoint.STDistance(@otherPoint) <= @distance高效

像这样:

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;
于 2013-03-26T15:07:11.960 回答
6
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

精彩教程

http://www.sql-server-helper.com/sql-server-2008/convert-latitude-longitude-to-geography-point.aspx

于 2014-10-21T07:24:16.557 回答
5

我认为你想要 POWER 而不是 POW

http://msdn.microsoft.com/en-us/library/ms174276.aspx

于 2013-03-26T03:28:27.620 回答