2017-01-17 1 views
5

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

+0

Вы имеете в виду как linestring разных точек, а затем используете 'STLength'? – ZLK

+3

Не встроен в SQL Server, потому что SQL Server не поставляется с мировым атласом дорог. – Dai

+1

@ Дай Даже со всеми правильными данными о полигонах/точках я не вижу, чтобы SQL Server мог делать это очень хорошо. Оставьте его в специальном приложении сопоставления. – iamdave

ответ

1

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

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

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

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

Существует в глубокий пост здесь объясняя это: Roads in SQL Server 2008 но вам нужно подключить в алгоритме маршрутизации здесь Djkstra in 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); 
Смежные вопросы