source: subversion/applications/utils/mod_tile/speedtest.cpp @ 8646

Last change on this file since 8646 was 8425, checked in by jonb, 11 years ago

mod_tile: Move map style & font location into render_config.h. Fix up operation with non-metatile rendering. Several utilities are not implemented for non-metatile (render_list, render_old, speedtest).

File size: 6.0 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <sys/types.h>
5#include <sys/socket.h>
6#include <sys/stat.h>
7#include <sys/time.h>
8#include <sys/un.h>
9#include <poll.h>
10#include <errno.h>
11#include <math.h>
12#include <limits.h>
13
14#include "gen_tile.h"
15#include "protocol.h"
16#include "render_config.h"
17#include "dir_utils.h"
18
19#ifndef METATILE
20#warning("Speed test not implemented for non-metatile mode. Feel free to submit fix")
21int main(int argc, char **argv)
22{
23    fprintf(stderr, "Speed test not implemented for non-metatile mode. Feel free to submit fix!\n");
24    return -1;
25}
26#else
27
28#define DEG_TO_RAD (M_PIl/180)
29#define RAD_TO_DEG (180/M_PIl)
30
31static const int minZoom = 0;
32static const int maxZoom = 18;
33
34#if 1
35static double boundx0=-0.5;
36static double boundy0=51.25;
37static double boundx1=0.5;
38static double boundy1=51.75;
39#endif
40#if 0
41//    bbox = (-6.0, 50.0,3.0,58.0)
42static double boundx0=-6.0;
43static double boundy0=50.0;
44static double boundx1=3.0;
45static double boundy1=58.0;
46#endif
47#if 0
48// UK: 49.7,-7.6, 58.8, 3.2
49static double boundx0=-7.6;
50static double boundy0=49.7;
51static double boundx1=3.2;
52static double boundy1=58.8;
53#endif
54
55
56static double minmax(double a, double b, double c)
57{
58#define MIN(x,y) ((x)<(y)?(x):(y))
59#define MAX(x,y) ((x)>(y)?(x):(y))
60    a = MAX(a,b);
61    a = MIN(a,c);
62    return a;
63}
64
65class GoogleProjection
66{
67    double *Ac, *Bc, *Cc, *zc;
68
69    public:
70        GoogleProjection(int levels=18) {
71            Ac = new double[levels];
72            Bc = new double[levels];
73            Cc = new double[levels];
74            zc = new double[levels];
75            int d, c = 256;
76            for (d=0; d<levels; d++) {
77                int e = c/2;
78                Bc[d] = c/360.0;
79                Cc[d] = c/(2 * M_PIl);
80                zc[d] = e;
81                Ac[d] = c;
82                c *=2;
83            }
84        }
85
86        void fromLLtoPixel(double &x, double &y, int zoom) {
87            double d = zc[zoom];
88            double f = minmax(sin(DEG_TO_RAD * y),-0.9999,0.9999);
89            x = round(d + x * Bc[zoom]);
90            y = round(d + 0.5*log((1+f)/(1-f))*-Cc[zoom]);
91        }
92        void fromPixelToLL(double &x, double &y, int zoom) {
93            double e = zc[zoom];
94            double g = (y - e)/-Cc[zoom];
95            x = (x - e)/Bc[zoom];
96            y = RAD_TO_DEG * ( 2 * atan(exp(g)) - 0.5 * M_PIl);
97        }
98};
99
100static GoogleProjection gprj(maxZoom+1);
101
102
103void display_rate(struct timeval start, struct timeval end, int num) 
104{
105    int d_s, d_us;
106    float sec;
107
108    d_s  = end.tv_sec  - start.tv_sec;
109    d_us = end.tv_usec - start.tv_usec;
110
111    sec = d_s + d_us / 1000000.0;
112
113    printf("Rendered %d tiles in %.2f seconds (%.2f tiles/s)\n", num, sec, num / sec);
114    fflush(NULL);
115}
116
117
118
119int rx_process(const struct protocol *req)
120{
121    fprintf(stderr, "version(%d), cmd(%d), z(%d), x(%d), y(%d)\n",
122            req->ver, req->cmd, req->z, req->x, req->y);
123    return 0;
124}
125
126int process_loop(int fd, int x, int y, int z)
127{
128    struct protocol cmd, rsp;
129    //struct pollfd fds[1];
130    int ret = 0;
131
132    bzero(&cmd, sizeof(cmd));
133
134    cmd.ver = 1;
135    cmd.cmd = cmdRender;
136    cmd.z = z;
137    cmd.x = x;
138    cmd.y = y;
139    //strcpy(cmd.path, "/tmp/foo.png");
140
141        //printf("Sending request\n");
142    ret = send(fd, &cmd, sizeof(cmd), 0);
143    if (ret != sizeof(cmd)) {
144        perror("send error");
145    }
146        //printf("Waiting for response\n");
147    bzero(&rsp, sizeof(rsp));
148    ret = recv(fd, &rsp, sizeof(rsp), 0);
149    if (ret != sizeof(rsp)) {
150        perror("recv error");
151        return 0;
152    }
153        //printf("Got response\n");
154
155    if (!ret)
156        perror("Socket send error");
157    return ret;
158}
159
160
161int main(int argc, char **argv)
162{
163    const char *spath = RENDER_SOCKET;
164    int fd;
165    struct sockaddr_un addr;
166    int ret=0;
167    int z;
168    char name[PATH_MAX];
169    struct timeval start, end;
170    struct timeval start_all, end_all;
171    int num, num_all = 0;
172 
173   
174    fprintf(stderr, "Rendering client\n");
175
176    fd = socket(PF_UNIX, SOCK_STREAM, 0);
177    if (fd < 0) {
178        fprintf(stderr, "failed to create unix socket\n");
179        exit(2);
180    }
181
182    bzero(&addr, sizeof(addr));
183    addr.sun_family = AF_UNIX;
184    strncpy(addr.sun_path, spath, sizeof(addr.sun_path));
185
186    if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
187        fprintf(stderr, "socket connect failed for: %s\n", spath);
188        close(fd);
189        exit(3);
190    }
191
192    // Render something to counter act the startup costs
193    // of obtaining the Postgis table extents
194
195    printf("Initial startup costs\n");
196    gettimeofday(&start, NULL);
197    process_loop(fd, 0,0,0);
198    gettimeofday(&end, NULL);
199    display_rate(start, end, 1);
200
201    gettimeofday(&start_all, NULL);
202
203    for (z=minZoom; z<=maxZoom; z++) {
204        double px0 = boundx0;
205        double py0 = boundy1;
206        double px1 = boundx1;
207        double py1 = boundy0;
208        gprj.fromLLtoPixel(px0, py0, z);
209        gprj.fromLLtoPixel(px1, py1, z);
210
211        int x, xmin, xmax;
212        xmin = (int)(px0/256.0);
213        xmax = (int)(px1/256.0);
214
215        int y, ymin, ymax;
216        ymin = (int)(py0/256.0);
217        ymax = (int)(py1/256.0);
218
219        num = (xmax - xmin + 1) * (ymax - ymin + 1);
220//        if (!num) {
221//            printf("No tiles at zoom(%d)\n", z);
222//            continue;
223//        }
224
225        printf("\nZoom(%d) Now rendering %d tiles\n", z, num);
226        num_all += num;
227        gettimeofday(&start, NULL);
228
229        for (x=xmin; x<=xmax; x++) {
230            for (y=ymin; y<=ymax; y++) {
231                struct stat s;
232                xyz_to_meta(name, sizeof(name), x, y, z);
233                if (stat(name, &s) < 0) {
234                // File doesn't exist
235                    ret = process_loop(fd, x, y, z);
236                }
237                //printf(".");
238                fflush(NULL);
239            }
240        }
241        //printf("\n");
242        gettimeofday(&end, NULL);
243        display_rate(start, end, num);
244    }
245    gettimeofday(&end_all, NULL);
246    printf("\nTotal for all tiles rendered\n");
247    display_rate(start_all, end_all, num_all);
248
249    close(fd);
250    return ret;
251}
252#endif
Note: See TracBrowser for help on using the repository browser.