Transform coordinates from a specified source to a specified target map projection. This uses the 'PROJ' library directly, by wrapping the 'PROJ' package (if functional), otherwise the 'proj4' package. The 'reproj()' function is generic, methods may be added to remove the need for an explicit source definition. If 'proj4' is in use 'reproj()' handles the requirement for conversion of angular units where necessary. This is for use primarily to transform generic data formats and direct leverage of the underlying 'PROJ' library. (There are transformations that aren't possible with 'PROJ' and that are provided by the 'GDAL' library, a limitation which users of this package should be aware of.) The 'PROJ' library is available at < https://proj.org/>.
The goal of reproj is to reproject data between coordinate systems.
The proj4
package is the only one available for generic data that will
transform between arbitrary coordinate systems specified by source and
target coordinate systems, and the only one with control over ‘xy’
versus ‘xyz’ input and output. reproj adds some further features by
wrapping the need to convert longitude/latitude data to or from radians.
Other R packages for transforming coordinates are monolithic and do not
expose the underlying facility outside of their specific goals and
contexts. The packages that do this are rgdal
, sf
and lwgeom
. The
all require GDAL by some means, and include many other irrelevant
libraries and restrictions including specific data formats that are
inefficient.
Possible alternatives are mapproj
and globe
but these are variously
too specific or difficult to use. If you know of others please let me
know!
There are a number of limitations to the proj4 package that is used, please use reproj at your own risk. The sf package provides a better supported facility to modern code and for datum transformations. (We have not even checked if proj4 can do datum transforms). If a more generic interface to the PROJ library becomes available we will configure reproj to use it.
You can install the dev version of reproj from github with:
remotes::install_github("hypertidy/reproj")
This example shows how to convert between coordinate systems:
library(reproj)(pt <- (reproj(cbind(c(147, 148), c(-42, -45)), target = "+proj=laea +datum=WGS84", source = 4326)))#> [,1] [,2] [,3]#> [1,] 5969744 -9803200 0#> [2,] 5362760 -10052226 0## to another coordinate system(pt1 <- reproj(pt, target = "+proj=lcc +lat_1=-20 +lat_2=-10 +datum=WGS84", source = "+proj=laea +datum=WGS84"))#> [,1] [,2] [,3]#> [1,] 12701201 -9158714 0#> [2,] 12538357 -9514556 0## and back againreproj(pt1, target = "+proj=longlat +datum=WGS84", source = "+proj=lcc +lat_1=-20 +lat_2=-10 +datum=WGS84")#> [,1] [,2] [,3]#> [1,] 147 -42 0#> [2,] 148 -45 0
Note that the output is always in ‘xyz’ form, even if the z value is implied zero. The input may also be ‘xyz’ and it is the user’s job to ensure this is specified correctly. It’s not possible to automate every case, because among the three main cases:
+a/+b
in PROJ terms),it is not possible to easily capture the intended task. reproj sits at the simplest level of flexibility and control, and doesn’t impose any restrictions of converting between these cases.
Are you interested in reproj or even contributing? Great! Please use the issues tab for discussions.
This is a wishlist / todo.
reproj.method
(this is already possible
for your own classes)Please note that the ‘reproj’ project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.