SQL Server存储过程数据转换错误排查:点面包含判断问题
问题排查与修正
你的存储过程存在两个核心问题,导致数据转换错误:
1. 点坐标的WKT格式重复拼接错误
调用存储过程时,你传入的@PlanePoint已经是完整的WKT点格式(比如'POINT(-71.99 45.33)'),但存储过程里又额外拼接了'POINT(@PlanePoint)',最终生成的字符串是'POINT(POINT(-71.99 45.33))',这是无效的WKT格式,无法被STPointFromText解析。
同时,你错误地将变量@PlanePoint放在单引号内,SQL Server会把它当成字面量字符串,而不是替换为变量值。
2. 多边形的WKT格式拼接错误与坐标不闭合
- 同样的变量拼接错误:
'POLYGON((@PolygonInfos))'中的@PolygonInfos被当成字面量,没有替换为传入的坐标值; - 多边形WKT要求首尾坐标必须一致,才能构成闭合图形,但你调用时传入的坐标列表没有闭合,这也会导致地理类型转换失败;
- 存储过程没有将传入的坐标对正确组合成符合要求的多边形WKT结构。
修正后的存储过程
ALTER PROCEDURE [NSGIS].CheckPointInPolygon @PlanePoint NVARCHAR(255), @PolygonInfos NVARCHAR(4000) AS BEGIN DECLARE @Point GEOGRAPHY; DECLARE @Polygon GEOGRAPHY; DECLARE @PolygonWKT NVARCHAR(4000); -- 直接使用传入的完整点WKT,无需额外拼接 SET @Point = geography::STPointFromText(@PlanePoint, 4326); -- 处理多边形:拼接闭合的WKT格式,确保首尾坐标一致 -- 先提取第一个坐标作为闭合点 DECLARE @FirstCoord NVARCHAR(100); SET @FirstCoord = LEFT(@PolygonInfos, CHARINDEX(',', @PolygonInfos) - 1); -- 构建完整的多边形WKT SET @PolygonWKT = 'POLYGON((' + @PolygonInfos + ', ' + @FirstCoord + '))'; SET @Polygon = geography::STPolyFromText(@PolygonWKT, 4326); -- 判断点是否在多边形内 IF @Polygon.STContains(@Point) = 1 BEGIN PRINT 'The point is within the polygon'; END ELSE BEGIN PRINT 'The point is not within the polygon'; END END
修正后的调用示例
如果你的坐标列表本身已经是闭合的,可以去掉存储过程中添加首尾坐标的逻辑,直接拼接即可。
DECLARE @return_value INT EXEC @return_value = [NSGIS].[CheckPointInPolygon] @PlanePoint = 'POINT(-71.99 45.33)', -- 传入未闭合的坐标对,存储过程会自动处理闭合 @PolygonInfos = '-122.34900 47.65100, -122.23700 47.65100, -122.23700 47.73900, -122.34900 47.73900' SELECT @return_value AS "Return Value"
内容的提问来源于stack exchange,提问作者Mike Savoy
相关产品推荐
相关产品推荐

