[OSM-dev] Proposal: Database accelerator and dirty tile marker based on simple algorithm.

Nick Hill nick at nickhill.co.uk
Sat Sep 16 21:46:45 BST 2006


Nick Hill wrote:

> So I propose that if we should use a quad-tree principle, it would be on 
> the basis of coding complexity comparison, computing requirement, data 
> locality in database (areas on the hard drive roughly corresponding to 
> localities in real world) and whether the easier selection of larger 
> areas is justifiable.
> 

Developing this still further, we will want to have a scalable map which 
operates over a wide range of zooms. At close zoom levels, fie features 
are selected and shown. At lower zoom levels, large lakes and parks, A, 
B, Motorways and rail lines shown. At lower level, A, Motorway and 
intercity rail network shown. Lower level, Motorways and intercity 
lines. Lowest zooms, very large features such as huge inland lakes. All 
zooms, country outlines.

By using a quad-tree style tile to represent the 16 
most-significant-bits of objects lat and lon (32 bits), the selection of 
areas on a regional and country scale would be made simpler and less DB 
intensive.

To achieve this sort of scalability, we would need a table with 
basically 3 fields. Quadtree-style tile 32 bit (with interleaved 
lat/lon), Object zoom value (the maximum zoom level an object will 
remain visible at) and reference to object.

There is a problem where large scale views of an area will constantly be 
invalidated by small changes in the area, despite those changes not 
affecting objects visible at the current zoom level.

For example, you may view the whole London area A-road network. From one 
view to the next, the whole lot will be invalidated from tiny changes to 
minor roads, which are not visible at your zoom level.

This is where the variable bitmask and zoom level become one of the same 
thing.

If a feature with a zoom value of 0 is modified, only the smallest 
invalidation tile has it's timestamp updated and the tile location 
written to the invalidation table.

If a feature with zoom value 1 is modified or created, exactly the same 
happens for 0. After that update, the last 2 bits of the quad-tree tile 
are set to 0 and an entry is put into/timestamp updated for zoom level 1.

If a feature with zoom value 2 is modified or created, exactly the same 
happens for 0 and for 1. After those updates, the last 4 bits of the 
quad-tree tile are set to 0 and an entry is put into/timestamp updated 
for zoom level 2.

and so on.

This way, a tile is only invalidated if an object which will show at 
that zoom level is changed.

The table has a primary key based on invalidation tile and zoom level. 
Inserts to the table are set to update on duplicate so only the freshest 
time stamp for an area is kept.

I wonder if tomorrow I will understand what I have just written?





More information about the dev mailing list