2015-08-17 6 views
0

Я знаю, что с SELECT @source.STDistance(@target) Я могу получить расстояние между двумя пространственными объектами и более сложным с чем-то вроде этого, где я могу обернуть ближайший сосед в триггере и получить значения от ближайшего соседа. Боюсь, что я, возможно, слишком усложнил это до такой степени, что не могу понять что-то столь же простое, как получить не только «имя» ближайшего соседа, но и как далеко оно? Как мне извлечь это расстояние как часть этого и написать эту ценность вместе с именем?Элементарная реализация 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

Ваш вопрос разве ясный. Вы говорите, что уже знаете 'SELECT @ source.STDistance (@target)' –

ответ

0

Ответ выкопали из old post я помню, когда пытается решить еще одну проблему ближайшего соседа:

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

Вопрос в том, как реализовать его в триггере, как опубликованный, и повторить поиск объектов (n). Я отлично знаю пример, предоставленный Microsoft. – tpcolson

+0

Вы должны быть конкретными. Какая у вас проблема? Что вы наделали? Покажите нам образцы данных, покажите нам свою работу. Что не так с запросом, который у вас уже есть? Каково ваше желание? Что означает повторение (n)? Вы знаете триггеры? или ваша проблема заключается в изменении данных перед сохранением или поиском соседа? –

 Смежные вопросы

  • Нет связанных вопросов^_^