09.09.2012, 17:11
Hallo Christian,
Aufgrund der Mail noch eine Erklärung zu meinem Ansatz.
Das Problem beim Originalalgorithmus ist bei mir, dass aufgrund der Originalkurve optimiert wird. Zoomt man hinein, so bleiben an einigen Stellen zu wenige Punkte im Anzeigebereich übrig.
Mein Ansatz ist nun, dass zuerst die Abschnitte der Kurve bestimmt werden, die wirklich im Anzeigebereich sind. Danach werden die Abschnitte einzeln optimiert. Hier macht der Cache dann probleme, da der Douglas-Peucker-Algorithmus mit verschiedenen Kurven aufgerufen wird.
Erst am Ende werden die Segmente dann zu einer Kurve kombiniert.
Der worst case für meinen Algorithmus ist die Gesamtansicht der Kurve, da hier genausoviel übrig bleibt und man sich den Segmentbestimmungsschritt hätte sparen könnte. Umso weiter man hineinzoomt, desto weniger bleibt bei mir übrig und es geht schneller.
Die Zeiten bei mir sind für die Gesamtkurve ca. 3 Sekunden. Vielleicht kann man ja beide Varianten im Code halten, die man über eine Option umschaltbar macht ? Evtl. sollte man auf meine Variante auch erst ab einem bestimmten Zoomlevel gehen.
Gruß
Thomas
(09.09.2012, 15:31)routeconverter Wrote: Der significantPositionCache cacht für einen Zoomlevel, welche Positionen der Douglas-Peucker-Algorithmus als signifikant erreichnet habt. Der Cache wird gelöscht, wenn eine Position bewegt wird oder sich ändert oder die gesamte Positionsliste sich ändert.
Ein Löschen des Caches "bezahle" ich auf meinem System mit 25 Sekunden Wartezeit für Deine Dateien mit 600000 Positionen. Wie lange dauern die Schritte unten bei Dir und auf wieviele Positionen reduziert der von Dir optimierte Algorithmus pro Schritt?
Aufgrund der Mail noch eine Erklärung zu meinem Ansatz.
Das Problem beim Originalalgorithmus ist bei mir, dass aufgrund der Originalkurve optimiert wird. Zoomt man hinein, so bleiben an einigen Stellen zu wenige Punkte im Anzeigebereich übrig.
Mein Ansatz ist nun, dass zuerst die Abschnitte der Kurve bestimmt werden, die wirklich im Anzeigebereich sind. Danach werden die Abschnitte einzeln optimiert. Hier macht der Cache dann probleme, da der Douglas-Peucker-Algorithmus mit verschiedenen Kurven aufgerufen wird.
Erst am Ende werden die Segmente dann zu einer Kurve kombiniert.
Der worst case für meinen Algorithmus ist die Gesamtansicht der Kurve, da hier genausoviel übrig bleibt und man sich den Segmentbestimmungsschritt hätte sparen könnte. Umso weiter man hineinzoomt, desto weniger bleibt bei mir übrig und es geht schneller.
Die Zeiten bei mir sind für die Gesamtkurve ca. 3 Sekunden. Vielleicht kann man ja beide Varianten im Code halten, die man über eine Option umschaltbar macht ? Evtl. sollte man auf meine Variante auch erst ab einem bestimmten Zoomlevel gehen.
Code:
INFO: base position list size: 596039
09.09.2012 17:49:32 slash.navigation.converter.gui.mapview.BaseMapView logJavaScript
INFO: script 'return getNorthEastBounds();'
with result '72.193605,61.710604'
09.09.2012 17:49:32 slash.navigation.converter.gui.mapview.BaseMapView logJavaScript
INFO: script 'return getSouthWestBounds();'
with result '44.680463,-26.180021'
09.09.2012 17:49:33 slash.navigation.converter.gui.mapview.BaseMapView filterVisiblePositionsExt
INFO: Reduced 596039 positions to 1 segments / 596039 positions in 252 milliseconds
09.09.2012 17:49:33 slash.navigation.converter.gui.mapview.BaseMapView filterEveryNthPosition
INFO: Filtered every 11,920780th position to reduce 596039 positions to 50000 in 5 milliseconds
09.09.2012 17:49:34 slash.navigation.converter.gui.mapview.BaseMapView calculateSignificantPositionsForZoom
INFO: zoom 5 < 16: threshold 5000.0, significant positions 305, calculated in 1652 milliseconds
09.09.2012 17:49:34 slash.navigation.converter.gui.mapview.BaseMapView filterSignificantPositions
INFO: Filtered significant positions to reduce 50000 positions to 305 in 1656 milliseconds
09.09.2012 17:49:34 slash.navigation.converter.gui.mapview.BaseMapView logJavaScript
Gruß
Thomas