Use DouglasPeucker with squaredEuclideanDistance
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include "engine/douglas_peucker.hpp"
|
||||
#include "util/coordinate_calculation.hpp"
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include <boost/test/test_case_template.hpp>
|
||||
@@ -12,6 +13,16 @@ BOOST_AUTO_TEST_SUITE(douglas_peucker_simplification)
|
||||
using namespace osrm;
|
||||
using namespace osrm::engine;
|
||||
|
||||
BOOST_AUTO_TEST_CASE(calibrate_thresholds)
|
||||
{
|
||||
auto thresholds = detail::generateThreshold(5, 19);
|
||||
auto z = 0;
|
||||
for (auto t : thresholds)
|
||||
{
|
||||
BOOST_TEST_MESSAGE(t << ", // z" << z++);
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(removed_middle_test)
|
||||
{
|
||||
/*
|
||||
@@ -23,9 +34,9 @@ BOOST_AUTO_TEST_CASE(removed_middle_test)
|
||||
*/
|
||||
std::vector<util::Coordinate> coordinates = {
|
||||
util::Coordinate(util::FloatLongitude(5), util::FloatLatitude(5)),
|
||||
util::Coordinate(util::FloatLongitude(5.995715), util::FloatLatitude(6)),
|
||||
util::Coordinate(util::FloatLongitude(10), util::FloatLatitude(10)),
|
||||
util::Coordinate(util::FloatLongitude(15), util::FloatLatitude(5))};
|
||||
util::Coordinate(util::FloatLongitude(12.5), util::FloatLatitude(12.6096298302)),
|
||||
util::Coordinate(util::FloatLongitude(20), util::FloatLatitude(20)),
|
||||
util::Coordinate(util::FloatLongitude(25), util::FloatLatitude(5))};
|
||||
|
||||
for (unsigned z = 0; z < detail::DOUGLAS_PEUCKER_THRESHOLDS_SIZE; z++)
|
||||
{
|
||||
@@ -49,19 +60,19 @@ BOOST_AUTO_TEST_CASE(removed_middle_test_zoom_sensitive)
|
||||
std::vector<util::Coordinate> coordinates = {
|
||||
util::Coordinate(util::FloatLongitude(5), util::FloatLatitude(5)),
|
||||
util::Coordinate(util::FloatLongitude(6), util::FloatLatitude(6)),
|
||||
util::Coordinate(util::FloatLongitude(10), util::FloatLatitude(10)),
|
||||
util::Coordinate(util::FloatLongitude(15), util::FloatLatitude(5))};
|
||||
util::Coordinate(util::FloatLongitude(20), util::FloatLatitude(20)),
|
||||
util::Coordinate(util::FloatLongitude(25), util::FloatLatitude(5))};
|
||||
|
||||
// Coordinate 6,6 should start getting included at Z12 and higher
|
||||
// Coordinate 6,6 should start getting included at Z9 and higher
|
||||
// Note that 5,5->6,6->10,10 is *not* a straight line on the surface
|
||||
// of the earth
|
||||
for (unsigned z = 0; z < 11; z++)
|
||||
for (unsigned z = 0; z < 9; z++)
|
||||
{
|
||||
auto result = douglasPeucker(coordinates, z);
|
||||
BOOST_CHECK_EQUAL(result.size(), 3);
|
||||
}
|
||||
// From 12 to max zoom, we should get all coordinates
|
||||
for (unsigned z = 12; z < detail::DOUGLAS_PEUCKER_THRESHOLDS_SIZE; z++)
|
||||
// From 9 to max zoom, we should get all coordinates
|
||||
for (unsigned z = 9; z < detail::DOUGLAS_PEUCKER_THRESHOLDS_SIZE; z++)
|
||||
{
|
||||
auto result = douglasPeucker(coordinates, z);
|
||||
BOOST_CHECK_EQUAL(result.size(), 4);
|
||||
@@ -71,38 +82,39 @@ BOOST_AUTO_TEST_CASE(removed_middle_test_zoom_sensitive)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(remove_second_node_test)
|
||||
{
|
||||
for (unsigned z = 0; z < detail::DOUGLAS_PEUCKER_THRESHOLDS_SIZE; z++)
|
||||
// derived from the degreeToPixel function
|
||||
const auto delta_pixel_to_delta_degree = [](const int pixel, const unsigned zoom) {
|
||||
const double shift = (1u << zoom) * 256;
|
||||
const double b = shift / 2.0;
|
||||
return pixel * 180. / b;
|
||||
};
|
||||
// For zoom level 0 all gets reduced to a line
|
||||
for (unsigned z = 1; z < detail::DOUGLAS_PEUCKER_THRESHOLDS_SIZE; z++)
|
||||
{
|
||||
/*
|
||||
x--x
|
||||
| \
|
||||
x-x x
|
||||
|
|
||||
x
|
||||
x
|
||||
| \
|
||||
x-x x
|
||||
|
|
||||
x
|
||||
*/
|
||||
std::vector<util::Coordinate> input = {
|
||||
util::Coordinate(util::FixedLongitude(5 * COORDINATE_PRECISION),
|
||||
util::FixedLatitude(5 * COORDINATE_PRECISION)),
|
||||
util::Coordinate(util::FixedLongitude(5 * COORDINATE_PRECISION),
|
||||
util::FixedLatitude(5 * COORDINATE_PRECISION +
|
||||
detail::DOUGLAS_PEUCKER_THRESHOLDS[z])),
|
||||
util::Coordinate(util::FixedLongitude(10 * COORDINATE_PRECISION),
|
||||
util::FixedLatitude(10 * COORDINATE_PRECISION)),
|
||||
util::Coordinate(util::FixedLongitude(10 * COORDINATE_PRECISION),
|
||||
util::FixedLatitude(10 + COORDINATE_PRECISION +
|
||||
detail::DOUGLAS_PEUCKER_THRESHOLDS[z] * 2)),
|
||||
util::Coordinate(util::FixedLongitude(5 * COORDINATE_PRECISION),
|
||||
util::FixedLatitude(15 * COORDINATE_PRECISION)),
|
||||
util::Coordinate(util::FixedLongitude(5 * COORDINATE_PRECISION +
|
||||
detail::DOUGLAS_PEUCKER_THRESHOLDS[z]),
|
||||
util::FixedLatitude(15 * COORDINATE_PRECISION))};
|
||||
BOOST_TEST_MESSAGE("Threshold (" << z << "): " << detail::DOUGLAS_PEUCKER_THRESHOLDS[z]);
|
||||
util::Coordinate(util::FloatLongitude(5),
|
||||
util::FloatLatitude(5)),
|
||||
util::Coordinate(util::FloatLongitude(5 + delta_pixel_to_delta_degree(2, z)),
|
||||
util::FloatLatitude(5)),
|
||||
util::Coordinate(util::FloatLongitude(10),
|
||||
util::FloatLatitude(10)),
|
||||
util::Coordinate(util::FloatLongitude(5),
|
||||
util::FloatLatitude(15)),
|
||||
util::Coordinate(util::FloatLongitude(5),
|
||||
util::FloatLatitude(15 + delta_pixel_to_delta_degree(2, z)))};
|
||||
BOOST_TEST_MESSAGE("Delta (" << z << "): " << delta_pixel_to_delta_degree(2, z));
|
||||
auto result = douglasPeucker(input, z);
|
||||
BOOST_CHECK_EQUAL(result.size(), 4);
|
||||
BOOST_CHECK_EQUAL(result.size(), 3);
|
||||
BOOST_CHECK_EQUAL(input[0], result[0]);
|
||||
BOOST_CHECK_EQUAL(input[2], result[1]);
|
||||
BOOST_CHECK_EQUAL(input[3], result[2]);
|
||||
BOOST_CHECK_EQUAL(input[5], result[3]);
|
||||
BOOST_CHECK_EQUAL(input[4], result[2]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user