2017-01-17 17 views
5

私はSQL Server空間関数を試していて、STDistanceメソッドで2つのジオメトリ間の距離を判断できることが分かりました。 Googleマップなど、道路経由で2つのポイント間の距離を測定できる機能はありますか?SQL Serverはルート経由の距離測定をサポートしていますか?

+0

異なる点の線ストリングのような意味ですか、「STLength」を使用していますか? – ZLK

+3

SQL Serverにはワールドロードアトラスが付属していないため、SQL Serverには組み込まれていません。 – Dai

+1

@Daiすべての正しいポリゴン/ポイントデータがあっても、SQL Serverはこれを非常にうまく実行できません。それを専用のマッピングアプリケーションに任せてください。 – iamdave

答えて

1

はい可能です...(ArcGISやpostGISなどのGISであなたに「無料」です)いくつかの作業が必要なので、あらかじめご了承ください。

実際にネットワークを横断している一連の道路沿いの2つの地点間の距離(直接的なユークリッド距離とは対照的に)を基本的に考えるときgraph

ですから、次に最適なルーティングを使用する点AとZ

  • に交差点(グラフノード)
  • 負荷に

    1. あなたの道路における負荷(グラフエッジ)
    2. ロードする必要がありますAとZの間のエッジに沿ってノードを通過するアルゴリズム。

    Roads in SQL Server 2008ここでは、Djkstra in 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);