使用缓冲区插入唯一点



我目前正在使用这个:

IF OBJECT_ID('tempdb..#Source') IS NOT NULL DROP TABLE #Source
IF OBJECT_ID('tempdb..#Target') IS NOT NULL DROP TABLE #Target
CREATE TABLE #Source
(
Point GEOGRAPHY
);
CREATE TABLE #Target
(
Point GEOGRAPHY
);  
DECLARE @PointBufferDistanceInMeters FLOAT;
SET @PointBufferDistanceInMeters = 3;
INSERT #Source SELECT GEOGRAPHY::STPointFromText(N'POINT(102.0 0.5)', 4326); 
INSERT #Source SELECT GEOGRAPHY::STPointFromText(N'POINT(102.0 0.5)', 4326); 
INSERT #Source SELECT GEOGRAPHY::STPointFromText(N'POINT(102.0 0.50009)', 4326); -- 10 meter-ish away
SELECT * FROM #Source
INSERT INTO #Target
SELECT 
GEOGRAPHY::STPointFromText(Wkt, 4326) 
FROM 
(
SELECT DISTINCT Point.STAsText() AS Wkt
FROM    #Source AS S
WHERE   NOT EXISTS ( SELECT 42
FROM   #Target
WHERE  S.Point.STDistance(Point) < @PointBufferDistanceInMeters)
) X
SELECT Point.STAsText() FROM #Target

将"唯一"点(缓冲区为 3 米)插入到目标表 #Target 中。我对此进行了测试,它似乎工作正常。结果是预期的:

POINT (102 0.5)
POINT (102 0.50009)

只是好奇,这是否可以在效率方面得到改善,或者有人在这里看到什么问题?谢谢。

您的INSERT仅根据#Target的当前状态进行筛选。如果#Source包含一些彼此之间@PointBufferDistanceInMeters不相同的点,则它们都将入。

恐怕目前处理GEOGRAPHY数据的唯一防弹方法是通过 RBAR,与双转换Point.STAsText() AS Wkt=>GEOGRAPHY::STPointFromText(Wkt, 4326)相比,它可能并没有那么低效。

最新更新