Найдите сегменты, лежащие внутри другого, используя точки географии SQL Сервер - PullRequest
0 голосов
/ 04 августа 2020

Позвольте мне пояснить прилагаемое изображение. Желтая линия, обозначенная как «Планирование строительства», обозначенная идентификатором планирования, и все другие цвета, обозначенные как «Строительный сегмент», обозначенные идентификатором сегмента . Я пытаюсь использовать функцию STDistance точек географии, чтобы найти SegmentId=12689 и SegmentId=12687, передавая PlanningID=25801. Моя программа должна возвращать значения 12689 и 12687, поскольку эти два целиком l ie в пределах PlanningID=25801. Однако следует исключить значение SegmentId=12688, поскольку этот сегмент не ie полностью или большая часть сегмента не входит в план строительства. Я создал следующий скрипт на SQL сервере

declare    @Planningid INT
declare    @agencyID int
set @Planningid=25801
set @agencyID=79
DECLARE @finalresult int
DECLARE @result TABLE (id INT, starting sys.geography, ending sys.geography,
                          chachedroute sys.geography)
DECLARE @tablevar TABLE(id INT)
insert into @result select id,
starting,Ending,CachedRoute from Route R where AgencyId=@agencyID and LayerId=1 
                  and CachedRoute.STDistance((select CachedRoute from route 
                                               where id=@Planningid))<0.5
select * from @result
/* the above part of the code is working fine as it should */

/* the next part of the logic is not working and it is excluding all the Segment Id when it 
                                should not and should only exclude SegmentId=12688 */
insert into @tablevar
select id from @result where 
            chachedroute.STDistance((select starting from route where id=@Planningid))<700 
            and 
            chachedroute.STDistance((select ending from route where id=@Planningid))<700
intersect
select id from @result

select * from @tablevar

Думаю, проблема в and logi c во второй части кода, где он вычисляет, находятся ли значения в пределах 700 метров. Этот код был впервые создан с концепцией, что каждый PlanningId должен иметь только один SegmentID, поэтому я закодировал его, сопоставляя как начало, так и конец сегментов. Но теперь модификация состоит в том, что один PlanningId может иметь несколько SegmentID, в чем, я думаю, и заключается проблема. Любая помощь по изменению кода будет очень признательна. Таблица Route содержит следующие атрибуты:

  1. ID (int)
  2. Начало (Географические точки)
  3. Концовка (Географические точки)
  4. Кэшированный маршрут (географическая точка)
  5. LayerId (int)
  6. AgencyId (int)

Значение LayerId=1 относится к Construction Segment и LayerId=4 относится к Construction Planning

1 Ответ

0 голосов
/ 12 августа 2020

Я изменил указанную выше функцию следующим образом, чтобы она работала:

CREATE FUNCTION [dbo].[GetSegmentId]
(   
    @Planningid INT,
    @agencyID int
)

RETURNS @tablevar TABLE 
(
    id INT
)

AS

BEGIN
        declare    @CachedRoute geography
        DECLARE @finalresult int
        DECLARE @result TABLE (id INT, starting sys.geography, ending sys.geography,chachedroute sys.geography)
        

        set @CachedRoute = (select CachedRoute from route where id = @Planningid)

        insert into @result select id,
        starting,Ending,CachedRoute from Route R where AgencyId=@agencyID and LayerId=1 and CachedRoute.STDistance(@CachedRoute)<0.5 

        insert into @tablevar
        select id from @result where @CachedRoute.STDistance(starting)<700 and @CachedRoute.STDistance(ending)<700
        intersect
        select id from @result


    RETURN;
END;
...