Thanks for looking at this project. I am building an open source panorama viewing system (similar in concept to Google Street View). This project is focusing on just one but an important module for the whole system - The image tile server.
This tool will accept requests via a URL then grab the full panorama image (from either a remote server or local store) and return the requested tile to the user.
I would like a fast system for serving panoramic images running on Google apps engine.
The original images will either be an external HTTP or FTP URL or a path to a file in an image on the local data store.
An image tile will be requested from this server with a URL something like this
[url removed, login to view]
Tile size = normally 256 or 512 - all tiles are square
X,Y,Z = the tile position and zoom level for the image stack (tile structure link below)
image = an encrypted location for the image. (described below)
Please use the same tiling structure as suggested in this page -> [url removed, login to view]
Note that the request for one tile will quickly followed (or occur simultaneously) with the request for more tiles from the same image. Please ensure the image is only retrieved, tiled and cached only once in this case.
Cache the resulting tiles, no need to cache the original file
I want to prevent people using the tool without going via our main server. This is why the image location in the URL is encrypted. So this system will have a "Secret Key" to decrypt the image location. The server (not part of this project) that will generate the URL will be PHP based so please use an encryption method that is available as standard in both PHP and Google Apps engine.
Only use valid URL and image paths once decrypted - if path not valid return an "Invalid image path".
The system is to have a few limits set by variables that will limit the disk space and the size of the images users can access. (see below)
System configuration Variables
* MB limit to image tiles = 2000 | tile_cache = 2000
* secret key | secret = emuview
* max tile size px| max_tile = 512
* max tile zoom level | max_tile_zoom = 5
* min tile zoom level | max_tile_zoom = 0
When tiling an image please create all the tiles for the image for each zoom level and store in the cache.
There is some room for running over the max cache size. So to deal with the size of the cache you could - once a new image is tilled - check if the cache is over size - and if so, delete enough oldest accessed images to bring it back under the max size.
Please note that this is deleting the oldest access (not oldest created) images.
Store the tiles in a way that makes them as fast as possible to serve. For example - please ensure that we are not recalculating the image location decryption on each tile requested from the cache as this can be stored as part of the file name.
As tiles are removed from the cache it is likely that only part of a full panorama will remain in the cache - this is good as people will not explore all images to the same depth. But if one one of the missing tiles is then requested the full images will need to be collected and re-tilled
Please make it as fast and efficient as possible.
Google apps engine has a image handling API that I suspect will be the fastest way for producing the tiles - but I will leave that up to you to decide if it is the best way to go.
I hope that all makes sense - let me know if you have any questions.
Should be a fun project I think.