summaryrefslogtreecommitdiff
path: root/tagstats/tagstats.cpp
blob: 4b27b9cee1acc7ca77a53c426234b42acc1b34ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <getopt.h>

#include <osmium.hpp>

#include <osmium/handler/statistics.hpp>

/**
 * Positions are stored in this type of integer for the distribution images.
 * TAGSTATS_GEODISTRIBUTION_INT must be set in Makefile, typically to uint16_t
 * or uint32_t (for higher resolution but needs twice as much memory).
 */
typedef TAGSTATS_GEODISTRIBUTION_INT rough_position_t;

#ifdef TAGSTATS_GEODISTRIBUTION_FOR_WAYS
# include <osmium/storage/byid.hpp>
// Set TAGSTATS_GEODISTRIBUTION_STORAGE to SparseTable or Mmap in Makefile
typedef Osmium::Storage::TAGSTATS_GEODISTRIBUTION_FOR_WAYS<rough_position_t> storage_t;
#endif // TAGSTATS_GEODISTRIBUTION_FOR_WAYS

#include "geodistribution.hpp"

GeoDistribution::geo_distribution_t GeoDistribution::c_distribution_all;
int GeoDistribution::c_width;
int GeoDistribution::c_height;

#include "tagstats_handler.hpp"


/* ================================================== */

void print_help() {
    std::cout << "tagstats [OPTIONS] OSMFILE\n\n" \
              << "This program is part of Taginfo. It calculates statistics\n" \
              << "on OSM tags and puts them into taginfo-db.db and count.db.\n" \
              << "\nOptions:\n" \
              << "  -H, --help           This help message\n" \
              << "  -d, --debug          Enable debugging output\n" \
              << "  -t, --top=NUMBER     Top of bounding box for distribution images\n" \
              << "  -r, --right=NUMBER   Right of bounding box for distribution images\n" \
              << "  -b, --bottom=NUMBER  Bottom of bounding box for distribution images\n" \
              << "  -l, --left=NUMBER    Left of bounding box for distribution images\n" \
              << "  -w, --width=NUMBER   Width of distribution images (default: 360)\n" \
              << "  -h, --height=NUMBER  Height of distribution images (default: 180)\n" \
              << "\nDefault for bounding box is: (-180, -90, 180, 90)\n";
}

int main(int argc, char *argv[]) {
    static struct option long_options[] = {
        {"debug",  no_argument, 0, 'd'},
        {"help",   no_argument, 0, 'H'},
        {"top",    required_argument, 0, 't'},
        {"right",  required_argument, 0, 'r'},
        {"bottom", required_argument, 0, 'b'},
        {"left",   required_argument, 0, 'l'},
        {"width",  required_argument, 0, 'w'},
        {"height", required_argument, 0, 'h'},
        {0, 0, 0, 0}
    };

    bool debug = false;

    int top    =   90;
    int right  =  180;
    int bottom =  -90;
    int left   = -180;

    unsigned int width  = 360;
    unsigned int height = 180;

    while (true) {
        int c = getopt_long(argc, argv, "dHt:r:b:l:w:h:", long_options, 0);
        if (c == -1) {
            break;
        }

        switch (c) {
            case 'd':
                debug = true;
                break;
            case 'H':
                print_help();
                exit(0);
            case 't':
                top = atoi(optarg);
                break;
            case 'r':
                right = atoi(optarg);
                break;
            case 'b':
                bottom = atoi(optarg);
                break;
            case 'l':
                left = atoi(optarg);
                break;
            case 'w':
                width = atoi(optarg);
                break;
            case 'h':
                height = atoi(optarg);
                break;
            default:
                exit(1);
        }
    }

    Osmium::init(debug);

    if (argc - optind != 1) {
        std::cerr << "Usage: " << argv[0] << " [OPTIONS] OSMFILE" << std::endl;
        exit(1);
    }

    Osmium::OSMFile infile(argv[optind]);
    TagStatsHandler handler(left, bottom, right, top, width, height);
    infile.read(handler);
}