[postgis-devel] Much slower processing on GEOS 3.9.0 versus 3.8.0 for geodesic area calculation

Marco Boeringa marco at boeringa.demon.nl
Mon Apr 26 03:03:39 PDT 2021


Hi all,

I am seeing a very significant performance regression (104x) when 
attempting to calculate geodesic area using PostGIS after upgrading GEOS 
from 3.8.0 to 3.9.0:

POSTGIS 3.1.1 / GEOS 3.8.0: 1m52s
POSTGIS 3.1.1 / GEOS 3.9.0: 3h(!)14m45s

This makes it impossible for me to process planet level OpenStreetMap 
data, and I had to restore a backup to get back to a usable situation.

The actual code run is nothing more than what the PostGIS manual shows:

"float ST_Area(geography geog, boolean use_spheroid=true);"

Note that the OpenStreetMap data, as imported by osm2pgsql, is stored in 
PostGIS in WGS1984 / SRID 4326 as 'geometry', so in order to use it in 
'ST_Area', the data is simply cast to 'geography':

"ST_Area(way::geography,true)"

Nothing else happens in this part of the processing when the performance 
regression is visible. In fact, other more complicated parts of the code 
that call more advanced functions like 'ST_SimplifyVW' / 'ST_Transform' 
/ 'ST_ChaikinSmoothing' run at expected / normal speed in GEOS 3.9.0 
compared to 3.8.0, so it is not an overall slower processing that is 
happening.

The postgis_full_version results for these setups are:

- POSTGRESQL 13.2 / POSTGIS 3.1.1 / GEOS 3.8.0:

PostGIS version: POSTGIS="3.1.1 aaf4c79" [EXTENSION] PGSQL="130" 
GEOS="3.8.0-CAPI-1.13.1 " PROJ="6.3.1" LIBXML="2.9.10" LIBJSON="0.13.1" 
LIBPROTOBUF="1.3.3" WAGYU="0.5.0 (Internal)"

  - POSTGRESQL 13.2 / POSTGIS 3.1.1 / GEOS 3.9.0:

PostGIS version: POSTGIS="3.1.1 aaf4c79" [EXTENSION] PGSQL="130" 
GEOS="3.9.0-CAPI-1.16.2" PROJ="6.3.1" LIBXML="2.9.10" LIBJSON="0.13.1" 
LIBPROTOBUF="1.3.3" WAGYU="0.5.0 (Internal)"

I am not entirely sure why 'postgis_full_version' is showing 
'PGSQL="130"' instead of 'PGSQL="132"', as I am definitely on 13.2, 
'SELECT version()' returns:

PostgreSQL 13.2 (Ubuntu 13.2-1.pgdg20.04+1) on x86_64-pc-linux-gnu, 
compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit

Note that the installation of PostgreSQL / PostGIS is based on the plain 
vanilla one as available from the official apt repository for PostgreSQL:

http://apt.postgresql.org/pub/repos/apt/ 
<http://apt.postgresql.org/pub/repos/apt/>

while GEOS was updated to 3.9.0 from the UbuntuGIS repository:

https://launchpad.net/~ubuntugis/+archive/ppa/ 
<https://launchpad.net/~ubuntugis/+archive/ppa/>

*** STEPS to reproduce ***

- Load some OpenStreetMap as WGS1984 / SRID 4326 using osm2pgsql

- Ensure you have the default POSTGRESQL 13.2 / POSTGIS 3.1.1 / GEOS 
3.8.0 version installed as from the official repository

- Create a column to store the geodesic area data

- UPDATE the column using "ST_Area(way::geography,true)" and note timing

- Now update GEOS to 3.9.0 from the UbuntuGIS repository

- Ensure GEOS is properly at 3.9.0 by calling 'SELECT 
postgis_full_version()'

- Run UPDATE a second time with "ST_Area(way::geography,true)" and again 
note timing

This should show a major difference.

Marco



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-devel/attachments/20210426/5ac4b3ae/attachment.html>


More information about the postgis-devel mailing list