diff --git a/osmium-builder.cpp b/osmium-builder.cpp index cc7d7f189..d671394d1 100644 --- a/osmium-builder.cpp +++ b/osmium-builder.cpp @@ -54,11 +54,11 @@ osmium_builder_t::get_wkb_node(osmium::Location const &loc) const } osmium_builder_t::wkbs_t -osmium_builder_t::get_wkb_line(osmium::WayNodeList const &nodes, bool do_split) +osmium_builder_t::get_wkb_line(osmium::WayNodeList const &nodes, double split_at) { wkbs_t ret; - double const split_at = m_proj->target_latlon() ? 1 : 100 * 1000; + bool do_split = split_at > 0.0; double dist = 0; osmium::geom::Coordinates prev_pt; @@ -167,7 +167,7 @@ osmium_builder_t::get_wkb_multipolygon(osmium::Relation const &rel, osmium_builder_t::wkbs_t osmium_builder_t::get_wkb_multiline(osmium::memory::Buffer const &ways, - bool do_split) + double split_at) { // make a list of all endpoints using endpoint_t = std::tuple; @@ -258,7 +258,7 @@ osmium_builder_t::get_wkb_multiline(osmium::memory::Buffer const &ways, // found a line end, create the wkbs m_buffer.commit(); auto linewkbs = - get_wkb_line(m_buffer.get(0), do_split); + get_wkb_line(m_buffer.get(0), split_at); std::move(linewkbs.begin(), linewkbs.end(), std::inserter(ret, ret.end())); } @@ -305,13 +305,13 @@ osmium_builder_t::get_wkb_multiline(osmium::memory::Buffer const &ways, // found a line end, create the wkbs m_buffer.commit(); auto linewkbs = - get_wkb_line(m_buffer.get(0), do_split); + get_wkb_line(m_buffer.get(0), split_at); std::move(linewkbs.begin(), linewkbs.end(), std::inserter(ret, ret.end())); } } - if (!do_split && !ret.empty()) { + if (split_at <= 0.0 && !ret.empty()) { auto num_lines = ret.size(); m_writer.multilinestring_start(); for (auto const &line : ret) { diff --git a/osmium-builder.hpp b/osmium-builder.hpp index ce6ba349a..10ccaa5ce 100644 --- a/osmium-builder.hpp +++ b/osmium-builder.hpp @@ -27,12 +27,12 @@ class osmium_builder_t } wkb_t get_wkb_node(osmium::Location const &loc) const; - wkbs_t get_wkb_line(osmium::WayNodeList const &way, bool do_split); + wkbs_t get_wkb_line(osmium::WayNodeList const &way, double split_at); wkb_t get_wkb_polygon(osmium::Way const &way); wkbs_t get_wkb_multipolygon(osmium::Relation const &rel, osmium::memory::Buffer const &ways); - wkbs_t get_wkb_multiline(osmium::memory::Buffer const &ways, bool split); + wkbs_t get_wkb_multiline(osmium::memory::Buffer const &ways, double split_at); private: wkb_t create_multipolygon(osmium::Area const &area); diff --git a/output-gazetteer.cpp b/output-gazetteer.cpp index de58f2278..ec21b1806 100644 --- a/output-gazetteer.cpp +++ b/output-gazetteer.cpp @@ -640,7 +640,7 @@ int output_gazetteer_t::process_way(osmium::Way *way) geom = m_builder.get_wkb_polygon(*way); } if (geom.empty()) { - auto wkbs = m_builder.get_wkb_line(way->nodes(), false); + auto wkbs = m_builder.get_wkb_line(way->nodes(), 0.0); if (wkbs.empty()) { return 0; } @@ -698,7 +698,7 @@ int output_gazetteer_t::process_relation(osmium::Relation const &rel) } auto geoms = is_waterway - ? m_builder.get_wkb_multiline(osmium_buffer, false) + ? m_builder.get_wkb_multiline(osmium_buffer, 0.0) : m_builder.get_wkb_multipolygon(rel, osmium_buffer); if (!geoms.empty()) { diff --git a/output-pgsql.cpp b/output-pgsql.cpp index 17ae40b4a..b52cbea59 100644 --- a/output-pgsql.cpp +++ b/output-pgsql.cpp @@ -92,7 +92,8 @@ void output_pgsql_t::pgsql_out_way(osmium::Way const &way, taglist_t *tags, m_tables[t_poly]->write_row(way.id(), *tags, wkb); } } else { - for (auto const &wkb : m_builder.get_wkb_line(way.nodes(), true)) { + double const split_at = m_options.projection->target_latlon() ? 1 : 100 * 1000; + for (auto const &wkb : m_builder.get_wkb_line(way.nodes(), split_at)) { expire.from_wkb(wkb.c_str(), way.id()); m_tables[t_line]->write_row(way.id(), *tags, wkb); if (roads) { @@ -374,7 +375,8 @@ int output_pgsql_t::pgsql_process_relation(osmium::Relation const &rel, // Needs to be done before the polygon treatment below because // for boundaries the way_area tag may be added. if (!make_polygon) { - auto wkbs = m_builder.get_wkb_multiline(buffer, true); + double const split_at = m_options.projection->target_latlon() ? 1 : 100 * 1000; + auto wkbs = m_builder.get_wkb_multiline(buffer, split_at); for (auto const &wkb : wkbs) { expire.from_wkb(wkb.c_str(), -rel.id()); m_tables[t_line]->write_row(-rel.id(), outtags, wkb); diff --git a/processor-line.cpp b/processor-line.cpp index 3c971039c..7a6fbed1b 100644 --- a/processor-line.cpp +++ b/processor-line.cpp @@ -9,7 +9,7 @@ processor_line::processor_line(std::shared_ptr const &proj) geometry_processor::wkb_t processor_line::process_way(osmium::Way const &way) { - auto wkbs = m_builder.get_wkb_line(way.nodes(), false); + auto wkbs = m_builder.get_wkb_line(way.nodes(), 1000000); return wkbs.empty() ? wkb_t() : wkbs[0]; } @@ -18,6 +18,5 @@ geometry_processor::wkbs_t processor_line::process_relation(osmium::Relation const &, osmium::memory::Buffer const &ways) { - // XXX are multilines really acceptable? - return m_builder.get_wkb_multiline(ways, false); + return m_builder.get_wkb_multiline(ways, 1000000); }