Sorry for the first, stupid mail.

I'm trying to write a nginx module which does more or less the same like
mod_tile. I reviewed a lot of the code but now I have a little problem
with the computation of paths to meta tiles. Could someone please
explain me how mod_tile creates file paths from a request and how the
offset is computed? My own code looks exactly the same but returns
x=0,z=0 for every input. I'm highly confused :)

The original code should look like this:

int xyz_to_meta(char *path, size_t len, const char *tile_dir, const char 
*xmlconfig, int x, int y, int z)
{
    unsigned char i, hash[5], offset, mask;

    // Each meta tile winds up in its own file, with several in each leaf 
directory
    // the .meta tile name is beasd on the sub-tile at (0,0)
        mask = METATILE - 1;
    offset = (x & mask) * METATILE + (y & mask);
    x &= ~mask;
    y &= ~mask;

    for (i=0; i<5; i++) {
        hash[i] = ((x & 0x0f) << 4) | (y & 0x0f);
        x >>= 4;
        y >>= 4;
    }
#ifdef DIRECTORY_HASH
    snprintf(path, len, "%s/%s/%d/%u/%u/%u/%u/%u.meta", tile_dir, xmlconfig, z, 
hash[4], hash[3], hash[2], hash[1], hash[0]);
#else
    snprintf(path, len, "%s/%s/%d/%u/%u.meta", tile_dir, xmlconfig, z, x, y);
#endif
    return offset;
}
#endif

The nginx code looks like this:

#define METATILE (8)
static ngx_int_t
ngx_http_serve_request_handler(ngx_http_request_t *r, struct protocol *cmd)
{

        char                                                    *path;
        unsigned char                                           hash[5],offset, 
mask;
        int                                                     i,x,y;

        ngx_http_core_loc_conf_t                *clcf;

        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);

        if((path = ngx_palloc(r->pool, 256)) == NULL)             
                return NGX_HTTP_INTERNAL_SERVER_ERROR;

        printf("original: %d, %d, %d\n", cmd->z, cmd->x, cmd->y);
        x = cmd->x;
        y = cmd->y;
        //build meta file name
        mask = METATILE - 1;
        offset = (x & mask) * METATILE + (y & mask);
        x &= ~mask;
        y &= ~mask;
        for(i=0; i<5;i++) {
                hash[i] = ((x & 0x0f) << 4) | (y & 0x0f);
                x >>=4;
                y >>=4;
        }

        printf("%d,%u,%u\n",cmd->z,x,y);

        return NGX_OK;
}

Thanks for any help.

best regards

philipp



_______________________________________________
dev mailing list
dev@openstreetmap.org
http://lists.openstreetmap.org/listinfo/dev

Reply via email to