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

Last change on this file since 28454 was 23108, checked in by saerdnaer, 9 years ago

mod_tile: replace all static max_zoom values of 18 with MAX_ZOOM constant. Patch derived from the work of the Geopard Team, especially Jonathan-David SCHRODER <jonathan.schroder@…>

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