[Maps-l] introduction: the new osm database

Peter Körner osm-lists at mazdermind.de
Tue May 11 19:42:11 UTC 2010


Hi folks,

I'm proud to announce the availability of a new osm database that holds 
all nodes, ways and polygons with all used tags used in osm.

It uses the postgresql hstore extension to form a "tags" column which is 
an indexed hash array of all tags. despite that it has the "ways"-column 
known from regular osm2pgsql databases and the normal tag-columns that 
are listed in osm2pgsql's default.style.

Because of this combined scheme it is adequate for a lot of queries. To 
take use of the indexes you'll need to follow some rules. I'll point out 
some of them and also give some examples on how to use the new scheme.

I'll switch the diff-update process from the classic scheme to the new 
combined scheme in the next days and drop the old scheme (tables 
starting with planet_osm) in about two weeks if no one protests. I'll 
take some days to catch up.



== a query in a (relative) small area ==
in this case the geometry-index is the most important one and you can 
use the tags-column as you wish:

SELECT tags
   FROM planet_point
  WHERE
    (tags->'man_made' = 'surveillance') AND
    way && ST_Transform(ST_SetSRID(ST_MakeBox2D(
      ST_Point(8.17,50.04),
      ST_Point(8.36,49.95)
    ), 4326),900913);


== a query on a rarely used tag in a large area ==
in such a case you want to use the index on the tags-column to identify 
the nodes. the index only knows "which node has which tag", means it 
doesn't know anything about the values. So to take use of the index you 
need two different conditions: one to filter for the tag and a second 
one for the tags value:

SELECT tags
   FROM planet_point
  WHERE
    (tags ? 'club-mate') AND
    (tags->'club-mate' = 'yes')


== a query on a heavy used tag ==
in the case of a heavy used tag (eg. amenity), the gin-index on the 
hstore column does not work very good, especially when the tag has a 
such huge number of different values, because (as we learned before) the 
index doesn't know anything about the value. In such a case its better 
to use the regular columns. anyway such a query is always a bad idea, if 
you don't specify a small enough bounding box, so don't run this query, 
please:

SELECT tags
   FROM planet_point
  WHERE
    amenity = 'restaurant'


== live statistics ==
a very cool feature of the hstore column is that you can get live tag 
usage statistics from it. please don't run this on the whole planet 
before talking about it on this list, as it will may drive the 
database-server down, but for small or medium sized regions, it's really 
cool:

SELECT key, count(*)
   FROM (
      SELECT (each(tags)).key
        FROM planet_point
       WHERE
         way && ST_Transform(ST_SetSRID(ST_MakeBox2D(
           ST_Point(8.17,50.04),
           ST_Point(8.36,49.95)
         ), 4326),900913)
      ) AS stat
  GROUP BY key
  ORDER BY count DESC, key
  LIMIT 20;


== rendering ==
thanks to river we have a quite nice rendeing stack on willow. You can 
use the command line tool /home/project/o/s/m/osm/bin/render to test 
your own styles and if they're ready you can mail them to this list so 
we can configure renderd to render tiles for them.

To show the capabilities of the new hstore scheme in conjunction with 
the rendering system, I created a style that renders surveillance cctvs 
on a transparent overlay. It's a quite simple style but it shows how to 
do things. It's located at 
/home/project/o/s/m/osm/data/styles/surveillance/surveillance.xml and 
should be redable for everyone.

to render a map of germany in this style, just log on to willow and call

render --bbox 5.56,55.04,15.35,47.15 --style 
/home/mazder/styles/surveillance/surveillance.xml --size 2000x2000

it will create a map.png if the current directory. Call 
/home/project/o/s/m/osm/bin/render --help to learn about the possible 
parameters.

You'll want to add /home/project/o/s/m/osm/bin/ to your PATH in your 
.bash_profile so you can just all render without a path.

I also added the style to the renderd config and you can take a look at 
it under 
http://toolserver.org/~osm/styles/?zoom=12&lat=52.50546&lon=13.42461&layers=00TB0 
The style is not perfect, the icons are too big but hey - its just a sample.


Thank you for reading. I'm happily looking forward in seeing cool map 
styles and useful tools. If you got questions, just ask at 
<maps-l at lists.wikimedia.org>.

Peter



More information about the Maps-l mailing list