查询表区域内的点(几何)记录

时间:2011-07-12 16:53:07

标签: sql sql-server tsql sql-server-2008 geospatial

我有一个表(位置),其中有一个名为Point(geometry)的字段。我写了一个查询,它传递了顶部和底部纬度坐标以及底部和顶部经度坐标。我想检索我传递存储过程的坐标区域内的所有记录。当我运行它时它返回零记录,即使我知道有一个符合条件的记录。我可能做错了什么想法?

    DECLARE @categoryid AS int,@leftlong AS float,@rightlong AS float,@toplat AS                         float,@bottomlat AS float
    DECLARE @searcharea  geometry, @polygon AS varchar(500);
    SET @leftlong = -85.605469
    SET @toplat = 42.303468
    SET @rightlong = -85.594912
    SET @bottomlat = 42.297564
    SET @polygon =  CAST(@leftlong AS varchar(20)) + ' ' + CAST(@toplat AS varchar(20)) + ',' + 
            CAST(@leftlong AS varchar(20)) + ' ' + cast(@bottomlat AS varchar(20)) + ',' + 
            cast(@rightlong AS varchar(20)) + ' ' + cast(@bottomlat AS varchar(20)) + ',' + 
            cast(@rightlong AS varchar(20)) + ' ' + cast(@toplat AS varchar(20)) + ',' + 
            CAST(@leftlong AS varchar(20)) + ' ' + CAST(@toplat AS varchar(20))

    SET @searcharea = geometry::STGeomFromText('POLYGON ((' + @polygon + '))', 0);

    SELECT *
    FROM locations l
    WHERE l.point.STWithin(@searcharea) = 1

1 个答案:

答案 0 :(得分:0)

该问题有两种可能的潜在来源:

  1. 使用几何而不是地理类型。处理纬度和经度数据时,通常需要使用地理类型来对椭圆体进行计算,而不是在平面上进行计算。这些计算可能有很大不同 - 这是关于这一区别的大量信息,例如whitepaper等各种文章。

  2. SRID不匹配 - 您的位置表中的数据的srid对于所有行也是0吗?如果您的数据与@searcharea不匹配,则不会返回任何结果。