Libosmium
Fast and flexible C++ library for working with OpenStreetMap data
Toggle main menu visibility
Loading...
Searching...
No Matches
include
osmium
area
multipolygon_manager_legacy.hpp
Go to the documentation of this file.
1
#ifndef OSMIUM_AREA_MULTIPOLYGON_MANAGER_LEGACY_HPP
2
#define OSMIUM_AREA_MULTIPOLYGON_MANAGER_LEGACY_HPP
3
4
/*
5
6
This file is part of Osmium (https://osmcode.org/libosmium).
7
8
Copyright 2013-2026 Jochen Topf <jochen@topf.org> and others (see README).
9
10
Boost Software License - Version 1.0 - August 17th, 2003
11
12
Permission is hereby granted, free of charge, to any person or organization
13
obtaining a copy of the software and accompanying documentation covered by
14
this license (the "Software") to use, reproduce, display, distribute,
15
execute, and transmit the Software, and to prepare derivative works of the
16
Software, and to permit third-parties to whom the Software is furnished to
17
do so, all subject to the following:
18
19
The copyright notices in the Software and this entire statement, including
20
the above license grant, this restriction and the following disclaimer,
21
must be included in all copies of the Software, in whole or in part, and
22
all derivative works of the Software, unless such copies or derivative
23
works are solely in the form of machine-executable object code generated by
24
a source language processor.
25
26
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
29
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
30
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
31
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
32
DEALINGS IN THE SOFTWARE.
33
34
*/
35
36
#include <
osmium/area/stats.hpp
>
37
#include <
osmium/handler.hpp
>
38
#include <
osmium/handler/check_order.hpp
>
39
#include <
osmium/memory/buffer.hpp
>
40
#include <
osmium/memory/callback_buffer.hpp
>
41
#include <
osmium/osm/item_type.hpp
>
42
#include <
osmium/osm/relation.hpp
>
43
#include <
osmium/osm/tag.hpp
>
44
#include <
osmium/osm/way.hpp
>
45
#include <
osmium/relations/manager_util.hpp
>
46
#include <
osmium/relations/members_database.hpp
>
47
#include <
osmium/relations/relations_database.hpp
>
48
#include <
osmium/relations/relations_manager.hpp
>
49
#include <
osmium/storage/item_stash.hpp
>
50
51
#include <algorithm>
52
#include <cassert>
53
#include <cstddef>
54
#include <cstdint>
55
#include <cstring>
56
#include <vector>
57
58
namespace
osmium
{
59
63
namespace
area
{
64
77
template
<
typename
TAssembler>
78
class
MultipolygonManagerLegacy
:
public
osmium::relations::RelationsManager
<MultipolygonManagerLegacy<TAssembler>, false, true, false> {
79
80
using
assembler_config_type
=
typename
TAssembler::config_type;
81
assembler_config_type
m_assembler_config
;
82
83
area_stats
m_stats
;
84
85
public
:
86
93
explicit
MultipolygonManagerLegacy
(
const
assembler_config_type
& assembler_config) :
94
m_assembler_config
(assembler_config) {
95
}
96
101
const
area_stats
&
stats
() const noexcept {
102
return
m_stats
;
103
}
104
109
bool
new_relation
(
const
osmium::Relation
&
relation
)
const
{
110
const
char
* type =
relation
.tags().get_value_by_key(
"type"
);
111
112
// ignore relations without "type" tag
113
if
(!type) {
114
return
false
;
115
}
116
117
if
((!std::strcmp(type,
"multipolygon"
)) || (!std::strcmp(type,
"boundary"
))) {
118
return
std::any_of(
relation
.members().cbegin(),
relation
.members().cend(), [](
const
RelationMember
& member) {
119
return member.type() == osmium::item_type::way;
120
});
121
}
122
123
return
false
;
124
}
125
131
void
complete_relation
(
const
osmium::Relation
&
relation
) {
132
std::vector<const osmium::Way*> ways;
133
ways.reserve(
relation
.members().size());
134
for
(
const
auto
& member :
relation
.members()) {
135
if
(member.ref() != 0) {
136
ways.push_back(this->
get_member_way
(member.ref()));
137
assert(ways.back() !=
nullptr
);
138
}
139
}
140
141
try
{
142
TAssembler assembler{
m_assembler_config
};
143
assembler(
relation
, ways, this->
buffer
());
144
m_stats += assembler.stats();
145
}
catch
(
const
osmium::invalid_location
&) {
146
// XXX ignore
147
}
148
}
149
154
void
way_not_in_any_relation
(
const
osmium::Way
&
way
) {
155
// you need at least 4 nodes to make up a polygon
156
if
(
way
.nodes().size() <= 3) {
157
return
;
158
}
159
try
{
160
if
(!
way
.nodes().front().location() || !
way
.nodes().back().location()) {
161
throw
osmium::invalid_location
{
"invalid location"
};
162
}
163
if
(
way
.ends_have_same_location()) {
164
// way is closed and has enough nodes, build simple multipolygon
165
TAssembler assembler{
m_assembler_config
};
166
assembler(
way
, this->
buffer
());
167
m_stats += assembler.stats();
168
}
169
}
catch
(
const
osmium::invalid_location
&) {
170
// XXX ignore
171
}
172
}
173
174
};
// class MultipolygonManagerLegacy
175
176
}
// namespace area
177
178
}
// namespace osmium
179
180
#endif
// OSMIUM_AREA_MULTIPOLYGON_MANAGER_LEGACY_HPP
buffer.hpp
callback_buffer.hpp
check_order.hpp
osmium::RelationMember
Definition
relation.hpp:56
osmium::Relation
Definition
relation.hpp:161
osmium::Way
Definition
way.hpp:72
osmium::area::MultipolygonManagerLegacy::stats
const area_stats & stats() const noexcept
Definition
multipolygon_manager_legacy.hpp:101
osmium::area::MultipolygonManagerLegacy::way_not_in_any_relation
void way_not_in_any_relation(const osmium::Way &way)
Definition
multipolygon_manager_legacy.hpp:154
osmium::area::MultipolygonManagerLegacy::MultipolygonManagerLegacy
MultipolygonManagerLegacy(const assembler_config_type &assembler_config)
Definition
multipolygon_manager_legacy.hpp:93
osmium::area::MultipolygonManagerLegacy::assembler_config_type
typename TAssembler::config_type assembler_config_type
Definition
multipolygon_manager_legacy.hpp:80
osmium::area::MultipolygonManagerLegacy::complete_relation
void complete_relation(const osmium::Relation &relation)
Definition
multipolygon_manager_legacy.hpp:131
osmium::area::MultipolygonManagerLegacy::m_stats
area_stats m_stats
Definition
multipolygon_manager_legacy.hpp:83
osmium::area::MultipolygonManagerLegacy::new_relation
bool new_relation(const osmium::Relation &relation) const
Definition
multipolygon_manager_legacy.hpp:109
osmium::area::MultipolygonManagerLegacy::m_assembler_config
assembler_config_type m_assembler_config
Definition
multipolygon_manager_legacy.hpp:81
osmium::handler::Handler::way
void way(const osmium::Way &) const noexcept
Definition
handler.hpp:81
osmium::relations::RelationsManagerBase::buffer
osmium::memory::Buffer & buffer() noexcept
Access the output buffer.
Definition
relations_manager.hpp:259
osmium::relations::RelationsManagerBase::get_member_way
const osmium::Way * get_member_way(osmium::object_id_type id) const noexcept
Definition
relations_manager.hpp:213
osmium::relations::RelationsManager
Definition
relations_manager.hpp:305
osmium::relations::RelationsManager< MultipolygonManagerLegacy< TAssembler >, false, true, false >::relation
void relation(const osmium::Relation &relation)
Definition
relations_manager.hpp:488
handler.hpp
item_stash.hpp
item_type.hpp
manager_util.hpp
members_database.hpp
osmium::area
Code related to the building of areas (multipolygons) from relations.
Definition
assembler.hpp:55
osmium
Namespace for everything in the Osmium library.
Definition
assembler.hpp:53
relation.hpp
relations_database.hpp
relations_manager.hpp
stats.hpp
osmium::area::area_stats
Definition
stats.hpp:49
osmium::invalid_location
Definition
location.hpp:54
tag.hpp
way.hpp
Generated by
1.17.0