SSMS中T-SQL空间查询:STIntersects与STContains结果异常
问题分析与解决方案
核心问题:坐标参数顺序错误
SQL Server中geography::Point()的参数顺序为纬度在前,经度在后,但你在路线的WKT格式LINESTRING里使用的是(经度 纬度)的顺序,构造@startPoint时直接照搬了WKT的数值顺序,导致生成的点与实际路线上的点完全错位,这是查询无结果的根本原因。
举例来说,你路线里的点50.47959 -80.518649(WKT格式:经度 纬度),但geography::Point('50.47959','-80.518649',4326)错误地将50.47959作为纬度、-80.518649作为经度,生成的缓冲区域自然和路线没有交集。
正确的查询方案
方案1:用STDistance直接判断距离(高效直观)
无需构造缓冲区,直接计算路线与目标点的球面距离,筛选距离≤5000米的路线:
DECLARE @startPoint geography; -- 纠正坐标顺序:纬度在前,经度在后 SET @startPoint = geography::Point(-80.518649, 50.47959, 4326); SELECT route_id, route_name FROM [test-DB].[dbo].[routes] WHERE route_geography.STDistance(@startPoint) <= 5000; -- 筛选距离≤5km的路线
方案2:纠正坐标后使用STIntersects
若坚持使用缓冲区,先修正点的坐标顺序,再构造缓冲区判断相交:
DECLARE @startPoint geography; SET @startPoint = geography::Point(-80.518649, 50.47959, 4326); DECLARE @buffer geography; SET @buffer = @startPoint.STBuffer(5000); SELECT route_id, route_name FROM [test-DB].[dbo].[routes] WHERE route_geography.STIntersects(@buffer) = 1;
补充说明:STContains失效原因
STContains(@buffer, route_geography)要求整条路线完全被缓冲区包含,而你的路线是长距离线路,5km缓冲区不可能覆盖整条路线,这个逻辑本身不符合需求,因此不适用。
内容的提问来源于stack exchange,提问作者Sunny
相关产品推荐
相关产品推荐

