Opened 15 years ago

Closed 12 years ago

#318 closed defect (wontfix)

900913->4326 Transform

Reported by: pramsey Owned by: mcayland
Priority: medium Milestone: PostGIS 1.4.3
Component: postgis Version: master
Keywords: Cc: andyh@…, realityexists, kbayram

Description

Originally reported on postgis-users against 1.3.6, strange results are also available on 1.5:

geog=# select postgis_full_version();
                                                    postgis_full_version                                                    
----------------------------------------------------------------------------------------------------------------------------
 POSTGIS="1.5.0SVN" GEOS="3.2.0-CAPI-1.6.0" PROJ="Rel. 4.6.1, 21 August 2008" USE_STATS (procs from 1.5 r4836 need upgrade)
(1 row)

geog=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-633510.090428,7506727.67383),900913),4326));
                  astext                   
-------------------------------------------
 POINT(-5.69091796875412 55.7394816986905)
(1 row)

geog=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-305748.113141,7834489.65112),900913),4326));
ERROR:  transform: couldn't project point (-305748 7.83449e+06 0): failed to load NAD27-83 correction file (-38)
HINT:  PostGIS was unable to transform the point because either no grid shift files were found, or the point does not lie within the range for which the grid shift is defined. Refer to the ST_Transform() section of the PostGIS manual for details on how to configure PostGIS to alter this behaviour.
geog=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-305748.113141,7834489.65112),900913),4269));
                  astext                   
-------------------------------------------
 POINT(-2.74658203125265 57.3620898624176)
(1 row)

geog=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-305748.113141,7834489.65112),900913),4267));
                  astext                   
-------------------------------------------
 POINT(-2.74658203125265 57.3620898615614)
(1 row)

Note that for some reason we get NAD27/83 grid failure in the 900913->4326 case but *not* in the transforms into NAD83 and NAD27!

Change History (27)

comment:1 by pramsey, 15 years ago

Actually, note in the example above the first call to transform works, the second fails. This is also exhibited in the postgis-users case, though the failure in his case is wrong answers.

http://postgis.refractions.net/pipermail/postgis-users/2009-November/025234.html

comment:2 by pramsey, 15 years ago

Cc: andyh@… added

comment:3 by mcayland, 15 years ago

Hmmm I can't recreate this on SVN trunk or 1.4 here (Debian Lenny, amd64):

pg83@zeno:~$ psql -d trunk Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms

\h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit

trunk=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-633510.090428,7506727.67383),900913),4326));

astext


POINT(-5.69091796875412 55.7394816986905)

(1 row)

trunk=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-633510.090428,7506727.67383),900913),4326));

astext


POINT(-5.69091796875412 55.7394816986905)

(1 row)

trunk=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-633510.090428,7506727.67383),900913),4326));

astext


POINT(-5.69091796875412 55.7394816986905)

(1 row)

trunk=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-633510.090428,7506727.67383),900913),4326));

astext


POINT(-5.69091796875412 55.7394816986905)

(1 row)

This is using a PROJ.4 I've compiled myself. Can anyone else recreate this?

comment:4 by nicklas, 15 years ago

I get the same error with:

select ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-305748.113141,7834489.65112),900913),4267));

I'm not sure if Paul meant that was when he gets the error, but it is for me. so it is not 4326 but 4327 for me /Nicklas

comment:5 by mcayland, 15 years ago

Here is the output from another session:

trunk=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-633510.090428,7506727.67383),900913),4326));

astext


POINT(-5.69091796875412 55.7394816986905)

(1 row)

trunk=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-305748.113141,7834489.65112),900913),4326));

astext


POINT(-2.74658203125265 57.3620898615614)

(1 row)

trunk=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-305748.113141,7834489.65112),900913),4269));

astext


POINT(-2.74658203125265 57.3620898624176)

(1 row)

trunk=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-305748.113141,7834489.65112),900913),4267)); ERROR: transform: couldn't project point (-305748 7.83449e+06 0): failed to load NAD27-83 correction file (-38) HINT: PostGIS was unable to transform the point because either no grid shift files were found, or the point does not lie within the range for which the grid shift is defined. Refer to the ST_Transform() section of the PostGIS manual for details on how to configure PostGIS to alter this behaviour.

So is the bug here that 4267 should work or perhaps the point is genuinely out of range?

comment:6 by mloskot, 15 years ago

I can not reproduce Paul's problem and I get similar output to Mark's:

mloskot@vb-ubuntu910-x64:~$ psql ticket318
psql (8.4.1)
Type "help" for help.

ticket318=# SELECT postgis_full_version();
                                         postgis_full_version                                          
-------------------------------------------------------------------------------------------------------
 POSTGIS="1.5.0SVN" GEOS="3.3.0-CAPI-1.6.1" PROJ="Rel. 4.6.1, 21 August 2008" LIBXML="2.7.5" USE_STATS
(1 row)

ticket318=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-633510.090428,7506727.67383),900913),4326));
                  astext                   
-------------------------------------------
 POINT(-5.69091796875412 55.7394816986905)
(1 row)

ticket318=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-305748.113141,7834489.65112),900913),4326));
                  astext                   
-------------------------------------------
 POINT(-2.74658203125265 57.3620898615614)
(1 row)

ticket318=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-305748.113141,7834489.65112),900913),4269));
                  astext                   
-------------------------------------------
 POINT(-2.74658203125265 57.3620898624176)
(1 row)

ticket318=# SELECT ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-305748.113141,7834489.65112),900913),4267));
ERROR:  transform: couldn't project point (-305748 7.83449e+06 0): failed to load NAD27-83 correction file (-38)
HINT:  PostGIS was unable to transform the point because either no grid shift files were found, or the point does not lie within the range for which the grid shift is defined. Refer to the ST_Transform() section of the PostGIS manual for details on how to configure PostGIS to alter this behaviour.
ticket318=# 

I use GEOS and PostGIS built from SVN trunk today morning on Linux Ubuntu 9.10 (64-bit)

comment:7 by pramsey, 15 years ago

Milestone: PostGIS 1.5.0PostGIS 1.5.1

OK, seeing as this is a rarer condition than I thought, I'm rolling forward to the next point release. Fortunately I can see it so I can try and fix it, but it's not a blocker.

comment:8 by arthurnederlof, 15 years ago

Milestone: PostGIS 1.5.1PostGIS 1.4.1

Hi, I have this problem as wel, running postgis 1.4 on the OSM data. ST_Transform(ST_SetSRID(ST_MakePoint("+lon+","+lat+"),4326),900913) is not a problem ST_TransForm(way,4326) goes wrong for all european points (error as above) Using srid=4267 seems to work ok, not sure if the resulting coor. are correct.

Is there a workaround/patch thinkable to solve this in 1.4?

regards, Arthur

comment:9 by mcayland, 15 years ago

Hi Arthur,

If you look at the thread above, the issue is that so far only Paul can reproduce the error. You can help us by giving as much information about your system, OS, PostgreSQL version, GEOS version and PROJ version as possible, as well as complete test case.

HTH,

Mark.

in reply to:  9 comment:10 by arthurnederlof, 15 years ago

Replying to mcayland:

Hi Arthur,

If you look at the thread above, the issue is that so far only Paul can reproduce the error. You can help us by giving as much information about your system, OS, PostgreSQL version, GEOS version and PROJ version as possible, as well as complete test case.

HTH,

Mark.

Mark, No problem, the probem is very consistent. below the enviromnet, testoutput and a small demoprogram. The used testcoordinates are from Cologne, germany, but all tested coordinates in Europe give the same problem. If you need more, please ask. Arthur

system: GNU bash, version 3.2.48(1)-release (x86_64-pc-linux-gnu) postgresql:"PostgreSQL 8.3.9 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.3.real (Ubuntu 4.3.3-5ubuntu4) 4.3.3" postgis:"POSTGIS="1.4.1" GEOS="3.0.0-CAPI-1.4.1" PROJ="Rel. 4.6.0, 21 Dec 2007" USE_STATS"

Output testprogram: 15:18:13,445 INFO test::15 - start testrun

15:18:13,449 DEBUG DbfMaintenance::483 - Access to postGreSql on jdbc:postgresql://10.13.54.8:5432/osm, user= arthur 15:18:13,581 DEBUG test::54 - postgreql version = PostgreSQL 8.3.9 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.3.real (Ubuntu 4.3.3-5ubuntu4) 4.3.3 15:18:13,582 DEBUG test::55 - postgis version = POSTGIS="1.4.1" GEOS="3.0.0-CAPI-1.4.1" PROJ="Rel. 4.6.0, 21 Dec 2007" USE_STATS 15:18:13,582 DEBUG test::60 - sql:select osm_id, name from planet_osm_polygon where (ST_Contains(way,ST_Transform(ST_SetSRID(ST_MakePoint(6.95,50.9333333),4326),900913))) limit 1 15:18:13,591 DEBUG test::63 - name = Köln, Stadt 15:18:13,592 DEBUG test::68 - sql:select osm_id, name, ST_AsGeoJSON( ST_TransForm(ST_setSRID(St_Box2D(way)::box2d,900913),4326),6 ) as box from planet_osm_polygon where (ST_Contains(way,ST_Transform(ST_SetSRID(ST_MakePoint(6.95,50.9333333),4326),900913))) limit 1 15:18:13,620 DEBUG test::75 - problem with sql : ERROR: transform: couldn't project point (753919 6.59133e+06 0): failed to load NAD27-83 correction file (-38)

Hint: PostGIS was unable to transform the point because either no grid shift files were found, or the point does not lie within the range for which the grid shift is defined. Refer to the ST_Transform() section of the PostGIS manual for details on how to configure PostGIS to alter this behaviour.

15:18:13,620 DEBUG DbfMaintenance::507 - disconnected to database. 15:18:13,621 INFO test::17 - Run postgistest OK

The testrountine itself:

public static String demontratePostgisProblem(double lat, double lon){

Connection conn=DbfMaintenance.getPgDbConn(); String sql="";

try {

Statement stmt= conn.createStatement();

stmt = conn.createStatement(); ResultSet rset; rset = stmt.executeQuery ("select version() as postresqlversion, postgis_full_version() as postgisversion");

while (rset.next()) {

logger.debug("postgreql version = "+rset.getString("postresqlversion")); logger.debug("postgis version = "+rset.getString("postgisversion"));

}

this does work

sql = "select osm_id, name from planet_osm_polygon"+

" where (ST_Contains(way,ST_Transform(ST_SetSRID(ST_MakePoint("+lon+","+lat+"),4326),900913))) limit 1";

logger.debug("sql:"+sql); rset = stmt.executeQuery (sql); while (rset.next()) {

logger.debug("name = "+rset.getString("name"));

} this one gives the error for 4326, 4267 works ok sql = "select osm_id, name, ST_AsGeoJSON( ST_TransForm(ST_setSRID(St_Box2D(way)::box2d,900913),4326),6 ) as box from planet_osm_polygon"+

" where (ST_Contains(way,ST_Transform(ST_SetSRID(ST_MakePoint("+lon+","+lat+"),4326),900913))) limit 1";

logger.debug("sql:"+sql); rset = stmt.executeQuery (sql); while (rset.next()) {

logger.debug("name = "+rset.getString("name")); logger.debug("box = "+rset.getString("box"));

}

} catch (SQLException e) {

logger.debug("problem with sql : "+e.getMessage());

} DbfMaintenance.closeDbConn(conn); return"OK";

}

comment:11 by arthurnederlof, 15 years ago

Hallo, a more trivial example (osm form open street map, worldcountries has geometries in 4326 srid format: this works: select world.gid, osm.admin_level from planet_osm_polygon as osm,worldcountries as world where (osm.admin_level='4') AND (ST_Contains(ST_Transform(world.the_geom,900913),ST_Centroid(osm.way))) limit 10

this one does not work: select world.gid, osm.admin_level from planet_osm_polygon as osm,worldcountries as world where (osm.admin_level='4') AND (ST_Contains(world.the_geom,ST_Centroid(ST_Transform(osm.way,4326)))) limit 10

ERROR: transform: couldn't project point (5.1755e+06 6.1799e+06 0): failed to load NAD27-83 correction file (-38) HINT: PostGIS was unable to transform the point because either no grid shift files were found, or the point does not lie within the range for which the grid shift is defined. Refer to the ST_Transform() section of the PostGIS manual for details on how to configure PostGIS to alter this behaviour.

comment:12 by mcayland, 15 years ago

Unfortunately, without a database dump of the relevant tables then it is impossible for me to re-create this here. Can you extract a small set of geometries that will re-create the bug into a separate table and then provide a pg_dump file that I can use for testing?

in reply to:  12 ; comment:13 by arthurnederlof, 15 years ago

Replying to mcayland:

Unfortunately, without a database dump of the relevant tables then it is impossible for me to re-create this here. Can you extract a small set of geometries that will re-create the bug into a separate table and then provide a pg_dump file that I can use for testing?

I could give you access to my database if you want to. No special or private tables there. Arthur

comment:14 by robe, 15 years ago

Guys,

I can produce this error on my PostGIS 1.5SVN windows install

SELECT ST_ASTEXT(ST_Transform(ST_SetSRID(ST_Point(-305748.113141,7834489.65112),900913),4267));


Yields:
couldn't project point (-305748 7.83449e+006 0): failed to load NAD27-83 correction file (-38)
HINT:  PostGIS was unable to transform the point because either no grid shift files were found, or the point does not lie within the range for which the grid shift is defined. Refer to the ST_Transform() section of the PostGIS manual for details on how to configure PostGIS to alter this behaviour.

This could possibly be the same problem we ran across in #387 that the proj4text is simply different, or possibly I'm using an out of date set of datum shift files.


I tried my 1.3.6 install, and that doesn't even have this entry. It is my understanding that this is a defunct srid put in a while ago before there was an official google mercator EPSG SRID, so its highly likely everyones is slightly different unless they reloaded their spatial_ref_sys.

Mine reads:

SELECT proj4text from spatial_ref_sys where srid = 900913;


+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +units=m +k=1.0 +nadgrids=@null +no_defs

and I'm running proj 4.6.1

comment:15 by robe, 15 years ago

Slight correction -- I see the one that fails for me is the NAD27 and not the other one that was complained about. But it would be still interesting to find out if we are all working against the same proj4text.

For record:
SELECT ST_AsText(ST_Transform(ST_SetSRID(ST_Point(-305748.113141,7834489.65112),900913),4326));

Yields:
POINT(-2.74658203125265 57.3620898615614)

comment:16 by filbertkm, 15 years ago

I had the same problem. I upgraded from PostGIS 1.3.6 to the 1.5 svn version. I used spatial_ref_sys and the postgis upgrade script. I also used a 900913.sql script of my own (can't remember where I got it).

Since PostGIS 1.3.6, the Google Spherical Mercator projection has been assigned an EPSG code:

http://spatialreference.org/ref/epsg/3785/

My database still had all the tables assigned as 900913. To resolve the problem, I dropped the 900913 entry from my spatial_ref_sys table:

Then I took the PostGIS spatial_ref_sys INSERT statement for 3785 from the spatial reference site. I updated my 900913.sql statement with this one, but changing the srid and auth_srid to 900913. I then readded 900913 to PostGIS and everything works great now.

in reply to:  13 ; comment:17 by arthurnederlof, 15 years ago

Replying to arthurnederlof:

Replying to mcayland:

Unfortunately, without a database dump of the relevant tables then it is impossible for me to re-create this here. Can you extract a small set of geometries that will re-create the bug into a separate table and then provide a pg_dump file that I can use for testing?

I could give you access to my database if you want to. No special or private tables there. Arthur

Ok, I exctracted thes sql without using a database, reproducing the error. Changing the srid as descibed by filbertkm does not give any result on my side.

select ST_AsGeoJSON( ST_TransForm(ST_setSRID(St_Box2D(ST_Transform(ST_SetSRID(ST_MakePoint(6.95,50.9333333),4326),900913))::box2d,900913),4326),6 )

hop this helps understanding what goes on, Arthur

comment:18 by pramsey, 15 years ago

Milestone: PostGIS 1.4.1PostGIS 1.4.2

comment:19 by mcayland, 15 years ago

Unfortunately this still works for me:

trunk=# select ST_AsGeoJSON( ST_TransForm(ST_setSRID(St_Box2D(ST_Transform(ST_SetSRID(ST_MakePoint(6.95,50.9333333),4326),900913))::box2d,900913),4326),6 );

st_asgeojson


{"type":"Polygon","coordinates":[6.95,50.933333],[6.95,50.933335],[6.95,50.933335],[6.95,50.933333],[6.95,50.933333]}

(1 row)

trunk=# select * from spatial_ref_sys where srid = 900913;

srid | auth_name | auth_srid | srtext | proj4text


900913 | spatialreferencing.org | 900913 | PROJCS["Popular Visualisation CRS / Mercator (deprecated)",GEOGCS["Popular Visualisation CRS",DATUM["Popular_Visualisation_Datum",SPHEROID["Popular Visualisation Sphere",6378137,0,AUTHORITY["EPSG","7059"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6055"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4055"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTIONMercator_1SP,PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],AUTHORITY["EPSG","3785"],AXIS["X",EAST],AXIS["Y",NORTH]] | +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +units=m +k=1.0 +nadgrids=@null +no_defs

(1 row)

in reply to:  17 ; comment:20 by mcayland, 15 years ago

Hi Arthur,

Where did you get your PROJ.4 installation from? Did you compile it yourself or install from packages?

ATB,

Mark.

in reply to:  20 comment:21 by arthurnederlof, 15 years ago

Replying to mcayland:

Hi Arthur,

Where did you get your PROJ.4 installation from? Did you compile it yourself or install from packages?

ATB,

Mark.

The installation is from the Ubuntu repository, I did not build it myself. project 4.6.0-2 Arthur.

comment:22 by pramsey, 15 years ago

Milestone: PostGIS 1.4.2PostGIS 1.4.3

comment:23 by pbalomiri, 14 years ago

Hi, I got this bug too. I am working on os/x The lib versions are:

template_postgis=# select * from postgis_version();
            postgis_version            
---------------------------------------
 1.5 USE_GEOS=1 USE_PROJ=1 USE_STATS=1

template_postgis=# select * from postgis_proj_version();
     postgis_proj_version      
-------------------------------
 Rel. 4.7.1, 23 September 2009

The Error consistently appears when using SRID 4326:

wien_python=# select st_transform(st_transform('srid=4326;POINT(1 1)'::geometry, 900913), 4326);
ERROR:  transform: couldn't project point (111319 111325 0): failed to load NAD27-83 correction file (-38)
HINT:  PostGIS was unable to transform the point because either no grid shift files were found, or the point does not lie within the range for which the grid shift is defined. Refer to the ST_Transform() section of the PostGIS manual for details on how to configure PostGIS to alter this behaviour.

For SRID 4267, however it works

wien_python=# select ST_Transform('SRID=900913;POINT(653103 6.63036e+06 0)'::geometry, 4267);

st_transform


01010000A0AB10000037CD83F1BA771740E31A12928E8649400000000000000000

(1 row)


in reply to:  23 comment:24 by pbalomiri, 14 years ago

Sorry for the formatting err:

For SRID 4267, however it works

 wien_python=# select ST_Transform('SRID=900913;POINT(653103 6.63036e+06 0)'::geometry, 4267);
                             st_transform                            
 --------------------------------------------------------------------
  01010000A0AB10000037CD83F1BA771740E31A12928E8649400000000000000000
 (1 row)
 {{{
> 
}}}

comment:25 by realityexists, 13 years ago

Cc: realityexists added

I'm also getting this error on PostGIS 1.5.2 on Windows, installed from the installer using Application Stack builder.

SELECT Transform(ST_GeomFromEWKT('SRID=4267;POINT(-79.867611 9.3553472)'), 4326)

ERROR: transform: couldn't project point (-79.8676 9.35535 0): failed to load NAD27-83 correction file (-38)

However, this succeeds:

SELECT Transform(Transform(ST_GeomFromEWKT('SRID=4267;POINT(-79.867611 9.3553472)'), 3395), 4326)

PostGIS full version: "POSTGIS="1.5.2" GEOS="3.2.2-CAPI-1.6.2" PROJ="Rel. 4.6.1, 21 August 2008" LIBXML="2.7.6" USE_STATS" PostgreSQL version 9.0.4 on Windows, 32-bit

in reply to:  description comment:26 by kbayram, 13 years ago

Cc: kbayram added

I came across this bug and Google brought me here. I've managed to fix the problem in my case and it turns out it was a extremely trivial problem.

If you do a "select * from spatial_ref_sys where srid = 900913;" in psql you may notice that the text in the srtext and proj4text has line feeds. It turns out that proj4 does not like these and anything after the first line in the proj4text field is ignored, namely the important nadgrids=@null which causes the error.

Removing the line feeds solved the problem for me.

comment:27 by pramsey, 12 years ago

Resolution: wontfix
Status: newclosed
Note: See TracTickets for help on using tickets.