1 #ifndef OSMIUM_AREA_ASSEMBLER_HPP 2 #define OSMIUM_AREA_ASSEMBLER_HPP 50 #include <osmium/area/detail/basic_assembler.hpp> 74 if (!config().problem_reporter) {
77 return stats().duplicate_nodes ||
78 stats().duplicate_segments ||
79 stats().intersections ||
82 stats().touching_rings ||
83 stats().ways_in_multiple_rings ||
92 std::map<std::string, size_t> counter;
94 for (
const auto& tag : way->tags()) {
95 std::string kv{tag.key()};
97 kv.append(tag.value());
102 const size_t num_ways = ways.size();
103 for (
const auto& t_c : counter) {
105 std::cerr <<
" tag " << t_c.first <<
" is used " << t_c.second <<
" times in " << num_ways <<
" ways\n";
107 if (t_c.second == num_ways) {
108 const size_t len = std::strlen(t_c.first.c_str());
109 tl_builder.
add_tag(t_c.first.c_str(), t_c.first.c_str() + len + 1);
118 add(
false,
"created_by");
119 add(
false,
"source");
121 add(
false,
"test:id");
122 add(
false,
"test:section");
135 if (std::strcmp(tag.key(),
"type")) {
136 tl_builder.add_tag(tag.key(), tag.value());
145 std::cerr <<
" found " <<
count <<
" tags on relation (without ignored ones)\n";
150 std::cerr <<
" use tags from relation\n";
153 if (config().keep_type_tag) {
159 ++stats().no_tags_on_relation;
161 std::cerr <<
" use tags from outer ways\n";
163 std::set<const osmium::Way*> ways;
164 for (
const auto& ring : rings()) {
165 if (ring.is_outer()) {
169 if (ways.size() == 1) {
171 std::cerr <<
" only one outer way\n";
173 builder.
add_item((*ways.cbegin())->tags());
176 std::cerr <<
" multiple outer ways, get common tags\n";
186 builder.initialize_from_object(way);
188 const bool area_okay = create_rings();
189 if (area_okay || config().create_empty_areas) {
193 add_rings_to_area(builder);
197 config().problem_reporter->report_way(way);
200 return area_okay || config().create_empty_areas;
204 set_num_members(members.size());
206 builder.initialize_from_object(relation);
208 const bool area_okay = create_rings();
209 if (area_okay || config().create_empty_areas) {
213 add_rings_to_area(builder);
218 config().problem_reporter->report_way(*way);
222 return area_okay || config().create_empty_areas;
230 detail::BasicAssembler(config) {
243 if (!config().create_way_polygons) {
251 if (config().problem_reporter) {
253 config().problem_reporter->set_nodes(way.
nodes().
size());
258 ++stats().short_ways;
263 ++stats().duplicate_nodes;
264 if (config().problem_reporter) {
270 stats().invalid_locations = segment_list().extract_segments_from_way(config().problem_reporter,
271 stats().duplicate_nodes,
273 if (!config().ignore_invalid_locations && stats().invalid_locations > 0) {
277 if (config().debug_level > 0) {
278 std::cerr <<
"\nAssembling way " << way.
id() <<
" containing " << segment_list().size() <<
" nodes\n";
291 std::cerr <<
"Done: " << stats() <<
"\n";
308 std::vector<const osmium::Way*> ways;
309 for (
size_t offset : members) {
311 ways.push_back(&way);
324 assert(relation.
members().
size() >= members.size());
326 if (config().problem_reporter) {
331 ++stats().no_way_in_mp_relation;
335 ++stats().from_relations;
336 stats().invalid_locations = segment_list().extract_segments_from_ways(config().problem_reporter,
337 stats().duplicate_nodes,
338 stats().duplicate_ways,
341 if (!config().ignore_invalid_locations && stats().invalid_locations > 0) {
344 stats().member_ways = members.size();
346 if (stats().member_ways == 1) {
347 ++stats().single_way_in_mp_relation;
350 if (config().debug_level > 0) {
351 std::cerr <<
"\nAssembling relation " << relation.
id() <<
" containing " << members.size() <<
" way members with " << segment_list().size() <<
" nodes\n";
354 const size_t area_offset = out_buffer.
committed();
358 bool okay =
create_area(out_buffer, relation, members);
360 if ((config().create_new_style_polygons && stats().no_tags_on_relation == 0) ||
361 (config().create_old_style_polygons && stats().no_tags_on_relation != 0)) {
376 std::vector<const osmium::Way*> ways_that_should_be_areas;
377 if (stats().wrong_role == 0) {
379 if (!std::strcmp(member.
role(),
"inner")) {
388 if (!std::equal(way_fi_begin, way_fi_end, area_fi_begin) || d !=
std::distance(area_fi_begin, area_fi_end)) {
389 ways_that_should_be_areas.push_back(&way);
391 ++stats().inner_with_same_tags;
392 if (config().problem_reporter) {
393 config().problem_reporter->report_inner_with_same_tags(way);
403 std::cerr <<
"Done: " << stats() <<
"\n";
407 for (
const osmium::Way* way : ways_that_should_be_areas) {
409 if (!assembler(*way, out_buffer)) {
412 stats() += assembler.stats();
424 #endif // OSMIUM_AREA_ASSEMBLER_HPP WayNodeList & nodes()
Definition: way.hpp:89
#define OSMIUM_DEPRECATED
Definition: compatibility.hpp:50
bool operator()(const osmium::Way &way, osmium::memory::Buffer &out_buffer)
Definition: assembler.hpp:242
void add_item(const osmium::memory::Item &item)
Definition: builder.hpp:217
const TagList & tags() const
Get the list of tags for this object.
Definition: object.hpp:325
RelationMemberList & members()
Definition: relation.hpp:185
static void copy_tags_without_type(osmium::builder::AreaBuilder &builder, const osmium::TagList &tags)
Definition: assembler.hpp:132
Definition: relation.hpp:168
bool report_ways() const noexcept
Definition: assembler.hpp:73
static const MPFilter & filter() noexcept
Definition: assembler.hpp:127
Definition: assembler_config.hpp:49
const_iterator cbegin() const noexcept
Definition: collection.hpp:164
Definition: entity_bits.hpp:72
void add_tags_to_area(osmium::builder::AreaBuilder &builder, const osmium::Relation &relation)
Definition: assembler.hpp:141
size_type size() const noexcept
Definition: collection.hpp:152
bool has_tag(const char *key, const char *value) const noexcept
Definition: tag.hpp:159
double distance(const osmium::geom::Coordinates &c1, const osmium::geom::Coordinates &c2)
Definition: haversine.hpp:66
bool is_closed() const
Definition: way.hpp:112
bool create_area(osmium::memory::Buffer &out_buffer, const osmium::Way &way)
Definition: assembler.hpp:184
constexpr osmium::object_id_type ref() const noexcept
Definition: node_ref.hpp:65
bool empty() const noexcept
Definition: node_ref_list.hpp:74
~Assembler() noexcept=default
Definition: relation.hpp:57
bool operator()(const osmium::Relation &relation, const std::vector< const osmium::Way *> &members, osmium::memory::Buffer &out_buffer)
Definition: assembler.hpp:323
Namespace for everything in the Osmium library.
Definition: assembler.hpp:63
const_iterator cend() const noexcept
Definition: collection.hpp:168
bool empty() const noexcept
Definition: collection.hpp:143
Definition: assembler.hpp:114
Assembler(const config_type &config)
Definition: assembler.hpp:229
osmium::Location & location() noexcept
Definition: node_ref.hpp:79
void add_common_tags(osmium::builder::TagListBuilder &tl_builder, std::set< const osmium::Way *> &ways) const
Definition: assembler.hpp:91
object_id_type id() const noexcept
Get ID of this object.
Definition: object.hpp:126
size_t committed() const noexcept
Definition: buffer.hpp:263
bool ends_have_same_id() const
Definition: way.hpp:116
Definition: buffer.hpp:97
const char * role() const noexcept
Definition: relation.hpp:138
bool create_area(osmium::memory::Buffer &out_buffer, const osmium::Relation &relation, const std::vector< const osmium::Way *> &members)
Definition: assembler.hpp:203
const NodeRef & front() const noexcept
Definition: node_ref_list.hpp:126
const NodeRef & back() const noexcept
Definition: node_ref_list.hpp:138
MPFilter()
Definition: assembler.hpp:116
Definition: assembler.hpp:71
void rollback()
Definition: buffer.hpp:374
T & get(const size_t offset) const
Definition: buffer.hpp:408
size_type size() const noexcept
Definition: node_ref_list.hpp:83
void add_tag(const char *key, const char *value)
Definition: osm_object_builder.hpp:95
OSMIUM_DEPRECATED void operator()(const osmium::Relation &relation, const std::vector< size_t > &members, const osmium::memory::Buffer &in_buffer, osmium::memory::Buffer &out_buffer)
Definition: assembler.hpp:307
Definition: osm_object_builder.hpp:71
size_t commit()
Definition: buffer.hpp:358
void add_tags_to_area(osmium::builder::AreaBuilder &builder, const osmium::Way &way) const
Definition: assembler.hpp:87
Definition: osm_object_builder.hpp:528