123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812 |
- /*!
- \file include/vect/dig_structs.h
- \brief Data structures for \ref vectorlib
- \author Written by Dave Gerdes (CERL) 5/1988
- \author Updated to GRASS 5.7 by Radim Blazek (2001)
- \author Updated to GRASS 7.0 by Markus Metz (2011)
- \author Doxygenized by Martin Landa <landa.martin gmail.com> (2011)
- */
- #include <grass/config.h>
- #ifndef DIG___STRUCTS___
- #define DIG___STRUCTS___
- #include <stdio.h>
- #include <sys/types.h>
- #include <grass/dgl.h>
- #include <grass/shapefil.h>
- #include <grass/rbtree.h>
- #include <grass/rtree.h>
- #include <grass/dbmi.h>
- #ifdef HAVE_OGR
- #include <ogr_api.h>
- #endif
- #ifdef HAVE_POSTGRES
- #include <libpq-fe.h>
- #endif
- /*!
- \brief plus_t size
- 3.10 changes plus_t to int. This assumes that any reasonable machine
- will use 4 bytes to store an int. The diglib code is not guaranteed
- to work if plus_t is changed to a type that is larger than an int.
- */
- typedef int plus_t;
- /*!
- \brief Used by sites lib
- */
- struct site_att
- {
- /*!
- \brief Category number
- */
- int cat;
- /*!
- \brief Array of double attributes
- */
- double *dbl;
- /*!
- \brief Array of string attributes
- */
- char **str;
- };
- /*!
- \brief Bounding box
- */
- struct bound_box
- {
- /*!
- \brief North
- */
- double N;
- /*!
- \brief South
- */
- double S;
- /*!
- \brief East
- */
- double E;
- /*!
- \brief West
- */
- double W;
- /*!
- \brief Top
- */
- double T;
- /*!
- \brief Bottom
- */
- double B;
- };
- /*!
- \brief File definition
- */
- struct gvfile
- {
- /*!
- \brief File descriptor
- */
- FILE *file;
- /*!
- \brief Pointer to beginning of the file in the memory
- */
- char *start;
- /*!
- \brief Current position set by dig_seek()
- */
- char *current;
- /*!
- \brief End of file in the memory (pointer to first byte after)
- */
- char *end;
- /*!
- \brief Size of the file loaded to memory
- */
- off_t size;
- /*!
- \brief Allocated space
- */
- off_t alloc;
- /*!
- \brief Is file loaded?
- - 0 - not loaded
- - 1 - loaded
- */
- int loaded;
- };
- /*!
- \brief Layer (old: field) information
- */
- struct field_info
- {
- /*!
- \brief Layer number
- */
- int number;
- /*!
- \brief Layer name (optional)
- */
- char *name;
- /*!
- \brief Name of DB driver ('sqlite', 'dbf', ...)
- */
- char *driver;
- /*!
- brief Name of database
- */
- char *database;
- /*!
- \brief Name of DB table
- */
- char *table;
- /*!
- \brief Name of key column (usually 'cat')
- */
- char *key;
- };
- /*!
- \brief Database links
- */
- struct dblinks
- {
- /*!
- \brief Pointer to the first field_info structure
- */
- struct field_info *field;
- /*!
- \brief Number of allocated slots
- */
- int alloc_fields;
- /*!
- \brief Number of available layers (old: fields)
- */
- int n_fields;
- };
- /*!
- \brief Portability info
-
- Set by V1_open_new() or V1_open_old()
- */
- struct Port_info
- {
- /*!
- \brief File byte order
- */
- int byte_order;
- /*!
- \brief Size of `off_t` data type
- */
- int off_t_size;
- /*!
- \brief Conversion matrices between file and native byte order (double)
- */
- unsigned char dbl_cnvrt[PORT_DOUBLE];
- /*!
- \brief Conversion matrices between file and native byte order (float)
- */
- unsigned char flt_cnvrt[PORT_FLOAT];
- /*!
- \brief Conversion matrices between file and native byte order (long)
- */
- unsigned char lng_cnvrt[PORT_LONG];
- /*!
- \brief Conversion matrices between file and native byte order (int)
- */
- unsigned char int_cnvrt[PORT_INT];
- /*!
- \brief Conversion matrices between file and native byte order (short)
- */
- unsigned char shrt_cnvrt[PORT_SHORT];
- /*!
- \brief Conversion matrices between file and native byte order (off_t)
- */
- unsigned char off_t_cnvrt[PORT_OFF_T];
- /*!
- \brief Quick reading flag for double
-
- Specify if native byte order of that type is the same
- as byte order of vector file (TRUE) or not (FALSE)
- */
- int dbl_quick;
- /*!
- \brief Quick reading flag for float
-
- Specify if native byte order of that type is the same
- as byte order of vector file (TRUE) or not (FALSE)
- */
- int flt_quick;
- /*!
- \brief Quick reading flag for long
-
- Specify if native byte order of that type is the same
- as byte order of vector file (TRUE) or not (FALSE)
- */
- int lng_quick;
- /*!
- \brief Quick reading flag for int
-
- Specify if native byte order of that type is the same
- as byte order of vector file (TRUE) or not (FALSE)
- */
- int int_quick;
- /*!
- \brief Quick reading flag for short
-
- Specify if native byte order of that type is the same
- as byte order of vector file (TRUE) or not (FALSE)
- */
- int shrt_quick;
- /*!
- \brief Quick reading flag for off_t
-
- Specify if native byte order of that type is the same
- as byte order of vector file (TRUE) or not (FALSE)
- */
- int off_t_quick;
- };
- /*!
- \brief List of dead lines in the file
- \todo Implement it
- The space can be reused, not yet used
- */
- struct recycle
- {
- char dummy;
- };
- /*! \brief Backward compatibility version info */
- struct Version_info {
- /*! \brief Current version (major) */
- int major;
- /*! \brief Current version (minor) */
- int minor;
- /*! \brief Earliest version that can use this data format (major) */
- int back_major;
- /*! \brief Earliest version that can use this data format (minor) */
- int back_minor;
- };
- /*!
- \brief Vector map header data
- Holds header data of vector map (see \ref vlibMap_info)
- */
- struct dig_head
- {
- /*!
- \brief Organization name
- */
- char *organization;
- /*!
- \brief Map date
- */
- char *date;
- /*!
- \brief User name
- */
- char *user_name;
- /*!
- \brief Map name
- */
- char *map_name;
- /*!
- \brief Source date
- */
- char *source_date;
- /*!
- \brief Original scale
- */
- long orig_scale;
- /*!
- \brief Comments
- */
- char *comment;
- int proj; /* projection */
- /*!
- \brief Zone (UTM only)
- */
- int plani_zone;
- /*!
- \brief Threshold for digitization
- */
- double digit_thresh;
- /* Programmers should NOT touch any thing below here */
- /* Library takes care of everything for you */
- /*! \brief Version info for coor file */
- struct Version_info coor_version;
- /*!
- \brief 2D/3D vector data
- - zero for 2D data
- - non-zero for 3D data
- */
- int with_z;
- /*!
- \brief Coor file size
- */
- off_t size;
- /*!
- \brief Coor header size
- */
- long head_size;
- /*!
- \brief Portability information
- */
- struct Port_info port;
- /*!
- \brief Offset of last read line
- */
- off_t last_offset;
- /*!
- \brief Recycle dead line
- \todo Not implemented yet
- */
- struct recycle *recycle;
- };
- /*!
- \brief Coor file info
- */
- struct Coor_info
- {
- /*!
- \brief Total size (in bytes)
- */
- off_t size;
- /*!
- \brief Time of last modification
- */
- long mtime;
- };
- /*!
- \brief Data structure used for building pseudo-topology
- See Vect__build_sfa() (Format_info_ogr and Format_info_pg) for
- implementation issues.
- */
- struct Format_info_offset
- {
- /*!
- \brief Offset list
- Array where feature/part info is stored for each feature in
- GRASS. This is not used for GV_CENTROID. Because one feature may
- contain more elements (geometry collection also recursively),
- offset for one line may be stored in more records. First record
- is FID, next records are part indexes if necessary.
- Example 1:
-
- 5. ring in 3. polygon in 7. feature (multipolygon) of geometry
- collection which has FID = 123 123 (feature 123: geometry
- colletion) 6 (7. feature in geometry collection: multiPolygon) 2
- (3. polygon) 4 (5. ring in the polygon)
- Example 2: geometry collection FID '1' containing one point, one
- linestring and one polygon
- \verbatim
- Offset:
- idx offset note
- ----------------
- 0 1 FID
- 1 0 first part (point)
- 2 1 FID
- 3 1 second part (linestring)
- 4 1 FID
- 5 2 third part (polygon)
- 6 0 first ring of polygon
- GRASS topology:
-
- line idx
- -----------------
- 1 0 point
- 2 2 line
- 3 4 boundary
- 4 1 centroid read from topo (idx == FID)
- In PostGIS Topology mode the offset array is used for mapping
- nodes.
- \endverbatim
- */
- int *array;
- /*!
- \brief Number of items in offset list
- */
- int array_num;
- /*!
- \brief Space allocated for offset list
- */
- int array_alloc;
- };
- /*!
- \brief Lines cache for reading feature (non-native formats)
- */
- struct Format_info_cache {
- /*!
- \brief Lines array
-
- Some simple features require more allocated lines (eg. polygon
- with more rings, multipoint, or geometrycollection)
- Line cache is also used for PostGIS Topology to store single
- topological element (ctype == CACHE_FEATURE) or all elements
- from the map (ctype == CACHE_MAP) to avoid random access which
- is very costly.
- */
- struct line_pnts **lines;
- /*!
- \brief List of line types (GV_POINT, GV_LINE, ...)
- */
- int *lines_types;
- /*!
- \brief List of line cats (used only for PostGIS Topology access)
- */
- int *lines_cats;
- /*!
- \brief Number of allocated lines in cache
- */
- int lines_alloc;
- /*!
- \brief Number of lines which forms current feature
- */
- int lines_num;
- /*!
- \brief Next line to be read from cache
- */
- int lines_next;
- /*!
- \brief Feature id
- */
- long fid;
- /*!
- \brief Simple feature type (currently used only by PG format)
- */
- SF_FeatureType sf_type;
- /*!
- \brief Cache type
- Currently used only by PostGIS Topology which allows caching the
- whole map (CACHE_MAP) */
- int ctype;
- };
- /*!
- \brief Non-native format info (OGR)
- \todo Structure size should not change depending on compilation I
- think, do it better
- */
- struct Format_info_ogr
- {
- /*!
- \brief OGR driver name
- */
- char *driver_name;
- /*!
- \brief OGR datasource name
- */
- char *dsn;
- /*!
- \brief OGR layer name
- */
- char *layer_name;
- /*!
- \brief SQL where statement (to filter features)
- */
- char *where;
- #ifdef HAVE_OGR
- /*!
- \brief Pointer to OGRDriver
- */
- OGRSFDriverH driver;
- /*!
- \brief Pointer to OGRDataSource
- */
- OGRDataSourceH ds;
- /*!
- \brief Pointer to OGRLayer
- */
- OGRLayerH layer;
- #else
- void *driver;
- void *ds;
- void *layer;
- #endif
-
- /*!
- \brief Open DB driver when writing attributes
- This driver is open by V2_open_new_ogr() and closed by
- V1_close_ogr().
- */
- dbDriver *dbdriver;
-
- /*!
- \brief Array of OGR DSN options
- */
- char **dsn_options;
- /*!
- \brief Array of OGR layer options
- */
- char **layer_options;
-
- /*!
- \brief Lines cache for reading feature
- */
- struct Format_info_cache cache;
- /*!
- \brief Cache to avoid repeated reading (level 2)
- NULL if no feature is in cache
- */
- #ifdef HAVE_OGR
- OGRFeatureH feature_cache;
- #else
- void *feature_cache;
- #endif
-
- /*!
- \brief Offset list used for building pseudo-topology
- */
- struct Format_info_offset offset;
-
- /*!
- \brief Next line to be read
- Used by V2_read_next_line_ogr()
- */
- int next_line;
- };
- /*!
- \brief Non-native format info (PostGIS)
- */
- struct Format_info_pg
- {
- /*!
- \brief Connection string
- */
- char *conninfo;
- /*!
- \brief Database name (derived from conninfo)
- */
- char *db_name;
- /*!
- \brief Schema name
- */
- char *schema_name;
- /*!
- \brief Table name
- */
- char *table_name;
- /*!
- \brief SQL where statement (fo filter features)
- */
- char *where;
- /*!
- \brief FID column
- */
- char *fid_column;
- /*!
- \brief Geometry column (simple feature access)
- */
- char *geom_column;
- /*!
- \brief Feature type (simple feature access)
- */
- SF_FeatureType feature_type;
- /*!
- \brief Coordinates dimension (2D or 3D)
- */
- int coor_dim;
- /*!
- \brief Spatial reference system id (see spatial_ref_sys
- table)
- */
- int srid;
- /*!
- \brief Open DB driver when writing attributes
- This driver is open by V2_open_new_pg() and closed by
- V1_close_pg().
- */
- dbDriver *dbdriver;
- struct field_info *fi;
- /*!
- \brief Start/Finish transaction
- */
- int inTransaction;
- #ifdef HAVE_POSTGRES
- /*!
- \brief PGconn object (generated by PQconnectdb)
- */
- PGconn *conn;
- PGresult *res;
- #else
- void *conn;
- void *res;
- #endif
- /*!
- \brief Open cursor
- */
- char *cursor_name;
- int cursor_fid;
-
- /*!
- \brief Next line to be read
- */
- int next_line;
- /*!
- \brief Lines cache for reading feature
- */
- struct Format_info_cache cache;
-
- /*!
- \brief Offset list used for building pseudo-topology (simple
- features access)
- */
- struct Format_info_offset offset;
- /* PostGIS topology support */
- /*!
- \brief TopoGeometry column (feature table)
- */
- char *topogeom_column;
- /*!
- \brief Topology schema name and id
- */
- char *toposchema_name;
- int toposchema_id;
- /*!
- \brief Topology format
- TRUE to store only Topo-Geo data in DB otherwise GRASS-like
- topology is also maintained in DB
- */
- int topo_geo_only;
- };
- /*!
- \brief Non-native format info (currently only OGR is implemented)
- */
- struct Format_info
- {
- /*!
- \brief id?
- */
- int i;
- /*!
- \brief OGR info
- */
- struct Format_info_ogr ogr;
- /*!
- \brief PostGIS info
- */
- struct Format_info_pg pg;
- };
- /*!
- \brief Category index
- */
- struct Cat_index
- {
- /*!
- \brief Field (layer) number
- */
- int field;
- /*!
- \brief Number of items in cat array
- */
- int n_cats;
- /*!
- \brief Allocated space in cat array
- */
- int a_cats;
- /*!
- \brief Array of cats (cat, type, lines/area)
- */
- int (*cat)[3];
- /*!
- \brief Number of unique cats (not updated)
- */
- int n_ucats;
- /*!
- \brief Number of types in type
- */
- int n_types;
- /*!
- \brief Number of elements for each type
- - GV_POINT
- - GV_LINE
- - GV_BOUNDARY
- - GV_CENTROID
- - GV_FACE
- - GV_KERNEL
- - GV_AREA
- */
- int type[7][2];
- /*!
- \brief Offset of the beginning of this index in cidx file
- */
- off_t offset;
- };
- /*!
- \brief Basic topology-related info
- Holds basic topology-related information about vector map
- Important note: you should NOT store non-topological information in
- topological structures.
- */
- struct Plus_head
- {
- /*! \brief Backward compatibility version info */
- struct {
- /*! \brief Version info for topology file */
- struct Version_info topo;
- /*! \brief Version info for spatial index file */
- struct Version_info spidx;
- /*! \brief Version info for category index file */
- struct Version_info cidx;
- } version;
- /*!
- \brief 2D/3D vector data
- - WITH_Z
- - WITHOUT_Z
- */
- int with_z;
- /*!
- \brief 2D/3D spatial index
- - WITH_Z
- - WITHOUT_Z
- */
- int spidx_with_z;
- /*!
- \brief Offset size
- Because Plus_head is available to all releveant
- functions
- */
- int off_t_size;
- /*** file header size ***/
-
- /*!
- \brief Topo header size
- */
- long head_size;
- /*!
- \brief Spatial index header size
- */
- long spidx_head_size;
- /*!
- \brief Category index header size
- */
- long cidx_head_size;
- /*!
- \brief Release memory occupied by support structures
- (topo, spatial, category)
- */
- int release_support;
- /*** portability info */
- /*!
- \brief Portability information
- */
- struct Port_info port;
- /*!
- \brief Portability information for spatial index
- */
- struct Port_info spidx_port;
- /*!
- \brief Portability information for category index
- */
- struct Port_info cidx_port;
- /*!
- \brief Access mode
-
- - GV_MODE_READ
- - GV_MODE_WRITE
- - GV_MODE_RW
- */
- int mode;
- /*!
- \brief Highest level of topology currently available
- - GV_BUILD_NONE
- - GV_BUILD_BASE
- - GV_BUILD_AREAS
- - GV_BUILD_ATTACH_ISLES
- - GV_BUILD_CENTROIDS
- - GV_BUILD_ALL
- */
- int built;
- /*!
- \brief Bounding box of features
- */
- struct bound_box box;
- /*** topology ***/
- /*!
- \brief Array of nodes
- */
- struct P_node **Node;
- /*!
- \brief Array of vector geometries
- */
- struct P_line **Line;
- /*!
- \brief Array of areas
- */
- struct P_area **Area;
- /*!
- \brief Array of isles
- */
- struct P_isle **Isle;
-
- /* add here P_FACE, P_VOLUME, P_HOLE */
- /*!
- \brief Current number of points
- */
- plus_t n_plines;
- /*!
- \brief Current number of lines
- */
- plus_t n_llines;
- /*!
- \brief Current number of boundaries
- */
- plus_t n_blines;
- /*!
- \brief Current number of centroids
- */
- plus_t n_clines;
- /*!
- \brief Current number of faces
- */
- plus_t n_flines;
- /*!
- \brief Current number of kernels
- */
- plus_t n_klines;
- /*!
- \brief Current number of volume faces
- */
- plus_t n_vfaces;
- /*!
- \brief Current number of hole faces
- */
- plus_t n_hfaces;
-
- /*!
- \brief Current number of topological features derived from vector
- geometries
- */
- /*!
- \brief Current number of nodes
- */
- plus_t n_nodes;
- /*!
- \brief Current number of edges
- */
- plus_t n_edges;
- /*!
- \brief Current number of lines
- */
- plus_t n_lines;
- /*!
- \brief Current number of areas
- */
- plus_t n_areas;
- /*!
- \brief Current number of isles
- */
- plus_t n_isles;
- /*!
- \brief Current number of faces
- */
- plus_t n_faces;
- /*!
- \brief Current number of volumes
- */
- plus_t n_volumes;
- /*!
- \brief Current number of holes
- */
- plus_t n_holes;
- /*!
- \brief Number of allocated nodes
- i.e. array size - 1
- */
- plus_t alloc_nodes;
- /*!
- \brief Number of allocated edges
- i.e. array size - 1
- */
- plus_t alloc_edges;
- /*!
- \brief Number of allocated lines
- i.e. array size - 1
- */
- plus_t alloc_lines;
- /*!
- \brief Number of allocated areas
- i.e. array size - 1
- */
- plus_t alloc_areas;
- /*!
- \brief Number of allocated isles
- i.e. array size - 1
- */
- plus_t alloc_isles;
- /*!
- \brief Number of allocated faces
- i.e. array size - 1
- */
- plus_t alloc_faces;
- /*!
- \brief Number of allocated volumes
- i.e. array size - 1
- */
- plus_t alloc_volumes;
- /*!
- \brief Number of allocated holes
- i.e. array size - 1
- */
- plus_t alloc_holes;
- /*!
- \brief Offset of array of nodes in topo file
- */
- off_t Node_offset;
- /*!
- \brief Offset of array of edges in topo file
- */
- off_t Edge_offset;
- /*!
- \brief Offset of array of vector geometries in topo file
- */
- off_t Line_offset;
- /*!
- \brief Offset of array of areas in topo file
- */
- off_t Area_offset;
- /*!
- \brief Offset of array of isles in topo file
- */
- off_t Isle_offset;
- /*!
- \brief Offset of array of volumes in topo file
- */
- off_t Volume_offset;
- /*!
- \brief Offset of array of holes in topo file
- */
- off_t Hole_offset;
- /*** spatial index ***/
- /*!
- \brief Spatial index built?
- Set to 1 if spatial index is available
- */
- int Spidx_built;
- /*!
- \brief Build new spatial index
- Set to 1 if new spatial index will be generated
- */
- int Spidx_new;
- /*!
- \brief Build new spatial index in file
- Set to 1 to build new indices in file
- */
- int Spidx_file;
- /*!
- \brief Spatial index file pointer
- */
- struct gvfile spidx_fp;
- /*!
- \brief Offset of nodes in sidx file
- */
- off_t Node_spidx_offset;
- /*!
- \brief Offset of lines in sidx file
- */
- off_t Line_spidx_offset;
- /*!
- \brief Offset of areas in sidx file
- */
- off_t Area_spidx_offset;
- /*!
- \brief Offset of isles in sidx file
- */
- off_t Isle_spidx_offset;
- /*!
- \brief Offset of faces in sidx file
- */
- off_t Face_spidx_offset;
- /*!
- \brief Offset of volumes in sidx file
- */
- off_t Volume_spidx_offset;
- /*!
- \brief Offset of holes in sidx file
- */
- off_t Hole_spidx_offset;
- /*!
- \brief Node spatial index
- */
- struct RTree *Node_spidx;
- /*!
- \brief Line spatial index
- */
- struct RTree *Line_spidx;
- /*!
- \brief Area spatial index
- */
- struct RTree *Area_spidx;
- /*!
- \brief Isles spatial index
- */
- struct RTree *Isle_spidx;
- /*!
- \brief Faces spatial index
- */
- struct RTree *Face_spidx;
- /*!
- \brief Volumes spatial index
- */
- struct RTree *Volume_spidx;
- /*!
- \brief Holes spatial index
- */
- struct RTree *Hole_spidx;
- /*** category index ***/
- /*!
- \brief Update category index if vector is modified
- By default, category index is not updated
- */
- int update_cidx;
- /*!
- \brief Number of category indexes (one for each field/layer)
- */
- int n_cidx;
- /*!
- \brief Allocated space for category indexes
- */
- int a_cidx;
- /*!
- \brief Array of category indexes
- */
- struct Cat_index *cidx;
- /*!
- \brief Category index to be updated
- Set to 1 when cidx is created
- and reset to 0 whenever any line is changed
- */
- int cidx_up_to_date;
- /*!
- \brief Size of coor file
- */
- off_t coor_size;
- /*!
- \brief Time of last coor modification
- */
- long coor_mtime;
- /*** level 2 ***/
- /*!
- \brief List of updated lines/nodes
- Note: Vect_set_updated() must be called to maintain this list
- */
- struct {
- /*!
- \brief Indicates if the list of updated features is maintained
- */
- int do_uplist;
-
- /*!
- \brief Array of updated lines
-
- List of lines and nodes updated (topo info for the line was
- changed) by last write/rewrite/delete operation.
- Lines/nodes in the list may be deleted (e.g. delete
- boundary: first added for delete area and then delete
- */
- int *uplines;
- /*!
- \brief Array of updated lines - offset
- Negative value for dead (deleted) lines - used by Vect_restore_line()
- */
- off_t *uplines_offset;
- /*!
- \brief Allocated array of lines
- */
- int alloc_uplines;
- /*!
- \brief Number of updated lines
- */
- int n_uplines;
- /*!
- \brief Array of updated nodes
- */
- int *upnodes;
- /*!
- \brief Allocated array of nodes
- */
- int alloc_upnodes;
- /*!
- \brief number of updated nodes
- */
- int n_upnodes;
- } uplist;
- };
- /*!
- \brief Graph-related section (see \ref dglib)
- */
- struct Graph_info {
- /*!
- \brief Line type used to build the graph
- */
- int line_type;
- /*!
- \brief Graph structure
- */
- dglGraph_s graph_s;
- /*!
- \brief Shortest path cache
- */
- dglSPCache_s spCache;
- /*!
- \brief Forward costs used for graph
-
- dglGetEdge() is not supported for _DGL_V1)
- */
- double *edge_fcosts;
- /*!
- \brief backward costs used for graph
- */
- double *edge_bcosts;
- /*!
- \brief Node costs used for graph
- */
- double *node_costs;
- /*!
- \brief Edge and node costs multiplicator
- */
- int cost_multip;
- };
- /*! \brief
- Vector map info
- Maintains all information about an individual open vector map. The
- structure must be passed to the most vector library routines.
- */
- struct Map_info
- {
- /*** common info for all formats ***/
- /*!
- \brief Map format (native, ogr, postgis)
-
- - GV_FORMAT_NATIVE
- - GV_FORMAT_OGR
- - GV_FORMAT_OGR_DIRECT
- - GV_FORMAT_POSTGIS
- */
- int format;
-
- /*!
- \brief Temporary map flag
- */
- int temporary;
- /*!
- \brief Array of DB links
- */
- struct dblinks *dblnk;
- /*!
- \brief Plus info (topology, version, ...)
- */
- struct Plus_head plus;
- /*!
- \brief Open indicator
- Should be 0x5522AA22 (VECT_OPEN_CODE) if opened correctly
- or 0x22AA2255 (VECT_CLOSED_CODE) if closed
- Anything else implies that structure has never been initialized
- */
- int open;
- /* Open mode
- - read (GV_MODE_READ),
- - write (GV_MODE_WRITE),
- - rw (GV_MODE_RW)
- */
- int mode;
- /*!
- \brief Topology level
-
- - 1 (without topo)
- - 2 (with 2D topology)
- - 3 (with 3D topology) - not yet implemented
- */
- int level;
- /*!
- \brief Open only header
- Non-zero code to open only header of vector map
- */
- int head_only;
- /*!
- \brief Support files were updated
- Non-zero code to indicate that supoort file were updated
- */
- int support_updated;
- /*!
- \brief Map name (for 4.0)
- */
- char *name;
- /*!
- \brief Mapset name
- */
- char *mapset;
- /*!
- \brief Location name
- Note: location and gisdbase is useful if changed (v.proj or external apps)
- */
- char *location;
- /*!
- \brief GISDBASE path
- */
- char *gisdbase;
- /*!
- \brief Feature id for sequential access
- Note: Line id starts with 1 - see Vect_read_next_line()
- */
- plus_t next_line;
- /*!
- \brief Constraints for sequential feature access
- */
- struct {
- /*!
- \brief Non-zero value to enable region constraint
- */
- int region_flag;
- /*!
- \brief Region (bbox) constraint
- */
- struct bound_box box;
- /*!
- \brief Non-zero value to enable feature type constraint
- */
- int type_flag;
- /*!
- \brief Feature type constraint
- */
- int type;
- /*!
- \brief Non-zero value to enable field constraint
- */
- int field_flag;
- /*!
- \brief Field number constraint (see line_cats structure)
- */
- int field;
- } constraint;
-
- /*!
- \brief ???
- */
- int proj;
- /*!
- \brief History file
- */
- FILE *hist_fp;
- /*!
- \brief Graph info (built for network analysis)
- */
- struct Graph_info dgraph;
- /*!
- \brief Header info
- */
- struct dig_head head;
-
- /*** format specific ***/
- /*!
- \brief GV file pointer (native format only)
- */
- struct gvfile dig_fp;
- /*!
- \brief Format info for non-native formats
- */
- struct Format_info fInfo;
- /* temporary solution for sites - to be removed ?*/
- /*!
- \brief Array of attributes loaded from db
-
- \todo To be removed?
- */
- struct site_att *site_att;
- /*!
- \brief Number of attributes in site_att array
- \todo To be removed?
- */
- int n_site_att;
- /*!
- \brief Number of double attributes for one site
- \todo To be removed
- */
- int n_site_dbl;
- /*!
- \brief Number of string attributes for one site
- \todo To be removed?
- */
- int n_site_str;
- };
- /*!
- \brief Topological feature - node
- */
- struct P_node
- {
- /*!
- \brief X coordinate
- */
- double x;
- /*!
- \brief Y coordinate
- */
- double y;
- /*!
- \brief Z coordinate (used only for 3D data)
- */
- double z;
- /*!
- \brief Allocated space for lines
- */
- plus_t alloc_lines;
- /*!
- \brief Number of attached lines (size of
- lines, angle)
- If 0, then is degenerate node, for snapping ???
- */
- plus_t n_lines;
- /*!
- \brief List of connected lines
- Line id can be positive (for lines which starts at the node) or
- negative (for lines which ends at the node).
- */
- plus_t *lines;
- /*!
- \brief List of angles of connected lines
- Angles for lines/boundaries are in radians between -PI and
- PI. Value for points or lines with identical points
- (degenerated) is set to -9. See dig_calc_begin_angle() and
- dig_calc_end_angle() for details.
- */
- float *angles;
- };
- /*!
- \brief Line topology
- */
- struct P_topo_l
- {
- /*!
- \brief Start node
- */
- plus_t N1;
- /*!
- \brief End node
- */
- plus_t N2;
- };
- /*!
- \brief Boundary topology
- */
- struct P_topo_b
- {
- /*!
- \brief Start node
- */
- plus_t N1;
- /*!
- \brief End node
- */
- plus_t N2;
- /*!
- \brief Area number to the left, negative for isle
- */
- plus_t left;
- /*!
- \brief Area number to the right, negative for isle
- */
- plus_t right;
- };
- /*!
- \brief Centroid topology
- */
- struct P_topo_c
- {
- /*!
- \brief Area number, negative for duplicate centroid
- */
- plus_t area;
- };
- /*!
- \brief Face topology
- */
- struct P_topo_f
- {
- /* TODO */
- /*!
- \brief Array of edges
- */
- plus_t E[3];
- /*!
- \brief Volume number to the left, negative for hole
- */
- plus_t left;
- /*!
- \brief Volume number to the right, negative for hole
- */
- plus_t right;
- };
- /*!
- \brief Kernel topology
- */
- struct P_topo_k
- {
- /*!
- \brief Volume number, negative for duplicate kernel
- */
- plus_t volume;
- };
- /*!
- \brief Vector geometry
- */
- struct P_line
- {
- /*!
- \brief Line type
- - GV_POINT
- - GV_LINE
- - GV_BOUNDARY
- - GV_CENTROID
- - GV_FACE
- - GV_KERNEL
- */
- char type;
- /*!
- \brief Offset in coor file for line
- OGR-links: offset array index
- PG-links: node/edge id
- */
- off_t offset;
- /*!
- \brief Topology info
- NULL for points
- */
- void *topo;
- };
- /*!
- \brief Area (topology) info
- */
- struct P_area
- {
- /*!
- \brief Number of boundary lines
- */
- plus_t n_lines;
- /*!
- \brief Allocated space for lines
- */
- plus_t alloc_lines;
- /*!
- \brief List of boundary lines
- - negative means direction N2 to N1
- - lines are in clockwise order
- */
- plus_t *lines;
- /********* Above this line is compatible with P_isle **********/
- /*!
- \brief Number of first centroid within area
- */
- plus_t centroid;
- /*!
- \brief Number of islands inside
- */
- plus_t n_isles;
- /*!
- \brief Allocated space for isles
- */
- plus_t alloc_isles;
- /*!
- \brief 1st generation interior islands
- */
- plus_t *isles;
- };
- /*!
- \brief Isle (topology) info
- */
- struct P_isle
- {
- /*!
- \brief Number of boundary lines
- */
- plus_t n_lines;
- /*!
- \brief Allocated space for lines
- */
- plus_t alloc_lines;
- /*!
- \brief List of boundary lines
- - negative means direction N2 to N1
- - lines are in counter clockwise order
- */
- plus_t *lines;
-
- /********* Above this line is compatible with P_area **********/
-
- /*!
- \brief Area it exists w/in, if any
- */
- plus_t area;
- };
- /*!
- \brief Feature geometry info - coordinates
- */
- struct line_pnts
- {
- /*!
- \brief Array of X coordinates
- */
- double *x;
- /*!
- \brief Array of Y coordinates
- */
- double *y;
- /*!
- \brief Array of Z coordinates
- */
- double *z;
- /*!
- \brief Number of points
- */
- int n_points;
- /*!
- \brief Allocated space for points
- */
- int alloc_points;
- };
- /*!
- \brief Feature category info
- */
- struct line_cats
- {
- /*!
- \brief Array of layers (fields)
- */
- int *field;
- /*!
- \brief Array of categories
- */
- int *cat;
- /*!
- \brief Number of categories attached to element
- */
- int n_cats;
- /*!
- \brief Allocated space for categories
- */
- int alloc_cats;
- };
- /*! \brief Category list */
- struct cat_list
- {
- /*!
- \brief Category layer (field)
- */
- int field;
- /*!
- \brief Array of minimum values
- */
- int *min;
- /*!
- \brief Array of maximum values
- */
- int *max;
- /*!
- \brief Number of ranges
- */
- int n_ranges;
- /*!
- \brief Allocated space for ranges
- */
- int alloc_ranges;
- };
- /*!
- \brief List of bounding boxes with id
- */
- struct boxlist
- {
- /*!
- \brief Array of ids
- */
- int *id;
- /*!
- \brief Array of bounding boxes
- */
- struct bound_box *box;
- /*!
- \brief flag to indicate whether bounding boxes should be added
- */
- int have_boxes;
- /*!
- \brief Number of items in the list
- */
- int n_values;
- /*!
- \brief Allocated space for items
- */
- int alloc_values;
- };
- /*!
- \brief Vector array
- Space allocated is size + 1
- */
- struct varray
- {
- /*!
- \brief Array size
- */
- int size;
- /*!
- \brief Array
- Where 'class' or new category
- or something like that is stored
- */
- int *c;
- };
- /*!
- \brief Spatial index info
- For use in modules
- */
- struct spatial_index
- {
- /*!
- \brief Pointer to the search tree (R*-Tree)
- */
- struct RTree *si_tree;
- /*!
- \brief Name of file to store the search tree
- */
- char *name;
- };
- #endif /* DIG___STRUCTS___ */
|