summaryrefslogtreecommitdiff
path: root/tagstats
diff options
context:
space:
mode:
authorJochen Topf <jochen@topf.org>2013-01-14 11:41:37 +0100
committerJochen Topf <jochen@topf.org>2013-01-14 11:41:37 +0100
commit522ae6c8bf890437d9cc40d80d00063b2f2a584c (patch)
treeb2a6ec11d92569605b3e0e90c9112bfd7cde514b /tagstats
parentff80fc295e1894db534ed59c70d7eb67ff766640 (diff)
downloadtaginfo-522ae6c8bf890437d9cc40d80d00063b2f2a584c.tar
taginfo-522ae6c8bf890437d9cc40d80d00063b2f2a584c.tar.gz
Create relation member and role stats
Diffstat (limited to 'tagstats')
-rw-r--r--tagstats/tagstats_handler.hpp86
1 files changed, 84 insertions, 2 deletions
diff --git a/tagstats/tagstats_handler.hpp b/tagstats/tagstats_handler.hpp
index 2955d53..26c4954 100644
--- a/tagstats/tagstats_handler.hpp
+++ b/tagstats/tagstats_handler.hpp
@@ -28,6 +28,7 @@
#include <map>
#include <google/sparse_hash_map>
+#include <boost/foreach.hpp>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
@@ -182,15 +183,54 @@ public:
typedef google::sparse_hash_map<const char *, KeyValueStats *, djb2_hash, eqstr> key_value_hash_map_t;
#endif // TAGSTATS_COUNT_TAG_COMBINATIONS
+struct RelationRoleStats {
+ uint32_t node;
+ uint32_t way;
+ uint32_t relation;
+};
+
class RelationTypeStats {
public:
- RelationTypeStats() {
+ uint64_t m_count;
+ uint64_t m_node_members;
+ uint64_t m_way_members;
+ uint64_t m_relation_members;
+
+ std::map<std::string, RelationRoleStats> m_role_counts;
+
+ RelationTypeStats() :
+ m_count(0),
+ m_node_members(0),
+ m_way_members(0),
+ m_relation_members(0),
+ m_role_counts() {
+ }
+
+ void add(const Osmium::OSM::Relation& relation) {
+ m_count++;
+
+ BOOST_FOREACH(const Osmium::OSM::RelationMember& member, relation.members()) {
+ RelationRoleStats& r = m_role_counts[member.role()];
+ switch (member.type()) {
+ case 'n': ++r.node;
+ ++m_node_members;
+ break;
+ case 'w': ++r.way;
+ ++m_way_members;
+ break;
+ case 'r': ++r.relation;
+ ++m_relation_members;
+ break;
+ }
+ }
}
}; // class RelationTypeStats
+typedef std::map<std::string, RelationTypeStats> relation_type_stats_map_t;
+
/**
* Osmium handler that creates statistics for Taginfo.
*/
@@ -210,7 +250,7 @@ class TagStatsHandler : public Osmium::Handler::Base {
key_value_hash_map_t m_key_value_stats;
#endif // TAGSTATS_COUNT_TAG_COMBINATIONS
- std::map<std::string, RelationTypeStats> m_relation_type_stats;
+ relation_type_stats_map_t m_relation_type_stats;
time_t m_max_timestamp;
@@ -449,6 +489,14 @@ public:
void relation(const shared_ptr<Osmium::OSM::Relation const>& relation) {
statistics_handler.relation(relation);
collect_tag_stats(*relation);
+
+ const char* type = relation->tags().get_value_by_key("type");
+ if (type) {
+ relation_type_stats_map_t::iterator it = m_relation_type_stats.find(type);
+ if (it != m_relation_type_stats.end()) {
+ it->second.add(*relation);
+ }
+ }
}
void before_nodes() {
@@ -540,6 +588,14 @@ public:
"VALUES (?, ?, ?, ?, ?, ?, ?, ?);");
#endif // TAGSTATS_COUNT_TAG_COMBINATIONS
+ Sqlite::Statement statement_insert_into_relation_types(m_database, "INSERT INTO relation_types (rtype, count, " \
+ "members_all, members_nodes, members_ways, members_relations) " \
+ "VALUES (?, ?, ?, ?, ?, ?);");
+
+ Sqlite::Statement statement_insert_into_relation_roles(m_database, "INSERT INTO relation_roles (rtype, role, " \
+ "count_all, count_nodes, count_ways, count_relations) " \
+ "VALUES (?, ?, ?, ?, ?, ?);");
+
Sqlite::Statement statement_update_meta(m_database, "UPDATE source SET data_until=?");
m_database.begin_transaction();
@@ -659,6 +715,32 @@ public:
}
#endif // TAGSTATS_COUNT_TAG_COMBINATIONS
+ typedef std::pair<const std::string, RelationTypeStats> relation_type_stats_map_iterator_t;
+ typedef std::pair<const std::string, RelationRoleStats> relation_role_stats_map_iterator_t;
+
+ BOOST_FOREACH(relation_type_stats_map_iterator_t it, m_relation_type_stats) {
+ const RelationTypeStats& r = it.second;
+ statement_insert_into_relation_types
+ .bind_text(it.first)
+ .bind_int64(r.m_count)
+ .bind_int64(r.m_node_members + r.m_way_members + r.m_relation_members)
+ .bind_int64(r.m_node_members)
+ .bind_int64(r.m_way_members)
+ .bind_int64(r.m_relation_members)
+ .execute();
+
+ BOOST_FOREACH(relation_role_stats_map_iterator_t roleit, r.m_role_counts) {
+ const RelationRoleStats& rstats = roleit.second;
+ statement_insert_into_relation_roles
+ .bind_text(it.first)
+ .bind_text(roleit.first)
+ .bind_int64(rstats.node)
+ .bind_int64(rstats.way)
+ .bind_int64(rstats.relation)
+ .execute();
+ }
+ }
+
m_database.commit();
_timer_info("dumping to db");