J'utilise actuellement ceci:
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
pour insert des points "uniques" (avec un tampon de 3 mètres) dans une table cible #Target. J'ai testé cela et cela semble fonctionner correctement. Les résultats sont attendus:
POINT (102 0.5) POINT (102 0.50009)
Juste curieux, cela peut-il être amélioré en termes d'efficacité ou est-ce que quelqu'un voit quelque chose qui cloche ici? Merci.
Votre INSERT
filter sur l'état actuel de #Target
uniquement. Si #Source
contient des points non identiques plus proches que @PointBufferDistanceInMeters
un de l'autre, ils seront tous insérés.
Je crains que la seule méthode pare-balles pour gérer datatables GEOGRAPHY
à l'heure actuelle soit RBAR qui pourrait ne pas être aussi inefficace que la double conversion Point.STAsText() AS Wkt
=> GEOGRAPHY::STPointFromText(Wkt, 4326)
.