x

CartoCSS und hstore


  1. CartoCSS und hstore · brogo (Gast) · 07.05.2017 14:11 · [flux]

    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


    • Re: CartoCSS und hstore · wambacher (Gast) · 07.05.2017 14:29 · [flux]

      brogo wrote:

      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.

      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


    • Re: CartoCSS und hstore · brogo (Gast) · 07.05.2017 14:34 · [flux]

      wambacher wrote:

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

      OK, kannte ich noch nicht.

      wambacher wrote:

      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.

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

      Christian


    • Re: CartoCSS und hstore · maxbe (Gast) · 07.05.2017 14:36 · [flux]

      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.


    • Re: CartoCSS und hstore · wambacher (Gast) · 07.05.2017 15:00 · [flux]

      brogo wrote:

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

      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?


    • Re: CartoCSS und hstore · maxbe (Gast) · 07.05.2017 16:18 · [flux]

      wambacher wrote:

      Das CSS-Beispiel von maxbe erscheint mir allerdings merkwürdig, da hier für roofcolour das Datenfeld aber nicht der Hstore verwendet wird.

      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.


    • Re: CartoCSS und hstore · wambacher (Gast) · 07.05.2017 16:52 · [flux]

      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


    • Re: CartoCSS und hstore · maxbe (Gast) · 07.05.2017 17:12 · [flux]

      wambacher wrote:

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

      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


    • Re: CartoCSS und hstore · wambacher (Gast) · 07.05.2017 18:16 · [flux]

      maxbe wrote:

      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.

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

      Gruss
      walter


    • Re: CartoCSS und hstore · brogo (Gast) · 07.05.2017 20:35 · [flux]

      maxbe wrote:

      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.

      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!