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;
Votre question isnt claire. Vous dites déjà savoir 'SELECT @ source.STDistance (@target)' –