1 /*!
2   \file include/vect/dig_structs.h
3 
4   \brief Data structures for \ref vectorlib
5 
6   \author Written by Dave Gerdes (CERL)  5/1988
7   \author Updated to GRASS 5.7 by Radim Blazek (2001)
8   \author Updated to GRASS 7.0 by Markus Metz (2011)
9   \author Doxygenized by Martin Landa <landa.martin gmail.com> (2011)
10 */
11 #include <grass/config.h>
12 
13 #ifndef  DIG___STRUCTS___
14 #define DIG___STRUCTS___
15 
16 #include <stdio.h>
17 
18 #include <sys/types.h>
19 
20 #include <grass/dgl.h>
21 #include <grass/shapefil.h>
22 #include <grass/rbtree.h>
23 #include <grass/rtree.h>
24 #include <grass/dbmi.h>
25 
26 #ifdef HAVE_OGR
27 #include <ogr_api.h>
28 #endif
29 
30 #ifdef HAVE_POSTGRES
31 #include <libpq-fe.h>
32 #endif
33 
34 /*!
35   \brief plus_t size
36 
37   3.10 changes plus_t to int. This assumes that any reasonable machine
38   will use 4 bytes to store an int. The diglib code is not guaranteed
39   to work if plus_t is changed to a type that is larger than an int.
40   */
41 typedef int plus_t;
42 
43 /*!
44   \brief Used by sites lib
45 */
46 struct site_att
47 {
48     /*!
49       \brief Category number
50     */
51     int cat;
52     /*!
53       \brief Array of double attributes
54     */
55     double *dbl;
56     /*!
57       \brief Array of string attributes
58     */
59     char **str;
60 };
61 
62 /*!
63   \brief Bounding box
64 */
65 struct bound_box
66 {
67     /*!
68       \brief North
69     */
70     double N;
71     /*!
72       \brief South
73     */
74     double S;
75     /*!
76       \brief East
77     */
78     double E;
79     /*!
80       \brief West
81     */
82     double W;
83     /*!
84       \brief Top
85     */
86     double T;
87     /*!
88       \brief Bottom
89     */
90     double B;
91 };
92 
93 /*!
94   \brief File definition
95 */
96 struct gvfile
97 {
98     /*!
99       \brief File descriptor
100     */
101     FILE *file;
102     /*!
103       \brief Pointer to beginning of the file in the memory
104     */
105     char *start;
106     /*!
107       \brief Current position set by dig_seek()
108     */
109     char *current;
110     /*!
111       \brief End of file in the memory (pointer to first byte after)
112     */
113     char *end;
114     /*!
115       \brief Size of the file loaded to memory
116     */
117     off_t size;
118     /*!
119       \brief Allocated space
120     */
121     off_t alloc;
122     /*!
123       \brief Is file loaded?
124 
125       - 0 - not loaded
126       - 1 - loaded
127     */
128     int loaded;
129 };
130 
131 /*!
132   \brief Layer (old: field) information
133 */
134 struct field_info
135 {
136     /*!
137       \brief Layer number
138     */
139     int number;
140     /*!
141       \brief Layer name (optional)
142     */
143     char *name;
144     /*!
145       \brief Name of DB driver ('sqlite', 'dbf', ...)
146     */
147     char *driver;
148     /*!
149       brief Name of database
150     */
151     char *database;
152     /*!
153       \brief Name of DB table
154     */
155     char *table;
156     /*!
157       \brief Name of key column (usually 'cat')
158     */
159     char *key;
160 };
161 
162 /*!
163   \brief Database links
164 */
165 struct dblinks
166 {
167     /*!
168       \brief Pointer to the first field_info structure
169     */
170     struct field_info *field;
171     /*!
172       \brief Number of allocated slots
173     */
174     int alloc_fields;
175     /*!
176       \brief Number of available layers (old: fields)
177     */
178     int n_fields;
179 };
180 
181 /*!
182   \brief Portability info
183 
184   Set by V1_open_new() or V1_open_old()
185 */
186 struct Port_info
187 {
188     /*!
189       \brief File byte order
190     */
191     int byte_order;
192     /*!
193       \brief Size of `off_t` data type
194     */
195     int off_t_size;
196 
197     /*!
198       \brief Conversion matrices between file and native byte order (double)
199     */
200     unsigned char dbl_cnvrt[PORT_DOUBLE];
201     /*!
202       \brief Conversion matrices between file and native byte order (float)
203     */
204     unsigned char flt_cnvrt[PORT_FLOAT];
205     /*!
206       \brief Conversion matrices between file and native byte order (long)
207     */
208     unsigned char lng_cnvrt[PORT_LONG];
209     /*!
210       \brief Conversion matrices between file and native byte order (int)
211     */
212     unsigned char int_cnvrt[PORT_INT];
213     /*!
214       \brief Conversion matrices between file and native byte order (short)
215     */
216     unsigned char shrt_cnvrt[PORT_SHORT];
217     /*!
218       \brief Conversion matrices between file and native byte order (off_t)
219     */
220     unsigned char off_t_cnvrt[PORT_OFF_T];
221     /*!
222       \brief Quick reading flag for double
223 
224       Specify if native byte order of that type is the same
225       as byte order of vector file (TRUE) or not (FALSE)
226     */
227     int dbl_quick;
228     /*!
229       \brief Quick reading flag for float
230 
231       Specify if native byte order of that type is the same
232       as byte order of vector file (TRUE) or not (FALSE)
233     */
234     int flt_quick;
235     /*!
236       \brief Quick reading flag for long
237 
238       Specify if native byte order of that type is the same
239       as byte order of vector file (TRUE) or not (FALSE)
240     */
241     int lng_quick;
242     /*!
243       \brief Quick reading flag for int
244 
245       Specify if native byte order of that type is the same
246       as byte order of vector file (TRUE) or not (FALSE)
247     */
248     int int_quick;
249     /*!
250       \brief Quick reading flag for short
251 
252       Specify if native byte order of that type is the same
253       as byte order of vector file (TRUE) or not (FALSE)
254     */
255     int shrt_quick;
256     /*!
257       \brief Quick reading flag for off_t
258 
259       Specify if native byte order of that type is the same
260       as byte order of vector file (TRUE) or not (FALSE)
261     */
262     int off_t_quick;
263 };
264 
265 /*!
266   \brief List of dead lines in the file
267 
268   \todo Implement it
269 
270   The space can be reused, not yet used
271 */
272 struct recycle
273 {
274     char dummy;
275 };
276 
277 /*! \brief Backward compatibility version info */
278 struct Version_info {
279     /*! \brief Current version (major) */
280     int major;
281     /*! \brief Current version (minor) */
282     int minor;
283     /*! \brief Earliest version that can use this data format (major) */
284     int back_major;
285     /*! \brief Earliest version that can use this data format (minor) */
286     int back_minor;
287 };
288 
289 /*!
290   \brief Vector map header data
291 
292   Holds header data of vector map (see \ref vlibMap_info)
293 */
294 struct dig_head
295 {
296     /*!
297       \brief Organization name
298     */
299     char *organization;
300     /*!
301       \brief Map date
302     */
303     char *date;
304     /*!
305       \brief User name
306     */
307     char *user_name;
308     /*!
309       \brief Map name
310     */
311     char *map_name;
312     /*!
313       \brief Source date
314     */
315     char *source_date;
316     /*!
317       \brief Original scale
318     */
319     long orig_scale;
320     /*!
321       \brief Comments
322     */
323     char *comment;
324     int proj;			/* projection */
325 
326     /*!
327       \brief Zone (UTM only)
328     */
329     int plani_zone;
330     /*!
331       \brief Threshold for digitization
332     */
333     double digit_thresh;
334 
335     /* Programmers should NOT touch any thing below here */
336     /* Library takes care of everything for you          */
337 
338     /*! \brief Version info for coor file */
339     struct Version_info coor_version;
340 
341     /*!
342       \brief 2D/3D vector data
343 
344       - zero for 2D data
345       - non-zero for 3D data
346     */
347     int with_z;
348 
349     /*!
350       \brief Coor file size
351     */
352     off_t size;
353     /*!
354       \brief Coor header size
355     */
356     long head_size;
357 
358     /*!
359       \brief Portability information
360     */
361     struct Port_info port;
362 
363     /*!
364       \brief Offset of last read line
365     */
366     off_t last_offset;
367 
368     /*!
369       \brief Recycle dead line
370 
371       \todo Not implemented yet
372     */
373     struct recycle *recycle;
374 };
375 
376 /*!
377   \brief Coor file info
378 */
379 struct Coor_info
380 {
381     /*!
382       \brief Total size (in bytes)
383     */
384     off_t size;
385     /*!
386       \brief Time of last modification
387     */
388     long mtime;
389 };
390 
391 /*!
392   \brief Data structure used for building pseudo-topology
393 
394   See Vect__build_sfa() (Format_info_ogr and Format_info_pg) for
395   implementation issues.
396 */
397 struct Format_info_offset
398 {
399     /*!
400       \brief Offset list
401 
402       Array where feature/part info is stored for each feature in
403       GRASS. This is not used for GV_CENTROID. Because one feature may
404       contain more elements (geometry collection also recursively),
405       offset for one line may be stored in more records. First record
406       is FID, next records are part indexes if necessary.
407 
408       Example 1:
409 
410       5. ring in 3. polygon in 7. feature (multipolygon) of geometry
411       collection which has FID = 123 123 (feature 123: geometry
412       colletion) 6 (7. feature in geometry collection: multiPolygon) 2
413       (3. polygon) 4 (5. ring in the polygon)
414 
415       Example 2: geometry collection FID '1' containing one point, one
416       linestring and one polygon
417 
418       \verbatim
419       Offset:
420 
421       idx  offset note
422       ----------------
423       0	   1	  FID
424       1	   0	  first part (point)
425 
426       2	   1	  FID
427       3	   1	  second part (linestring)
428 
429       4	   1	  FID
430       5	   2	  third part (polygon)
431       6	   0	  first ring of polygon
432 
433       GRASS topology:
434 
435       line idx
436       -----------------
437       1    0      point
438       2    2      line
439       3    4      boundary
440       4    1      centroid read from topo (idx == FID)
441 
442       In PostGIS Topology mode the offset array is used for mapping
443       nodes.
444       \endverbatim
445     */
446     int *array;
447     /*!
448       \brief Number of items in offset list
449     */
450     int array_num;
451     /*!
452       \brief Space allocated for offset list
453     */
454     int array_alloc;
455 
456 };
457 
458 /*!
459   \brief Lines cache for reading feature (non-native formats)
460 */
461 struct Format_info_cache {
462     /*!
463       \brief Lines array
464 
465       Some simple features require more allocated lines (eg. polygon
466       with more rings, multipoint, or geometrycollection)
467 
468       Line cache is also used for PostGIS Topology to store single
469       topological element (ctype == CACHE_FEATURE) or all elements
470       from the map (ctype == CACHE_MAP) to avoid random access which
471       is very costly.
472     */
473     struct line_pnts **lines;
474     /*!
475       \brief List of line types (GV_POINT, GV_LINE, ...)
476     */
477     int *lines_types;
478     /*!
479       \brief List of line cats (used only for PostGIS Topology access)
480     */
481     int *lines_cats;
482     /*!
483       \brief Number of allocated lines in cache
484     */
485     int lines_alloc;
486     /*!
487       \brief Number of lines which forms current feature
488     */
489     int lines_num;
490     /*!
491       \brief Next line to be read from cache
492     */
493     int lines_next;
494     /*!
495       \brief Feature id
496     */
497     long fid;
498     /*!
499       \brief Simple feature type (currently used only by PG format)
500     */
501     SF_FeatureType sf_type;
502     /*!
503       \brief Cache type
504 
505       Currently used only by PostGIS Topology which allows caching the
506       whole map (CACHE_MAP) */
507     int ctype;
508 };
509 
510 /*!
511   \brief Non-native format info (OGR)
512 
513   \todo Structure size should not change depending on compilation I
514   think, do it better
515 */
516 struct Format_info_ogr
517 {
518     /*!
519       \brief OGR driver name
520     */
521     char *driver_name;
522     /*!
523       \brief OGR datasource name
524     */
525     char *dsn;
526     /*!
527       \brief OGR layer name
528     */
529     char *layer_name;
530     /*!
531       \brief SQL where statement (to filter features)
532     */
533     char *where;
534 #ifdef HAVE_OGR
535     /*!
536       \brief Pointer to OGRDriver
537     */
538     OGRSFDriverH driver;
539     /*!
540       \brief Pointer to OGRDataSource
541     */
542     OGRDataSourceH ds;
543     /*!
544       \brief Pointer to OGRLayer
545      */
546     OGRLayerH layer;
547 #else
548     void *driver;
549     void *ds;
550     void *layer;
551 #endif
552 
553     /*!
554       \brief Open DB driver when writing attributes
555 
556       This driver is open by V2_open_new_ogr() and closed by
557       V1_close_ogr().
558     */
559     dbDriver *dbdriver;
560 
561     /*!
562       \brief Array of OGR DSN options
563     */
564     char **dsn_options;
565     /*!
566       \brief Array of OGR layer options
567     */
568     char **layer_options;
569 
570     /*!
571       \brief Lines cache for reading feature
572     */
573     struct Format_info_cache cache;
574 
575     /*!
576       \brief Cache to avoid repeated reading (level 2)
577 
578       NULL if no feature is in cache
579     */
580 #ifdef HAVE_OGR
581     OGRFeatureH feature_cache;
582 #else
583     void *feature_cache;
584 #endif
585 
586     /*!
587       \brief Offset list used for building pseudo-topology
588     */
589     struct Format_info_offset offset;
590 
591     /*!
592       \brief Next line to be read
593 
594       Used by V2_read_next_line_ogr()
595     */
596     int next_line;
597 };
598 
599 /*!
600   \brief Non-native format info (PostGIS)
601 */
602 struct Format_info_pg
603 {
604     /*!
605       \brief Connection string
606     */
607     char    *conninfo;
608     /*!
609       \brief Database name (derived from conninfo)
610     */
611     char    *db_name;
612     /*!
613       \brief Schema name
614     */
615     char    *schema_name;
616     /*!
617       \brief Table name
618     */
619     char    *table_name;
620     /*!
621       \brief SQL where statement (fo filter features)
622     */
623     char *where;
624     /*!
625       \brief FID column
626     */
627     char    *fid_column;
628     /*!
629       \brief Geometry column (simple feature access)
630     */
631     char    *geom_column;
632     /*!
633       \brief Feature type (simple feature access)
634     */
635     SF_FeatureType feature_type;
636     /*!
637       \brief Coordinates dimension (2D or 3D)
638     */
639     int      coor_dim;
640     /*!
641       \brief Spatial reference system id (see spatial_ref_sys
642       table)
643     */
644     int      srid;
645 
646     /*!
647       \brief Open DB driver when writing attributes
648 
649       This driver is open by V2_open_new_pg() and closed by
650       V1_close_pg().
651     */
652     dbDriver *dbdriver;
653     struct field_info *fi;
654 
655     /*!
656       \brief Start/Finish transaction
657     */
658     int       inTransaction;
659 #ifdef HAVE_POSTGRES
660     /*!
661       \brief PGconn object (generated by PQconnectdb)
662     */
663     PGconn   *conn;
664     PGresult *res;
665 #else
666     void     *conn;
667     void     *res;
668 #endif
669     /*!
670       \brief Open cursor
671     */
672     char     *cursor_name;
673     int       cursor_fid;
674 
675     /*!
676       \brief Next line to be read
677     */
678     int next_line;
679 
680     /*!
681       \brief Lines cache for reading feature
682     */
683     struct Format_info_cache cache;
684 
685     /*!
686       \brief Offset list used for building pseudo-topology (simple
687       features access)
688     */
689     struct Format_info_offset offset;
690 
691     /* PostGIS topology support */
692     /*!
693       \brief TopoGeometry column (feature table)
694     */
695     char    *topogeom_column;
696     /*!
697       \brief Topology schema name and id
698     */
699     char    *toposchema_name;
700     int      toposchema_id;
701     /*!
702       \brief Topology format
703 
704       TRUE to store only Topo-Geo data in DB otherwise GRASS-like
705       topology is also maintained in DB
706     */
707     int      topo_geo_only;
708 };
709 
710 /*!
711   \brief Non-native format info (currently only OGR is implemented)
712 */
713 struct Format_info
714 {
715     /*!
716       \brief id?
717     */
718     int i;
719     /*!
720       \brief OGR info
721     */
722     struct Format_info_ogr ogr;
723     /*!
724       \brief PostGIS info
725     */
726     struct Format_info_pg  pg;
727 };
728 
729 /*!
730   \brief Category index
731 */
732 struct Cat_index
733 {
734     /*!
735       \brief Field (layer) number
736     */
737     int field;
738     /*!
739       \brief Number of items in cat array
740     */
741     int n_cats;
742     /*!
743       \brief Allocated space in cat array
744     */
745     int a_cats;
746     /*!
747       \brief Array of cats (cat, type, lines/area)
748     */
749     int (*cat)[3];
750     /*!
751       \brief Number of unique cats (not updated)
752     */
753     int n_ucats;
754     /*!
755       \brief Number of types in type
756     */
757     int n_types;
758     /*!
759       \brief Number of elements for each type
760 
761       - GV_POINT
762       - GV_LINE
763       - GV_BOUNDARY
764       - GV_CENTROID
765       - GV_FACE
766       - GV_KERNEL
767       - GV_AREA
768     */
769     int type[7][2];
770     /*!
771       \brief Offset of the beginning of this index in cidx file
772     */
773     off_t offset;
774 };
775 
776 /*!
777   \brief Basic topology-related info
778 
779   Holds basic topology-related information about vector map
780 
781   Important note: you should NOT store non-topological information in
782   topological structures.
783 */
784 struct Plus_head
785 {
786     /*! \brief Backward compatibility version info */
787     struct {
788         /*! \brief Version info for topology file */
789         struct Version_info topo;
790         /*! \brief Version info for spatial index file */
791         struct Version_info spidx;
792         /*! \brief Version info for category index file */
793         struct Version_info cidx;
794     } version;
795 
796     /*!
797       \brief 2D/3D vector data
798 
799       - WITH_Z
800       - WITHOUT_Z
801     */
802     int with_z;
803     /*!
804       \brief 2D/3D spatial index
805 
806       - WITH_Z
807       - WITHOUT_Z
808     */
809     int spidx_with_z;
810 
811     /*!
812       \brief Offset size
813 
814       Because Plus_head is available to all releveant
815       functions
816     */
817     int off_t_size;
818 
819     /*** file header size ***/
820 
821     /*!
822       \brief Topo header size
823     */
824     long head_size;
825     /*!
826       \brief Spatial index header size
827     */
828     long spidx_head_size;
829     /*!
830       \brief Category index header size
831     */
832     long cidx_head_size;
833 
834     /*!
835       \brief Release memory occupied by support structures
836       (topo, spatial, category)
837     */
838     int release_support;
839 
840     /*** portability info */
841 
842     /*!
843       \brief Portability information
844     */
845     struct Port_info port;
846     /*!
847       \brief Portability information for spatial index
848     */
849     struct Port_info spidx_port;
850     /*!
851       \brief Portability information for category index
852     */
853     struct Port_info cidx_port;
854     /*!
855       \brief Access mode
856 
857       - GV_MODE_READ
858       - GV_MODE_WRITE
859       - GV_MODE_RW
860     */
861     int mode;
862 
863     /*!
864       \brief Highest level of topology currently available
865 
866       - GV_BUILD_NONE
867       - GV_BUILD_BASE
868       - GV_BUILD_AREAS
869       - GV_BUILD_ATTACH_ISLES
870       - GV_BUILD_CENTROIDS
871       - GV_BUILD_ALL
872     */
873     int built;
874     /*!
875       \brief Bounding box of features
876     */
877     struct bound_box box;
878 
879     /*** topology ***/
880    /*!
881      \brief Array of nodes
882    */
883     struct P_node **Node;
884    /*!
885      \brief Array of vector geometries
886    */
887     struct P_line **Line;
888    /*!
889      \brief Array of areas
890    */
891     struct P_area **Area;
892     /*!
893       \brief Array of isles
894     */
895     struct P_isle **Isle;
896 
897     /* add here P_FACE, P_VOLUME, P_HOLE */
898 
899     /*!
900       \brief Current number of points
901     */
902     plus_t n_plines;
903     /*!
904       \brief Current number of lines
905     */
906     plus_t n_llines;
907     /*!
908       \brief Current number of boundaries
909     */
910     plus_t n_blines;
911     /*!
912       \brief Current number of centroids
913     */
914     plus_t n_clines;
915     /*!
916       \brief Current number of faces
917     */
918     plus_t n_flines;
919     /*!
920       \brief Current number of kernels
921     */
922     plus_t n_klines;
923     /*!
924       \brief Current number of volume faces
925     */
926     plus_t n_vfaces;
927     /*!
928       \brief Current number of hole faces
929     */
930     plus_t n_hfaces;
931 
932     /*!
933       \brief Current number of topological features derived from vector
934       geometries
935     */
936     /*!
937       \brief Current number of nodes
938     */
939     plus_t n_nodes;
940     /*!
941       \brief Current number of edges
942     */
943     plus_t n_edges;
944     /*!
945       \brief Current number of lines
946     */
947     plus_t n_lines;
948     /*!
949       \brief Current number of areas
950     */
951     plus_t n_areas;
952     /*!
953       \brief Current number of isles
954     */
955     plus_t n_isles;
956     /*!
957       \brief Current number of faces
958     */
959     plus_t n_faces;
960     /*!
961       \brief Current number of volumes
962     */
963     plus_t n_volumes;
964     /*!
965       \brief Current number of holes
966     */
967     plus_t n_holes;
968 
969    /*!
970      \brief Number of allocated nodes
971 
972      i.e. array size - 1
973    */
974     plus_t alloc_nodes;
975    /*!
976      \brief Number of allocated edges
977 
978      i.e. array size - 1
979    */
980     plus_t alloc_edges;
981    /*!
982      \brief Number of allocated lines
983 
984      i.e. array size - 1
985    */
986     plus_t alloc_lines;
987    /*!
988      \brief Number of allocated areas
989 
990      i.e. array size - 1
991    */
992     plus_t alloc_areas;
993    /*!
994      \brief Number of allocated isles
995 
996      i.e. array size - 1
997    */
998     plus_t alloc_isles;
999    /*!
1000      \brief Number of allocated faces
1001 
1002      i.e. array size - 1
1003    */
1004     plus_t alloc_faces;
1005    /*!
1006      \brief Number of allocated volumes
1007 
1008      i.e. array size - 1
1009    */
1010     plus_t alloc_volumes;
1011    /*!
1012      \brief Number of allocated holes
1013 
1014      i.e. array size - 1
1015    */
1016     plus_t alloc_holes;
1017 
1018     /*!
1019       \brief Offset of array of nodes in topo file
1020     */
1021     off_t Node_offset;
1022     /*!
1023       \brief Offset of array of edges in topo file
1024     */
1025     off_t Edge_offset;
1026     /*!
1027       \brief Offset of array of vector geometries in topo file
1028     */
1029     off_t Line_offset;
1030     /*!
1031       \brief Offset of array of areas in topo file
1032     */
1033     off_t Area_offset;
1034     /*!
1035       \brief Offset of array of isles in topo file
1036     */
1037     off_t Isle_offset;
1038     /*!
1039       \brief Offset of array of volumes in topo file
1040     */
1041     off_t Volume_offset;
1042     /*!
1043       \brief Offset of array of holes in topo file
1044     */
1045     off_t Hole_offset;
1046 
1047     /*** spatial index ***/
1048     /*!
1049       \brief Spatial index built?
1050 
1051       Set to 1 if spatial index is available
1052     */
1053     int Spidx_built;
1054     /*!
1055       \brief Build new spatial index
1056 
1057       Set to 1 if new spatial index will be generated
1058     */
1059     int Spidx_new;
1060     /*!
1061       \brief Build new spatial index in file
1062 
1063       Set to 1 to build new indices in file
1064     */
1065     int Spidx_file;
1066 
1067     /*!
1068       \brief Spatial index file pointer
1069     */
1070     struct gvfile spidx_fp;
1071 
1072     /*!
1073       \brief Offset of nodes in sidx file
1074     */
1075     off_t Node_spidx_offset;
1076     /*!
1077       \brief Offset of lines in sidx file
1078     */
1079     off_t Line_spidx_offset;
1080     /*!
1081       \brief Offset of areas in sidx file
1082     */
1083     off_t Area_spidx_offset;
1084     /*!
1085       \brief Offset of isles in sidx file
1086     */
1087     off_t Isle_spidx_offset;
1088     /*!
1089       \brief Offset of faces in sidx file
1090     */
1091     off_t Face_spidx_offset;
1092     /*!
1093       \brief Offset of volumes in sidx file
1094     */
1095     off_t Volume_spidx_offset;
1096     /*!
1097       \brief Offset of holes in sidx file
1098     */
1099     off_t Hole_spidx_offset;
1100 
1101     /*!
1102       \brief Node spatial index
1103     */
1104     struct RTree *Node_spidx;
1105     /*!
1106       \brief Line spatial index
1107     */
1108     struct RTree *Line_spidx;
1109     /*!
1110       \brief Area spatial index
1111     */
1112     struct RTree *Area_spidx;
1113     /*!
1114       \brief Isles spatial index
1115     */
1116     struct RTree *Isle_spidx;
1117     /*!
1118       \brief Faces spatial index
1119     */
1120     struct RTree *Face_spidx;
1121     /*!
1122       \brief Volumes spatial index
1123     */
1124     struct RTree *Volume_spidx;
1125     /*!
1126       \brief Holes spatial index
1127     */
1128     struct RTree *Hole_spidx;
1129 
1130     /*** category index ***/
1131     /*!
1132       \brief Update category index if vector is modified
1133 
1134       By default, category index is not updated
1135     */
1136     int update_cidx;
1137 
1138     /*!
1139       \brief Number of category indexes (one for each field/layer)
1140     */
1141     int n_cidx;
1142     /*!
1143       \brief Allocated space for category indexes
1144     */
1145     int a_cidx;
1146     /*!
1147       \brief Array of category indexes
1148     */
1149     struct Cat_index *cidx;
1150     /*!
1151       \brief Category index to be updated
1152 
1153       Set to 1 when cidx is created
1154       and reset to 0 whenever any line is changed
1155     */
1156     int cidx_up_to_date;
1157 
1158     /*!
1159       \brief Size of coor file
1160     */
1161     off_t coor_size;
1162     /*!
1163       \brief Time of last coor modification
1164     */
1165     long coor_mtime;
1166 
1167     /*** level 2 ***/
1168     /*!
1169       \brief List of updated lines/nodes
1170 
1171       Note: Vect_set_updated() must be called to maintain this list
1172     */
1173     struct {
1174 	/*!
1175 	  \brief Indicates if the list of updated features is maintained
1176 	*/
1177 	int do_uplist;
1178 
1179 	/*!
1180 	  \brief Array of updated lines
1181 
1182 	  List of lines and nodes updated (topo info for the line was
1183 	  changed) by last write/rewrite/delete operation.
1184 	  Lines/nodes in the list may be deleted (e.g. delete
1185 	  boundary: first added for delete area and then delete
1186 	*/
1187 	int *uplines;
1188 	/*!
1189 	  \brief Array of updated lines - offset
1190 
1191 	  Negative value for dead (deleted) lines - used by Vect_restore_line()
1192 	*/
1193 	off_t *uplines_offset;
1194 	/*!
1195 	  \brief Allocated array of lines
1196 	*/
1197 	int alloc_uplines;
1198 	/*!
1199 	  \brief Number of updated lines
1200 	*/
1201 	int n_uplines;
1202 	/*!
1203 	  \brief Array of updated nodes
1204 	*/
1205 	int *upnodes;
1206 	/*!
1207 	  \brief Allocated array of nodes
1208 	*/
1209 	int alloc_upnodes;
1210 	/*!
1211 	  \brief number of updated nodes
1212 	*/
1213 	int n_upnodes;
1214     } uplist;
1215 };
1216 
1217 /*!
1218   \brief Graph-related section (see \ref dglib)
1219 */
1220 struct Graph_info {
1221     /*!
1222       \brief Line type used to build the graph
1223     */
1224     int line_type;
1225     /*!
1226       \brief Graph structure
1227     */
1228     dglGraph_s graph_s;
1229     /*!
1230       \brief Shortest path cache
1231     */
1232     dglSPCache_s spCache;
1233     /*!
1234       \brief Forward costs used for graph
1235 
1236       dglGetEdge() is not supported for _DGL_V1)
1237     */
1238     double *edge_fcosts;
1239     /*!
1240       \brief backward costs used for graph
1241     */
1242     double *edge_bcosts;
1243     /*!
1244       \brief Node costs used for graph
1245     */
1246     double *node_costs;
1247     /*!
1248       \brief Edge and node costs multiplicator
1249     */
1250     int cost_multip;
1251 };
1252 
1253 /*! \brief
1254   Vector map info
1255 
1256   Maintains all information about an individual open vector map. The
1257   structure must be passed to the most vector library routines.
1258 */
1259 struct Map_info
1260 {
1261     /*** common info for all formats ***/
1262 
1263     /*!
1264       \brief Map format (native, ogr, postgis)
1265 
1266       - GV_FORMAT_NATIVE
1267       - GV_FORMAT_OGR
1268       - GV_FORMAT_OGR_DIRECT
1269       - GV_FORMAT_POSTGIS
1270     */
1271     int format;
1272 
1273     /*!
1274       \brief Temporary map flag
1275     */
1276     int temporary;
1277 
1278     /*!
1279       \brief Array of DB links
1280     */
1281     struct dblinks *dblnk;
1282 
1283     /*!
1284       \brief Plus info (topology, version, ...)
1285     */
1286     struct Plus_head plus;
1287 
1288     /*!
1289       \brief Open indicator
1290 
1291       Should be 0x5522AA22 (VECT_OPEN_CODE) if opened correctly
1292       or        0x22AA2255 (VECT_CLOSED_CODE) if closed
1293 
1294       Anything else implies that structure has never been initialized
1295     */
1296     int open;
1297 
1298     /* Open mode
1299 
1300        - read (GV_MODE_READ),
1301        - write (GV_MODE_WRITE),
1302        - rw (GV_MODE_RW)
1303     */
1304     int mode;
1305 
1306     /*!
1307       \brief Topology level
1308 
1309       - 1 (without topo)
1310       - 2 (with 2D topology)
1311       - 3 (with 3D topology) - not yet implemented
1312     */
1313     int level;
1314 
1315     /*!
1316       \brief Open only header
1317 
1318       Non-zero code to open only header of vector map
1319     */
1320     int head_only;
1321 
1322     /*!
1323       \brief Support files were updated
1324 
1325       Non-zero code to indicate that supoort file were updated
1326     */
1327     int support_updated;
1328 
1329     /*!
1330       \brief Map name (for 4.0)
1331     */
1332     char *name;
1333     /*!
1334       \brief Mapset name
1335     */
1336     char *mapset;
1337     /*!
1338       \brief Location name
1339 
1340       Note: location and gisdbase is useful if changed (v.proj or external apps)
1341     */
1342     char *location;
1343     /*!
1344       \brief GISDBASE path
1345     */
1346     char *gisdbase;
1347 
1348     /*!
1349       \brief Feature id for sequential access
1350 
1351       Note: Line id starts with 1 - see Vect_read_next_line()
1352     */
1353     plus_t next_line;
1354 
1355     /*!
1356       \brief Constraints for sequential feature access
1357     */
1358     struct {
1359 	/*!
1360 	  \brief Non-zero value to enable region constraint
1361 	*/
1362 	int region_flag;
1363         /*!
1364           \brief Region (bbox) constraint
1365         */
1366 	struct bound_box box;
1367 	/*!
1368 	  \brief Non-zero value to enable feature type constraint
1369 	*/
1370 	int type_flag;
1371         /*!
1372           \brief Feature type constraint
1373         */
1374 	int type;
1375 	/*!
1376 	  \brief Non-zero value to enable field constraint
1377 	*/
1378 	int field_flag;
1379         /*!
1380           \brief Field number constraint (see line_cats structure)
1381         */
1382 	int field;
1383     } constraint;
1384 
1385     /*!
1386       \brief ???
1387     */
1388     int proj;
1389 
1390     /*!
1391       \brief History file
1392     */
1393     FILE *hist_fp;
1394 
1395     /*!
1396       \brief Graph info (built for network analysis)
1397     */
1398     struct Graph_info dgraph;
1399 
1400     /*!
1401       \brief Header info
1402     */
1403     struct dig_head head;
1404 
1405     /*** format specific ***/
1406 
1407     /*!
1408       \brief GV file pointer (native format only)
1409     */
1410     struct gvfile dig_fp;
1411 
1412     /*!
1413       \brief Format info for non-native formats
1414     */
1415     struct Format_info fInfo;
1416 
1417     /* temporary solution for sites - to be removed ?*/
1418 
1419     /*!
1420       \brief Array of attributes loaded from db
1421 
1422       \todo To be removed?
1423     */
1424     struct site_att *site_att;
1425     /*!
1426       \brief Number of attributes in site_att array
1427 
1428       \todo To be removed?
1429     */
1430     int n_site_att;
1431     /*!
1432       \brief Number of double attributes for one site
1433 
1434       \todo To be removed
1435     */
1436     int n_site_dbl;
1437     /*!
1438       \brief Number of string attributes for one site
1439 
1440       \todo To be removed?
1441     */
1442     int n_site_str;
1443 };
1444 
1445 /*!
1446   \brief Topological feature - node
1447 */
1448 struct P_node
1449 {
1450     /*!
1451       \brief X coordinate
1452     */
1453     double x;
1454     /*!
1455       \brief Y coordinate
1456     */
1457     double y;
1458     /*!
1459       \brief Z coordinate (used only for 3D data)
1460     */
1461     double z;
1462     /*!
1463       \brief Allocated space for lines
1464     */
1465     plus_t alloc_lines;
1466     /*!
1467       \brief Number of attached lines (size of
1468       lines, angle)
1469 
1470       If 0, then is degenerate node, for snapping ???
1471     */
1472     plus_t n_lines;
1473     /*!
1474       \brief List of connected lines
1475 
1476       Line id can be positive (for lines which starts at the node) or
1477       negative (for lines which ends at the node).
1478     */
1479     plus_t *lines;
1480     /*!
1481       \brief List of angles of connected lines
1482 
1483       Angles for lines/boundaries are in radians between -PI and
1484       PI. Value for points or lines with identical points
1485       (degenerated) is set to -9. See dig_calc_begin_angle() and
1486       dig_calc_end_angle() for details.
1487     */
1488     float *angles;
1489 };
1490 
1491 /*!
1492   \brief Line topology
1493 */
1494 struct P_topo_l
1495 {
1496     /*!
1497       \brief Start node
1498     */
1499     plus_t N1;
1500     /*!
1501       \brief End node
1502     */
1503     plus_t N2;
1504 };
1505 
1506 /*!
1507   \brief Boundary topology
1508 */
1509 struct P_topo_b
1510 {
1511     /*!
1512       \brief Start node
1513     */
1514     plus_t N1;
1515     /*!
1516       \brief End node
1517     */
1518     plus_t N2;
1519     /*!
1520       \brief Area number to the left, negative for isle
1521     */
1522     plus_t left;
1523     /*!
1524       \brief Area number to the right, negative for isle
1525     */
1526     plus_t right;
1527 };
1528 
1529 /*!
1530   \brief Centroid topology
1531 */
1532 struct P_topo_c
1533 {
1534     /*!
1535       \brief Area number, negative for duplicate centroid
1536     */
1537     plus_t area;
1538 };
1539 
1540 /*!
1541   \brief Face topology
1542 */
1543 struct P_topo_f
1544 {
1545     /* TODO */
1546     /*!
1547       \brief Array of edges
1548     */
1549     plus_t E[3];
1550     /*!
1551       \brief Volume number to the left, negative for hole
1552     */
1553     plus_t left;
1554     /*!
1555       \brief Volume number to the right, negative for hole
1556     */
1557     plus_t right;
1558 };
1559 
1560 /*!
1561   \brief Kernel topology
1562 */
1563 struct P_topo_k
1564 {
1565     /*!
1566       \brief Volume number, negative for duplicate kernel
1567     */
1568     plus_t volume;
1569 };
1570 
1571 /*!
1572   \brief Vector geometry
1573 */
1574 struct P_line
1575 {
1576     /*!
1577       \brief Line type
1578 
1579       - GV_POINT
1580       - GV_LINE
1581       - GV_BOUNDARY
1582       - GV_CENTROID
1583       - GV_FACE
1584       - GV_KERNEL
1585     */
1586     char type;
1587     /*!
1588       \brief Offset in coor file for line
1589 
1590       OGR-links: offset array index
1591       PG-links: node/edge id
1592     */
1593     off_t offset;
1594     /*!
1595       \brief Topology info
1596 
1597       NULL for points
1598     */
1599     void *topo;
1600 };
1601 
1602 /*!
1603   \brief Area (topology) info
1604 */
1605 struct P_area
1606 {
1607     /*!
1608       \brief Number of boundary lines
1609     */
1610     plus_t n_lines;
1611     /*!
1612       \brief Allocated space for lines
1613     */
1614     plus_t alloc_lines;
1615     /*!
1616       \brief List of boundary lines
1617 
1618       - negative means direction N2 to N1
1619       - lines are in clockwise order
1620     */
1621     plus_t *lines;
1622 
1623     /*********  Above this line is compatible with P_isle **********/
1624 
1625     /*!
1626       \brief Number of first centroid within area
1627     */
1628     plus_t centroid;
1629     /*!
1630       \brief Number of islands inside
1631     */
1632     plus_t n_isles;
1633     /*!
1634       \brief Allocated space for isles
1635     */
1636     plus_t alloc_isles;
1637     /*!
1638       \brief 1st generation interior islands
1639     */
1640     plus_t *isles;
1641 };
1642 
1643 /*!
1644   \brief Isle (topology) info
1645 */
1646 struct P_isle
1647 {
1648     /*!
1649       \brief Number of boundary lines
1650     */
1651     plus_t n_lines;
1652     /*!
1653       \brief Allocated space for lines
1654     */
1655     plus_t alloc_lines;
1656     /*!
1657       \brief List of boundary lines
1658 
1659       - negative means direction N2 to N1
1660       - lines are in counter clockwise order
1661     */
1662     plus_t *lines;
1663 
1664     /*********  Above this line is compatible with P_area **********/
1665 
1666     /*!
1667       \brief Area it exists w/in, if any
1668     */
1669     plus_t area;
1670 };
1671 
1672 /*!
1673   \brief Feature geometry info - coordinates
1674 */
1675 struct line_pnts
1676 {
1677     /*!
1678       \brief Array of X coordinates
1679     */
1680     double *x;
1681     /*!
1682       \brief Array of Y coordinates
1683     */
1684     double *y;
1685     /*!
1686       \brief Array of Z coordinates
1687     */
1688     double *z;
1689     /*!
1690       \brief Number of points
1691     */
1692     int n_points;
1693     /*!
1694       \brief Allocated space for points
1695     */
1696     int alloc_points;
1697 };
1698 
1699 /*!
1700   \brief Feature category info
1701 */
1702 struct line_cats
1703 {
1704     /*!
1705       \brief Array of layers (fields)
1706     */
1707     int *field;
1708     /*!
1709       \brief Array of categories
1710     */
1711     int *cat;
1712     /*!
1713       \brief Number of categories attached to element
1714     */
1715     int n_cats;
1716     /*!
1717       \brief Allocated space for categories
1718     */
1719     int alloc_cats;
1720 };
1721 
1722 /*! \brief Category list */
1723 struct cat_list
1724 {
1725     /*!
1726       \brief Category layer (field)
1727     */
1728     int field;
1729     /*!
1730       \brief Array of minimum values
1731     */
1732     int *min;
1733     /*!
1734       \brief Array of maximum values
1735     */
1736     int *max;
1737     /*!
1738       \brief Number of ranges
1739     */
1740     int n_ranges;
1741     /*!
1742       \brief Allocated space for ranges
1743     */
1744     int alloc_ranges;
1745 };
1746 
1747 /*!
1748    \brief List of bounding boxes with id
1749 */
1750 struct boxlist
1751 {
1752     /*!
1753       \brief Array of ids
1754     */
1755     int *id;
1756     /*!
1757       \brief Array of bounding boxes
1758     */
1759     struct bound_box *box;
1760     /*!
1761       \brief flag to indicate whether bounding boxes should be added
1762     */
1763     int have_boxes;
1764     /*!
1765       \brief Number of items in the list
1766     */
1767     int n_values;
1768     /*!
1769       \brief Allocated space for items
1770     */
1771     int alloc_values;
1772 };
1773 
1774 /*!
1775   \brief Vector array
1776 
1777   Space allocated is size + 1
1778 */
1779 struct varray
1780 {
1781     /*!
1782       \brief Array size
1783     */
1784     int size;
1785     /*!
1786       \brief Array
1787 
1788       Where 'class' or new category
1789       or something like that is stored
1790     */
1791     int *c;
1792 };
1793 
1794 /*!
1795   \brief Spatial index info
1796 
1797   For use in modules
1798 */
1799 struct spatial_index
1800 {
1801     /*!
1802       \brief Pointer to the search tree (R*-Tree)
1803     */
1804     struct RTree *si_tree;
1805     /*!
1806       \brief Name of file to store the search tree
1807     */
1808     char *name;
1809 };
1810 
1811 #endif /* DIG___STRUCTS___ */
1812