Loading...
Searching...
No Matches
GRASS and the PROJ projection library

by GRASS Development Team

https://grass.osgeo.org

# GRASS and the PROJ projection library

GRASS utilizes the PROJ library (https://proj.org) originally developed by Gerald Evenden/USGS (Cartographic Projection Procedures for the UNIX Environment – A User's Manual, Evenden, 1990, Open-file report 90-284). The PROJ functions are used through wrapper functions in a GRASS environment.

Internally to the PROJ library, projection may involve transformation to and from geodetic co-ordinates (latitude and longitude), and numerical corrections to account for different datums.

This is transparent for the user as input and output parameters are either read from PROJ_INFO and PROJ_UNITS files (g.proj, v.proj, r.proj). In addition, a PROJ_EPSG file is stored. GRASS converts a co-ordinate system representation to WKT style, the EPSG code is here preferred if available. The TOWGS84 parameter is scanned from PROJ_INFO file and appended to co-ordinate system definition imported from EPSG code by GDAL library.

In GRASS the wrapper functions in lib/proj/get_proj.c makes the preparations to set up the parameter strings and init the info-structures, while lib/proj/do_proj.c contains the actual projection calls.

Files lib/proj/ellipse.c and lib/proj/datum.c contain functions for querying GRASS locations and users for ellipsoid and datum information (some of these functions were included in the GIS library in earlier versions of GRASS).

File lib/proj/convert.c contains functions for converting GRASS co-ordinate system descriptions to and from the formats used by other GIS. Heavy use is made of the OGR library, part of GDAL (https://gdal.org).

## Datum transformation

GRASS generally supports datum transformation (3 parameters, 7 parameters and grid).

Note that datum transformation is handled exclusively by PROJ 6 and later. In the case that GRASS is compiled with PROJ 5 or older, the datum management is still done within GRASS. Only in that case, if a warning appears that a certain datum is not recognised by GRASS and no parameters found, the datum transformation parameters have to be added to $GISBASE/etc/proj/datum.table (and also $GISBASE/etc/proj/datumtransform.table if you have 7-parameter transformation parameters). No need to re-compile though. When adding to git, currently these files are still in lib/gis/.

A list of datum equivalents is included in convert.c for geospatial files that use a non-standard name for a datum that is already supported in GRASS.

Hint: use GDAL's "testepsg" to identify the canonical name, e.g. testepsg epsg:4674

## Makefile Example

The following code demonstrates the Makefile.

    MODULE_TOPDIR = ../..

    PGM = r.myproj

    EXTRA_INC = $(PROJINC)
    LIBES     = $(GPROJLIB) $(GISLIB)
    DEPENDENCIES= $(GPROJDEP) $(GISDEP)

    include $(MODULE_TOPDIR)/include/Make/Module.make

    default: cmd

# Functions

- GPJ_ask_datum_params()
- GPJ_get_datum_by_name()
- GPJ__get_datum_params()
- GPJ_get_datum_params()
- GPJ_get_datum_transform_by_name()
- GPJ_get_default_datum_params_by_name()
- GPJ_get_ellipsoid_by_name()
- GPJ__get_ellipsoid_params()
- GPJ_get_ellipsoid_params()
- GPJ_get_equivalent_latlong()
- GPJ_grass_to_osr()
- GPJ_grass_to_osr2()
- GPJ_grass_to_wkt()
- GPJ_grass_to_wkt2()
- GPJ_free_datum()
- GPJ_free_datum_transform()
- GPJ_free_ellps()
- GPJ_set_csv_loc()
- GPJ_osr_to_grass()
- GPJ_wkt_to_grass()
- GPJ_init_transform()
- GPJ_transform()
- GPJ_transform_array()