[R-sig-Geo] Projection problem (epsg 3857 - maybe not R-related)

Roger Bivand Roger.Bivand at nhh.no
Thu May 3 10:50:18 CEST 2012


On Thu, 3 May 2012, Jon Olav Skoien wrote:

> On 02-May-12 18:39, Roger Bivand wrote:
>> On Wed, 2 May 2012, Jon Olav Skoien wrote:
>> 
>>> Hi,
>>> 
>>> We are having a problem with projections that we dont know the source of 
>>> (bugs in software or lack of understanding). The problem might not be 
>>> related to R, but I hope someone can still help. We have a set of data 
>>> (polygons and rasters) that are all supposed to be in projection epsg:3857 
>>> (WGS 84 / Pseudo-Mercator, often referred to as web mercator as it is used 
>>> in web services such as Google Maps). However, they do not appear to be 
>>> the same when using them in R. Below is an example that starts with a 
>>> hypothetical polygon somewhere in Europe, and then transforming it with 
>>> the three different proj4strings we got from the different objects :
>>> 
>>> cords = matrix(c( 650000, 700000, 700000, 650000, 650000, 5600000, 
>>> 5600000, 5700000, 5700000, 5600000), ncol = 2)
>>> pol = 
>>> SpatialPolygonsDataFrame(SpatialPolygons(list(Polygons(list(Polygon(cords)), 
>>> ID = "1")),
>>>    proj4string = CRS("+init=epsg:3857")), data = data.frame(test = 1))
>>> proj4string(pol)
>>> # [1] " +init=epsg:3857 +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 
>>> +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"
>>> # This is the proj4string that R creates from this epsg code
>>> 
>>> # Below are the proj4strings that we got from the imported objects
>>> # 1 is from an export and transformation from a postgis database of 
>>> polygons (latlong) with ogr2ogr and target crs epsg:3857
>>> # 2 is an export from the same data base with psql2shape
>>> # the same proj4strings were also generated from the .prj-files when 
>>> transforming with QGIS.
>>> # 3 is from a geoTIFF, and practically identical to the proj4string that R 
>>> generated from epsg:3857
>>> projs = list()
>>> projs[[1]] = " +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 
>>> +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0"
>>> projs[[2]] = " +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 
>>> +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs"
>>> projs[[3]] = " +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 
>>> +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"
>>> 
>>> # Here we print the y-coordinate of the original polygon (centroid) 
>>> together with the y-coordinate
>>> # of the reprojected polygon. In addition we write the result to a 
>>> shapefile:
>>> pols = list()
>>> for (i in 1:3) {
>>>  pols[[i]] = spTransform(pol, CRS(projs[[i]]))
>>> #  writeOGR(pols[[i]], "e:/temp/Rtmp/polygons", paste("pol", i, sep = ""), 
>>> driver = "ESRI Shapefile")
>>>  print(paste(i, coordinates(pol)[,2], coordinates(pols[[i]])[,2]))
>>> }
>>> #[1] "1 5650000 5619680.01465088"
>>> #[1] "2 5650000 5619663.0232111"
>>> #[1] "3 5650000 5650000"
>>> 
>>> The writeOGR call above is to also be able to examine the .prj files. The 
>>> last two of these are:
>>> pol2.prj
>>> PROJCS["Mercator",GEOGCS["GCS_unnamed ellipse",DATUM["D_unknown", 
>>> SPHEROID["Unknown",6378137,0]],PRIMEM["Greenwich",0],
>>> UNIT["Degree",0.017453292519943295]], 
>>> PROJECTION["Mercator"],PARAMETER["central_meridian",0],
>>> PARAMETER["false_easting",0], 
>>> PARAMETER["false_northing",0],PARAMETER["standard_parallel_1",0.0],
>>> UNIT["Meter",1]]
>>> pol3.prj
>>> PROJCS["Mercator_2SP",GEOGCS["GCS_unnamed ellipse",DATUM["D_unknown", 
>>> SPHEROID["Unknown",6378137,0]],PRIMEM["Greenwich",0], 
>>> UNIT["Degree",0.017453292519943295]], 
>>> PROJECTION["Mercator_2SP"],PARAMETER["standard_parallel_1",0], 
>>> PARAMETER["central_meridian",0],PARAMETER["false_easting",0],
>>> PARAMETER["false_northing",0],UNIT["Meter",1]]
>>> 
>>> The only differences between these two are the PROJCS and PROJECTION 
>>> parameters, which are "Mercator" and "Mercator_2SP", respectively, and the 
>>> order of some parameters; the last one puts 
>>> PARAMETER["standard_parallel_1",0] before meridian and false easting and 
>>> northing, whereas the first one puts it after. The parameters are 
>>> otherwise the same.
>>> 
>>> The questions are therefore:
>>> Are the differences due to the use of "Mercator" and "Mercator_2SP"?
>>> Can it be correct that we get different coordinates for the same 
>>> epsg-code?
>>> If not, which version should we trust, or how can we make sure that the 
>>> same epsg-code refers to the same projection?
>> 
>> As http://spatialreference.org/ref/sr-org/6864/ points out, this is a 
>> rather broken configuration on a sphere. The definitions seem to be 
>> identical in your cases, as a @null grid or zero towgs84 coefficients will 
>> have the same effect. You could ask on the proj list, but my intuition is 
>> that this is useful for display only, not for data transfer.
>> 
>> Hope this clarifies,
>> 
>> Roger
>
> Roger,
>
> If I understand the reference correct, this projection could cause errors in 
> the order of 800 meters, while the ones we encountered are around 30 km. You 
> are probably right that we should be careful with this projection and not use 
> it without manual checking. I will also ask on the proj list and see if they 
> can give some more information.
>
> BTW, the proj4string from spatialreference.org also gives a y-transformation 
> of points defined with epsg:3857 in R:
> p1 = SpatialPoints(data.frame(x = 700000, y = 5700000), proj4string = 
> CRS("+init=epsg:3857"))
> p2 = spTransform(p1, CRS("+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 
> +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs"))
> p1
> p2

Yes, it does, which implies that +towgs84=0,0,0,0,0,0,0 and 
+nadgrids=@null are not equivalent in this case. Is it the minor axis 
difference in going from WGS84 to sphere that is changing y? I think that 
the proj list is the right place to follow this up, unless the final 
point on:

http://proj.maptools.org/faq.html

helps. As I read the FAQ, the definition including +towgs84= is probably 
wrong, and is forcing an understanding of +datum=WGS84. Has this changed 
between PROJ.4 releases?

Roger

>
> Thanks a lot for your help!
> Jon
>
>> 
>>> 
>>> Thanks,
>>> Jon
>>> 
>>> BTW:
>>>> sessionInfo()
>>> R version 2.15.0 (2012-03-30)
>>> Platform: x86_64-pc-mingw32/x64 (64-bit)
>>> 
>>> locale:
>>> [1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United 
>>> States.1252
>>> [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
>>> [5] LC_TIME=English_United States.1252
>>> 
>>> attached base packages:
>>> [1] stats     graphics  grDevices utils     datasets  methods   base
>>> 
>>> other attached packages:
>>> [1] rgdal_0.7-8 sp_0.9-98
>>> 
>>> loaded via a namespace (and not attached):
>>> [1] grid_2.15.0    lattice_0.20-6
>>>> getPROJ4VersionInfo()
>>> [1] "Rel. 4.7.1, 23 September 2009, [PJ_VERSION: 470]"
>>> 
>>> 
>> 
>
>
>

-- 
Roger Bivand
Department of Economics, NHH Norwegian School of Economics,
Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: Roger.Bivand at nhh.no



More information about the R-sig-Geo mailing list