1 #ifndef OSMIUM_GEOM_FACTORY_HPP 2 #define OSMIUM_GEOM_FACTORY_HPP 67 std::runtime_error(message),
72 m_message += object_type;
74 m_message += std::to_string(m_id);
80 if (m_id == 0 &&
id != 0) {
82 m_message += object_type;
84 m_message += std::to_string(
id);
94 const char*
what() const noexcept
override {
95 return m_message.c_str();
139 return "+proj=longlat +datum=WGS84 +no_defs";
147 template <
typename TGeomImpl,
typename TProjection = IdentityProjection>
156 if (last_location != node_ref.location()) {
157 last_location = node_ref.location();
158 m_impl.multipolygon_add_location(m_projection(last_location));
171 template <
typename... TArgs>
174 m_impl(m_projection.epsg(), std::forward<TArgs>(args)...) {
181 template <
typename... TArgs>
183 m_projection(std::move(projection)),
184 m_impl(m_projection.epsg(), std::forward<TArgs>(args)...) {
196 return m_projection.epsg();
200 return m_projection.proj_string();
206 return m_impl.make_point(m_projection(location));
211 return create_point(node.
location());
220 return create_point(node_ref.
location());
230 m_impl.linestring_start();
233 template <
typename TIter>
235 size_t num_points = 0;
236 for (; it !=
end; ++it, ++num_points) {
237 m_impl.linestring_add_location(m_projection(it->location()));
242 template <
typename TIter>
244 size_t num_points = 0;
246 for (; it !=
end; ++it) {
247 if (last_location != it->location()) {
248 last_location = it->location();
249 m_impl.linestring_add_location(m_projection(last_location));
257 return m_impl.linestring_finish(num_points);
262 size_t num_points = 0;
264 if (un == use_nodes::unique) {
267 case direction::forward:
268 num_points = fill_linestring_unique(wnl.
cbegin(), wnl.
cend());
270 case direction::backward:
271 num_points = fill_linestring_unique(wnl.
crbegin(), wnl.
crend());
276 case direction::forward:
277 num_points = fill_linestring(wnl.
cbegin(), wnl.
cend());
279 case direction::backward:
280 num_points = fill_linestring(wnl.
crbegin(), wnl.
crend());
285 if (num_points < 2) {
289 return linestring_finish(num_points);
294 return create_linestring(way.
nodes(), un, dir);
304 m_impl.polygon_start();
307 template <
typename TIter>
309 size_t num_points = 0;
310 for (; it !=
end; ++it, ++num_points) {
311 m_impl.polygon_add_location(m_projection(it->location()));
316 template <
typename TIter>
318 size_t num_points = 0;
320 for (; it !=
end; ++it) {
321 if (last_location != it->location()) {
322 last_location = it->location();
323 m_impl.polygon_add_location(m_projection(last_location));
331 return m_impl.polygon_finish(num_points);
336 size_t num_points = 0;
338 if (un == use_nodes::unique) {
341 case direction::forward:
342 num_points = fill_polygon_unique(wnl.
cbegin(), wnl.
cend());
344 case direction::backward:
345 num_points = fill_polygon_unique(wnl.
crbegin(), wnl.
crend());
350 case direction::forward:
351 num_points = fill_polygon(wnl.
cbegin(), wnl.
cend());
353 case direction::backward:
359 if (num_points < 4) {
363 return polygon_finish(num_points);
368 return create_polygon(way.
nodes(), un, dir);
379 size_t num_polygons = 0;
380 size_t num_rings = 0;
381 m_impl.multipolygon_start();
383 for (
auto it = area.
cbegin(); it != area.
cend(); ++it) {
386 if (num_polygons > 0) {
387 m_impl.multipolygon_polygon_finish();
389 m_impl.multipolygon_polygon_start();
390 m_impl.multipolygon_outer_ring_start();
392 m_impl.multipolygon_outer_ring_finish();
397 m_impl.multipolygon_inner_ring_start();
399 m_impl.multipolygon_inner_ring_finish();
405 if (num_rings == 0) {
409 m_impl.multipolygon_polygon_finish();
410 return m_impl.multipolygon_finish();
423 #endif // OSMIUM_GEOM_FACTORY_HPP WayNodeList & nodes()
Definition: way.hpp:89
typename TGeomImpl::ring_type ring_type
Definition: factory.hpp:193
const_iterator cbegin() const noexcept
Returns an iterator to the beginning.
Definition: node_ref_list.hpp:206
typename TGeomImpl::multipolygon_type multipolygon_type
Definition: factory.hpp:192
point_type create_point(const osmium::NodeRef &node_ref)
Definition: factory.hpp:218
linestring_type linestring_finish(size_t num_points)
Definition: factory.hpp:256
Definition: factory.hpp:148
double lon() const
Definition: location.hpp:371
const_reverse_iterator crbegin() const noexcept
Returns a reverse_iterator to the beginning.
Definition: node_ref_list.hpp:226
point_type create_point(const osmium::Location &location) const
Definition: factory.hpp:205
std::string proj_string() const
Definition: factory.hpp:199
size_t fill_polygon_unique(TIter it, TIter end)
Definition: factory.hpp:317
Linestring has reverse direction.
const char * what() const noexcept override
Definition: factory.hpp:94
double lat() const
Definition: location.hpp:390
Definition: reader_iterator.hpp:39
const_iterator cbegin() const
Definition: object.hpp:375
const_iterator cend() const noexcept
Returns an iterator to the end.
Definition: node_ref_list.hpp:211
int epsg() const noexcept
Definition: factory.hpp:134
Linestring has same direction as way.
Definition: factory.hpp:59
constexpr osmium::object_id_type ref() const noexcept
Definition: node_ref.hpp:65
polygon_type create_polygon(const osmium::Way &way, use_nodes un=use_nodes::unique, direction dir=direction::forward)
Definition: factory.hpp:366
Namespace for everything in the Osmium library.
Definition: assembler.hpp:73
TGeomImpl m_impl
Definition: factory.hpp:164
linestring_type create_linestring(const osmium::WayNodeList &wnl, use_nodes un=use_nodes::unique, direction dir=direction::forward)
Definition: factory.hpp:260
TProjection m_projection
Definition: factory.hpp:163
void polygon_start()
Definition: factory.hpp:303
std::string proj_string() const
Definition: factory.hpp:138
Definition: coordinates.hpp:48
void add_points(const osmium::NodeRefList &nodes)
Definition: factory.hpp:153
size_t fill_linestring_unique(TIter it, TIter end)
Definition: factory.hpp:243
int epsg() const
Definition: factory.hpp:195
osmium::io::InputIterator< osmium::io::Reader > end(osmium::io::Reader &)
Definition: reader_iterator.hpp:45
int64_t object_id_type
Type for OSM object (node, way, or relation) IDs.
Definition: types.hpp:45
Remove consecutive nodes with same location.
void linestring_start()
Definition: factory.hpp:229
const_iterator cend() const
Definition: object.hpp:379
typename TGeomImpl::linestring_type linestring_type
Definition: factory.hpp:190
osmium::object_id_type m_id
Definition: factory.hpp:62
Definition: location.hpp:266
osmium::Location & location() noexcept
Definition: node_ref.hpp:79
multipolygon_type create_multipolygon(const osmium::Area &area)
Definition: factory.hpp:377
size_t fill_linestring(TIter it, TIter end)
Definition: factory.hpp:234
polygon_type polygon_finish(size_t num_points)
Definition: factory.hpp:330
direction
Definition: factory.hpp:117
object_id_type id() const noexcept
Get ID of this object.
Definition: object.hpp:126
Coordinates operator()(osmium::Location location) const
Definition: factory.hpp:130
typename TGeomImpl::polygon_type polygon_type
Definition: factory.hpp:191
size_t fill_polygon(TIter it, TIter end)
Definition: factory.hpp:308
typename TGeomImpl::point_type point_type
Definition: factory.hpp:189
osmium::Location location() const noexcept
Definition: node.hpp:67
osmium::object_id_type id() const noexcept
Definition: factory.hpp:90
point_type create_point(const osmium::Node &node)
Definition: factory.hpp:209
use_nodes
Definition: factory.hpp:108
geometry_error(const std::string &message, const char *object_type="", osmium::object_id_type id=0)
Definition: factory.hpp:66
Definition: node_ref_list.hpp:52
std::string m_message
Definition: factory.hpp:61
Definition: node_ref.hpp:50
const_reverse_iterator crend() const noexcept
Returns a reverse_iterator to the end.
Definition: node_ref_list.hpp:231
linestring_type create_linestring(const osmium::Way &way, use_nodes un=use_nodes::unique, direction dir=direction::forward)
Definition: factory.hpp:292
void set_id(const char *object_type, osmium::object_id_type id)
Definition: factory.hpp:79
polygon_type create_polygon(const osmium::WayNodeList &wnl, use_nodes un=use_nodes::unique, direction dir=direction::forward)
Definition: factory.hpp:334
Definition: factory.hpp:126
TProjection projection_type
Definition: factory.hpp:187