Skip to content
Merged
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
77 changes: 45 additions & 32 deletions src/expire-tiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,41 +78,57 @@ void expire_tiles::from_point_list(geom::point_list_t const &list)
});
}

void expire_tiles::from_geometry(geom::geometry_t const &geom)
void expire_tiles::from_geometry(geom::point_t const &geom)
{
geom::box_t const box = geom::envelope(geom);
from_bbox(box);
}

void expire_tiles::from_geometry(geom::linestring_t const &geom)
{
if (geom.srid() != 3857) {
return;
from_point_list(geom);
}

void expire_tiles::from_polygon_boundary(geom::polygon_t const &geom)
{
from_point_list(geom.outer());
for (auto const &inner : geom.inners()) {
from_point_list(inner);
}
}

if (geom.is_point()) {
auto const box = geom::envelope(geom);
from_bbox(box);
} else if (geom.is_linestring()) {
from_point_list(geom.get<geom::linestring_t>());
} else if (geom.is_multilinestring()) {
for (auto const &list : geom.get<geom::multilinestring_t>()) {
from_point_list(list);
}
} else if (geom.is_polygon() || geom.is_multipolygon()) {
auto const box = geom::envelope(geom);
if (from_bbox(box)) {
if (geom.is_polygon()) {
from_point_list(geom.get<geom::polygon_t>().outer());
for (auto const &inner : geom.get<geom::polygon_t>().inners()) {
from_point_list(inner);
}
} else if (geom.is_multipolygon()) {
for (auto const &polygon : geom.get<geom::multipolygon_t>()) {
from_point_list(polygon.outer());
for (auto const &inner : polygon.inners()) {
from_point_list(inner);
}
}
}
void expire_tiles::from_geometry(geom::polygon_t const &geom)
{
geom::box_t const box = geom::envelope(geom);
if (from_bbox(box)) {
/* Bounding box too big - just expire tiles on the boundary */
from_polygon_boundary(geom);
}
}

void expire_tiles::from_geometry(geom::multipolygon_t const &geom)
{
geom::box_t const box = geom::envelope(geom);
if (from_bbox(box)) {
/* Bounding box too big - just expire tiles on the boundary */
for (auto const &sgeom : geom) {
from_polygon_boundary(sgeom);
}
}
}

void expire_tiles::from_geometry(geom::geometry_t const &geom)
{
geom.visit([&](auto const &g) { from_geometry(g); });
}

void expire_tiles::from_geometry_if_3857(geom::geometry_t const &geom)
{
if (geom.srid() == 3857) {
from_geometry(geom);
}
}

/*
* Expire tiles that a line crosses
*/
Expand Down Expand Up @@ -281,11 +297,8 @@ std::size_t output_tiles_to_file(quadkey_list_t const &tiles_maxzoom,

int expire_from_result(expire_tiles *expire, pg_result_t const &result)
{
if (!expire->enabled()) {
return -1;
}

auto const num_tuples = result.num_tuples();

for (int i = 0; i < num_tuples; ++i) {
char const *const wkb = result.get_value(i, 0);
expire->from_geometry(ewkb_to_geom(decode_hex(wkb)));
Expand Down
18 changes: 18 additions & 0 deletions src/expire-tiles.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,26 @@ class expire_tiles

bool enabled() const noexcept { return m_maxzoom != 0; }

void from_polygon_boundary(geom::polygon_t const &geom);

void from_geometry(geom::nullgeom_t const & /*geom*/) {}
void from_geometry(geom::point_t const &geom);
void from_geometry(geom::linestring_t const &geom);
void from_geometry(geom::polygon_t const &geom);
void from_geometry(geom::multipolygon_t const &geom);

template <typename T>
void from_geometry(geom::multigeometry_t<T> const &geom)
{
for (auto const &sgeom : geom) {
from_geometry(sgeom);
}
}

void from_geometry(geom::geometry_t const &geom);

void from_geometry_if_3857(geom::geometry_t const &geom);

int from_bbox(geom::box_t const &box);

/**
Expand Down
6 changes: 6 additions & 0 deletions src/options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -710,6 +710,12 @@ void options_t::check_options()
"large and has been set to 31.");
}

if (expire_tiles_zoom != 0 && projection->target_srs() != 3857) {
log_warn("Expire has been enabled (with -e or --expire-tiles) but "
"target SRS is not Mercator (EPSG:3857). Expire disabled!");
expire_tiles_zoom = 0;
}

if (output_backend == "flex" || output_backend == "gazetteer") {
if (style == DEFAULT_STYLE) {
throw std::runtime_error{
Expand Down
17 changes: 7 additions & 10 deletions src/output-flex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -711,13 +711,13 @@ void output_flex_t::write_column(
type == table_column_type::multilinestring ||
type == table_column_type::multipolygon);
if (geom->srid() == column.srid()) {
m_expire.from_geometry(*geom);
m_expire.from_geometry_if_3857(*geom);
copy_mgr->add_hex_geom(geom_to_ewkb(*geom, wrap_multi));
} else {
auto const proj =
reprojection::create_projection(column.srid());
auto const tgeom = geom::transform(*geom, *proj);
m_expire.from_geometry(tgeom);
m_expire.from_geometry_if_3857(tgeom);
copy_mgr->add_hex_geom(geom_to_ewkb(tgeom, wrap_multi));
}
} else {
Expand Down Expand Up @@ -1681,7 +1681,7 @@ void output_flex_t::add_row(table_connection_t *table_connection,

auto const geoms = geom::split_multi(std::move(geom), split_multi);
for (auto const &sgeom : geoms) {
m_expire.from_geometry(sgeom);
m_expire.from_geometry_if_3857(sgeom);
write_row(table_connection, object.type(), id, sgeom,
table.geom_column().srid());
}
Expand Down Expand Up @@ -1906,15 +1906,12 @@ void output_flex_t::delete_from_table(table_connection_t *table_connection,
osmium::item_type type, osmid_t osm_id)
{
assert(table_connection);
auto const id = table_connection->table().map_id(type, osm_id);
auto const &table = table_connection->table();
auto const id = table.map_id(type, osm_id);

if (m_expire.enabled() && table_connection->table().has_geom_column()) {
if (m_expire.enabled() && table.has_geom_column() &&
table.geom_column().srid() == 3857) {
auto const result = table_connection->get_geom_by_id(type, id);

if (result.num_tuples() == 0) {
return;
}

expire_from_result(&m_expire, result);
}

Expand Down
26 changes: 17 additions & 9 deletions src/output-pgsql.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ void output_pgsql_t::pgsql_out_way(osmium::Way const &way, taglist_t *tags,

auto const wkb = geom_to_ewkb(projected_geom);
if (!wkb.empty()) {
m_expire.from_geometry(projected_geom);
m_expire.from_geometry_if_3857(projected_geom);
if (m_enable_way_area) {
double const area = calculate_area(
get_options()->reproject_area, geom, projected_geom);
Expand All @@ -82,7 +82,7 @@ void output_pgsql_t::pgsql_out_way(osmium::Way const &way, taglist_t *tags,
auto const geoms = geom::split_multi(geom::segmentize(
geom::transform(geom::create_linestring(way), *m_proj), split_at));
for (auto const &sgeom : geoms) {
m_expire.from_geometry(sgeom);
m_expire.from_geometry_if_3857(sgeom);
auto const wkb = geom_to_ewkb(sgeom);
m_tables[t_line]->write_row(way.id(), *tags, wkb);
if (roads) {
Expand Down Expand Up @@ -169,7 +169,7 @@ void output_pgsql_t::node_add(osmium::Node const &node)
}

auto const geom = geom::transform(geom::create_point(node), *m_proj);
m_expire.from_geometry(geom);
m_expire.from_geometry_if_3857(geom);
auto const wkb = geom_to_ewkb(geom);
m_tables[t_point]->write_row(node.id(), outtags, wkb);
}
Expand Down Expand Up @@ -272,7 +272,7 @@ void output_pgsql_t::pgsql_process_relation(osmium::Relation const &rel)
}
auto const geoms = geom::split_multi(std::move(projected_geom));
for (auto const &sgeom : geoms) {
m_expire.from_geometry(sgeom);
m_expire.from_geometry_if_3857(sgeom);
auto const wkb = geom_to_ewkb(sgeom);
m_tables[t_line]->write_row(-rel.id(), outtags, wkb);
if (roads) {
Expand All @@ -288,7 +288,7 @@ void output_pgsql_t::pgsql_process_relation(osmium::Relation const &rel)
!get_options()->enable_multi);
for (auto const &sgeom : geoms) {
auto const projected_geom = geom::transform(sgeom, *m_proj);
m_expire.from_geometry(projected_geom);
m_expire.from_geometry_if_3857(projected_geom);
auto const wkb = geom_to_ewkb(projected_geom);
if (m_enable_way_area) {
double const area = calculate_area(
Expand Down Expand Up @@ -325,8 +325,12 @@ void output_pgsql_t::relation_add(osmium::Relation const &rel)
* contain the change for that also. */
void output_pgsql_t::node_delete(osmid_t osm_id)
{
auto const results = m_tables[t_point]->get_wkb(osm_id);
if (expire_from_result(&m_expire, results) != 0) {
if (m_expire.enabled()) {
auto const results = m_tables[t_point]->get_wkb(osm_id);
if (expire_from_result(&m_expire, results) != 0) {
m_tables[t_point]->delete_row(osm_id);
}
} else {
m_tables[t_point]->delete_row(osm_id);
}
}
Expand All @@ -336,8 +340,12 @@ void output_pgsql_t::delete_from_output_and_expire(osmid_t id)
m_tables[t_roads]->delete_row(id);

for (auto table : {t_line, t_poly}) {
auto const results = m_tables[table]->get_wkb(id);
if (expire_from_result(&m_expire, results) != 0) {
if (m_expire.enabled()) {
auto const results = m_tables[table]->get_wkb(id);
if (expire_from_result(&m_expire, results) != 0) {
m_tables[table]->delete_row(id);
}
} else {
m_tables[table]->delete_row(id);
}
}
Expand Down
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ set_test(test-check-input LABELS NoDB)
set_test(test-db-copy-thread)
set_test(test-db-copy-mgr)
set_test(test-domain-matcher LABELS NoDB)
set_test(test-expire-from-geometry LABELS NoDB)
set_test(test-expire-tiles LABELS NoDB)
set_test(test-geom-box LABELS NoDB)
set_test(test-geom-collections LABELS NoDB)
Expand Down
Loading