src/Processor/Polyline/SimplifyBearing.php
public function simplify(Polyline $polyline): Polyline
    {
        $counterPoints = $polyline->getNumberOfPoints();

        if ($counterPoints < 3) {
            return clone $polyline;
        }

        $result      = new Polyline();
        $bearingCalc = new BearingEllipsoidal();

        $points = $polyline->getPoints();

        $index = 0;

        // add the first point to the resulting polyline
        $result->addPoint($points[$index]);

        do {
            $index++;

            // preserve the last point of the original polyline
            if ($index === ($counterPoints - 1)) {
                $result->addPoint($points[$index]);
                break;
            }

            $bearing1 = $bearingCalc->calculateBearing($points[$index - 1], $points[$index]);
            $bearing2 = $bearingCalc->calculateBearing($points[$index], $points[$index + 1]);

            $bearingDifference = min(
                fmod($bearing1 - $bearing2 + 360, 360),
                fmod($bearing2 - $bearing1 + 360, 360)
            );

            if ($bearingDifference > $this->bearingAngle) {
                $result->addPoint($points[$index]);
            }
        } while ($index < $counterPoints);

        return $result;
    }
public function simplify(Polyline $polyline): Polyline
    {
        $counterPoints = $polyline->getNumberOfPoints();

        if ($counterPoints < 3) {
            return clone $polyline;
        }

        $result      = new Polyline();
        $bearingCalc = new BearingEllipsoidal();

        $points = $polyline->getPoints();

        $index = 0;

        // add the first point to the resulting polyline
        $result->addPoint($points[$index]);

        do {
            $index++;

            // preserve the last point of the original polyline
            if ($index === ($counterPoints - 1)) {
                $result->addPoint($points[$index]);
                break;
            }

            $bearing1 = $bearingCalc->calculateBearing($points[$index - 1], $points[$index]);
            $bearing2 = $bearingCalc->calculateBearing($points[$index], $points[$index + 1]);

            $bearingDifference = min(
                fmod($bearing1 - $bearing2 + 360, 360),
                fmod($bearing2 - $bearing1 + 360, 360)
            );

            if ($bearingDifference > $this->bearingAngle) {
                $result->addPoint($points[$index]);
            }
        } while ($index < $counterPoints);

        return $result;
    }
Simplifies the given polyline

1. calculate the bearing angle between the first two points p1 and p2: b1
2. calculate the bearing angle between the next two points p2 and p3: b2
3. calculate the difference between b1 and b2: deltaB; if deltaB is
smaller than the threshold angle, remove the middle point p2
4. start again at (1.) as long as the polyline contains more points

@param Polyline $polyline

@return Polyline