METATILE = 8
# the directory root for meta tiles
HASH_ROOT = "/tiles/default/"
- # lowest zoom that we want to expire
- # MIN_ZOOM=12
- MIN_ZOOM=13
- # highest zoom that we want to expire
- MAX_ZOOM=18
# database parameters
DBNAME="gis"
DBHOST=""
end
# this must match the definition of xyz_to_meta in mod_tile
- def Expire.xyz_to_meta(root, x, y, z)
+ def Expire.xyz_to_meta(x, y, z)
# mask off the final few bits
x &= ~(METATILE - 1)
y &= ~(METATILE - 1)
hash_path = (0..4).collect { |i|
(((x >> 4*i) & 0xf) << 4) | ((y >> 4*i) & 0xf)
}.reverse.join('/')
- root + '/' + z.to_s + '/' + hash_path + ".meta"
+ z.to_s + '/' + hash_path + ".meta"
end
# time to reset to, some very stupidly early time, before OSM started
File.utime(EXPIRY_TIME, EXPIRY_TIME, meta)
end
- def Expire.expire(change_file)
- do_expire(change_file) do |set|
+ def Expire.expire(change_file, min_zoom, max_zoom, tile_dirs)
+ do_expire(change_file, min_zoom, max_zoom) do |set|
new_set = Set.new
meta_set = Set.new
# so that we don't expire things multiple times
set.each do |xy|
# this has to match the routine in mod_tile
- meta = xyz_to_meta(HASH_ROOT, xy[0], xy[1], xy[2])
-
- meta_set.add(meta) if File.exist? meta
+ meta = xyz_to_meta(xy[0], xy[1], xy[2])
+
+ # check each style working out what needs expiring
+ tile_dirs.each do |tile_dir|
+ meta_set.add(tile_dir + "/" + meta) if File.exist?(tile_dir + "/" + meta)
+ end
# add the parent into the set for the next round
new_set.add([xy[0] / 2, xy[1] / 2, xy[2] - 1])
end
end
- def Expire.do_expire(change_file, &block)
+ def Expire.do_expire(change_file, min_zoom, max_zoom, &block)
# read in the osm change file
doc = XML::Document.file(change_file)
end
point = Proj4::Point.new(Math::PI * node['lon'].to_f / 180,
Math::PI * lat / 180)
- nodes[node['id'].to_i] = tile_from_latlon(point, MAX_ZOOM)
+ nodes[node['id'].to_i] = tile_from_latlon(point, max_zoom)
end
# now we look for all the ways that have changed and put all of their nodes into
# loop over results, adding tiles to the change set
res.each do |row|
point = Proj4::Point.new(row[0].to_f / 100.0, row[1].to_f / 100.0)
- nodes[node_id] = tile_from_merc(point, MAX_ZOOM)
+ nodes[node_id] = tile_from_merc(point, max_zoom)
end
# Discard results
set = Set.new nodes.values
# expire tiles and shrink to the set of parents
- (MAX_ZOOM).downto(MIN_ZOOM) do |z|
+ (max_zoom).downto(min_zoom) do |z|
# allow the block to work on the set, returning the set at the next
# zoom level
set = yield set