geometrisch/geographische Zuordnungssuche
Verfasst: Montag 30. Dezember 2013, 18:59
Das ganze ist ein Teilproblem, dass ich in python lösen muss, da der entsprechende Code (temporär) in ein Softwaresystem integriert werden muss, dass nur eine python- Schnittstelle hat.
Ich hoffe, ich kann es einigermaßen herüberbringen.
Gegeben ist eine Liste von Koordinaten, die (durch ihre Reihenfolge) eine Linie abbildet. Diese Linie bildet typischerweise eine Straßenachse zu einem bestimmten Zeitpunkt. (Fragliche Achse)
Der gegenwärtige Verlauf der Straße liegt typischerweise "in der Nähe", könnte aber natürlich auch durch komplett andere Stützstellen repräsentiert werden. Dabei ist es so, dass die Straße in einzelne Elemente zerfallen kann (Abschnitte und Äste genannt), die teilweise auch dicht nebeneinander her verlaufen können. (Ist- Achse, bzw. Ist- Achsen) Entlang dieser Achse kann die Position als sogenannte Station als Entfernung entlang der Achse vom Anfang aus ermittelt werden.
Ein Web- Service sagt mir zu einem beliebigen Punkt, von welchen Ist- Achsen der geographische Punkt wie weit entfernt ist und welche Station der korrespondierende Punkt auf dieser Achse hätte.
Eine jede Abfrage dauert ca. 1 s, die Gesamtdatenmenge besteht aus ca. 20 000 Achsen mit 20-500 Einzelpunkten, eine solche Abfrage für JEDEN Einzelpunkt durchzuführen, würde mehrere Tage dauern und ist im Moment nicht möglich, der Webservice ist als gegeben zu betrachten.
Jetzt wird es in der Berschreibung richtig kompliziert:
Gesucht ist die "richtige" Zuordnung potentiell mehrerer Ist- Achsen zu einer fraglichen Achse, wobei jedes Teilstück der fraglichen Achse nur zu einer Ist- Achse gehören darf.
Die Definition "richtig" ist hierbei nicht trivial. Der aktuelle Ansatz sieht vor, auf jeder fraglichen Achse "Stützstellen" zu berechnen, die dann eine Menge von potentiellen Kandidaten für Ist- Achsen liefern.
Die Stützstellen werden einmal alle X m gewählt (initial) und dann sollen (rekursiv) soviele Zwischenpunkte "abgefragt" werden, bis das je 2 benachbarte Stützstellen mindestens eine gemeinsame Ist- Achse haben oder die Punkte direkt nebeneinander liegen (worst case).
Ist dieser Zustand erreicht, dann werden die geeignetste Ist- Achsen gewählt, indem
1. die potentiellen Gesamtlängen der einzelnen möglichen Ist- Achsen (wenn also 2 benachbarte Punkte über die gleiche Achse verbunden sind) ermittelt werden
2. die größte Länge (mit dem kleinsten Abstand zur Ist- Achse) ausgewählt wird
3. die Achsenteile, die dadurch beschrieben werden können, entsprechend markiert werden
Diese 3 Schritte werden weiter durchgeführt, wobei in Schritt 1 nur noch die Teilbereiche ausgewertet werden, die noch nicht "versorgt" worden sind
Auch das Abbruchkriterium ist nicht ganz trivial, da es ja durchaus sein kann, dass teile der fraglichen Achse soweit von allen Ist- Achsen wegführen, dass sie de facto NICHT auf einer Ist- Achse verlaufen.
Sie könnten sogar auf einer völlig anderen Ist- Achse verlaufen, die sie quasi strückweise kreuzen.
Am Ende soll dann etwas rauskommen a la
Fragliche Achse 1)
P1 - P20: IstAchse: 12345, Stationen: 100-1700, symbolischer Abstand: 2m
P20 - P30: IstAchse: 23456, Stationen: 0-200, symbolischer Abstand: 3m
P30 - P40: keine Achse
P40 - P42: IstAchse: 98765, Stationen: 500-510, symbolischer Abstand: 3m
P42 - P80: keine Achse
P80 - P100: IstAchse: 23456, Stationen: 700-1200, symbolischer Abstand: 4m
wobei es immer noch sein kann, dass P40-P42 quasi ein Artefakt darstellt, das muss ich an anderer Stelle prüfen, letztlich über einen Datenbankabgleich.
Das ganze ist immer noch deutlich simplifiziert, denn es ist natürlich auch denkbar, dass man iterativ den Suchradius für Punkte erweitert, wenn man erst mal eine gut passende Ist- Achse gefunden hat und dann lediglich die Punkte als "weit weg" klassifiziert. Ebenso könnte man den geographischen Abstand der Punkte in Beziehung setzen zu der Differenz der ermittelten Stationen. Derartige Erweiterungen können in Zukunft nötig und sinnvoll sein, können aber keinesfalls schon jetzt eingearbeitet werden.
Der von mir bislang erzeugte Code geht in etwa so vor. Es gibt Objektklassen für GeoLinien, GeoPunkte und PunktZuordnungen. Ebenso gibt es diverse Hilfsklassen, die bemüht werden, um die Längenermittlung zu kapseln. Natürlich ist einiges, was ich hier "einfach" beschrieben habe, komplizierter implementiert und teilweise auch umgekehrt.
Was mich interessieren würde, wäre, wie ihr das ganze angehen würdet.
Wer sich die Mühe gemacht hat, bis hierher zu lesen: Herzlichen Dank
Ich hoffe, ich kann es einigermaßen herüberbringen.
Gegeben ist eine Liste von Koordinaten, die (durch ihre Reihenfolge) eine Linie abbildet. Diese Linie bildet typischerweise eine Straßenachse zu einem bestimmten Zeitpunkt. (Fragliche Achse)
Der gegenwärtige Verlauf der Straße liegt typischerweise "in der Nähe", könnte aber natürlich auch durch komplett andere Stützstellen repräsentiert werden. Dabei ist es so, dass die Straße in einzelne Elemente zerfallen kann (Abschnitte und Äste genannt), die teilweise auch dicht nebeneinander her verlaufen können. (Ist- Achse, bzw. Ist- Achsen) Entlang dieser Achse kann die Position als sogenannte Station als Entfernung entlang der Achse vom Anfang aus ermittelt werden.
Ein Web- Service sagt mir zu einem beliebigen Punkt, von welchen Ist- Achsen der geographische Punkt wie weit entfernt ist und welche Station der korrespondierende Punkt auf dieser Achse hätte.
Eine jede Abfrage dauert ca. 1 s, die Gesamtdatenmenge besteht aus ca. 20 000 Achsen mit 20-500 Einzelpunkten, eine solche Abfrage für JEDEN Einzelpunkt durchzuführen, würde mehrere Tage dauern und ist im Moment nicht möglich, der Webservice ist als gegeben zu betrachten.
Jetzt wird es in der Berschreibung richtig kompliziert:
Gesucht ist die "richtige" Zuordnung potentiell mehrerer Ist- Achsen zu einer fraglichen Achse, wobei jedes Teilstück der fraglichen Achse nur zu einer Ist- Achse gehören darf.
Die Definition "richtig" ist hierbei nicht trivial. Der aktuelle Ansatz sieht vor, auf jeder fraglichen Achse "Stützstellen" zu berechnen, die dann eine Menge von potentiellen Kandidaten für Ist- Achsen liefern.
Die Stützstellen werden einmal alle X m gewählt (initial) und dann sollen (rekursiv) soviele Zwischenpunkte "abgefragt" werden, bis das je 2 benachbarte Stützstellen mindestens eine gemeinsame Ist- Achse haben oder die Punkte direkt nebeneinander liegen (worst case).
Ist dieser Zustand erreicht, dann werden die geeignetste Ist- Achsen gewählt, indem
1. die potentiellen Gesamtlängen der einzelnen möglichen Ist- Achsen (wenn also 2 benachbarte Punkte über die gleiche Achse verbunden sind) ermittelt werden
2. die größte Länge (mit dem kleinsten Abstand zur Ist- Achse) ausgewählt wird
3. die Achsenteile, die dadurch beschrieben werden können, entsprechend markiert werden
Diese 3 Schritte werden weiter durchgeführt, wobei in Schritt 1 nur noch die Teilbereiche ausgewertet werden, die noch nicht "versorgt" worden sind
Auch das Abbruchkriterium ist nicht ganz trivial, da es ja durchaus sein kann, dass teile der fraglichen Achse soweit von allen Ist- Achsen wegführen, dass sie de facto NICHT auf einer Ist- Achse verlaufen.
Sie könnten sogar auf einer völlig anderen Ist- Achse verlaufen, die sie quasi strückweise kreuzen.
Am Ende soll dann etwas rauskommen a la
Fragliche Achse 1)
P1 - P20: IstAchse: 12345, Stationen: 100-1700, symbolischer Abstand: 2m
P20 - P30: IstAchse: 23456, Stationen: 0-200, symbolischer Abstand: 3m
P30 - P40: keine Achse
P40 - P42: IstAchse: 98765, Stationen: 500-510, symbolischer Abstand: 3m
P42 - P80: keine Achse
P80 - P100: IstAchse: 23456, Stationen: 700-1200, symbolischer Abstand: 4m
wobei es immer noch sein kann, dass P40-P42 quasi ein Artefakt darstellt, das muss ich an anderer Stelle prüfen, letztlich über einen Datenbankabgleich.
Das ganze ist immer noch deutlich simplifiziert, denn es ist natürlich auch denkbar, dass man iterativ den Suchradius für Punkte erweitert, wenn man erst mal eine gut passende Ist- Achse gefunden hat und dann lediglich die Punkte als "weit weg" klassifiziert. Ebenso könnte man den geographischen Abstand der Punkte in Beziehung setzen zu der Differenz der ermittelten Stationen. Derartige Erweiterungen können in Zukunft nötig und sinnvoll sein, können aber keinesfalls schon jetzt eingearbeitet werden.
Der von mir bislang erzeugte Code geht in etwa so vor. Es gibt Objektklassen für GeoLinien, GeoPunkte und PunktZuordnungen. Ebenso gibt es diverse Hilfsklassen, die bemüht werden, um die Längenermittlung zu kapseln. Natürlich ist einiges, was ich hier "einfach" beschrieben habe, komplizierter implementiert und teilweise auch umgekehrt.
Was mich interessieren würde, wäre, wie ihr das ganze angehen würdet.
Wer sich die Mühe gemacht hat, bis hierher zu lesen: Herzlichen Dank