Ich versuche gerade einen Kartenstil für Mapnik zu erstellen. Dazu nutze ich Tilemill. Ich habe eine Postgres-Datenbank mit Postigs mittels osm2pgsql und default.style gefüttert. Dabei ich ich die Option ‘-k’ gewählt, also eine zusätzliche hstore-Spalte eingefügt.
Eine normales Kartenobjekt, wie ich es mir erstellt habe, sieht etwa so aus:
Doch wie kann ich eine Abfrage über die hstore-Spalte machen? Ich weiß ich könnte die .style-Datei ändern und somit zusätzliche Spalten einfügen. Das gibt mir aber trotzdem nicht die Flexibiltät einer hstore-Spalte, in der ALLE Tags abfragbar sind.
-k steht ja für --hstore : damit werden alle Tags in die DB übernommen, für die es kein eigenes Datenfeld gibt. Ich würde lieber mit --hstore-all importieren, da dann alle Tags in dem Hstore landen und du dir dann nicht merken muss, ob der Tag im Hstore steht oder eine eigene Spalte hat. Kostet nur etwas Speicher.
Aber egal, was du machst: Mit select tags->‘key’ kommst an den Wert im Hstore ran. Und mit if tags ? ‘key’ kannst du testen, ob der Key im Hstore enthalten ist.
Zudem empfehle ich noch die Option –hstore-add-index, die für die nötige Performance sorgt.
Sorry, da muss ich passen. Ich kenne “nur” Mapnik und da werden ganz normale SQL-Abfragen verwendet.
Das CSS-Beispiel von maxbe erscheint mir allerdings merkwürdig, da hier für roofcolour das Datenfeld aber nicht der Hstore verwendet wird.
Gruss
walter
ps: Ich habe irgendwie im Hinterkopf, dass Tilemill “tot” sein soll - eventuell springst du gerade auf das falsche Pferd?
Ich mache das so, weil ich mir dann beim Renderer keine Gedanken darüber machen muss, wie man dem die Pfeilchen und Anführungszeichen beibringt. Das ist für ihn einfach ein Feld wie jedes andere:
select building,tags->'roof:colour' as roofcolour,amenity,shop from osm_polygon
where tags?'roof:colour'
and (amenity is not null or shop is not null )
limit 6;
building | roofcolour | amenity | shop
----------+------------+--------------+-------------
yes | red | kindergarten |
retail | grey | | furniture
yes | lightgrey | | mall
yes | #CCCCCC | parking |
yes | darkgrey | | supermarket
yes | silver | recycling |
Wie man das Tilemill beibringt, weiss ich auch nicht. Bei Mapnik und Mapserver haut es so hin.
Ich habs nicht ausprobiert, will mir auch grad kein Tilemill installieren. Ich bin mir aber recht sicher, dass man hier in Schritt 6 statt “(SELECT * from dc_census_tracts)” auch gut “(SELECT way, osm_id, tags->‘roof:colour’ as roofcolour from planet_osm_polygon)” eintragen kann und dann die Spalte “roofcolour” im CSS verwenden kann.