Risultati diversi per la stessa trasformazione su diverse installazioni PostgreSQL / Postgis

Aug 21 2020

Durante la migrazione dei servizi Web da un server a un altro, abbiamo notato risultati di trasformazione diversi per la stessa query. Nel nostro caso, un Polygon viene fornito in WKT con SRID = 4326 e viene inviata una query a PostgresSQL per trasformarlo in 31467. Si sospettava che i diversi server avessero definizioni proj4 diverse, ma le informazioni spatial_ref_sys per srid 31467 sono identiche.

Poligono di esempio in WKT, SRID = 4326:

POLYGON((6.765692822761539 51.00597872375141,6.767598964757953 51.00509342952401,6.771910476416512 51.006635544034566,6.7707304837520645 51.00806338213016,6.765692822761539 51.00597872375141))

Server A

SELECT ST_AsText(ST_Transform(ST_GeomFromText('POLYGON((6.765692822761539 51.00597872375141,6.767598964757953 51.00509342952401,6.771910476416512 51.006635544034566,6.7707304837520645 51.00806338213016,6.765692822761539 51.00597872375141))',4326),31467))

rende:

POLYGON((3343258.68567984 5654686.62282287,3343389.47157136 5654584.09718158,3343697.23474346 5654746.47217529,3343619.23068104 5654907.79612667,3343258.68567984 5654686.62282287))

Ulteriori informazioni sulla versione:

SELECT PostGIS_Full_Version();  
SELECT version();

rendimenti

POSTGIS="2.2.5 r15298" GEOS="3.5.0-CAPI-1.9.0 r4084" PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.9.2, released 2012/10/08" LIBXML="2.7.6" LIBJSON="0.11" RASTER
PostgreSQL 9.4.13 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18), 64-bit

e

SELECT proj4text FROM spatial_ref_sys WHERE srid=31467;

rendimenti

+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +datum=potsdam +units=m +no_defs

Quando eseguiamo la trasformazione sul Server B,

SELECT ST_AsText(ST_Transform(ST_GeomFromText('POLYGON((6.765692822761539 51.00597872375141,6.767598964757953 51.00509342952401,6.771910476416512 51.006635544034566,6.7707304837520645 51.00806338213016,6.765692822761539 51.00597872375141))',4326),31467))

noi riceviamo

POLYGON((3343204.36380305 5654547.24689407,3343335.13281662 5654444.73197122,3343642.85963301 5654607.08595063,3343564.86647133 5654768.39203429,3343204.36380305 5654547.24689407))

Un risultato notevolmente diverso rispetto al poligono restituito dal server A.

Ulteriori informazioni sulla versione:

SELECT PostGIS_Full_Version();
SELECT version();

rendimenti

POSTGIS="2.5.3 r17699" [EXTENSION] PGSQL="100" GEOS="3.7.2-CAPI-1.11.2 b55d2125" PROJ="Rel. 6.2.0, September 1st, 2019" GDAL="GDAL 3.0.1, released 2019/06/28 GDAL_DATA not found" LIBXML="2.9.1" LIBJSON="0.11" LIBPROTOBUF="1.0.2" RASTER
PostgreSQL 10.10 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit

e

SELECT proj4text FROM spatial_ref_sys WHERE srid=31467;

rendimenti

+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +datum=potsdam +units=m +no_defs

Quando entrambi i poligoni vengono esportati in geojson e resi in QGis, la differenza diventa ovvia:

Non ci saremmo aspettati una versione più recente di PostGIS e delle librerie associate per avere un tale effetto sui risultati, soprattutto perché la definizione proj4 per 31467 su entrambe le installazioni è identica. C'è qualcosa che ci siamo persi qui?

Risposte

4 CL. Aug 21 2020 at 10:07

La libreria PROJ ha avuto tre diverse definizioni per il potsdamdatum.

Nella versione 4.8.0, è stata modificata da una forma a tre parametri a una forma a sette parametri più precisa. Questa forma di sette parametri è quello server A sta usando, e ciò che viene mostrato sul epsg.io .

Nella versione 5.0.1, è stato modificato per utilizzare la griglia BeTA2007 . Questo è ciò che sta usando il server B.