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

Last change on this file since 28629 was 28516, checked in by Dirk Stoecker, 7 years ago

finally remove hardcoded tile path and replace it by config option

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