2016-06-27 5 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

Я вижу - танки. Угадайте, какой-то галстук-брелок с рулонами будет полезен здесь. – cs0815

Смежные вопросы