在SQL Server中使用经度和纬度进行查询

时间:2016-01-24 14:39:30

标签: sql sql-server

我在SQL Server中有这样的功能。我无法理解它是什么。有人可以简单地向我解释一下吗?

l = [1, 2, 3]                                                                                                                                                                                          

it = iter(l)                                                                    
while True:                                                                     
    try:                                                                        
        print next(it)                                                       
    except StopIteration:                                                       
        break                  

3 个答案:

答案 0 :(得分:2)

您正在查看Haversine公式,该公式使用纬度和经度坐标计算球体上的距离。以下是使用完整Haversine公式的查询:

SELECT 
    ACOS(
       COS(RADIANS(Latitude1))
     * COS(RADIANS(Latitude2))
     * COS(RADIANS(Longitude1) - RADIANS(Longitude2))
     + SIN(RADIANS(Latitude1)) 
     * SIN(RADIANS(Latitude2))
) AS haversineDistance
 FROM yourTable

有关详细信息,请查看this SO articleWikipedia

答案 1 :(得分:1)

就像@TimBiegeleisen和@RobertRodkey所说,这是一个用于计算地球上两点之间距离的旧式公式。

因此,这会导致其他一些问题:

  1. 问:SqlServer是否有可用的地理空间方法?答:对于sql server版本2008及更高版本,
  2. 问:如果Sql使用Geography方法可以使用,我应该使用上面的数学吗?答: 如果您使用的是Sql Server 2008或更高版本。如果在此之前,那么你别无选择,只能使用那种方式/公式。
  3. 问:Narwhales,是海洋的独角兽吗?答:
  4. 进一步展示小费 - 使用STDistance ..那是你的朋友:)

    (浏览器代码,未经测试等)......

    -- Arrange.
    DECLARE @longitude1 FLOAT = -122.360,
            @latitude1 FLOAT = 47.656,
            @longitude2 FLOAT = -122.343,
            @latitude2 FLOAT = 47.656;
    DECLARE @point1 GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT(' + CAST(@longitude1 AS VARCHAR(10)) + ' ' + CAST(@latitude1 AS VARCHAR(10)) + ')', 4326);
    DECLARE @point2 GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT(' + CAST(@longitude2 AS VARCHAR(10)) + ' ' + CAST(@latitude2 AS VARCHAR(10)) + ')', 4326);
    
    -- Determine the distance (which would be in metres because we're using the 4326 == [common GPS format](http://spatialreference.org/ref/epsg/wgs-84/)).
    SELECT @point1.STDistance(@point2);
    

答案 2 :(得分:0)

我不是该领域的专家,但看起来它正在选择一个边界内的点:

http://www.movable-type.co.uk/scripts/latlong-db.html