[Tilecache] Virtual Earth compatible TC-cache
Steven M. Ottens
steven at minst.net
Tue Feb 12 09:48:19 EST 2008
Hi all,
Once I finished it, I realised that it is actually quite a useless piece
of code. There is hardly any asiteuation where you want to store the
cache inside TC as VE-tiles without exposing them to the outer world. So
I decided to write a service instead. The will take a request with a
quadkey and calculate the row and column in epsg:900913:
A typical request would be
http://steef/tilecache.py?ve=true&layer=hoogtes&tile=120
where ve=true triggers the VETMS service in Service.py
layer=hoogtes gives yoou the layer
tile=120 gives you the quad key number.
120 in this case means z= 3, x=4 and y=5
In virtual earth you can add a tilecache-based layer this way:
var tileSourceSpec = new VETileSourceSpecification("ahn",
"http://steef/tilecache.py?ve=true&layer=hoogtes&tile=%4");
Once again the only reason why you want to use this is if you're somehow
stuck with the VE-client, instead of a more friendly one like OpenLayers.
Attached the VETMS service also you need to add the following lines to
Service.py
elif params.has_key("ve") and \
params['ve'] == "true":
from TileCache.Services.VETMS import VETMS
tile = VETMS(self).parse(params, path_info, host)
just above:
else:
from TileCache.Services.TMS import TMS
tile = TMS(self).parse(params, path_info, host)
(line 173)
Regards,
Steven
Steven M. Ottens wrote:
> Hi all,
>
> For those lost souls who want to create a cache which is directly
> compatible with the virtual earth client I've attached a modified
> disk.py, renamed to VE.py. It is written for TC 2.01 and should be put
> in the <tilecache>/Cache folder.
>
> Some information on the VE compatible cache structure:
> http://msdn2.microsoft.com/en-us/library/bb259689.aspx
>
> This VE cache is a flat file structure, which means that you need a
> filesystem that can handle thousands of files in a directory. To be
> honest the only reason why you would want to do this is so you can
> directly add a dataset in virtualearth using the new
> VETileSourceSpecification
> and have the files available in a web-accessible directory. The next
> step will be to add a VE layer so you can use tilecache to dynamically
> generate the VE-tiles.
>
> The reason why you want to create VE-specific tiles is to be able to
> view them in 3D (inside the VE viewer).
>
> Regards,
> Steven
> ------------------------------------------------------------------------
>
> _______________________________________________
> Tilecache mailing list
> Tilecache at openlayers.org
> http://openlayers.org/mailman/listinfo/tilecache
-------------- next part --------------
# BSD Licensed, Copyright (c) 2006-2007 MetaCarta, Inc.
from TileCache.Service import Request, Capabilities
import TileCache.Layer as Layer
class VETMS (Request):
def parse (self, fields, path, host):
# <host>?ve=true&layer=global_mosaic&tile=000.jpg
for key in ['layer','tile']:
if fields.has_key(key.upper()):
fields[key] = fields[key.upper()]
elif not fields.has_key(key):
fields[key] = ""
layer = self.getLayer(fields['layer'])
tilenumber = str(fields['tile'])
quadkey = tilenumber.split(".")[0]
tile = None
cell = self.unQuad(quadkey)
tile = Layer.Tile(layer, int(cell[0]), int(cell[1]), int(cell[2]))
return tile
def unQuad (self, quad):
z = len(quad)
col = int(0)
row = int(pow(2,z)-1)
quadint = int(0)
cell = [0,0,0]
for i in range (0,z):
quadint =int(quad[i])
tmp = int(pow(2,z-(i+1)))
if (quadint ==1):
col += tmp
elif (quadint == 2):
row -= tmp
elif (quadint == 3):
col += tmp
row -= tmp
cell[0] = col
cell[1] = row
cell[2] = z
return cell
def serverCapabilities (self, host):
return Capabilities("text/xml", """<?xml version="1.0" encoding="UTF-8" ?>
<Services>
<VETileMapService version="1.0.0" href="%s?ve=true/" />
</Services>""" % host)
More information about the Tilecache
mailing list