В настоящее время я использую это:вставки уникальных точек с буфером
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)
Любопытно, может ли это быть улучшено с точки зрения эффективности или кто-нибудь видит что-то здесь не так? Благодарю.
Не могли бы вы рассказать об этом и, возможно, предложить исправить? – cs0815
Предположим, что у вас есть еще одна запись в '# Source':' INSERT #Source SELECT GEOGRAPHY :: STPointFromText (N'POINT (102.0 0.500091) ', 4326); - на расстоянии 1 метра ». Какой пункт (ы) должен сделать это в '# Tagret'? –
Я вижу - танки. Угадайте, какой-то галстук-брелок с рулонами будет полезен здесь. – cs0815