Wir haben Bushaltestellendaten und möchten eine Anwendung erstellen, die die Leitung / Mehrfachleitung für eine bestimmte Startstation und die Endstation bereitstellt.
Zum Beispiel versucht der Benutzer, einen Buslinienvorschlag von Station1 zu Station2 zu erhalten.
Wenn es eine Buslinie gibt, die beide station1
und abdecken kann station2
, sollte diese Linie zurückgegeben werden. Das Ergebnis könnte folgendermaßen aussehen:
Step1: station1 -- station2
Wenn es keine direkte Buslinie zwischen Station1 und Station2 gibt, sollte die Anwendung versuchen, den Austauschplan zu finden. Das Ergebnis kann beispielsweise folgendermaßen aussehen:
Step1: station1 -- exchangestation
Step2: exchangestation -- station2
Jetzt haben wir die Daten, aber wir wissen nicht, wie man das Datenmodell in der Datenbank entwirft, wie man das Schema erstellt, um die Abfrage effizient zu gestalten?
==============================================
Aktualisieren:
Zum Beispiel habe ich vier Buslinien (eigentlich zwei) mit jeweils unterschiedlicher Farbe:
l1: A-B-C-D
l2: D-B-A (in fact, the l2 is the reverse of l1 except the l2 will skip station `C`.
l3: E-B-D-F
l4: F-D-B-E(reverse of l3)
Wenn wir diese Informationen in der Datenbank speichern möchten, um den Buslinienplan für eine Station zu einer anderen abzufragen, wie viele Tabellen benötigen wir dann und was sollte in jede Tabelle eingefügt werden?
Antworten:
Ich denke, Sie müssen eine weitere Tabelle erstellen, in der alle Routen als Kombinationen anderer Routen definiert sind. Anschließend fragen Sie diese Tabelle ab und verbinden sich mit den tatsächlichen Routen, um die Geometrie zu erhalten.
Wenn die Abfrage "von Station" zu "zu Station" lautet und jeder Abschnitt ein "von Station zu Station" und "zu Station" enthält. Wenn Sie jedoch Routen einschließen möchten, die mehrere Abschnitte umfassen, können Sie eine andere Tabelle "Routen" verwenden, die Folgendes enthält:
Sie benötigen auch Ihre Originalabschnitts-Tabelle, etwa:
und ich denke, dass Sie eine andere Join-Tabelle benötigen wie:
In dieser Tabelle wird die Eins-zu-Viele-Beziehung zwischen den Routen- und Abschnittstabellen gespeichert. In Ihrem obigen Beispiel haben Sie also zwei Zeilen in der Verknüpfungstabelle, eine für jeden Schritt. Die Abfrage erfolgt in der Routentabelle für von und zu Stationen. Wenn räumliche Daten zurückgegeben werden, handelt es sich um Details aus der Routentabelle und räumliche Daten aus der Abschnittstabelle. Vielleicht addieren Sie die Zeiten aus jedem Abschnitt oder was auch immer.
Ist das sinnvoll?
quelle
Sie sollten wahrscheinlich ein Werkzeug dafür auswählen und dem Schema folgen, das das Werkzeug erzwingt (zum Beispiel pgRouting ).
Wenn Sie es ohne Tabelle tun möchten, benötigen Sie nur zwei Tabellen, um die Scheitelpunkte und die Knoten wirklich zu speichern.
Der Trick ist, dass Ihr Bild einen räumlichen Ansatz zeigt, während Sie tatsächlich einen zeitlichen benötigen (Bild steht noch aus). Der Bus fährt nicht von Knoten A zu Knoten B. Der Bus fährt von Knoten A @ 12: 00 zu Knoten B @ 12: 10 .
Also erstellen wir einen Knoten für jede Station + einen Knoten für jede Abfahrtszeit von jeder Station. Jeder Knoten hat 3 Einwegverbindungen:
Um nun die Verbindung von Punkt A zu Punkt C zu finden, wählen wir den frühesten passenden Punkt an Station A und finden unseren Weg von dort zum Basisknoten für Station C.
Knoten:
Eckpunkte
quelle
Hier ist ein funktionierendes Beispiel mit Hilfe von JavaScript und Daten von OpenStreetMap. Das Datenmodell kann nützlich sein.
quelle