From 33337d5df2297ca3973955afe9463ec990352108 Mon Sep 17 00:00:00 2001 From: "Sascha L. Teichmann" Date: Sun, 21 Sep 2014 12:57:21 +0200 Subject: [PATCH] mtwebmapper: Added scaffold for updating the pyramid tiles. TODO: Implement th actual imaging stuff. --- cmd/mtwebmapper/tilesupdater.go | 67 +++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/cmd/mtwebmapper/tilesupdater.go b/cmd/mtwebmapper/tilesupdater.go index 70f9ab9..11df3c3 100644 --- a/cmd/mtwebmapper/tilesupdater.go +++ b/cmd/mtwebmapper/tilesupdater.go @@ -29,10 +29,27 @@ type xz struct { Z int16 } +type xzm struct { + P xz + Mask uint16 +} + func (c xz) quantize() xz { return xz{X: (c.X - -1933) / 16, Z: (c.Z - -1933) / 16} } +func (c xz) dequantize() xz { + return xz{X: c.X*16 + -1933, Z: c.Z*16 + -1933} +} + +func (c xz) parent() xzm { + xp, xr := c.X>>1, uint16(c.X&1) + zp, zr := c.Z>>1, uint16(c.Z&1) + return xzm{ + P: xz{X: xp, Z: zp}, + Mask: ((1 << xr) << 2) | (1 << zr)} +} + func newTileUpdater(mapDir, redisAddress string, colors *common.Colors, workers int) *tileUpdater { tu := tileUpdater{ mapDir: mapDir, @@ -95,24 +112,58 @@ func (tu *tileUpdater) doUpdates() { go updateBaseTiles(jobs, btc, &done) } + parentJobs := make(map[xz]uint16) + for c, _ := range changes { - log.Printf("job: %+v", c) + //log.Printf("job: %+v", c) jobs <- c + pxz := c.parent() + parentJobs[pxz.P] |= pxz.Mask } + close(jobs) done.Wait() + + for level := 7; level >= 0; level-- { + pJobs := make(chan xzm) + for i, n := 0, min(len(parentJobs), tu.workers); i < n; i++ { + done.Add(1) + go updatePyramidTiles(level, baseDir, pJobs, &done) + } + ppJobs := make(map[xz]uint16) + for c, mask := range parentJobs { + pJobs <- xzm{P: c, Mask: mask} + pxz := c.parent() + ppJobs[pxz.P] |= pxz.Mask + } + close(pJobs) + done.Wait() + parentJobs = ppJobs + } + } +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func updatePyramidTiles(level int, baseDir string, jobs chan xzm, done *sync.WaitGroup) { + defer done.Done() + for job := range jobs { + _ = job } - return } func updateBaseTiles(jobs chan xz, btc *common.BaseTileCreator, done *sync.WaitGroup) { + defer btc.Close() + defer done.Done() for job := range jobs { - x := job.X*16 + -1933 - 1 - z := job.Z*16 + -1933 - 1 - log.Printf("%d/%d %d/%d", x, z, job.X, job.Z) - if err := btc.CreateTile(x, z, int(job.X), int(job.Z)); err != nil { + xz := job.dequantize() + //log.Printf("%d/%d %d/%d", x, z, job.X, job.Z) + if err := btc.CreateTile(xz.X-1, xz.Z-1, int(job.X), int(job.Z)); err != nil { log.Printf("WARN: create tile failed: %s", err) } } - btc.Close() // TODO: Keep redis connection open to update the pyramid tiles. - done.Done() }