source: subversion/applications/utils/mod_tile/convert_meta.c @ 12950

Revision 12950, 4.6 KB checked in by twain, 5 years ago (diff)

mod_tile: New apache directives and options for multiple tile sets

Line 
1#define _GNU_SOURCE
2
3#include <stdio.h>
4#include <stdlib.h>
5#include <unistd.h>
6#include <sys/types.h>
7#include <sys/socket.h>
8#include <sys/stat.h>
9#include <sys/time.h>
10#include <sys/un.h>
11#include <poll.h>
12#include <errno.h>
13#include <math.h>
14#include <getopt.h>
15#include <time.h>
16#include <sys/types.h>
17#include <dirent.h>
18#include <assert.h>
19#include <fcntl.h>
20
21#include "render_config.h"
22#include "dir_utils.h"
23#include "store.h"
24
25#ifndef METATILE
26#warning("convert_meta not implemented for non-metatile mode. Feel free to submit fix")
27int main(int argc, char **argv)
28{
29    fprintf(stderr, "convert_meta not implemented for non-metatile mode. Feel free to submit fix!\n");
30    return -1;
31}
32#else
33
34static int minZoom = 0;
35static int maxZoom = 18;
36static int verbose = 0;
37static int num_render = 0, num_all = 0;
38static struct timeval start, end;
39static int unpack;
40
41void display_rate(struct timeval start, struct timeval end, int num) 
42{
43    int d_s, d_us;
44    float sec;
45
46    d_s  = end.tv_sec  - start.tv_sec;
47    d_us = end.tv_usec - start.tv_usec;
48
49    sec = d_s + d_us / 1000000.0;
50
51    printf("Converted %d tiles in %.2f seconds (%.2f tiles/s)\n", num, sec, num / sec);
52    fflush(NULL);
53}
54
55static void descend(const char *search)
56{
57    DIR *tiles = opendir(search);
58    struct dirent *entry;
59    char path[PATH_MAX];
60
61    if (!tiles) {
62        //fprintf(stderr, "Unable to open directory: %s\n", search);
63        return;
64    }
65
66    while ((entry = readdir(tiles))) {
67        struct stat b;
68        char *p;
69
70        //check_load();
71
72        if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, ".."))
73            continue;
74        snprintf(path, sizeof(path), "%s/%s", search, entry->d_name);
75        if (stat(path, &b))
76            continue;
77        if (S_ISDIR(b.st_mode)) {
78            descend(path);
79            continue;
80        }
81        p = strrchr(path, '.');
82        if (p) {
83            if (unpack) {
84                if (!strcmp(p, ".meta")) 
85                    process_unpack(path);
86            } else {
87                if (!strcmp(p, ".png")) 
88                  process_pack(path);
89            }
90        }
91    }
92    closedir(tiles);
93}
94
95
96int main(int argc, char **argv)
97{
98    int z, c;
99
100    while (1) {
101        int option_index = 0;
102        static struct option long_options[] = {
103            {"min-zoom", 1, 0, 'z'},
104            {"max-zoom", 1, 0, 'Z'},
105            {"unpack", 0, 0, 'u'},
106            {"verbose", 0, 0, 'v'},
107            {"help", 0, 0, 'h'},
108            {0, 0, 0, 0}
109        };
110
111        c = getopt_long(argc, argv, "uhvz:Z:", long_options, &option_index);
112        if (c == -1)
113            break;
114
115        switch (c) {
116            case 'z':
117                minZoom=atoi(optarg);
118                if (minZoom < 0 || minZoom > 18) {
119                    fprintf(stderr, "Invalid minimum zoom selected, must be between 0 and 18\n");
120                    return 1;
121                }
122                break;
123            case 'Z':
124                maxZoom=atoi(optarg);
125                if (maxZoom < 0 || maxZoom > 18) {
126                    fprintf(stderr, "Invalid maximum zoom selected, must be between 0 and 18\n");
127                    return 1;
128                }
129                break;
130            case 'u':
131                unpack=1;
132                break;
133            case 'v':
134                verbose=1;
135                break;
136            case 'h':
137                fprintf(stderr, "Convert the rendered PNGs into the more efficient .meta format\n");
138                fprintf(stderr, "\t-u|--unpack\tUnpack the .meta files back to PNGs\n");
139                fprintf(stderr, "\t-z|--min-zoom\tonly process tiles greater or equal this zoom level (default 0)\n");
140                fprintf(stderr, "\t-Z|--max-zoom\tonly process tiles less than or equal to this zoom level (default 18)\n");
141                return -1;
142            default:
143                fprintf(stderr, "unhandled char '%c'\n", c);
144                break;
145        }
146    }
147
148    if (maxZoom < minZoom) {
149        fprintf(stderr, "Invalid zoom range, max zoom must be greater or equal to minimum zoom\n");
150        return 1;
151    }
152
153    fprintf(stderr, "Converting tiles\n");
154
155    gettimeofday(&start, NULL);
156
157    for (z=minZoom; z<=maxZoom; z++) {
158        char path[PATH_MAX];
159        snprintf(path, PATH_MAX, HASH_PATH "/%d", z);
160        descend(path);
161    }
162
163    gettimeofday(&end, NULL);
164    printf("\nTotal for all tiles converted\n");
165    printf("Meta tiles converted: ");
166    display_rate(start, end, num_render);
167    printf("Total tiles converted: ");
168    display_rate(start, end, num_render * METATILE * METATILE);
169    printf("Total tiles handled: ");
170    display_rate(start, end, num_all);
171
172    return 0;
173}
174#endif
Note: See TracBrowser for help on using the repository browser.