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

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


person John Mills    schedule 17.01.2017    source источник
comment
Вы имеете в виду строку из разных точек, а затем используете STLength?   -  person ZLK    schedule 18.01.2017
comment
Не встроен в SQL Server, поскольку SQL Server не поставляется с атласом дорог мира.   -  person Dai    schedule 18.01.2017
comment
@Dai Даже со всеми правильными данными о многоугольниках / точках я не вижу, чтобы SQL Server вообще мог делать это очень хорошо. Оставьте это специальному картографическому приложению.   -  person iamdave    schedule 18.01.2017
comment
Это лучше подходит для такого продукта, как ArcGIS Server?   -  person John Mills    schedule 18.01.2017
comment
Посмотрите этот ответ, хотя он для postgis. Я думаю, что большинство упомянутых функций также доступны на сервере sql: stackoverflow.com/questions/23385649/   -  person sovemp    schedule 18.01.2017


Ответы (1)


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

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

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

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

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

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

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);
person user918967    schedule 08.02.2017