gis.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. /*
  2. *****************************************************************************
  3. *
  4. * MODULE: Grass Include Files
  5. * AUTHOR(S): Original author unknown - probably CERL
  6. * Justin Hickey - Thailand - jhickey@hpcc.nectec.or.th
  7. * PURPOSE: This file contains definitions of variables and data types
  8. * for use with most, if not all, Grass programs. This file is
  9. * usually included in every Grass program.
  10. * COPYRIGHT: (C) 2000-2011 by the GRASS Development Team
  11. *
  12. * This program is free software under the GNU General Public
  13. * License (>=v2). Read the file COPYING that comes with GRASS
  14. * for details.
  15. *
  16. *****************************************************************************/
  17. #ifndef GRASS_GIS_H
  18. #define GRASS_GIS_H
  19. /*============================= Include Files ==============================*/
  20. /* System include files */
  21. #include <stdio.h>
  22. #include <stdarg.h>
  23. /* Grass and local include files */
  24. #include <grass/config.h>
  25. #include <grass/datetime.h>
  26. /*=========================== Constants/Defines ============================*/
  27. #if !defined __GNUC__ || __GNUC__ < 2
  28. #undef __attribute__
  29. #define __attribute__(x)
  30. #endif
  31. static const char *GRASS_copyright __attribute__ ((unused))
  32. = "GRASS GNU GPL licensed Software";
  33. #define GIS_H_VERSION "$Revision$"
  34. #define GIS_H_DATE "$Date$"
  35. #define G_gisinit(pgm) G__gisinit(GIS_H_VERSION, (pgm))
  36. #define G_no_gisinit() G__no_gisinit(GIS_H_VERSION)
  37. /* Define TRUE and FALSE for boolean comparisons */
  38. #ifndef TRUE
  39. #define TRUE 1
  40. #endif
  41. #ifndef FALSE
  42. #define FALSE 0
  43. #endif
  44. #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64
  45. #define PRI_OFF_T "lld"
  46. #else
  47. #define PRI_OFF_T "ld"
  48. #endif
  49. #define NEWLINE '\n'
  50. /*!
  51. \brief List of units
  52. */
  53. #define U_UNDEFINED -1
  54. #define U_UNKNOWN 0
  55. #define U_ACRES 1
  56. #define U_HECTARES 2
  57. #define U_KILOMETERS 3
  58. #define U_METERS 4
  59. #define U_MILES 5
  60. #define U_FEET 6
  61. #define U_RADIANS 7
  62. #define U_DEGREES 8
  63. /* Temporal units from the datetime library */
  64. #define U_YEARS DATETIME_YEAR
  65. #define U_MONTHS DATETIME_MONTH
  66. #define U_DAYS DATETIME_DAY
  67. #define U_HOURS DATETIME_HOUR
  68. #define U_MINUTES DATETIME_MINUTE
  69. #define U_SECONDS DATETIME_SECOND
  70. /*! \brief Projection code - XY coordinate system (unreferenced data) */
  71. #define PROJECTION_XY 0
  72. /*! \brief Projection code - UTM */
  73. #define PROJECTION_UTM 1
  74. /*! \brief Projection code - State Plane */
  75. #define PROJECTION_SP 2
  76. /*! \brief Projection code - Latitude-Longitude */
  77. #define PROJECTION_LL 3
  78. /*! \brief Projection code - other projection (other then noted above) */
  79. #define PROJECTION_OTHER 99
  80. #define PROJECTION_FILE "PROJ_INFO"
  81. #define UNIT_FILE "PROJ_UNITS"
  82. #define CONFIG_DIR ".grass7"
  83. /* define PI and friends */
  84. #undef M_PI
  85. #define M_PI 3.14159265358979323846 /* pi */
  86. #undef M_PI_2
  87. #define M_PI_2 1.57079632679489661923 /* pi/2 */
  88. #undef M_PI_4
  89. #define M_PI_4 0.78539816339744830962 /* pi/4 */
  90. /* epsilon (IEEE: 2.220446e-16) */
  91. #define GRASS_EPSILON 1.0e-15
  92. /* Location of envariment variables */
  93. #define G_VAR_GISRC 0
  94. #define G_VAR_MAPSET 1
  95. /* Where to find/store variables */
  96. #define G_GISRC_MODE_FILE 0 /* files */
  97. #define G_GISRC_MODE_MEMORY 1 /* memory only */
  98. /* for G_parser() */
  99. #define TYPE_INTEGER 1
  100. #define TYPE_DOUBLE 2
  101. #define TYPE_STRING 3
  102. #define YES 1
  103. #define NO 0
  104. /* File/directory name lengths */
  105. #define GNAME_MAX 256
  106. #define GMAPSET_MAX 256
  107. #define GPATH_MAX 4096
  108. /* Macros for type size independent integers */
  109. /* Use these for portability to ensure integers are truly 32bit */
  110. /* and are handled in a uniform manner */
  111. /* Convert integer to 4 bytes - little endian */
  112. #define serialize_int32_le(buf, x) do { \
  113. (buf)[0] = ((x) >> 0) & 0xFF; \
  114. (buf)[1] = ((x) >> 8) & 0xFF; \
  115. (buf)[2] = ((x) >> 16) & 0xFF; \
  116. (buf)[3] = ((x) >> 24) & 0xFF; \
  117. } while(0)
  118. /* Convert 4 bytes to an integer - little endian */
  119. #define deserialize_int32_le(buf) (((buf)[0] << 0) | \
  120. ((buf)[1] << 8) | \
  121. ((buf)[2] << 16) | \
  122. ((buf)[3] << 24))
  123. /* Convert integer to 4 bytes - big endian */
  124. #define serialize_int32_be(buf, x) do { \
  125. (buf)[0] = ((x) >> 24) & 0xFF; \
  126. (buf)[1] = ((x) >> 16) & 0xFF; \
  127. (buf)[2] = ((x) >> 8) & 0xFF; \
  128. (buf)[3] = ((x) >> 0) & 0xFF; \
  129. } while(0)
  130. /* Convert 4 bytes to an integer - big endian */
  131. #define deserialize_int32_be(buf) (((buf)[0] << 24) | \
  132. ((buf)[1] << 16) | \
  133. ((buf)[2] << 8) | \
  134. ((buf)[3] << 0))
  135. /* Cross-platform Directory Separator Character and null device stuff */
  136. #define GRASS_DIRSEP '/'
  137. #ifdef __MINGW32__
  138. # define HOST_DIRSEP '\\'
  139. # define G_DEV_NULL "NUL:"
  140. #else
  141. # define HOST_DIRSEP '/'
  142. # define G_DEV_NULL "/dev/null"
  143. #endif
  144. /**/ typedef enum
  145. {
  146. G_OPT_UNDEFINED,
  147. G_OPT_DB_SQL, /* SQL statements */
  148. G_OPT_DB_WHERE, /* SQL where conditions */
  149. G_OPT_DB_TABLE, /* table name */
  150. G_OPT_DB_DRIVER, /* driver name */
  151. G_OPT_DB_DATABASE, /* database name */
  152. G_OPT_DB_SCHEMA, /* database schema */
  153. G_OPT_DB_COLUMN, /* one attr column */
  154. G_OPT_DB_COLUMNS, /* one or more attr columns */
  155. G_OPT_DB_KEYCOLUMN, /* key column */
  156. G_OPT_I_GROUP, /* old input imagery group */
  157. G_OPT_I_SUBGROUP, /* old input imagery subgroup */
  158. G_OPT_R_INPUT, /* old input raster map */
  159. G_OPT_R_INPUTS, /* old input raster maps */
  160. G_OPT_R_OUTPUT, /* new output raster map */
  161. G_OPT_R_MAP, /* old input raster map */
  162. G_OPT_R_MAPS, /* old input rasters map */
  163. G_OPT_R_BASE, /* old input base raster map */
  164. G_OPT_R_COVER, /* old input cover raster map */
  165. G_OPT_R_ELEV, /* old input elevation raster map */
  166. G_OPT_R_ELEVS, /* old input elevation raster maps */
  167. G_OPT_R3_INPUT, /* old input raster3d map */
  168. G_OPT_R3_INPUTS, /* old input raster3d maps */
  169. G_OPT_R3_OUTPUT, /* new output raster3d map */
  170. G_OPT_R3_MAP, /* old input raster3d map */
  171. G_OPT_R3_MAPS, /* old input raster3d maps */
  172. G_OPT_R3_TYPE, /* Type (FCELL or DCELL) of a new created raster3d map */
  173. G_OPT_R3_PRECISION, /* The precision of the new generated raster3d map */
  174. G_OPT_R3_TILE_DIMENSION, /* The tile dimension of a new generated raster3d map */
  175. G_OPT_R3_COMPRESSION, /* The kind of compression of a new created raster3d map */
  176. G_OPT_V_INPUT, /* old input vector map */
  177. G_OPT_V_INPUTS, /* old input vector maps */
  178. G_OPT_V_OUTPUT, /* new output vector map */
  179. G_OPT_V_MAP, /* old input vector map */
  180. G_OPT_V_MAPS, /* old input vector maps */
  181. G_OPT_V_TYPE, /* primitive type */
  182. G_OPT_V3_TYPE, /* primitive type, 2D and 3D */
  183. G_OPT_V_FIELD, /* layer number (layers used to be called fields) */
  184. G_OPT_V_FIELD_ALL, /* layer number (layers used to be called fields) */
  185. G_OPT_V_CAT, /* one category */
  186. G_OPT_V_CATS, /* more categories */
  187. G_OPT_V_ID, /* one feature id */
  188. G_OPT_V_IDS, /* more feature ids */
  189. G_OPT_F_INPUT, /* old input file */
  190. G_OPT_F_OUTPUT, /* new output file */
  191. G_OPT_F_SEP, /* data field separator */
  192. G_OPT_C_FG, /* foreground color */
  193. G_OPT_C_BG, /* background color */
  194. G_OPT_M_UNITS, /* units */
  195. G_OPT_M_DATATYPE, /* datatype */
  196. G_OPT_M_MAPSET, /* mapset */
  197. G_OPT_M_COORDS, /* coordinates */
  198. G_OPT_M_COLR, /* color rules */
  199. G_OPT_M_DIR, /* directory input */
  200. G_OPT_STDS_INPUT, /* old input space time dataset of type strds, str3ds or stvds */
  201. G_OPT_STDS_INPUTS, /* old input space time datasets */
  202. G_OPT_STDS_OUTPUT, /* new output space time dataset */
  203. G_OPT_STRDS_INPUT, /* old input space time raster dataset */
  204. G_OPT_STRDS_INPUTS, /* old input space time raster datasets */
  205. G_OPT_STRDS_OUTPUT, /* new output space time raster dataset */
  206. G_OPT_STR3DS_INPUT, /* old input space time raster3d dataset */
  207. G_OPT_STR3DS_INPUTS, /* old input space time raster3d datasets */
  208. G_OPT_STR3DS_OUTPUT, /* new output space time raster3d dataset */
  209. G_OPT_STVDS_INPUT, /* old input space time vector dataset */
  210. G_OPT_STVDS_INPUTS, /* old input space time vector datasets */
  211. G_OPT_STVDS_OUTPUT, /* new output space time vector dataset */
  212. G_OPT_MAP_INPUT, /* old input map of type raster, vector or raster3d */
  213. G_OPT_MAP_INPUTS, /* old input maps of type raster, vector or raster3d */
  214. G_OPT_STDS_TYPE, /* the type of a space time dataset: strds, str3ds, stvds */
  215. G_OPT_MAP_TYPE, /* The type of an input map: raster, vect, rast3d */
  216. G_OPT_T_TYPE, /* The temporal type of a space time dataset */
  217. G_OPT_T_WHERE, /* A temporal GIS framework SQL WHERE statement */
  218. G_OPT_T_SAMPLE, /* Temporal sample methods */
  219. } STD_OPT;
  220. /**/ typedef enum
  221. {
  222. G_FLG_UNDEFINED,
  223. G_FLG_V_TABLE, /* do not create attribute table */
  224. G_FLG_V_TOPO, /* do not build topology */
  225. } STD_FLG;
  226. /* Message format */
  227. #define G_INFO_FORMAT_STANDARD 0 /* GRASS_MESSAGE_FORMAT=standard or not defined */
  228. #define G_INFO_FORMAT_GUI 1 /* GRASS_MESSAGE_FORMAT=gui */
  229. #define G_INFO_FORMAT_SILENT 2 /* GRASS_MESSAGE_FORMAT=silent */
  230. #define G_INFO_FORMAT_PLAIN 3 /* GRASS_MESSAGE_FORMAT=plain */
  231. /* Icon types */
  232. #define G_ICON_CROSS 0
  233. #define G_ICON_BOX 1
  234. #define G_ICON_ARROW 2
  235. /* default colors */
  236. #define DEFAULT_FG_COLOR "black"
  237. #define DEFAULT_BG_COLOR "white"
  238. /* error codes */
  239. #define G_FATAL_EXIT 0
  240. #define G_FATAL_PRINT 1
  241. #define G_FATAL_RETURN 2
  242. /*! \brief Endian check */
  243. #define ENDIAN_LITTLE 0
  244. #define ENDIAN_BIG 1
  245. #define ENDIAN_OTHER 2
  246. /* for vector maps */
  247. /*!
  248. \brief Name of default key column
  249. */
  250. #define GV_KEY_COLUMN "cat"
  251. /* Element types */
  252. enum
  253. { /* Dir */
  254. G_ELEMENT_RASTER = 1, /* cell */
  255. G_ELEMENT_RASTER3D = 2, /* 3dcell */
  256. G_ELEMENT_VECTOR = 3, /* vector */
  257. G_ELEMENT_OLDVECTOR = 4, /* GRASS < 5.7 vector */
  258. G_ELEMENT_ASCIIVECTOR = 5, /* ASCII vector */
  259. G_ELEMENT_ICON = 6, /* icon */
  260. G_ELEMENT_LABEL = 7, /* labels */
  261. G_ELEMENT_SITE = 8, /* sites */
  262. G_ELEMENT_REGION = 9, /* region */
  263. G_ELEMENT_REGION3D = 10, /* 3dregion */
  264. G_ELEMENT_GROUP = 11, /* group */
  265. G_ELEMENT_3DVIEW = 12 /* 3dview */
  266. };
  267. /*=========================== Typedefs/Structures ==========================*/
  268. /*!
  269. \brief 2D/3D raster map header (used also for region)
  270. */
  271. struct Cell_head
  272. {
  273. /*! \brief Max number of bytes per raster data value minus 1 (raster header only)
  274. Note: -1 for FP raster maps
  275. */
  276. int format;
  277. /*! \brief Compression mode (raster header only)
  278. - 0: uncompressed
  279. - 1: compressed
  280. - -1: pre GRASS 3.0
  281. */
  282. int compressed;
  283. /*! \brief Number of rows for 2D data */
  284. int rows;
  285. /*! \brief Number of rows for 3D data */
  286. int rows3;
  287. /*! \brief Number of columns for 2D data */
  288. int cols;
  289. /*! \brief Number of columns for 3D data */
  290. int cols3;
  291. /*! \brief number of depths for 3D data */
  292. int depths;
  293. /*! \brief Projection code
  294. - PROJECTION_XY
  295. - PROJECTION_UTM
  296. - PROJECTION_SP
  297. - PROJECTION_LL
  298. - PROJECTION_OTHER
  299. */
  300. int proj;
  301. /*! \brief Projection zone (UTM) */
  302. int zone;
  303. /*! \brief Resolution - east to west cell size for 2D data */
  304. double ew_res;
  305. /*! \brief Resolution - east to west cell size for 3D data */
  306. double ew_res3;
  307. /*! \brief Resolution - north to south cell size for 2D data */
  308. double ns_res;
  309. /*! \brief Resolution - north to south cell size for 3D data */
  310. double ns_res3;
  311. /*! \brief Resolution - top to bottom cell size for 3D data */
  312. double tb_res;
  313. /*! \brief Extent coordinates (north) */
  314. double north;
  315. /*! \brief Extent coordinates (south) */
  316. double south;
  317. /*! \brief Extent coordinates (east) */
  318. double east;
  319. /*! \brief Extent coordinates (west) */
  320. double west;
  321. /*! \brief Extent coordinates (top) - 3D data*/
  322. double top;
  323. /*! \brief Extent coordinates (bottom) - 3D data */
  324. double bottom;
  325. };
  326. /*
  327. ** Structure for I/O of 3dview files (view.c)
  328. */
  329. struct G_3dview
  330. {
  331. char pgm_id[40]; /* user-provided identifier */
  332. float from_to[2][3]; /* eye position & lookat position */
  333. float fov; /* field of view */
  334. float twist; /* right_hand rotation about from_to */
  335. float exag; /* terrain elevation exageration */
  336. int mesh_freq; /* cells per grid line */
  337. int poly_freq; /* cells per polygon */
  338. int display_type; /* 1 for mesh, 2 for poly, 3 for both */
  339. int lightson; /* boolean */
  340. int dozero; /* boolean */
  341. int colorgrid; /* boolean */
  342. int shading; /* boolean */
  343. int fringe; /* boolean */
  344. int surfonly; /* boolean */
  345. int doavg; /* boolean */
  346. char grid_col[40]; /* colors */
  347. char bg_col[40]; /* colors */
  348. char other_col[40]; /* colors */
  349. float lightpos[4]; /* east, north, height, 1.0 for local 0.0 infin */
  350. float lightcol[3]; /* values between 0.0 to 1.0 for red, grn, blu */
  351. float ambient;
  352. float shine;
  353. struct Cell_head vwin;
  354. };
  355. struct Key_Value
  356. {
  357. int nitems;
  358. int nalloc;
  359. char **key;
  360. char **value;
  361. };
  362. struct Option /* Structure that stores option info */
  363. {
  364. const char *key; /* Key word used on command line */
  365. int type; /* Option type */
  366. int required; /* REQUIRED or OPTIONAL */
  367. int multiple; /* Multiple entries OK */
  368. const char *options; /* Approved values or range or NULL */
  369. const char **opts; /* NULL or NULL terminated array of parsed options */
  370. const char *key_desc; /* one word describing the key */
  371. const char *label; /* Optional short label, used in GUI as item label */
  372. const char *description; /* String describing option */
  373. const char *descriptions; /* ';' separated pairs of option and option descriptions */
  374. /* For example: (with ->options = "break,rmdupl")
  375. * "break;break lines on intersections;"
  376. * "rmdupl;remove duplicates"
  377. */
  378. const char **descs; /* parsed descriptions, array of either NULL or string */
  379. /* in the same order as options */
  380. char *answer; /* Option answer */
  381. const char *def; /* Where original answer gets saved */
  382. char **answers; /* Option answers (for multiple=YES) */
  383. struct Option *next_opt; /* Pointer to next option struct */
  384. const char *gisprompt; /* Interactive prompt guidance */
  385. const char *guisection; /* GUI Layout guidance: ';' delimited heirarchical tree position */
  386. const char *guidependency; /* GUI dependency, list of options
  387. (separated by commas) to be updated
  388. if the value is chanched */
  389. int (*checker)(const char *);/* Routine to check answer or NULL */
  390. int count;
  391. };
  392. struct Flag /* Structure that stores flag info */
  393. {
  394. char key; /* Key char used on command line */
  395. char answer; /* Stores flag state: 0/1 */
  396. char suppress_required; /* Suppresses checking of required options */
  397. const char *label; /* Optional short label, used in GUI as item label */
  398. const char *description; /* String describing flag meaning */
  399. const char *guisection; /* GUI Layout guidance: ';' delimited heirarchical tree position */
  400. struct Flag *next_flag; /* Pointer to next flag struct */
  401. };
  402. struct GModule /* Structure that stores module info */
  403. {
  404. const char *label; /* Optional short description for GUI */
  405. const char *description; /* String describing module */
  406. const char **keywords; /* Keywords describing module */
  407. /* further items are possible: author(s), version */
  408. int overwrite; /* overwrite old files */
  409. int verbose; /* print all information about progress and so on */
  410. };
  411. struct TimeStamp
  412. {
  413. DateTime dt[2]; /* two datetimes */
  414. int count;
  415. };
  416. struct Counter {
  417. int value;
  418. };
  419. struct Popen {
  420. FILE *fp;
  421. int pid;
  422. };
  423. typedef int CELL;
  424. typedef double DCELL;
  425. typedef float FCELL;
  426. struct _Color_Value_
  427. {
  428. DCELL value;
  429. unsigned char red;
  430. unsigned char grn;
  431. unsigned char blu;
  432. };
  433. struct _Color_Rule_
  434. {
  435. struct _Color_Value_ low, high;
  436. struct _Color_Rule_ *next;
  437. struct _Color_Rule_ *prev;
  438. };
  439. struct _Color_Info_
  440. {
  441. struct _Color_Rule_ *rules;
  442. int n_rules;
  443. struct
  444. {
  445. unsigned char *red;
  446. unsigned char *grn;
  447. unsigned char *blu;
  448. unsigned char *set;
  449. int nalloc;
  450. int active;
  451. } lookup;
  452. struct
  453. {
  454. DCELL *vals;
  455. /* pointers to color rules corresponding to the intervals btwn vals */
  456. struct _Color_Rule_ **rules;
  457. int nalloc;
  458. int active;
  459. } fp_lookup;
  460. DCELL min, max;
  461. };
  462. struct Colors
  463. {
  464. int version; /* set by read_colors: -1=old,1=new */
  465. DCELL shift;
  466. int invert;
  467. int is_float; /* defined on floating point raster data? */
  468. int null_set; /* the colors for null are set? */
  469. unsigned char null_red;
  470. unsigned char null_grn;
  471. unsigned char null_blu;
  472. int undef_set; /* the colors for cells not in range are set? */
  473. unsigned char undef_red;
  474. unsigned char undef_grn;
  475. unsigned char undef_blu;
  476. struct _Color_Info_ fixed;
  477. struct _Color_Info_ modular;
  478. DCELL cmin;
  479. DCELL cmax;
  480. int organizing;
  481. };
  482. /*!
  483. \brief List of integers
  484. */
  485. struct ilist
  486. {
  487. /*!
  488. \brief Array of values
  489. */
  490. int *value;
  491. /*!
  492. \brief Number of values in the list
  493. */
  494. int n_values;
  495. /*!
  496. \brief Allocated space for values
  497. */
  498. int alloc_values;
  499. };
  500. /*============================== Prototypes ================================*/
  501. /* Since there are so many prototypes for the gis library they are stored */
  502. /* in the file gisdefs.h */
  503. #include <grass/defs/gis.h>
  504. #endif /* GRASS_GIS_H */