You are not logged in.
- Topics: Active | Unanswered
Announcement
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.***
Pages: 1
#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
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.pbfgruss
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
-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.
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
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
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
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
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
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_buildingsDanke!
Offline
Pages: 1