Вычислить длину маршрута вдоль предопределенной строки-линии от начала строки-линии до точек в буферной области вокруг этой строки-линии.

До сих пор я фильтровал свои результаты, чтобы увидеть, попадают ли они в буферизованную строку. Теперь я хотел бы рассчитать длину сегмента линии вдоль линии от начала маршрута до каждой широты и долготы, перечисленных в столбцах 3 и 4.

Дистанция, которую я хочу, показана на фотографии ниже:

Объяснение расстояния

declare @TripRecordsReportWaypoints table(Column1 int, column3 decimal(25,10), Column4 decimal(25,10), InRouteBuffer bit);
insert into @TripRecordsReportWaypoints values (210,40.1445,-82.9911,1),(211,40.1444,-82.991 ,1),(212,40.1442,-82.9909,1),(213,40.1441,-82.9907,1),(214,40.144 ,-82.9906,1);

declare @Columbus106from71to23 geography;
set @Columbus106from71to23 = Geography ::STLineFromText('LINESTRING(-82.969404 40.142222,-82.972580 40.141951,-82.976319 40.141602, -82.979534 40.141376,-82.981217 40.141339,-82.983593 40.141409)',4326);

declare @Routebuffer geography;
set @Routebuffer = @Columbus106from71to23.STBuffer('20');

select Column1
      ,Column3
      ,Column4
      ,@Routebuffer.STContains(geography::Point(Column3,Column4,4326)) as InRouteBuffer
from @TripRecordsReportWaypoints
where @Routebuffer.STContains(geography::Point(Column3,Column4,4326)) = 1;

Что мне нужно сделать, чтобы рассчитать расстояние сегмента линии от начала моей определенной строки до каждой широты, долготы. Я хотел бы иметь столбец DistanceAlongRoute.


person Jon    schedule 01.06.2017    source источник


Ответы (1)


Я не совсем уверен, что происходит как с вашими данными, так и с вашими требованиями, поскольку данные в вашем вопросе на самом деле не имеют смысла, но....

Чтобы найти расстояние между двумя точками geography, вы можете использовать функцию GeogPoint.STDistance(OtherGeogPoint), которая вернет расстояние в метрах.

Чтобы найти начало geography linestring, вы можете использовать либо GeogLineString.STStartPoint(), либо GeogLineString.STPointN(PointNumberYouWantToReturn) с числом 1, которые функционально эквивалентны, хотя STPointN дает вам немного больше гибкости, если вы захотите позже изменить свои точки.

В совокупности это выглядит следующим образом:

select Column1
      ,Column3
      ,Column4
      ,geography::Point(Column3,Column4,4326).STDistance(@Routebuffer.STPointN(1)) as StartPointToPointMetres
from @TripRecordsReportWaypoints;

Следуя вашим комментариям ниже, вот еще одна функция, которая может помочь вам добраться туда, куда вам нужно:

.ShortestLineTo() найдет кратчайшую линию между одним типом geography и другим, что в вашем случае выглядит так:

@Columbus106from71to23.ShortestLineTo(geography::Point(Column3,Column4,4326)).STStartPoint() as LineFromRouteToPoint
person iamdave    schedule 01.06.2017
comment
Дэйв, я хотел бы знать, как далеко по маршруту находится та или иная точка. Есть ли простой способ вычислить это? Мне не нужно расстояние прямой линии, мне нужно расстояние от начала строки строки вдоль линии до точки в моем наборе данных. Имеет ли это больше смысла. - person Jon; 01.06.2017
comment
В этом случае вы можете настроить данные/запрос в своем вопросе, поскольку ни одна из точек ваших данных фактически не находится в буфере вашего вопроса. Во-вторых, что вы подразумеваете под как далеко по маршруту? Если точка находится в пределах буфера, вы хотите двигаться по linestring прямо к северу или югу от точки, а затем по прямой линии к ней или выбрать кратчайший маршрут от ближайшей части линии? - person iamdave; 01.06.2017
comment
Если точка находится в буфере, я хочу пройти по строке-линии, пока она не окажется в точке с кратчайшим маршрутом от ближайшей части линии. Таким образом, расстояние от начала строки строки на всем протяжении строки строки до ближайшей точки строки строки до точки, указанной в столбцах 3 и 4. - person Jon; 01.06.2017
comment
Я добавил фотографию к своему исходному сообщению, объясняющую расстояние, которое я пытаюсь рассчитать. Ваша редакция вычисляет то, что я нарисовал? - person Jon; 01.06.2017
comment
Любая идея программы или службы, которая могла бы вычислить это? - person Jon; 01.06.2017
comment
@Jon Понятия не имею о программе, хотя я, возможно, был немного поспешным заранее, прочитайте здесь: ask.sqlservercentral.com/questions/113547/ - person iamdave; 01.06.2017