forked from MTSR/mapserver
speed improvement
This commit is contained in:
parent
5be4319aa6
commit
b81e3c8b21
32
db/sqlite.go
32
db/sqlite.go
@ -104,28 +104,28 @@ func (db *Sqlite3Accessor) GetBlock(pos coords.MapBlockCoords) (*Block, error) {
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func sortAsc(a, b int) (int, int){
|
||||||
|
if a > b {
|
||||||
|
return b, a
|
||||||
|
} else {
|
||||||
|
return a, b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (db *Sqlite3Accessor) CountBlocks(pos1 coords.MapBlockCoords, pos2 coords.MapBlockCoords) (int, error){
|
func (db *Sqlite3Accessor) CountBlocks(pos1 coords.MapBlockCoords, pos2 coords.MapBlockCoords) (int, error){
|
||||||
|
|
||||||
poslist := make([]interface{}, 0)
|
poslist := make([]interface{}, 0)
|
||||||
|
|
||||||
if pos1.X != pos2.X {
|
minX, maxX := sortAsc(pos1.X, pos2.X)
|
||||||
return 0, errors.New("x does not line up")
|
minY, maxY := sortAsc(pos1.Y, pos2.Y)
|
||||||
}
|
minZ, maxZ := sortAsc(pos1.Z, pos2.Z)
|
||||||
|
|
||||||
if pos1.Z != pos2.Z {
|
for x := minX; x <= maxX; x++ {
|
||||||
return 0, errors.New("z does not line up")
|
for y := minY; y <= maxY; y++ {
|
||||||
}
|
for z := minZ; z <= maxZ; z++ {
|
||||||
|
poslist = append(poslist, coords.CoordToPlain(coords.NewMapBlockCoords(x,y,z)))
|
||||||
minY := pos1.Y
|
}
|
||||||
maxY := pos2.Y
|
}
|
||||||
|
|
||||||
if minY > maxY {
|
|
||||||
minY, maxY = maxY, minY
|
|
||||||
}
|
|
||||||
|
|
||||||
for y := minY; y <= maxY; y++ {
|
|
||||||
poslist = append(poslist, coords.CoordToPlain(coords.NewMapBlockCoords(pos1.X, y, pos1.Z)))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getBlocksQuery := "select count(*) from blocks b where b.pos in (?" + strings.Repeat(",?", len(poslist)-1) + ")"
|
getBlocksQuery := "select count(*) from blocks b where b.pos in (?" + strings.Repeat(",?", len(poslist)-1) + ")"
|
||||||
|
@ -55,6 +55,11 @@ func (tr *TileRenderer) Render(tc coords.TileCoords) ([]byte, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if img == nil {
|
||||||
|
//empty tile
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
png.Encode(buf, img)
|
png.Encode(buf, img)
|
||||||
|
|
||||||
@ -95,12 +100,17 @@ func (tr *TileRenderer) RenderImage(tc coords.TileCoords) (*image.NRGBA, error)
|
|||||||
return nil, errors.New("No layer found")
|
return nil, errors.New("No layer found")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if tc.Zoom > 13 || tc.Zoom < 1 {
|
||||||
|
return nil, errors.New("Invalid zoom")
|
||||||
|
}
|
||||||
|
|
||||||
if tc.Zoom == 13 {
|
if tc.Zoom == 13 {
|
||||||
//max zoomed in on mapblock level
|
//max zoomed in on mapblock level
|
||||||
mbr := coords.GetMapBlockRangeFromTile(tc, 0)
|
mbr := coords.GetMapBlockRangeFromTile(tc, 0)
|
||||||
mbr.Pos1.Y = layer.From
|
mbr.Pos1.Y = layer.From
|
||||||
mbr.Pos2.Y = layer.To
|
mbr.Pos2.Y = layer.To
|
||||||
|
|
||||||
|
//count blocks
|
||||||
count, err := tr.dba.CountBlocks(mbr.Pos1, mbr.Pos2)
|
count, err := tr.dba.CountBlocks(mbr.Pos1, mbr.Pos2)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -114,8 +124,21 @@ func (tr *TileRenderer) RenderImage(tc coords.TileCoords) (*image.NRGBA, error)
|
|||||||
return tr.mapblockrenderer.Render(mbr.Pos1, mbr.Pos2)
|
return tr.mapblockrenderer.Render(mbr.Pos1, mbr.Pos2)
|
||||||
}
|
}
|
||||||
|
|
||||||
if tc.Zoom > 13 || tc.Zoom < 1 {
|
if tc.Zoom == 12 {
|
||||||
return nil, errors.New("Invalid zoom")
|
//count blocks and ignore empty tiles
|
||||||
|
mbr := coords.GetMapBlockRangeFromTile(tc, 0)
|
||||||
|
mbr.Pos1.Y = layer.From
|
||||||
|
mbr.Pos2.Y = layer.To
|
||||||
|
|
||||||
|
count, err := tr.dba.CountBlocks(mbr.Pos1, mbr.Pos2)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if count == 0 {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//zoom 1-12
|
//zoom 1-12
|
||||||
|
Loading…
Reference in New Issue
Block a user