Source code for TileCache.Services.KML

# BSD Licensed, Copyright (c) 2006-2010 TileCache Contributors

from TileCache.Service import Request, Capabilities
from TileCache.Services.TMS import TMS
import TileCache.Layer as Layer

[docs]class KML(TMS):
[docs] def parse (self, fields, path, host): tile = TMS.parse(self,fields, path, host) kml = self.generate_kml_doc(tile, base_path=host) return ("application/vnd.google-earth.kml+xml", kml)
[docs] def generate_kml_doc(self, tile, base_path="", include_wrapper = True): tiles = [ Layer.Tile(tile.layer, tile.x << 1, tile.y << 1, tile.z + 1), Layer.Tile(tile.layer, (tile.x << 1) + 1, tile.y << 1, tile.z + 1), Layer.Tile(tile.layer, (tile.x << 1) + 1, (tile.y << 1) + 1, tile.z + 1), Layer.Tile(tile.layer, tile.x << 1 , (tile.y << 1) + 1, tile.z + 1) ] network_links = [] for single_tile in tiles: if single_tile.z >= len(tile.layer.resolutions): continue b = single_tile.bounds() network_links.append("""<NetworkLink> <name>tile</name> <Region> <Lod> <minLodPixels>256</minLodPixels><maxLodPixels>-1</maxLodPixels> </Lod> <LatLonAltBox> <north>%s</north><south>%s</south> <east>%s</east><west>%s</west> </LatLonAltBox> </Region> <Link> <href>%s/1.0.0/%s/%s/%s/%s.kml</href> <viewRefreshMode>onRegion</viewRefreshMode> </Link> </NetworkLink>""" % (b[3], b[1], b[2], b[0], base_path, single_tile.layer.name, single_tile.z, single_tile.x, single_tile.y)) b = tile.bounds() kml = [] if include_wrapper: kml.append( """<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://earth.google.com/kml/2.1">""") if tile.z == len(tile.layer.resolutions) - 1: max_lod_pixels = -1 else: max_lod_pixels = 512 kml.append(""" <Document> <Region> <Lod> <minLodPixels>256</minLodPixels><maxLodPixels>%d</maxLodPixels> </Lod> <LatLonAltBox> <north>%s</north><south>%s</south> <east>%s</east><west>%s</west> </LatLonAltBox> </Region> <GroundOverlay> <drawOrder>%s</drawOrder> <Icon> <href>%s/1.0.0/%s/%s/%s/%s</href> </Icon> <LatLonBox> <north>%s</north><south>%s</south> <east>%s</east><west>%s</west> </LatLonBox> </GroundOverlay> %s """ % (max_lod_pixels, b[3], b[1], b[2], b[0], tile.z, base_path, tile.layer.name, tile.z, tile.x, tile.y, b[3], b[1], b[2], b[0], "\n".join(network_links))) if include_wrapper: kml.append("""</Document></kml>""" ) kml = "\n".join(kml) return kml