[转]关于建立公交线路的网络拓扑关系(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;
浙公网安备 33010602011771号