2016-06-27 42 views
1

我目前使用这样的:插入唯一百分点缓冲

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) 

只是好奇,这可以提高效率方面或没有人看到任何不妥之处吗?谢谢。

回答

1

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

恐怕唯一的防弹方式此刻处理GEOGRAPHY数据通过RBAR这可能不是所有的低效通过比较双转换Point.STAsText() AS Wkt =>GEOGRAPHY::STPointFromText(Wkt, 4326)

+0

你可以请详细说明这一点,并可能建议修复? – cs0815

+0

假设你在'#Source'中有另一条记录:'INSERT #Source SELECT GEOGRAPHY :: STPointFromText(N'POINT(102.0 0.500091)',4326); - 1米远[']。哪个点应该到达#Tagret? –

+0

我看到 - tahnks。猜猜某些涉及rownumber的决胜盘在这里会很有用。 – cs0815