... the user friendly GPS tool


Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Patch für automatische Wegpunktreduzierung
#7
mrg21 Wrote:Ich habe die neue Version 1.22.3 kurz getestet und ich finde die aktuelle Umsetzung des Douglas Peucker Algorithmus nicht gut. Das Problem dabei ist, dass der Algo aktuell nicht auf Entfernungen Rücksicht nimmt und schon geglättete Routen (z.B. gpsbabel: -x position,distance=5m,all,time=900 -x simplify,error=2m) weiter stark vereinfacht. Diese werden dann in der Karte viel zu grob dargestellt.

Danke für den Hinweis. Daran habe ich gar nicht gedacht, da ich nicht mit durch gpsbabel geglätteten Routen arbeite. Der derzeitige Code

Code:
private static int[] douglasPeuckerSimplify(List<? extends BaseNavigationPosition> positions, int from, int to, double threshold) {
        // find the point with the maximum distance
        BaseNavigationPosition pointA = positions.get(from);
        BaseNavigationPosition pointB = positions.get(to);
        int maximumDistanceIndex = -1;
        double maximumDistance = 0.0;
        for (int i = from + 1; i < to; i++) {
            double d = Math.abs(positions.get(i).getOrthogonalDistance(pointA, pointB));
            if (d > maximumDistance) {
                maximumDistance = d;
                maximumDistanceIndex = i;
            }
        }

        // if max distance is greater than threshold, recursively simplify
        if ((maximumDistanceIndex != -1) && (maximumDistance > threshold)) {
            int[] res1 = douglasPeuckerSimplify(positions, from, maximumDistanceIndex, threshold);
            int[] res2 = douglasPeuckerSimplify(positions, maximumDistanceIndex, to, threshold);

            int[] result = new int[res1.length - 1 + res2.length];
            System.arraycopy(res1, 0, result, 0, res1.length - 1);
            System.arraycopy(res2, 0, result, res1.length - 1, res2.length);
            return result;
        } else
            return new int[]{from, to};
    }

entspricht m.E. dem von Wikipedia:

Code:
function DouglasPeucker(PunkteListe[], epsilon)
// Punkt mit dem maximalen Abstand ermitteln
dmax = 0
index = 0
for i = 2 to (length(PunkteListe) - 1)
  d = OrthogonalerAbstand(PunkteListe[i], Strecke(PunkteListe[1], PunkteListe[end]))
  if d > dmax
   index = i
   dmax = d
  end
end

// Abstand prüfen und ggf. in das Ergebnis eintragen
if dmax >= epsilon
  // rekursiver Aufruf
  rekErgebnis1[] = DouglasPeucker(PunkteListe[1...index], epsilon)
  rekErgebnis2[] = DouglasPeucker(PunkteListe[index...end], epsilon)
  
  // Bilden der Ergebnisliste
  ErgebnisListe[] = {rekErgebnis1[1...end-1] rekErgebnis2[1...end]}
else
  ErgebnisListe[] = {PunkteListe[1], PunkteListe[end]}
end

// Ergebnis zurückgeben
return ErgebnisListe[]
end

Was würdest Du vorschlagen?
--
Christian
Reply


Messages In This Thread
RE: Patch für automatische Wegpunktreduzierung - by routeconverter - 09.11.2008, 14:15

Forum Jump:


Users browsing this thread: 1 Guest(s)