2019-02-14 11:02:46 +03:00
|
|
|
package postgres
|
|
|
|
|
|
|
|
import (
|
2019-02-14 16:16:32 +03:00
|
|
|
"mapserver/coords"
|
2019-02-14 11:02:46 +03:00
|
|
|
"mapserver/db"
|
2019-02-14 11:05:39 +03:00
|
|
|
"mapserver/layer"
|
|
|
|
"mapserver/settings"
|
2019-02-14 21:59:35 +03:00
|
|
|
"math"
|
|
|
|
|
|
|
|
"github.com/sirupsen/logrus"
|
2019-02-14 11:02:46 +03:00
|
|
|
)
|
|
|
|
|
2019-02-14 11:05:39 +03:00
|
|
|
const (
|
2019-02-14 16:16:32 +03:00
|
|
|
SETTING_LAST_LAYER = "last_layer"
|
2019-02-14 16:04:01 +03:00
|
|
|
SETTING_LAST_X_BLOCK = "last_x_block"
|
|
|
|
SETTING_LAST_Y_BLOCK = "last_y_block"
|
2019-02-14 11:05:39 +03:00
|
|
|
)
|
2019-02-14 11:02:46 +03:00
|
|
|
|
2019-02-14 16:04:01 +03:00
|
|
|
// x -> 0 ... 256
|
|
|
|
|
|
|
|
//zoom/mapblock-width
|
|
|
|
//13 1
|
|
|
|
//12 2
|
|
|
|
//11 4
|
|
|
|
//10 8
|
|
|
|
//9 16
|
|
|
|
|
|
|
|
//Zoom 9:
|
|
|
|
//10 mapblocks height * 16 * 16 == 2560
|
|
|
|
|
2019-02-14 11:02:46 +03:00
|
|
|
func (this *PostgresAccessor) FindNextInitialBlocks(s settings.Settings, layers []*layer.Layer, limit int) (*db.InitialBlocksResult, error) {
|
2019-02-14 11:13:18 +03:00
|
|
|
|
2019-02-14 16:04:01 +03:00
|
|
|
lastlayer := s.GetInt(SETTING_LAST_LAYER, 0)
|
2019-02-15 09:36:31 +03:00
|
|
|
lastxblock := s.GetInt(SETTING_LAST_X_BLOCK, -129)
|
2019-02-14 16:04:01 +03:00
|
|
|
lastyblock := s.GetInt(SETTING_LAST_Y_BLOCK, -128)
|
|
|
|
|
|
|
|
if lastxblock >= 128 {
|
|
|
|
lastxblock = -128
|
|
|
|
lastyblock++
|
|
|
|
|
|
|
|
} else {
|
|
|
|
lastxblock++
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if lastyblock > 128 {
|
|
|
|
//done
|
2019-02-15 11:04:34 +03:00
|
|
|
var nextlayer = lastlayer
|
|
|
|
for _, l := range layers {
|
|
|
|
if l.Id > nextlayer {
|
|
|
|
nextlayer = l.Id
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
s.SetInt(SETTING_LAST_LAYER, nextlayer)
|
|
|
|
s.SetInt(SETTING_LAST_X_BLOCK, -129)
|
|
|
|
s.SetInt(SETTING_LAST_Y_BLOCK, -128)
|
2019-02-14 16:04:01 +03:00
|
|
|
|
|
|
|
result := &db.InitialBlocksResult{}
|
2019-02-15 11:04:34 +03:00
|
|
|
result.HasMore = nextlayer != lastlayer
|
2019-02-14 16:04:01 +03:00
|
|
|
return result, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
tc := coords.NewTileCoords(lastxblock, lastyblock, 9, lastlayer)
|
|
|
|
currentlayer := layer.FindLayerById(layers, lastlayer)
|
|
|
|
|
2019-02-14 21:59:35 +03:00
|
|
|
fromY := int(currentlayer.From / 16)
|
|
|
|
toY := int(currentlayer.To / 16)
|
|
|
|
|
2019-02-15 09:36:31 +03:00
|
|
|
tcr := coords.GetMapBlockRangeFromTile(tc, 0)
|
|
|
|
tcr.Pos1.Y = fromY
|
|
|
|
tcr.Pos2.Y = toY
|
2019-02-14 16:04:01 +03:00
|
|
|
|
|
|
|
fields := logrus.Fields{
|
2019-02-15 11:08:22 +03:00
|
|
|
"layerId": lastlayer,
|
|
|
|
"pos1": tcr.Pos1,
|
|
|
|
"pos2": tcr.Pos2,
|
|
|
|
"tile": tc,
|
2019-02-14 16:04:01 +03:00
|
|
|
}
|
2019-02-15 23:32:09 +03:00
|
|
|
log.WithFields(fields).Info("Initial-Query")
|
2019-02-15 09:36:31 +03:00
|
|
|
|
|
|
|
minX := int(math.Min(float64(tcr.Pos1.X), float64(tcr.Pos2.X)))
|
|
|
|
maxX := int(math.Max(float64(tcr.Pos1.X), float64(tcr.Pos2.X)))
|
|
|
|
minY := int(math.Min(float64(tcr.Pos1.Y), float64(tcr.Pos2.Y)))
|
|
|
|
maxY := int(math.Max(float64(tcr.Pos1.Y), float64(tcr.Pos2.Y)))
|
|
|
|
minZ := int(math.Min(float64(tcr.Pos1.Z), float64(tcr.Pos2.Z)))
|
|
|
|
maxZ := int(math.Max(float64(tcr.Pos1.Z), float64(tcr.Pos2.Z)))
|
|
|
|
|
2019-02-15 23:32:09 +03:00
|
|
|
//upper left: https://pandorabox.io/map/tiles/0/9/-121/-121
|
|
|
|
//lower right: https://pandorabox.io/map/tiles/0/9/120/120
|
|
|
|
// INFO[0007] Initial rendering elapsed=24.749287ms mapblocks=0 progress%=2 tiles=0
|
|
|
|
//INFO[0007] Initial-Query layerId=0 pos1="&{-1968 -1 1935}" pos2="&{-1953 10 1920}" prefix=postgres-db tile="&{-123 -121 9 0}"
|
|
|
|
//INFO[0007] Initial rendering elapsed=24.587519ms mapblocks=0 progress%=2 tiles=0
|
|
|
|
//INFO[0007] Initial-Query layerId=0 pos1="&{-1952 -1 1935}" pos2="&{-1937 10 1920}" prefix=postgres-db tile="&{-122 -121 9 0}"
|
|
|
|
//INFO[0007] Initial rendering elapsed=24.607329ms mapblocks=0 progress%=2 tiles=0
|
|
|
|
//INFO[0007] Initial-Query layerId=0 pos1="&{-1936 -1 1935}" pos2="&{-1921 10 1920}" prefix=postgres-db tile="&{-121 -121 9 0}"
|
|
|
|
//INFO[0007] Initial rendering elapsed=25.090037ms mapblocks=0 progress%=2 tiles=0
|
|
|
|
//INFO[0007] Initial-Query layerId=0 pos1="&{-1920 -1 1935}" pos2="&{-1905 10 1920}" prefix=postgres-db tile="&{-120 -121 9 0}"
|
|
|
|
//INFO[0007] Initial rendering elapsed=24.754558ms mapblocks=0 progress%=2 tiles=0
|
|
|
|
//INFO[0007] Initial-Query layerId=0 pos1="&{-1904 -1 1935}" pos2="&{-1889 10 1920}" prefix=postgres-db tile="&{-119 -121 9 0}"
|
|
|
|
//INFO[0007] Initial rendering elapsed=24.711348ms mapblocks=0 progress%=2 tiles=0
|
|
|
|
|
2019-02-15 09:36:31 +03:00
|
|
|
if lastxblock <= -128 {
|
|
|
|
//first x entry, check z stride
|
|
|
|
stridecount := this.intQuery(`
|
|
|
|
select count(*) from blocks
|
|
|
|
where posz >= $1 and posz <= $2
|
2019-02-15 19:33:49 +03:00
|
|
|
and posy >= $3 and posy <= $4`,
|
2019-02-15 09:36:31 +03:00
|
|
|
minZ, maxZ,
|
|
|
|
minY, maxY,
|
|
|
|
)
|
|
|
|
|
|
|
|
if stridecount == 0 {
|
|
|
|
fields = logrus.Fields{
|
|
|
|
"minX": minX,
|
|
|
|
"maxX": maxX,
|
|
|
|
"minY": minY,
|
|
|
|
"maxY": maxY,
|
|
|
|
}
|
|
|
|
log.WithFields(fields).Debug("Skipping stride")
|
2019-02-15 00:20:56 +03:00
|
|
|
|
2019-02-15 09:36:31 +03:00
|
|
|
s.SetInt(SETTING_LAST_LAYER, lastlayer)
|
|
|
|
s.SetInt(SETTING_LAST_X_BLOCK, -129)
|
|
|
|
s.SetInt(SETTING_LAST_Y_BLOCK, lastyblock+1)
|
2019-02-15 00:20:56 +03:00
|
|
|
|
2019-02-15 09:36:31 +03:00
|
|
|
result := &db.InitialBlocksResult{}
|
2019-02-15 11:08:22 +03:00
|
|
|
result.Progress = float64(((lastyblock+128)*256)+(lastxblock+128)) / float64(256*256)
|
2019-02-15 09:36:31 +03:00
|
|
|
result.HasMore = true
|
|
|
|
return result, nil
|
|
|
|
}
|
2019-02-15 00:20:56 +03:00
|
|
|
}
|
|
|
|
|
2019-02-14 16:04:01 +03:00
|
|
|
rows, err := this.db.Query(getBlocksByInitialTileQuery,
|
2019-02-14 21:59:35 +03:00
|
|
|
minX, minY, minZ, maxX, maxY, maxZ,
|
2019-02-14 16:04:01 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
defer rows.Close()
|
|
|
|
blocks := make([]*db.Block, 0)
|
2019-02-15 19:33:49 +03:00
|
|
|
var lastmtime int64
|
2019-02-14 16:04:01 +03:00
|
|
|
|
2019-02-15 23:32:09 +03:00
|
|
|
for rows.Next() {
|
|
|
|
var posx, posy, posz int
|
|
|
|
var data []byte
|
|
|
|
var mtime int64
|
2019-02-14 16:04:01 +03:00
|
|
|
|
2019-02-15 23:32:09 +03:00
|
|
|
err = rows.Scan(&posx, &posy, &posz, &data, &mtime)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
2019-02-15 00:20:56 +03:00
|
|
|
}
|
2019-02-15 23:32:09 +03:00
|
|
|
|
|
|
|
if mtime > lastmtime {
|
|
|
|
lastmtime = mtime
|
2019-02-15 00:20:56 +03:00
|
|
|
}
|
2019-02-15 23:32:09 +03:00
|
|
|
|
|
|
|
mb := convertRows(posx, posy, posz, data, mtime)
|
|
|
|
blocks = append(blocks, mb)
|
2019-02-14 16:04:01 +03:00
|
|
|
}
|
|
|
|
|
2019-02-14 21:59:35 +03:00
|
|
|
s.SetInt(SETTING_LAST_LAYER, lastlayer)
|
|
|
|
s.SetInt(SETTING_LAST_X_BLOCK, lastxblock)
|
|
|
|
s.SetInt(SETTING_LAST_Y_BLOCK, lastyblock)
|
|
|
|
|
2019-02-14 16:04:01 +03:00
|
|
|
result := &db.InitialBlocksResult{}
|
2019-02-15 19:33:49 +03:00
|
|
|
result.LastMtime = lastmtime
|
2019-02-15 11:08:22 +03:00
|
|
|
result.Progress = float64(((lastyblock+128)*256)+(lastxblock+128)) / float64(256*256)
|
2019-02-14 16:04:01 +03:00
|
|
|
result.List = blocks
|
|
|
|
result.HasMore = true
|
2019-02-14 11:13:18 +03:00
|
|
|
|
2019-02-14 16:04:01 +03:00
|
|
|
return result, nil
|
2019-02-14 11:02:46 +03:00
|
|
|
}
|