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