CartoCSS und hstore

Hallo!

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:

#osm-polygon[zoom>11] {
[building!=''] {
  polygon-fill:#444;
}}

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.

Christian

Hi,

-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.

Hier mal mein Import:


OSM2PGSQL  --verbose \
           --create \
           --slim \
           --exclude-invalid-polygon \
           --extra-attributes \
           --style /osm/db/wno_2017.style \
           --port 5432 \
           --database planet3 \
           --latlon \
           --username XXXXXX \
           --hstore-all \
           --hstore-add-index \
           -C 26000 \
           --cache-strategy optimized \
           --number-processes 12 \
           --keep-coastlines \
           --multi-geometry \
planet.pbf

gruss
walter

OK, kannte ich noch nicht.

So kann ich es direkt in psql machen, aber wie kriege ich in Tilemill die Abfrage hin?

Christian

In der Datenbankabfrage:

select way, building, tags->'roof:colour' as roofcolour, amenity, shop from ...

und im CSS


#osm-polygon[zoom>11] {
[roofcolour='red'] {
  polygon-fill:#ff0000;
}}

ok, blödes Beispiel, vielleicht… Zum Rumspielen würde ich einfach mal ein paar Abfragen in psql machen, dann sieht man, was passiert.

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.

Ein wenig bin ich noch unsicher. Wenn du sagen willst, dass dein CSS-Beispiel NICHT mit Tilemill läuft, sind wir uns einig.

Gruss
walter

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.

Grüße, Max

Jo, das macht Sinn. Mal sehen, ob der Kollege uns darüber informiert.

Gruss
walter

Ja, so klappt! Ganz vollständig sähe es dann so aus:

(SELECT way, osm_id, tags->'roof:colour' as roofcolour from planet_osm_polygon) as osm_buildings

Danke!