用缓冲区插入唯一的点

时间:2016-06-27 11:31:29

标签: sql-server tsql sql-server-2014

我目前正在使用这个:

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

插入&#39; unique&#39;将点(缓冲区为3米)放入目标表#Target中。我测试了它,似乎工作正常。结果是预期的:

POINT (102 0.5)
POINT (102 0.50009)

只是好奇,这可以在效率方面得到改善,还是有人在这里看到任何不妥之处?感谢。

1 个答案:

答案 0 :(得分:1)

您的INSERT仅过滤当前状态#Target。如果#Source包含一些不同于@PointBufferDistanceInMeters的非相同点,则会插入它们。

我担心目前处理GEOGRAPHY数据的唯一防弹方法是通过RBAR,与双转换Point.STAsText() AS Wkt =&gt;相比,这可能不是那么低效。 GEOGRAPHY::STPointFromText(Wkt, 4326)