Поддерживает ли SQL Server измерение расстояния с помощью маршрутов?


Я экспериментировал с пространственными функциями SQL Server и увидел, что метод STDistance позволяет определить расстояние между двумя геометриями. Существует ли какой-либо функционал, позволяющий измерять расстояние между двумя точками по дорогам, например Google Maps?

1 5

1 ответ:

Да, можешь... Будьте осторожны, так как это требует некоторой работы (которая, конечно, "бесплатна" для вас в таких ГИС, как ArcGIS или postGIS).

В основном подумайте о том, что когда вы измеряете расстояние между двумя точками вдоль ряда дорог (в отличие от прямого евклидова расстояния), вы фактически пересекаете сетку графа.

Так что вам нужно

  1. нагрузка на ваши дороги (ребра графика)
  2. нагрузка в пересечениях (узлах графа)
  3. нагрузка в точках A и Z
  4. Затем используйте оптимальный алгоритм маршрутизации между A и Z, идущий по краям, но через узлы.

Здесь есть подробный пост, объясняющий это: дороги в SQL Server 2008, но вам нужно подключить алгоритм маршрутизации отсюда Djkstra в SQL.

Код для создания дорожной сети с веб-сайта Alastaira (выше) дублируется на случай, если он когда-нибудь исчезнет.

DECLARE @Roads TABLE (
 RoadId int,
 RoadName varchar(32)
);

INSERT INTO @Roads VALUES
(1, 'Britannia Road'),
(2, 'Belsize Road'),
(3, 'Vincent Road'),
(4, 'Plumstead Road');

DECLARE @RoadSegments TABLE (
 SegmentId int,
 RoadId int,
 SegmentGeometry geography
);

INSERT INTO @RoadSegments VALUES
(1, 1, 'LINESTRING(1.313772 52.636871, 1.315038 52.635229)'),
(2, 1, 'LINESTRING(1.315038 52.635229,1.316052 52.63399,1.316401 52.633518)'),
(3, 1, 'LINESTRING(1.316401 52.633518,1.316497 52.632869,1.316642 52.632542)'),
(4, 2, 'LINESTRING(1.317538 52.632697,1.317307 52.633448,1.317098 52.633749)'),
(5, 3, 'LINESTRING(1.31734 52.633818,1.315982 52.635498,1.315038 52.635229)'),
(6, 4, 'LINESTRING(1.314546 52.633479,1.31529 52.633298,1.315902 52.633363,1.316401 52.633518)'),
(7, 4, 'LINESTRING(1.316401 52.633518,1.317097 52.633749)'),
(8, 4, 'LINESTRING(1.317098 52.633749,1.31734 52.633818)'),
(9, 4, 'LINESTRING(1.31734 52.633818,1.318332 52.634119)');

DECLARE @RoadIntersections TABLE (
 IntersectionId varchar(32),
 IntersectionLocation geography
);

INSERT INTO @RoadIntersections VALUES
('A', 'POINT(1.315038 52.635229)'),
('B', 'POINT(1.316401 52.633518)'),
('C', 'POINT(1.317097 52.633749)'),
('D', 'POINT(1.31734 52.633818)');

DECLARE @RoadIntersection_Segments TABLE (
 IntersectionId varchar(32),
 SegmentId int
);

INSERT INTO @RoadIntersection_Segments VALUES
('A',1),
('A',2),
('A',5),
('B',2),
('B',6),
('B',3),
('B',7),
('C',7),
('C',4),
('C',8),
('D',5),
('D',8),
('D',9);