/*! \page gislib GRASS GIS Library by GRASS Development Team (http://grass.osgeo.org) This chapter is divided as follows: - \subpage gislibintro - \subpage init - \subpage diag - \subpage envir - \subpage dbaseaccess - \subpage Fully_Qualified_File_Names - \subpage finding - \subpage Legal_File_Names - \subpage Opening_an_Existing_Database_File_for_Reading - \subpage Opening_an_Existing_Database_File_for_Update - \subpage Creating_and_Opening_a_New_Database_File - \subpage Database_File_Management - \subpage Region - \subpage Database_Region - \subpage Active_Module_Region - \subpage Projection_Information - \subpage Latitude_Longitude_Databases - \subpage Coordinates - \subpage Global_Wraparound - \subpage Miscellaneous - \subpage Calculations - \subpage Raster_Area_Calculations - \subpage Polygonal_Area_Calculations - \subpage Distance_Calculations - \subpage General_Plotting_Routines - \subpage Temporary_Files - \subpage Command_Line_Parsing - \subpage Description - \subpage Structures - \subpage Option_structure - \subpage Flag_structure - \subpage Parser_Routines - \subpage Parser_Programming_Examples - \subpage Step_by_Step_Use_of_the_Parser - \subpage Full_Module_Example - \subpage Complete_Structure_Members_Table - \subpage Description_of_Complex_Structure_Members - \subpage Answer_member_of_the_Flag_and_Option_structures - \subpage Multiple_and_Answers_Members - \subpage key_desc_Member - \subpage gisprompt_Member - \subpage Common_Questions - \subpage String_Manipulation_Functions - \subpage Enhanced_UNIX_Routines - \subpage Running_in_the_Background - \subpage Partially_Interruptible_System_Call - \subpage ENDIAN_test - \subpage Miscellaneous - \subpage GIS_Library_Data_Structures - \subpage struct_Cell_head - \subpage struct_Categories - \subpage struct_Colors - \subpage struct_History - \subpage struct_Range - \subpage Loading_the_GIS_Library - \subpage TimeStamp_functions - \subpage Memory_Allocation \section gislibintro Introduction The GIS Library is the primary programming library provided with the GRASS system. Programs must use this libary to access the GIS database. It contains the routines which locate, create, open, rename, and remove GRASS database files. It contains the routines which read and write raster files. It contains routines which interface the user to the database, including prompting the user, listing available files, validating user access, etc. It also has some general purpose routines (string manipulation, user information, etc.) which are not tied directly to database processing. It is assumed that the reader has read \ref location for a general description of GRASS databases, \ref Raster_File_Processing for details about raster map layers in GRASS, and Region_and_Mask (???) which discusses regions and masks. The routines in the GIS Library are presented in functional groupings, rather than in alphabetical order. The order of presentation will, it is hoped, provide a better understanding of how the library is to be used, as well as show the interrelationships among the various routines. Note that a good way to understand how to use these routines is to look at the source code for GRASS modules which use them. Most routines in this library require that the header file grass/gis.h be included in any code using these routines. Therefore, programmers should always include this file when writing code using routines from this library: \code #include \endcode Note: All routines and global variables in this library, documented or undocumented, start with the prefix G_. To avoid name conflicts, programmers should not create variables or routines in their own modules which use this prefix. \subsection init Library Initialization It is mandatory that the system be initialized before any other library routines are called. G_gisinit() initialize GIS library. This routine reads the user's GRASS environment file into memory and makes sure that the user has selected a valid database and mapset. It also initializes hidden variables used by other routines. If the user's database information is invalid, an error message is printed and the module exits. The program_name is stored for later recall by G_program_name(). It is recommended that argv[0] be used for the program_name: \code int main (int argc, char **argv) { G_gisinit(argv[0]); } \endcode \subsection diag Diagnostic Messages The following routines are used by other routines in the library to report warning and error messages. They may also be used directly by GRASS programs. - G_fatal_error() print error message and exit - G_debug() print debug message - G_warning() print warning message and continue These routines report errors to the user. The normal mode is to write the message to the screen (on the standard error output). G_warning() will return and G_fatal_error() will exit. If the standard error output is not a tty device, then the message is mailed to the user instead. If the file GIS_ERROR_LOG exists (with write permission), in either the user's home directory or in the $GISBASE directory, the messages will also be logged to this file. While most applications will find the normal error reporting quite adequate, there will be times when different handling is needed. For example, graphics modules may want the messages displayed graphically instead of on the standard error output. If the programmer wants to handle the error messages differently, the following routines can be used to modify the error handling: - G_set_error_routine() change error handling This routine provides a different error handler for G_fatal_error() and G_warning(). The handler routine must be defined as follows: \code int handler(char *message, int fatal) \endcode where message is the message to be handled and fatal indicates the type of error: - 1 (fatal error) - or 0 (warning). Note: The handler only provides a way to send the message somewhere other than to the error output. If the error is fatal, the module will exit after the handler returns. - G_unset_error_routine() reset normal error handling This routine resets the error handling for G_fatal_error() and G_warning() back to the default action. - G_sleep_on_error() sleep on error - G_suppress_warnings() suppress warnings \subsection envir Environment and Database Information The following routines return information about the current database selected by the user. Some of this information is retrieved from the user's GRASS environment file. Some of it comes from files in the database itself. See \ref Environment_Variables for a discussion of the GRASS environment. The following four routines can be used freely by the programmer: - G_location() current location name Returns the name of the current database location. This routine should be used by modules that need to display the current location to the user. See \ref Locations for an explanation of locations. - G_mapset() current mapset name Returns the name of the current mapset in the current location. This routine is often used when accessing files in the current mapset. See \ref Mapsets for an explanation of mapsets. - G_myname() location title Returns a one line title for the database location. This title is read from the file MYNAME in the PERMANENT mapset. See also \ref Permanent_Mapset for a discussion of the PERMANENT mapset. - G_gisbase() top level module directory Returns the full path name of the top level directory for GRASS programs. This directory will have subdirectories which will contain modules and files required for the running of the system. Some of these directories are: \verbatim bin commands run by the user etc modules and data files used by GRASS commands html help files \endverbatim The use of G_gisbase() to find these subdirectories enables GRASS modules to be written independently of where the GRASS system is actually installed on the machine. For example, to run the module sroff in the GRASS etc directory: \code char command[200]; sprintf(command, "%s/etc/sroff", G_gisbase()); G_spawn(command, "sroff", NULL); \endcode The following two routines return full path UNIX directory names. They should be used only in special cases. They are used by other routines in the library to build full UNIX file names for database files. The programmer should not use the next two routines to bypass the normal database access routines. - G_gisdbase() top level database directory Returns the full UNIX path name of the directory which holds the database locations. See \ref GISDBASE for a full explanation of this directory. - G_location_path() current location directory Returns the full UNIX path name of the current database location. For example, if the user is working in location spearfish in the /home/user/grassdata database directory, this routine will return a string which looks like /home/user/grassdata/spearfish. These next routines provide the low-level management of the information in the user's GRASS environment file. They should not be used in place of the higher level interface routines described above. - G_getenv() - G__getenv() These routines look up the variable name in the GRASS environment and return its value (which is a character string). If name is not set, G_getenv() issues an error message and calls exit(). G__setenv() just returns the NULL pointer. - G_setenv () - G__setenv() These routines set the the GRASS environment variable name to value. If value is NULL, the name is unset. Both routines set the value in module memory, but only G_setenv() writes the new value to the user's GRASS environment file. \section dbaseaccess Fundamental Database Access Routines The routines described in this section provide the low-level interface to the GRASS database. They search the database for files, prompt the user for file names, open files for reading or writing, etc. The programmer should never bypass this level of database interface. These routines must be used to access the GRASS database unless there are other higher level library routines which perform the same function. For example, routines to process raster files (see \ref Raster_File_Processing), vector files (see \ref Vector_File_Processing), etc., should be used instead. In the descriptions below, the term database element is used. Elements are subdirectories within a mapset and are associated with a specific GRASS data type. For example, raster files live in the "cell" and "fcell" element. See \ref Elements for more details. \subsection Fully_Qualified_File_Names Fully Qualified File Names All GRASS routines which access database files must be given both the file name and the mapset where the file resides. Often the name and the mapset are 2 distinct character strings. However, there is a need for a single character string which contains both the name and the mapset (e.g., for interactive interfacing to command-line programs). This form of the name is known as the fully qualified file name and is built by the following routine: - G_fully_qualified_name() Returns a fully qualified name for the file name in mapset Currently this string is in the form name@mapset, but the programmer should pretend not to know this and always call this routine to get the fully qualified name. The following example shows how an interactive version of d.rast interfaces with the command-line version of d.rast: \code #include int main(char *argc, char **argv) { char name[GNAME_MAX], *mapset, *fqn; char command[1024]; G_gisinit(argv[0]); mapset = G_ask_cell_old("", name, ""); if (mapset == NULL) exit(EXIT_SUCCESS); fqn = G_fully_qualified_name(name, mapset); sprintf(command, "d.rast map='%s'", fqn); G_spawn(command, "d.rast", NULL); } \endcode \subsection finding Finding Files in the Database Command line driven module requires a database file name as one of the command arguments. In this case, the programmer must search the database to find the mapset where the file resides. The following routines search the database for files: - G_find_file() Look for the file name under the specified element in the database. The mapset parameter can either be the empty string "", which means search all the mapsets in the user's current mapset search path, or it can be a specific mapset, which means. Look for the file only in this one mapset (for example, in the current mapset). If found, the mapset where the file lives is returned. If not found, the NULL pointer is returned. If the user specifies a fully qualified file name, (i.e, a name that also contains the mapset; see \ref Fully_Qualified_File_Names) then G_find_file() modifies name by eliminating the mapset from the name. For example, to find a "paint/labels" file anywhere in the database: \code char name[GNAME_MAX]; char *mapset; if ((mapset = G_find_file("paint/labels", name, "")) == NULL) /* not found */ \endcode To check that the file exists in the current mapset: \code char name[GNAME_MAX]; if (G_find_file("paint/labels", name, G_mapset()) == NULL) /* not found */ \endcode \subsection Legal_File_Names Legal File Names Not all names that a user may enter will be legal files for the GRASS databases. The routines which create new files require that the new file have a legal name. If the name is obtained from the command line, the programmer must check that the name is legal. The following routine checks for legal file names: - G_legal_filename() \subsection Opening_an_Existing_Database_File_for_Reading Opening an Existing Database File for Reading The following routines open the file name in mapset from the specified database element for reading (but not for writing). The file name and mapset can be obtained using G_find_file(). The database file name under the element in the specified mapset is opened for reading (but not for writing). - G_open_old() The UNIX open() routine is used to open the file. If the file does not exist, -1 is returned. Otherwise the file descriptor from the open() is returned. - G_fopen_old() The UNIX fopen() routine, with "r" read mode, is used to open the file. If the file does not exist, the NULL pointer is returned. Otherwise the file descriptor from the fopen() is returned. \subsection Opening_an_Existing_Database_File_for_Update Opening an Existing Database File for Update The following routines open the file name in the current mapset from the specified database element for writing. The file must exist. Its name can be obtained using G_find_file(). The database file name under the element in the current mapset is opened for reading and writing. - G_open_update() The UNIX open() routine is used to open the file. If the file does not exist, -1 is returned. Otherwise the file is positioned at the end of the file and the file descriptor from the open() is returned. - G_fopen_append() The UNIX fopen() routine, with "a" append mode, is used to open the file. If the file does not exist, the NULL pointer is returned. Otherwise the file is positioned at the end of the file and the file descriptor from the fopen() is returned. \subsection Creating_and_Opening_a_New_Database_File Creating and Opening a New Database File The following routines create the new file name in the current mapset (GRASS does not allow files to be created outside the current mapset; see \ref Database_Access_Rules) under the specified database element and open it for writing. The database element is created, if it does not already exist. The file name is obtained noninteractively (e.g., from the command line), G_legal_filename() should be called first to make sure that name is a valid GRASS file name. Warning: It is not an error for name to already exist. However, the file will be removed and recreated empty. G_find_file() could be used to see if name exists. The database file name under the element in the current mapset is created and opened for writing (but not reading). - G_open_new() The UNIX open() routine is used to open the file. If the file does not exist, -1 is returned. Otherwise the file is positioned at the end of the file and the file descriptor from the open() is returned. - G_fopen_new() The UNIX fopen() routine, with "w" write mode, is used to open the file. If the file does not exist, the NULL pointer is returned. Otherwise the file is positioned at the end of the file and the file descriptor from the fopen() is returned. \subsection Database_File_Management Database File Management The following routines allow the renaming and removal of database files in the current mapset (These functions only apply to the current mapset since GRASS does permit users to modify things in mapsets other than the current mapset; see \ref Database_Access_Rules). - G_rename() rename a database file - G_remove() remove a database file Note: These functions only apply to the specific element and not to other "related" elements. For example, if element is "cell", then the specified raster file will be removed (or renamed), but the other support files, such as "cellhd" or "cats", will not. To remove these other files as well, specific calls must be made for each related element. \section Region Region The region concept is explained in \ref Region. It can be thought of as a two-dimensional matrix with known boundaries and rectangular cells. There are logically two different regions. The first is the database region that the user has set in the current mapset. The other is the region that is active in the module. This active module region is what controls reading and writing of raster file data. The vector map export does not take care for the active region settings. The routines described below use a GRASS data structure Cell_head to hold region information. This structure is defined in the "gis.h" header file. It is discussed in detail under \ref GIS_Library_Data_Structures. \subsection Database_Region Database Region Reading and writing the user's database region are done by the following routines: Note: Previous versions of GRASS called this the "window". Due to overuse of this term (database window, graphics window, etc.), the term was changed to "region". However, to maintain compatibility with existing programs, library routine names were not changed - hence the term "window" is used in the routine name (where "region" should probably be used instead). - G_get_window() Reads the database region as stored in the WIND file in the user's current mapset into region. An error message is printed and exit() is called if there is a problem reading the region. Note: GRASS applications that read or write raster files should not use this routine since its use implies that the active module region will not be used. Programs that read or write raster file data (or vector data) can query the active module region using G_window_rows() and G_window_cols(). - G_put_window() Writes the database region file (WIND) in the user's current mapset from region. Warning: Since this routine actually changes the database region, it should only be called by modules which the user knows will change the region. It is probably fair to say that only the g.region should call this routine. There is another database region. This region is the default region for the location. The default region provides the user with a "starting" region, i.e., a region to begin with and return to as a reference point. The GRASS modules g.region allow the user to set their database region from the default region (see \ref Permanent_Mapset for a discussion of the default region). The following routine reads this region: - G_get_default_window() \subsection Active_Module_Region Active Module Region The active module region is the one that is used when reading and writing raster file data. This region determines the resampling when reading raster data. It also determines the extent and resolution of new raster files. Initially the active module region and the user's database region are the same, but the programmer can make them different. The following routines manage the active module region. - G_window_rows() number of rows in active region - G_window_cols() number of columns in active region These routines return the number of rows and columns (respectively) in the active module region. Before raster files can be read or written, it is necessary to known how many rows and columns are in the active region. For example: \code int nrows, cols; int row, col; nrows = G_window_rows(); ncols = G_window_cols(); for (row = 0; row < nrows; row++) { /* read row ... */ for (col = 0; col < ncols; col++) { /* process col ... */ } } \endcode - G_set_window() set the active region This routine sets the active region from given region. Setting the active region does not change the WIND file in the database. It simply changes the region for the duration of the module. However, the new region setting is not retained across the UNIX exec() call. This implies that G_set_window() cannot be used to set the region for a module to be executed using the system() or popen() routines. Note: This routine overrides the region as set by the user. Its use should be very limited since it changes what the user normally expects to happen. If this routine is not called, then the active region will be the same as what is in the user's WIND file. Warning: Calling this routine with already opened raster files has some side effects. If there are raster files which are open for reading, they will be read into the newly set region, not the region that was active when they were opened. However, CELL buffers allocated for reading the raster files are not automatically reallocated. The module must reallocate them explicitly. Also, this routine does not change the region for raster files which are open for writing. The region that was active when the open occurred still applies to these files. - G_get_set_window() get the active region Gets the values of the currently active region into region. If G_set_window() has been called, then the values set by that call are retrieved. Otherwise the user's database region is retrieved. Note: For modules that read or write raster data, and really need the full region information, this routine is preferred over G_get_window(). However, since G_window_rows() and G_window_cols() return the number of rows and columns in the active region, the programmer should consider whether or not the full region information is really needed before using this routine. - G_align_window() align two regions Modifies the input region to align to the reference region. The resolutions in region are set to match those in refefence region and the region edges (north, south, east, west) are modified to align with the grid of the reference region. The region may be enlarged if necessary to achieve the alignment. The north is rounded northward, the south southward, the east eastward and the west westward. - G_col_to_easting() Converts a column relative to a region to an easting. Note: col is a double: col+0.5 will return the easting for the center of the column; col+0.0 will return the easting for the western edge of the column; and col+1.0 will return the easting for the eastern edge of the column. - G_row_to_northing() Converts a row relative to a region to a northing. Note: row is a double: row+0.5 will return the northing for the center of the row; row+0.0 will return the northing for the northern edge of the row; and row+1.0 will return the northing for the southern edge of the row. - G_easting_to_col() Converts an easting relative to a region to a column. Note: The result is a double. Casting it to an integer will give the column number. - G_northing_to_row() Converts a northing relative to a region to a row. Note: the result is a double. Casting it to an integer will give the row number. \section Projection_Information Projection Information The following routines return information about the cartographic projection and zone. See \ref Region for more information about these values. - G_projection() This routine returns a code indicating the projection for the active region. The current values are: - PROJECTION_XY - unreferenced x,y (imagery data) - PROJECTION_UTM - UTM - PROJECTION_SP - State Plane - PROJECTION_LL - Latitude-Longitude - PROJECTION_OTHER - Other (more than 121 projections are supported) - G_database_projection_name() Returns a pointer to a string which is a printable name for projection code (as returned by G_projection()). - G_database_unit_name() Returns a string describing the database grid units. - G_database_units_to_meters_factor() Returns a factor which converts the grid unit to meters (by multiplication). If the database is not metric (eg. imagery) then 0.0 is returned. - G_zone() This routine returns the zone for the active region. The meaning for the zone depends on the projection. For example zone 18 for projection type 1 would be UTM zone 18. \subsection Latitude_Longitude_Databases Latitude-Longitude GIS Databases GRASS supports databases in a longitude-latitude grid using a projection where the x coordinate is the longitude and the y coordinate is the latitude. This projection is called the Equidistant Cylindrical Projection (also known as Plate Carree). ECP has the property that where am I and row-column calculations are identical to those in planimetric grids (like UTM, Universal Transverse Mercator Projection). This implies that normal GRASS registration and overlay functions will work without any special considerations or modifications to existing code. However, the projection is not planimetric. This means that distance and area calculations are no longed Euclidean. Also, since the world is round, maps may not have edges in the east-west direction, especially for global databases. Maps may have the same longitude at both the east and west edges of the display. This feature, called global wraparound, must be accounted for by GRASS modules (particularly vector based functions, like plotting). What follows is a description of the GIS Library routines that are available to support latitude-longitude databases. \subsection Coordinates Coordinates Latitudes and longitudes are specified in degrees. Northern latitudes range from 0 to 90 degrees, and southern latitudes from 0 to -90. Longitudes have no limits since longitudes ±360 degrees are equivalent. Coordinates are represented in ASCII using the format dd:mm:ssN or dd:mm:ssS for latitudes, ddd:mm:ssE or ddd.mm.ssW for longitudes, and dd.mm.ss for grid resolution. For example, 80:30:24N represents a northern latitude of 80 degrees, 30 minutes, and 24 seconds. 120:15W represents a longitude 120 degrees and 15 minutes west of the prime meridian. 30:15 represents a resolution of 30 degrees and 15 minutes. These next routines convert between ASCII representations and the machine representation for a coordinate. They work both with latitude-longitude projections and planimetric projections. Note: In each subroutine, the programmer must specify the projection number. If the projection number is PROJECTION_LL (defined in "gis.h"), then latitude-longitude ASCII format is invoked. Otherwise, a standard floating-point to ASCII conversion is made. - G_format_easting() easting to ASCII - G_format_northing() northing to ASCII Converts the double representation of the given coordinate to its ASCII representation. - G_format_resolution() Converts the double representation of the resolution to its ASCII representation. - G_scan_easting() ASCII easting to double - G_scan_northing() ASCII northing to double Converts the ASCII coordinate string in to its double representation. - G_scan_resolution() ASCII resolution to double Converts the ASCII "resolution" string to its double representation (into resolution). The following are examples of how these routines are used. \code double north; char buf[50]; G_scan_northing(buf, north, G_projection()); /* ASCII to double */ G_format_northing(north, buf, G_projection()); /* double to ASCII */ G_format_northing(north, buf, -1); /* double to ASCII */ /* This last example forces floating-point ASCII format */ \endcode \subsection Global_Wraparound Global Wraparound These next routines provide a mechanism for determining the relative position of a pair of longitudes. Since longitudes of ±360 are equivalent, but GRASS requires the east to be bigger than the west, some adjustment of coordinates is necessary. - G_adjust_easting() Returns east larger than west. If the region projection is PROJECTION_LL, then this routine returns an equivalent east that is larger, but no more than 360 degrees larger, than the coordinate for the western edge of the region. Otherwise no adjustment is made and the original east is returned. - G_adjust_east_longitude() This routine returns an equivalent east that is larger, but no more than 360 larger than the west coordinate. This routine should be used only with latitude-longitude coordinates. - G_shortest_way() Returns shortest way between eastings. \subsection Miscellaneous Miscellaneous - G_ellipsoid_name() This routine returns a pointer to a string containing the name for the ellipsoid in the GRASS ellipsoid table. It can be used as follows: \code int n; char *name; for(n = 0; name = G_ellipsoid_name(n); n++) fprintf(stdout, "%s\n", name); \endcode - G_get_ellipsoid_by_name() This routine returns the semi-major axis (in meters) and eccentricity squared for the named ellipsoid. - G_get_ellipsoid_parameters() This routine returns the semi-major axis (in meters) and the eccentricity squared for the ellipsoid associated with the database. If there is no ellipsoid explicitly associated with the database, it returns the values for the WGS 84 ellipsoid. - G_meridional_radius_of_curvature() Returns the meridional radius of curvature at a given longitude: \f$ \rho = \frac{a (1-e^2)}{(1-e^2\sin^2 lon)^{3/2}} \f$ - G_transverse_radius_of_curvature() Returns the transverse radius of curvature at a given longitude: \f$ \nu = \frac{a}{(1-e^2\sin^2 lon)^{1/2}} \f$ - G_radius_of_conformal_tangent_sphere() Returns the radius of the conformal sphere tangent to ellipsoid at a given longitude: \f$ r = \frac{a (1-e^2)^{1/2}}{(1-e^2\sin^2 lon)} \f$ - G_pole_in_polygon() For latitude-longitude coordinates, this routine determines if the polygon contains one of the poles. \section Calculations Calculations \subsection Raster_Area_Calculations Raster Area Calculations The following routines perform area calculations for raster maps. They are based on the fact that while the latitude-longitude grid is not planimetric, the size of the grid cell at a given latitude is constant. The first routines work in any projection. - G_begin_cell_area_calculations() This routine must be called once before any call to G_area_of_cell_at_row(). It can be used in either planimetric projections or the latitude-longitude projection. - G_area_of_cell_at_row() This routine returns the area in square meters of a cell in the specified row. This value is constant for planimetric grids and varies with the row if the projection is latitude-longitude. - G_begin_zone_area_on_ellipsoid() Initializes raster area calculations for an ellipsoid. - G_area_for_zone_on_ellipsoid() Returns the area between latitudes scaled by the factor passed to G_begin_zone_area_on_ellipsoid(). - G_begin_zone_area_on_sphere() Initializes raster area calculations for a sphere. - G_area_for_zone_on_sphere() Returns the area between latitudes. \subsection Polygonal_Area_Calculations Polygonal Area Calculations These next routines provide area calculations for polygons. Some of the routines are specifically for latitude-longitude, while others will function for all projections. However, there is an issue for latitude-longitude that does not occur with planimetric grids. Vector/polygon data is described as a series of x,y coordinates. The lines connecting the points are not stored but are inferred. This is a simple, straight-forward process for planimetric grids, but it is not simple for latitude-longitude. What is the shape of the line that connects two points on the surface of a globe? One choice (among many) is the shortest path from x1,y1 to x2,y2, known as the geodesic. Another is a straight line on the grid. The area routines described below assume the latter. Routines to work with the former have not yet been developed. - G_begin_polygon_area_calculations() This initializes the polygon area calculation routines. It is used both for planimetric and latitude-longitude projections. - G_area_of_polygon() Returns the area in square meters of the polygon. It is used both for planimetric and latitude-longitude projections. Note. If the database is planimetric with the non-meter grid, this routine performs the required unit conversion to produce square meters. - G_planimetric_polygon_area() Return the area in map units of the polygon, - G_begin_ellipsoid_polygon_area() This initializes the polygon area calculations for the ellipsoid. - G_ellipsoid_polygon_area() Returns the area in square meters of the polygon for latitude-longitude grids. Note: This routine assumes grid lines on the connecting the vertices (as opposed to geodesics). \subsection Distance_Calculations Distance Calculations Two routines perform distance calculations for any projection. - G_begin_distance_calculations() Initializes the distance calculations. It is used both for the planimetric and latitude-longitude projections. - G_distance() This routine computes the distance between two points in meters. - G_begin_geodesic_distance() Initializes the distance calculations for the ellipsoid. It is used only for the latitude-longitude projection. - G_geodesic_distance() geodesic distance Calculates the geodesic distance between two points in meters. The calculation of the geodesic distance is fairly costly. These next three routines provide a mechanism for calculating distance with two fixed latitudes and varying longitude separation. - G_set_geodesic_distance_lat1() set the first latitude. - G_set_geodesic_distance_lat2() set the second latitude. - G_geodesic_distance_lon_to_lon() Calculates the geodesic distance between two points set by G_set_geodesic_distance_latl() and G_set_geodesic_distance_lat2(). \section General_Plotting_Routines General Plotting Routines The following routines form the foundation of a general purpose line and polygon plotting capability. - G_bresenham_line() Draws a line from one point to another using Bresenham's algorithm. A routine to plot points must be provided, as is defined as: point(x, y) plot a point at x,y. This routine does not require a previous call to G_setup_plot() to function correctly, and is independent of all following routines. - G_setup_plot() Initializes the plotting capability. This routine must be called once before calling the G_plot_*() routines described below. - G_plot_line() Plots line between latlon coordinates. This routine handles global wrap-around for latitude-longitude databases. See G_setup_plot() for the required coordinate initialization procedure. - G_plot_polygon() Plots filled polygon with n vertices. See G_setup_plot() for the required coordinate initialization procedure. - G_plot_area() Plots multiple polygons. Like G_plot_polygon(), except it takes a set of polygons, each with n vertices, where the number of polygons is specified with the rings argument. It is especially useful for plotting vector areas with interior islands. - G_plot_where_en() The pixel coordinates x,y are converted to map coordinates east,north. See G_setup_plot() for the required coordinate initialization procedure. - G_plot_where_xy() The map coordinates east,north are converted to pixel coordinates x,y.. See G_setup_plot() for the required coordinate initialization procedure. - G_plot_fx() \section Temporary_Files Temporary Files Often it is necessary for modules to use temporary files to store information that is only useful during the module run. After the module finishes, the information in the temporary file is no longer needed and the file is removed. Commonly it is required that temporary file names be unique from invocation to invocation of the module. It would not be good for a fixed name like "/tmp/mytempfile" to be used. If the module were run by two users at the same time, they would use the same temporary file. In addition systematic use of the /tmp directory could leave the system vulnerable to symlink attacks. The following routine generates temporary file names which are unique within the module and across all GRASS programs. - G_tempfile() This routine returns a pointer to a string containing a unique file name that can be used as a temporary file within the module. Successive calls to G_tempfile() will generate new names. Only the file name is generated. The file itself is not created. To create the file, the module must use standard UNIX functions which create and open files, e.g., creat() or fopen(). The programmer should take reasonable care to remove (unlink) the file before the module exits. However, GRASS database management will eventually remove all temporary files created by G_tempfile() that have been left behind by the modules which created them. Note: The temporary files are created in the GRASS database rather than under /tmp. This is done for two reasons. The first is to increase the likelihood that enough disk is available for large temporary files since /tmp may be a very small file system. The second is so that abandoned temporary files can be automatically removed (but see the warning below). Warning: The temporary files are named, in part, using the process id of the module. GRASS database management will remove these files only if the module which created them is no longer running. However, this feature has a subtle trap. Programs which create child processes (using the UNIX fork(), see also G_fork() routine) should let the child call G_tempfile(). If the parent does it and then exits, the child may find that GRASS has removed the temporary file since the process which created it is no longer running. \section Command_Line_Parsing Command Line Parsing The following routines provide a standard mechanism for command line parsing. Use of the provided set of routines will standardize GRASS commands that expect command line arguments, creating a family of GRASS modules that is easy for users to learn. As soon as a GRASS user familiarizes himself with the general form of command line input as defined by the parser, it will greatly simplify the necessity of remembering or at least guessing the required command line arguments for any GRASS command. It is strongly recommended that GRASS programmers use this set of routines for all command line parsing. With their use, the programmer is freed from the burden of generating user interface code for every command. The parser will limit the programmer to a pre-defined look and feel, but limiting the interface is well worth the shortened user learning curve. \subsection Description Description The GRASS parser is a collection of five subroutines which use two structures that are defined in the GRASS "gis.h" header file. These structures allow the programmer to define the options and flags that make up the valid command line input of a GRASS command. The parser routines behave in one of three ways: # If no command line arguments are entered by the user, the parser searches for a completely interactive version of the command. If the interactive version is found, control is passed over to this version. # If command line arguments are entered but they are a subset of the options and flags that the programmer has defined as required arguments, three things happen. The parser will pass an error message to the user indicating which required options and/or flags were missing from the command line, the parser will then display a complete usage message for that command, and finally the parser cancels execution of the command. # If all necessary options and flags are entered on the command line by the user, the parser executes the command with the given options and flags. \subsection Structures Structures The parser routines described below use two structures as defined in the GRASS "gis.h" header file. This is a basic list of members of the Option and Flag structures. A comprehensive description of all elements of these two structures and their possible values can be found in \ref Full_Structure_Members_Description. \subsection Option_structure Option structure These are the basic members of the Option structure. \code struct Option *opt; /* to declare a command line option */ \endcode Structure Member Description of Member: - opt->key - Option name that user will use - opt->description - Option description that is shown to the user - opt->type - Variable type of the user's answer to the option - opt->required - Is this option required on the command line? (Boolean) \subsection Flag_structure Flag structure These are the basic members of the Flag structure. \code struct Flag *flag; /* to declare a command line flag */ \endcode Structure Member Description of Member: - flag->key - Single letter used for flag name - flag->description - Flag description that is shown to the user \subsection Parser_Routines Parser Routines Associated with the parser are five routines that are automatically included in the GRASS Makefile process. The Makefile process is documented in \ref Compiling_and_Installing_GRASS_Modules. - G_define_option() Returns Option structure. Allocates memory for the Option structure and returns a pointer to this memory. - G_define_flag() Allocates memory for the Flag structure and returns a pointer to this memory. - G_parser() The command line parameters argv and the number of parameters argc from the main() routine are passed directly to G_parser(). G_parser() accepts the command line input entered by the user, and parses this input according to the input options and/or flags that were defined by the programmer. G_parser() returns 0 if successful. If not successful, a usage statement is displayed that describes the expected and/or required options and flags and a non-zero value is returned. - G_usage() Calls to G_usage() allow the programmer to print the usage message at any time. This will explain the allowed and required command line input to the user. This description is given according to the programmer's definitions for options and flags. This function becomes useful when the user enters options and/or flags on the command line that are syntactically valid to the parser, but functionally invalid for the command (e.g. an invalid file name). For example, the parser logic doesn't directly support grouping options. If two options be specified together or not at all, the parser must be told that these options are not required and the programmer must check that if one is specified the other must be as well. If this additional check fails, then G_parser() will succeed, but the programmer can then call G_usage() to print the standard usage message and print additional information about how the two options work together. - G_disable_interactive() When a user calls a command with no arguments on the command line, the parser will enter its own standardized interactive session in which all flags and options are presented to the user for input. A call to G_disable_interactive() disables the parser's interactive prompting. Note: Displaying multiple answers default values (new in GRASS 5, see d.zoom for example). \code char *def[] = {"One", "Two", "Last", NULL}; opt->multiple = YES; opt->answers = def; if (G_parser(argc, argv)) exit(EXIT_FAILURE); \endcode The programmer may not forget last NULL value. \subsection Parser_Programming_Examples Parser Programming Examples The use of the parser in the programming process is demonstrated here. Both a basic step by step example and full code example are presented. \subsection Step_by_Step_Use_of_the_Parser Step by Step Use of the Parser These are the four basic steps to follow to implement the use of the GRASS parser in a GRASS command: (1) Allocate memory for Flags and Options: Flags and Options are pointers to structures allocated through the parser routines G_define_option() and G_define_flag() as defined in \ref Parser_Routines. \code #include ; /* The standard GRASS include file */ struct Option *opt; /* Establish an Option pointer for each option */ struct Flag *flag; /* Establish a Flag pointer for each option */ opt = G_define_option(); /* Request a pointer to memory for each option */ flag = G_define_flag(); /* Request a pointer to memory for each flag */ \endcode (2) Define members of Flag and Option structures: The programmer should define the characteristics of each option and flag desired as outlined by the following example: \code opt->key = "option"; /* The name of this option is "option". */ opt->description = _("Option test"); /* The option description is "Option test" */ opt->type = TYPE_STRING; /* The data type of the answer to the option */ opt->required = YES; /* This option *is* required from the user */ flag->key = "t"; /* Single letter name for flag */ flag->description = _("Flag test"); /* The flag description is "Flag test" */ \endcode Note: There are more options defined later in \ref Complete_Structure_Members_Table. (3) Call the parser: \code int main(int argc, char *argv[]); /* command line args passed into main() */ if (G_parser(argc, argv)) /* Returns 0 if successful, non-zero otherwise */ exit(EXIT_FAILURE); \endcode (4) Extracting information from the parser structures: \code fprintf(stdout, "For the option "%s" you chose: <%s>\n", opt->description, opt->answer); fprintf(stdout, "The flag "-%s" is %s set.\n", flag->key, flag->answer ? "" : "not"); \endcode (5) Running the example program Once such a module has been compiled (for example to the default executable file a.out , execution will result in the following user interface scenarios. Lines that begin with '$' imply user entered commands on the command line. \verbatim $ a.out help \endverbatim This is a standard user call for basic help information on the module. The command line options (in this case, "help") are sent to the parser via G_parser(). The parser recognizes the "help" command line option and returns a list of options and/or flags that are applicable for the specific command. Note how the programmer provided option and flag information is captured in the output. \verbatim a.out [-t] option=name Flags: -t Flag test Parameters: option Option test \endverbatim Now the following command is executed: \verbatim # a.out -t \endverbatim This command line does not contain the required option. Note that the output provides this information along with the standard usage message (as already shown above): \verbatim Required parameter