Erste Schritte in postgres

Anzahl Tags
Folgende Lösung ist mir eingefallen, gibt’s was Eleganteres? Meine Lösung verzählt sich wenn ein Komma im Tag vorkommt.

gis=# select osm_id, (regexp_count(tags::text,',')+1) as nbrtags from postpass_point where tags?'amenity' and geom && bb('lh') limit 10;
   osm_id    | nbrtags
-------------+---------
  8715304903 |       1
  8715304902 |       2
  1831405898 |       1
  6508834562 |       4
  6508834563 |       4
  6602753699 |       2
 12856370477 |      15
  6691317818 |       1
   616503322 |       3
 10997256882 |       1
(10 rows)

EDIT: Man kann nach ", " suchen, dann wird es genauer. Gemini meint array_length(akeys(tags), 1) sei eine gute Lösung, funktioniert allerdings nur bei hstore-Feldern, nicht bei jsonb.

Updaten kann ich meine DB nicht, da --slim nicht gesetzt war, korrekt?

Bug?

Die schnelle Variante von st_area liefert einen area < 0 Error:

gis=# select osm_id,tags->>'name', st_area(geom::geography, false) as sqrm from postpass_polygon where tags->>'natural'='water' order by sqrm desc limit 15;
ERROR:  lwgeom_area_spher(oid) returned area < 0.0

Mit true klappt’s hingegen, es wird der Bodensee ausgeworfen.

Ja, das --slim ist Voraussetzung fürs Updaten. Dann aber geht das mit osm2pgsql-replication ziemlich sorgenfrei.

1 Like

Oder erwarten die postgis Funktionen, dass die GeoObjekte in OGC sind, was ja bei OSM nicht garantiert ist … :wink:

Da 85% aller Polygone buildings sind, habe ich mir mal Indizes auf landuse und natural hinzugefügt. Sehr praktisch, dass der Command “select * from pg_indexes” den SQL-build Befehl ausgibt.

SELECT indexname, indexdef FROM pg_indexes
WHERE tablename = 'postpass_polygon';

Warum gibt es hier einen Fehler? Laut Doku existiert in postgresql eine ROUND Funktion.

SELECT 
    ROUND(SUM(ST_Length(roads.geom::geography)) / 1000,2) AS total_length_km
FROM postpass_line AS roads
...

Während des Ausführung der Overpass Query ist ein Fehler aufgetreten! Die Overpass API gab folgende Meldung zurück:
pq: function round(double precision, integer) does not exist

du musst “SUM(ST_Length(roads.geom::geography)) / 1000” auf numeric casten. Round funktioniert nicht mit double precision. Die erste Antwort in dem StackOverflow-Thread erklärt das ganz gut.

2 Likes