本文整理汇总了C++中osmium::Relation类的典型用法代码示例。如果您正苦于以下问题:C++ Relation类的具体用法?C++ Relation怎么用?C++ Relation使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Relation类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: relation
void relation(osmium::Relation& rel) {
const char* bus = rel.tags() ["route"];
if (bus && !strcmp(bus, "bus")) {
const char* busRef = rel.tags()["ref"];
if (busRef) {
buses.push_back(Bus(busRef, id));
id++;
osmium::RelationMemberList& rml = rel.members();
for (osmium::RelationMember& rm : rml) {
if (rm.type() == osmium::item_type::way) {
std::vector<osmium::Location> tmpVec;
for (auto& nd : ways[rm.ref()]) {
osmium::Location loc = locations.get(nd);
tmpVec.push_back(loc);
}
buses.at(id - 1).locs.push_back(tmpVec);
} else if(rm.type() == osmium::item_type::node &&
!strcmp(rm.role(), "stop")) {
buses.at(id - 1).busStopNames[rm.ref()] = nodes[rm.ref()];
}
}
}
}
}
示例2: relation
void relation( osmium::Relation& relation ) {
const char* bus = relation.tags()["route"];
if(bus && !strcmp(bus, "bus")) {
const char* name = relation.tags().get_value_by_key("ref");
if(!name) name = relation.tags().get_value_by_key("name");
std::cout << name;
osmium::unsigned_object_id_type temp1, temp2;
int db = 0;
for( auto &member : relation.members()){
if(db == 0 && member.type() == osmium::item_type::node) {
temp1 = member.positive_ref();
db++;
} else if(db !=0 && member.type() == osmium::item_type::node){
temp2 = member.positive_ref();
}
}
std::cout << " (" << map[temp1] << " - " << map[temp2] << ")" << std::endl;
for ( auto &member : relation.members()) {
if( member.type() == osmium::item_type::node){
std::cout << " " << locations.get(member.positive_ref()).lat() << ", " << locations.get(member.positive_ref()).lon() << " " << map[member.positive_ref()] << std::endl;
}
}
std::cout << std::endl;
}
}
示例3: create_area
bool create_area(osmium::memory::Buffer& out_buffer, const osmium::Relation& relation, const std::vector<const osmium::Way*>& members) {
set_num_members(members.size());
osmium::builder::AreaBuilder builder{out_buffer};
builder.initialize_from_object(relation);
const bool area_okay = create_rings();
if (area_okay || config().create_empty_areas) {
if (config().keep_type_tag) {
builder.add_item(relation.tags());
} else {
copy_tags_without_type(builder, relation.tags());
}
}
if (area_okay) {
add_rings_to_area(builder);
}
if (report_ways()) {
for (const osmium::Way* way : members) {
config().problem_reporter->report_way(*way);
}
}
return area_okay || config().create_empty_areas;
}
示例4: relation
// - walk over all relations-versions
// - walk over all relations-nodes
// - Adds the nodes and ways that aren't in node-tracker to a vector
// - if node or way is in the box hit becames true
// - if hit is true and the vector is not empty (it means their are nodes or ways that belong to a relation that has at least one node or way inside the box)
// - Records the id of node or way to outside_node_tracker or outside_way_tracker
void relation(const osmium::Relation& relation) {
bool hit = false;
if (debug) {
std::cerr << "cut_administrative relation " << relation.id() << " v" << relation.version() << "\n";
}
std::vector<const osmium::RelationMember*> members;
std::vector<const osmium::TagList*> tags;
for (auto& tag : relation.tags()) {
if (strcmp(tag.key(), "boundary") == 0 && strcmp(tag.value(), "administrative") == 0)
hit = true;
}
for (const auto& extract : info->extracts) {
if (hit){
if(!extract->relation_tracker.get(relation.id())){
extract->relation_tracker.set(relation.id());
}
//Add only the nodes and ways that were not yet in the respective trackers if hit is true
for (const auto& member : relation.members()) {
if (member.type() == osmium::item_type::way && !extract->way_tracker.get(member.ref())){
extract->way_tracker.set(member.ref());
}
}
}
}
}
示例5: relation
void relation(const osmium::Relation& relation) {
if (m_max_relation_id == relation.id()) {
throw out_of_order_error{"Relation ID twice in input. Maybe you are using a history or change file?", relation.id()};
}
if (id_order{}(relation.id(), m_max_relation_id)) {
throw out_of_order_error{"Relation IDs out of order.", relation.id()};
}
m_max_relation_id = relation.id();
}
示例6: relation
void relation(const osmium::Relation& rel)
{
const char *bdy = rel.tags().get_value_by_key("boundary");
if (bdy && !strcmp(bdy, "postal_code"))
{
postcode_boundaries++;
const char *ref = rel.tags().get_value_by_key("ref");
if (ref) postcode[ref]=true;
}
}
示例7: relation
// - walk over all relation-versions
// - walk over all bboxes
// - if the relation-id is recorded in the bboxes relation-tracker
// - send the relation to the bboxes writer
void relation(const osmium::Relation& relation) {
if (debug) {
std::cerr << "softcut relation " << relation.positive_id() << " v" << relation.version() << "\n";
}
for (const auto& extract : info->extracts) {
if (extract->relation_tracker.get(relation.positive_id())) {
extract->write(relation);
}
}
}
示例8: relation
// The relation handler is called for each node in the input data.
void relation(const osmium::Relation& relation) {
{
osmium::builder::RelationBuilder builder{m_buffer};
copy_attributes(builder, relation);
copy_tags(builder, relation.tags());
// Copy the relation member list over to the new way.
builder.add_item(relation.members());
}
m_buffer.commit();
}
示例9: relation
void parse_osmium_t::relation(osmium::Relation& rel)
{
if (rel.deleted()) {
m_data->relation_delete(rel.id());
} else {
if (m_append) {
m_data->relation_modify(rel);
} else {
m_data->relation_add(rel);
}
}
m_stats.add_rel(rel.id());
}
示例10: new_relation
/**
* We are interested in all relations tagged with type=multipolygon
* or type=boundary with at least one way member.
*/
bool new_relation(const osmium::Relation& relation) const {
const char* type = relation.tags().get_value_by_key("type");
// ignore relations without "type" tag
if (!type) {
return false;
}
if ((!std::strcmp(type, "multipolygon")) || (!std::strcmp(type, "boundary"))) {
return std::any_of(relation.members().cbegin(), relation.members().cend(), [](const RelationMember& member) {
return member.type() == osmium::item_type::way;
});
}
return false;
}
示例11: switch
osmium::osm_entity_bits::type CommandAddRefs::add_members(const osmium::Relation& relation) {
osmium::osm_entity_bits::type read_types = osmium::osm_entity_bits::nothing;
for (const auto& member : relation.members()) {
switch (member.type()) {
case osmium::item_type::node:
m_node_ids.insert(member.ref());
break;
case osmium::item_type::way:
if (m_way_ids.count(member.ref()) == 0) {
m_way_ids.insert(member.ref());
read_types |= osmium::osm_entity_bits::way;
}
break;
case osmium::item_type::relation:
if (m_relation_ids.count(member.ref()) == 0) {
m_relation_ids.insert(member.ref());
read_types |= osmium::osm_entity_bits::relation;
}
break;
default:
break;
}
}
return read_types;
}
示例12: relation
void relation(const osmium::Relation& relation) {
*m_out += 'r';
write_meta(relation);
*m_out += " M";
if (!relation.members().empty()) {
auto it = relation.members().begin();
relation_member(*it);
for (++it; it != relation.members().end(); ++it) {
*m_out += ',';
relation_member(*it);
}
}
*m_out += '\n';
}
示例13: operator
/**
* Assemble an area from the given relation and its members.
* The resulting area is put into the out_buffer.
*
* @returns false if there was some kind of error building the
* area(s), true otherwise.
*/
bool operator()(const osmium::Relation& relation, const std::vector<const osmium::Way*>& members, osmium::memory::Buffer& out_buffer) {
if (!config().create_new_style_polygons) {
return true;
}
assert(relation.cmembers().size() >= members.size());
if (config().problem_reporter) {
config().problem_reporter->set_object(osmium::item_type::relation, relation.id());
}
if (relation.members().empty()) {
++stats().no_way_in_mp_relation;
return false;
}
++stats().from_relations;
stats().invalid_locations = segment_list().extract_segments_from_ways(config().problem_reporter,
stats().duplicate_nodes,
stats().duplicate_ways,
relation,
members);
if (!config().ignore_invalid_locations && stats().invalid_locations > 0) {
return false;
}
stats().member_ways = members.size();
if (stats().member_ways == 1) {
++stats().single_way_in_mp_relation;
}
if (config().debug_level > 0) {
std::cerr << "\nAssembling relation " << relation.id() << " containing " << members.size() << " way members with " << segment_list().size() << " nodes\n";
}
// Now create the Area object and add the attributes and tags
// from the relation.
bool okay = create_area(out_buffer, relation, members);
if (okay) {
out_buffer.commit();
} else {
out_buffer.rollback();
}
return okay;
}
示例14: relation
void relation ( osmium::Relation& rel ) {
const char* bus = rel.tags() ["route"];
const char* nev;
if ( bus && !strcmp ( bus, "bus" ) ) {
if( rel.tags()["name"])
{
nev = rel.tags()["name"];
}
else
{
nev = rel.tags()["ref"];
}
++stops;
//TODO asdasd
int i {1};
osmium::RelationMemberList& rml = rel.members();
int szam=0;
for ( osmium::RelationMember& rm : rml ) {
i = 1;
if (rm.type() == osmium::item_type::way ) {
for( auto it : way_node_map[rm.ref()] )
{
try {
osmium::Location loc = locations.get ( it );
if ( i++>1 ) {
osmium::geom::Coordinates coords {loc};
szam++;
printf("%.8f %.8f\n",double(coords.y),double(coords.x) );
}
} catch ( std::exception& e ) {
std::cout << "No such node on the map. "<< e.what() << std::endl;
}
}
std::cout << "way\n";
}
}
//std::cout << "way\n";
std::cout << nev << " busz\n";
}
}
示例15: extract_segments_from_ways
/**
* Extract all segments from all ways that make up this
* multipolygon relation and add them to the list.
*/
void extract_segments_from_ways(const osmium::Relation& relation, const std::vector<size_t>& members, const osmium::memory::Buffer& in_buffer) {
auto member_it = relation.members().begin();
for (size_t offset : members) {
const osmium::Way& way = in_buffer.get<const osmium::Way>(offset);
extract_segments_from_way(way, member_it->role());
++member_it;
}
}