• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

gpsgis

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

[转]关于建立公交线路的网络拓扑关系(Delphi+MapX代码)

建立网络拓扑关系分三个步骤:
1、数据库的建立,建立公交线路和公交站点的对应数据库
2、在地图上标注出公交线路和公交站点,尽量的精准
3、通过遍历数据库的公交线路及地图,建立其拓扑关系
比如(A->B->C->D)在数据库表示其拓扑关系为:
From     To    Dist        Line(起点 终点 距离 连接路线条数)
A            B    14.00      1
B            C    20.56      1  
C            D    9.00        1

代码:
procedure TfrmMain.Button1Click(Sender: TObject); 
    frmProgress := TfrmProgress.Create(Self); 
    frmProgress.Show; 
    frmProgress.Update; 
    frmProgress.pbPubTra.Position := 0; 

    InitPublicTraffic(); 

    frmProgress.pbPubTra.Position := 100; 
    frmProgress.Free; 
    ShowMessage('公交线路的网络拓扑关系创建完成!');
emd;

procedure TfrmMain.InitPublicTraffic;
var
str: String;
fld: TFiled;
i,nBus: Integer;
nFromStop,nToStop: Integer;
nStop1,nStop2: Integer;
nOffset: Integer;
lyr: CMapXLayer;
dDist: Double;
ftA,ftB:CMapXFindFeature;
ds: CMapXDataset;

begin
    //lyr.Selection.
    if not adoConn.Connected then Exit;
    
    str := 'select * from 公交线路 order by MAPINFO_ID';
    adoQueryBus.Connection := adoConn; 
    adoQueryStop.Connection := adoConn; 
    adoTableArc.Connection := adoConn; 
    adoTableArc.TableName := 'NetArcList'; 
    adoTableArc.Open; 
    adoQueryBus.SQL.Clear; 
    adoQueryBus.SQL.Add(str); 
    adoQueryBus.Open; 


    adoQueryBus.First; 
    nOffset := 100 div adoQueryBus.RecordCount; 

    lyr := mapPT.Layers._Item('公交站点'); 
    ds := mapPT.Datasets.Add(miDataSetLayer, lyr ,EmptyParam, EmptyParam, EmptyParam, EmptyParam,EmptyParam, EmptyParam); 
    lyr.Find.FindDataset := ds; 
    lyr.Find.FindField := ds.Fields.Item[1]; 

    while not adoQueryBus.Eof do 
        begin 
            fld := adoQueryBus.Fields.FindField('MAPINFO_ID'); 
            nBus := fld.AsInteger; 
            if nBus = 0 then continue; 

            str := Format('StopID%d',[1]); 
            fld := adoQueryBus.Fields.FindField(str); 
            nFromStop := fld.AsInteger; 
            if nFromStop = 0 then continue; 

            for i := 2 to 32 do 
                begin 
                    str := Format('StopID%d',[i]); 
                    fld := adoQueryBus.Fields.FindField(str); 
                    nToStop := fld.AsInteger; 
                    if fld.AsInteger = 0 then break; 

                    str := Format('select MAPINFO_ID from 公交站点 where CODE=%d',[nFromStop]); 
                    adoQueryStop.Close; 
                    adoQueryStop.Active := False; 
                    adoQueryStop.SQL.Clear; 
                    adoQueryStop.SQL.Add(str); 
                    adoQueryStop.Open; 

                    nStop1 := adoQueryStop.Fields[0].AsInteger; 
                    str := Format('%d',[nStop1]); 
                    ftA := lyr.Find.Search(str, EmptyParam); 

                    str := Format('select MAPINFO_ID from 公交站点 where CODE=%d',[nToStop]); 
                    adoQueryStop.Close; 
                    adoQueryStop.Active := False; 
                    adoQueryStop.SQL.Clear; 
                    adoQueryStop.SQL.Add(str); 
                    adoQueryStop.Open; 

                    nStop2 := adoQueryStop.Fields[0].AsInteger; 
                    str := Format('%d',[nStop2]); 
                    ftB := lyr.Find.Search(str, EmptyParam); 

                    dDist := mapPT.Distance(ftA.CenterX, ftA.CenterY, ftB.CenterX, ftB.CenterY); 

                    adoTableArc.Recordset.AddNew(EmptyParam,EmptyParam); 
                    adoTablearc.Recordset.Fields.Item[1].Value := nStop1; //nFromStop - 10000; 
                    adoTablearc.Recordset.Fields.Item[2].Value := nStop2; //nToStop - 10000; 
                    adoTablearc.Recordset.Fields.Item[3].Value := nBus; 
                    adoTablearc.Recordset.Fields.Item[4].Value := dDist; 

                    nFromStop := nToStop; 

                    { str := Format('insert into NetArcList(FromStop,ToStop,LineID) values(%d,%d,%d)', 
                                [nFromStop, nToStop, nBus]); 
                    adoQueryStop.SQL.Clear; 
                    adoQueryStop.SQL.Add(str); 
                    adoQueryStop.Open; 
                    } 
                end;

                frmProgress.pbPubTra.Position := frmProgress.pbPubTra.Position + nOffset; 
                adoQueryBus.Next; 
            end; 

        adoQueryBus.Close; 
        adoQueryStop.Close; 
        adoTableArc.Close; 
        frmProgress.pbPubTra.Position := 5; 
    end;




posted on 2005-12-09 11:48  handsomet  阅读(956)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3