Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow a limit to be set on expiry of line segments #2185

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions man/osm2pgsql.1
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,9 @@ Create a tile expiry list.
-o, --expire-output=FILENAME
Output file name for expired tiles list.
.TP
--expire-segment-length=SIZE
Max length for a line segment to be expired.
.TP
--expire-bbox-size=SIZE
Max size for a polygon to expire the whole polygon, not just the
boundary.
Expand Down
3 changes: 3 additions & 0 deletions man/osm2pgsql.md
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,9 @@ mandatory for short options too.
-o, \--expire-output=FILENAME
: Output file name for expired tiles list.

\--expire-segment-length=SIZE
: Max length for a line segment to be expired.

\--expire-bbox-size=SIZE
: Max size for a polygon to expire the whole polygon, not just the boundary.

Expand Down
6 changes: 6 additions & 0 deletions src/command-line-parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -460,6 +460,12 @@ options_t parse_command_line(int argc, char *argv[])
// Expire options
// ----------------------------------------------------------------------

// --expire-segment-length
app.add_option("--expire-segment-length", options.expire_tiles_max_segment)
->description("Max length for a line segment to be expired (default: no limit).")
->type_name("SIZE")
->group("Expire options");

// --expire-bbox-size
app.add_option("--expire-bbox-size", options.expire_tiles_max_bbox)
->description("Max size for a polygon to expire the whole polygon, not "
Expand Down
5 changes: 5 additions & 0 deletions src/expire-config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ struct expire_config_t
/// Buffer around expired feature as fraction of the tile size.
double buffer = 0.1;

/**
* Maximum length of a line segment that will be expired.
*/
double line_segment_limit = 0.0;

/**
* Maximum width/heigth of bbox of a (multi)polygon before hybrid mode
* expiry switches from full-area to boundary-only expire.
Expand Down
5 changes: 5 additions & 0 deletions src/expire-tiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,11 @@ void expire_tiles::from_line_segment(geom::point_t const &a,
geom::point_t const &b,
expire_config_t const &expire_config)
{
if (expire_config.line_segment_limit > 0.0 &&
distance(a, b) > expire_config.line_segment_limit) {
return;
}

auto tilec_a = coords_to_tile(a);
auto tilec_b = coords_to_tile(b);

Expand Down
9 changes: 9 additions & 0 deletions src/flex-lua-table.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,15 @@ static void parse_and_set_expire_options(lua_State *lua_state,
throw fmt_error("Unknown expire mode '{}'.", mode);
}

lua_getfield(lua_state, -1, "line_segment_limit");
if (lua_isnumber(lua_state, -1)) {
config.line_segment_limit = lua_tonumber(lua_state, -1);
} else if (!lua_isnil(lua_state, -1)) {
throw std::runtime_error{"Optional expire field 'line_segment_limit' "
"must contain a number."};
}
lua_pop(lua_state, 1); // ""line_segment_limit"

lua_getfield(lua_state, -1, "full_area_limit");
if (lua_isnumber(lua_state, -1)) {
if (config.mode != expire_mode::hybrid) {
Expand Down
3 changes: 3 additions & 0 deletions src/options.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ struct options_t

std::shared_ptr<reprojection> projection; ///< SRS of projection

/// Max length of line segment that will be expired
double expire_tiles_max_segment = 0.0;

/// Max bbox size in either dimension to expire full bbox for a polygon
double expire_tiles_max_bbox = 20000.0;

Expand Down
1 change: 1 addition & 0 deletions src/output-flex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1189,6 +1189,7 @@ output_flex_t::output_flex_t(std::shared_ptr<middle_query_t> const &mid,
if (table.has_geom_column() && table.geom_column().srid() == 3857) {
expire_config_t config{};
config.expire_output = m_expire_outputs->size() - 1;
config.line_segment_limit = options.expire_tiles_max_segment;
if (options.expire_tiles_max_bbox > 0.0) {
config.mode = expire_mode::hybrid;
config.full_area_limit = options.expire_tiles_max_bbox;
Expand Down
1 change: 1 addition & 0 deletions src/output-pgsql.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,7 @@ output_pgsql_t::output_pgsql_t(std::shared_ptr<middle_query_t> const &mid,
m_buffer(32768, osmium::memory::Buffer::auto_grow::yes),
m_rels_buffer(1024, osmium::memory::Buffer::auto_grow::yes)
{
m_expire_config.line_segment_limit = get_options()->expire_tiles_max_segment;
m_expire_config.full_area_limit = get_options()->expire_tiles_max_bbox;
if (get_options()->expire_tiles_max_bbox > 0.0) {
m_expire_config.mode = expire_mode::hybrid;
Expand Down
31 changes: 31 additions & 0 deletions tests/test-expire-from-geometry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,37 @@ TEST_CASE("expire linestring crossing tile boundary", "[NoDB]")
CHECK(tile_t::from_quadkey(tiles[1], zoom) == tile_t{zoom, 2048, 2047});
}

TEST_CASE("expire linestring with long segment", "[NoDB]")
{
expire_config_t expire_config;
expire_config.line_segment_limit = 10000;
expire_tiles et{zoom, defproj};

SECTION("line")
{
geom::linestring_t const line{{5000.0, 5000.0}, {15000.0, 15000.0}};
et.from_geometry(line, expire_config);
}

SECTION("geom")
{
geom::linestring_t line{{5000.0, 5000.0}, {15000.0, 15000.0}};
geom::geometry_t const geom{std::move(line)};
et.from_geometry(geom, expire_config);
}

SECTION("geom with check")
{
geom::linestring_t line{{5000.0, 5000.0}, {15000.0, 15000.0}};
geom::geometry_t geom{std::move(line)};
geom.set_srid(3857);
et.from_geometry_if_3857(geom, expire_config);
}

auto const tiles = et.get_tiles();
REQUIRE(tiles.size() == 0);
}

TEST_CASE("expire small polygon", "[NoDB]")
{
expire_config_t const expire_config;
Expand Down