我有一个表(位置),其中有一个名为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
答案 0 :(得分:0)
该问题有两种可能的潜在来源:
使用几何而不是地理类型。处理纬度和经度数据时,通常需要使用地理类型来对椭圆体进行计算,而不是在平面上进行计算。这些计算可能有很大不同 - 这是关于这一区别的大量信息,例如whitepaper等各种文章。
SRID不匹配 - 您的位置表中的数据的srid对于所有行也是0吗?如果您的数据与@searcharea不匹配,则不会返回任何结果。