Skip to content
Closed
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
@@ -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.
3 changes: 3 additions & 0 deletions man/osm2pgsql.md
Original file line number Diff line number Diff line change
@@ -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.

6 changes: 6 additions & 0 deletions src/command-line-parser.cpp
Original file line number Diff line number Diff line change
@@ -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 "
5 changes: 5 additions & 0 deletions src/expire-config.hpp
Original file line number Diff line number Diff line change
@@ -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.
5 changes: 5 additions & 0 deletions src/expire-tiles.cpp
Original file line number Diff line number Diff line change
@@ -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);

9 changes: 9 additions & 0 deletions src/flex-lua-table.cpp
Original file line number Diff line number Diff line change
@@ -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) {
3 changes: 3 additions & 0 deletions src/options.hpp
Original file line number Diff line number Diff line change
@@ -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;

1 change: 1 addition & 0 deletions src/output-flex.cpp
Original file line number Diff line number Diff line change
@@ -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;
1 change: 1 addition & 0 deletions src/output-pgsql.cpp
Original file line number Diff line number Diff line change
@@ -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;
31 changes: 31 additions & 0 deletions tests/test-expire-from-geometry.cpp
Original file line number Diff line number Diff line change
@@ -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;