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

ターゲット表#Targetに(3メートルの緩衝液を用いて)「ユニーク」点を挿入します。私はこれをテストし、それは正常に動作するようです。結果は期待通りです:

POINT (102 0.5) 
POINT (102 0.50009) 

これは効率の点で改善できるのですか?ありがとう。

答えて

1

INSERTは現在の状態である#Targetのみをフィルタリングしています。 #Sourceに、@PointBufferDistanceInMetersより近いいくつかの同一でない点が含まれている場合、それらはすべて挿入されます。

は、私は、ダブルコンバージョンPoint.STAsText() AS Wkt =>GEOGRAPHY::STPointFromText(Wkt, 4326)と比較することにより、すべてのことは非効率的ではないかもしれません現時点でGEOGRAPHYデータを処理するための唯一の防弾方法RBAR経由で怖いです。

+0

これについて詳しく説明し、修正を提案することはできますか? – cs0815

+0

'#Source'に別のレコードがあるとします:' INSERT #Source SELECT GEOGRAPHY :: STPointFromText(N'POINT(102.0 0.500091) '、4326); - 1メートル離れている。どのポイントは '#Tagret'にするべきですか? –

+0

私はタンクを見る。ここで役に立つかもしれないrownumberを含むタイ・ブレーカーのようなものがあります。 – cs0815

関連する問題