You are not logged in.

Announcement

*** NOTICE: forum.openstreetmap.org is being retired. Please request a category for your community in the new ones as soon as possible using this process, which will allow you to propose your community moderators.
Please create new topics on the new site at community.openstreetmap.org. We expect the migration of data will take a few weeks, you can follow its progress here.***

#1 2017-05-07 14:11:11

brogo
Member
From: 54,11 +-1°
Registered: 2009-06-02
Posts: 553

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

Offline

#2 2017-05-07 14:29:00

wambacher
Member
From: Schlangenbad/Wambach, Germany
Registered: 2009-12-16
Posts: 16,769
Website

Re: CartoCSS und hstore

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

Last edited by wambacher (2017-05-07 14:29:44)

Offline

#3 2017-05-07 14:34:55

brogo
Member
From: 54,11 +-1°
Registered: 2009-06-02
Posts: 553

Re: CartoCSS und hstore

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

Offline

#4 2017-05-07 14:36:03

maxbe
Member
Registered: 2010-01-19
Posts: 3,255
Website

Re: CartoCSS und hstore

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.

Last edited by maxbe (2017-05-07 14:38:29)

Offline

#5 2017-05-07 15:00:20

wambacher
Member
From: Schlangenbad/Wambach, Germany
Registered: 2009-12-16
Posts: 16,769
Website

Re: CartoCSS und hstore

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?

Last edited by wambacher (2017-05-07 15:04:38)

Offline

#6 2017-05-07 16:18:08

maxbe
Member
Registered: 2010-01-19
Posts: 3,255
Website

Re: CartoCSS und hstore

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.

Offline

#7 2017-05-07 16:52:23

wambacher
Member
From: Schlangenbad/Wambach, Germany
Registered: 2009-12-16
Posts: 16,769
Website

Re: CartoCSS und hstore

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

Offline

#8 2017-05-07 17:12:56

maxbe
Member
Registered: 2010-01-19
Posts: 3,255
Website

Re: CartoCSS und hstore

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

Offline

#9 2017-05-07 18:16:29

wambacher
Member
From: Schlangenbad/Wambach, Germany
Registered: 2009-12-16
Posts: 16,769
Website

Re: CartoCSS und hstore

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

Offline

#10 2017-05-07 20:35:40

brogo
Member
From: 54,11 +-1°
Registered: 2009-06-02
Posts: 553

Re: CartoCSS und hstore

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!

Offline

Board footer

Powered by FluxBB