2015-08-17 2 views
0

Je sais qu'avec SELECT @source.STDistance(@target) je peux dériver la distance entre deux objets spatiaux, et plus complexe avec quelque chose comme ceci, où je peux conclure le plus proche voisin dans un déclencheur et obtenir des valeurs du plus proche voisin. Je crains d'avoir trop compliqué cela au point où je ne peux pas comprendre quelque chose d'aussi simple que d'obtenir non seulement le "nom" du plus proche voisin, mais à quelle distance il est? Comment extraire cette distance dans le cadre de cela et écrire cette valeur avec le nom?Mise en œuvre élémentaire de SQL STDistance?

ALTER TRIGGER [dbo].[IMPORT_RAW_WILD_BEAR_GPS_COLLAR] 
ON [dbo].[WILD_BEAR_GPS_COLLAR] 
after INSERT,UPDATE NOT FOR REPLICATION 
AS 
BEGIN 
    SET NOCOUNT ON; 
    UPDATE p SET 
     SHAPE = CASE WHEN i.SHAPE IS NOT NULL 
     THEN p.SHAPE ELSE Geography::STPointFromText('POINT(' 
      + CAST(p.LON AS VARCHAR(20)) + ' ' 
      + CAST(p.LAT AS VARCHAR(20)) + ')', 4269) END, 
     LON = CASE WHEN p.SHAPE IS NULL THEN p.LON ELSE p.SHAPE.Long END, 
     LAT = CASE WHEN p.SHAPE IS NULL THEN p.LAT ELSE p.SHAPE.Lat END, 
    QuadName = COALESCE(b.name, p.QuadName), 
    Watershed = COALESCE(c.HUC_12_Name, p.Watershed), 
    County = COALESCE(d.Name, p.County), 
    State= COALESCE(e.Name, p.State), 
    NEAR_ROAD = COALESCE(k.FULLNAME, p.NEAR_ROAD), 
    NEAR_TRAIL = COALESCE(j.NAME, p.NEAR_TRAIL), 
       UNITCODE = 'WILD', 
       RESTRICTION = 'UNR', 
       UNITNAME = 'WILD', 
       DATUM = 'NAD83', 
       COORD_SYSTEM = 'GCS', 
       COORD_UNITS = 'dd', 
       UTM_ZONE = '17', 
       NEAR_STREAM = COALESCE(g.GNIS_Name, p.NEAR_STREAM) 
       ELEVATION = (SELECT pdata.getValueByLoc(1,p.SHAPE.Long,p.SHAPE.Lat) FROM [dbo].[DEM10MP]) 
    FROM WILD_BEAR_GPS_COLLAR 
    AS p 

    INNER JOIN 
    inserted AS i 
    ON i.OBJECTID = p.OBJECTID 
    LEFT OUTER JOIN USGS_24K_TOPOMAP_BOUNDARIES AS b 
    ON b.Shape.STIntersects(i.Shape) = 1 
    LEFT OUTER JOIN WATERSHEDS AS c 
    ON c.Shape.STIntersects(i.Shape) = 1 
    LEFT OUTER JOIN WILD_COUNTIES AS d 
    ON d.Shape.STIntersects(i.Shape) = 1 
    LEFT OUTER JOIN WILD_States AS e 
    ON e.Shape.STIntersects(i.Shape) = 1 

CROSS APPLY (SELECT TOP 1 GNIS_Name, shape     
FROM dbo.NHDFLOWLINE WITH(index ([NHD_idx]))     
WHERE NHDFLOWLINE.Shape.STDistance(i.Shape) IS NOT NULL 
ORDER BY NHDFLOWLINE.Shape.STDistance(i.Shape) ASC) as g 
CROSS APPLY (SELECT TOP 1 RiverOrder, shape     
FROM dbo.NHDFLOWLINE WITH(index ([NHD_idx]))     
WHERE NHDFLOWLINE.Shape.STDistance(i.Shape) IS NOT NULL 
ORDER BY NHDFLOWLINE.Shape.STDistance(i.Shape) ASC) as h 
CROSS APPLY (SELECT TOP 1 FULLNAME, shape      
FROM dbo.WILD_ROADS 
/****** force spatial index hint ******/ 
WITH(index ([WILD_ROADS_idx]))     
WHERE WILD_ROADS.Shape.STDistance(i.Shape) IS NOT NULL 
ORDER BY WILD_ROADS.Shape.STDistance(i.Shape) ASC) as k 
CROSS APPLY (SELECT TOP 1 NAME, shape 
FROM dbo.WILD_TRAILS 
/****** force spatial index hint ******/ 
WITH(index ([WILD_TRAILS_idx]))     
WHERE WILD_TRAILS.Shape.STDistance(i.Shape) IS NOT NULL 
ORDER BY WILD_TRAILS.Shape.STDistance(i.Shape) ASC) as j 

END; 
+0

Votre question isnt claire. Vous dites déjà savoir 'SELECT @ source.STDistance (@target)' –

Répondre

0

Réponse déterré d'un old post Je me souviens en essayant de résoudre un autre problème le plus proche voisin:

update s 
set 
[NEAR_TRAIL] = fname, 
[DIST_TRAIL] = Shape.STDistance(fshape) 
from(
Select 
[dbo].[GRSM_BEAR_GPS_COLLAR].*, 
fnc.Name as fname, 
fnc.Shape as fShape 
from 
[dbo].[GRSM_BEAR_GPS_COLLAR] 
CROSS APPLY (SELECT TOP 1 Name, shape     
FROM [dbo].[GRSM_TRAILS] WITH(index ([GRSM_TRAILS_idx]))     
WHERE [GRSM_TRAILS].Shape.STDistance([dbo].[GRSM_BEAR_GPS_COLLAR].Shape) IS NOT NULL 
        ORDER BY GRSM_Trails.Shape.STDistance([dbo].[GRSM_BEAR_GPS_COLLAR].Shape) ASC) fnc)s; 
0

Query Spatial Data for Nearest Neighbor

USE AdventureWorks2012 
GO 
DECLARE @g geography = 'POINT(-121.626 47.8315)'; 
SELECT TOP(7) SpatialLocation.ToString(), City, SpatialLocation.STDistance(@g) 
FROM Person.Address 
WHERE SpatialLocation.STDistance(@g) IS NOT NULL 
ORDER BY SpatialLocation.STDistance(@g); 
+0

La question est de savoir comment l'implémenter dans un déclencheur comme celui posté, et répétez la recherche de (n) objets. Je suis assez au courant de l'exemple fourni par Microsoft. – tpcolson

+0

Vous devez être précis. Quelle partie avez-vous un problème? Qu'avez-vous fait? Montrez-nous des exemples de données, montrez-nous votre travail. Quel est le problème avec la requête que vous avez déjà? Quelle est la sortie de votre désir? Que signifie répéter (n)? Connaissez-vous des déclencheurs? ou votre problème est de changer les données avant d'enregistrer ou de chercher le voisin? –