GRASS 8 Programmer's Manual 8.6.0dev(2026)-56a9afeb9f
Loading...
Searching...
No Matches
constraint.c
Go to the documentation of this file.
1/*!
2 \file lib/vector/Vlib/constraint.c
3
4 \brief Vector library - constraints for reading features
5
6 Higher level functions for reading/writing/manipulating vectors.
7
8 These routines can affect the Vect_read_next_line() functions by
9 restricting what they return. They are applied on a per map basis.
10
11 These do not affect the lower level direct read functions.
12
13 Normally, all 'Alive' lines will be returned unless overridden by
14 this function. You can specified all the types you are interested
15 in (by oring their types together). You can use this to say exclude
16 'boundary' type features.
17
18 By default all DEAD lines are ignored by the Vect_read_next_line()
19 functions. This too can be overridden by including their types.
20
21 (C) 2001-2009, 2011-2012 by the GRASS Development Team
22
23 This program is free software under the GNU General Public License
24 (>=v2). Read the file COPYING that comes with GRASS for details.
25
26 \author Original author CERL, probably Dave Gerdes or Mike Higgins.
27 \author Update to GRASS 5.7 Radim Blazek and David D. Gray.
28 */
29
30#include <grass/vector.h>
31#include <grass/glocale.h>
32
33/*!
34 \brief Set constraint region
35
36 Vect_read_next_line() will read only features inside of given
37 region or features with overlapping bounding box.
38
39 \note Constraint is ignored for random access - Vect_read_line().
40
41 \param Map pointer to Map_info struct
42 \param n,s,e,w,t,b bbox definition (north, south, east, west, top, and bottom
43 coordinates)
44
45 \return 0 on success
46 \return -1 on error (invalid region)
47 */
48int Vect_set_constraint_region(struct Map_info *Map, double n, double s,
49 double e, double w, double t, double b)
50{
51 if (n <= s)
52 return -1;
53 if (e <= w)
54 return -1;
55
56 Map->constraint.region_flag = TRUE;
57 Map->constraint.box.N = n;
58 Map->constraint.box.S = s;
59 Map->constraint.box.E = e;
60 Map->constraint.box.W = w;
61 Map->constraint.box.T = t;
62 Map->constraint.box.B = b;
63 Map->head.proj = G_projection();
64
65 return 0;
66}
67
68/*!
69 \brief Get constraint box
70
71 Constraint box can be defined by Vect_set_constraint_region().
72
73 \param Map vector map
74 \param[out] Box bounding box
75
76 \return 0 on success
77 \return -1 no region constraint defined
78 */
80{
81 if (!Map->constraint.region_flag)
82 return -1;
83
84 Box->N = Map->constraint.box.N;
85 Box->S = Map->constraint.box.S;
86 Box->E = Map->constraint.box.E;
87 Box->W = Map->constraint.box.W;
88 Box->T = Map->constraint.box.T;
89 Box->B = Map->constraint.box.B;
90
91 return 0;
92}
93
94/*!
95 \brief Set constraint type
96
97 Vect_read_next_line() will read only features of given
98 type. Constraint is ignored for random access - Vect_read_line().
99
100 \param Map pointer to Map_info struct
101 \param type constraint feature type (GV_POINT, GV_LINE, ...)
102
103 \return 0 on success
104 \return -1 invalid feature type
105 */
107{
108 if (!(type & (GV_POINTS | GV_LINES | GV_FACE | GV_KERNEL)))
109 return -1;
110
111 Map->constraint.type = type;
112 Map->constraint.type_flag = TRUE;
113
114 return 0;
115}
116
117/*!
118 \brief Remove all constraints
119
120 \param Map pointer to Map_info struct
121 */
123{
124 Map->constraint.region_flag = FALSE;
125 Map->constraint.type_flag = FALSE;
126 Map->constraint.field_flag = FALSE;
127}
128
129/*!
130 \brief Set constraint field
131
132 Vect_read_next_line() will read only features of given type. Note
133 that categories must be read otherwise this constraint is
134 ignored. Constraint is ignored for random access -
135 Vect_read_line().
136
137 Ignored for non-native vector formats.
138
139 Note: Field is called layer on user level.
140
141 \param Map pointer to Map_info struct
142 \param field field number (-1 for all fields)
143
144 \return 0 on success
145 \return -1 invalid field
146 */
148{
149 if (Map->format != GV_FORMAT_NATIVE) {
150 G_warning(_("Layer constraint ignored for non-native vector formats"));
151 return -1;
152 }
153
154 if (field == -1) {
155 Map->constraint.field_flag = FALSE;
156 return 0;
157 }
158 if (field < 1) {
159 return -1;
160 }
161 Map->constraint.field = field;
162 Map->constraint.field_flag = TRUE;
163
164 return 0;
165}
int Vect_set_constraint_type(struct Map_info *Map, int type)
Set constraint type.
Definition constraint.c:106
int Vect_set_constraint_field(struct Map_info *Map, int field)
Set constraint field.
Definition constraint.c:147
int Vect_set_constraint_region(struct Map_info *Map, double n, double s, double e, double w, double t, double b)
Set constraint region.
Definition constraint.c:48
int Vect_get_constraint_box(struct Map_info *Map, struct bound_box *Box)
Get constraint box.
Definition constraint.c:79
void Vect_remove_constraints(struct Map_info *Map)
Remove all constraints.
Definition constraint.c:122
void G_warning(const char *,...) __attribute__((format(printf
int G_projection(void)
Query cartographic projection.
Definition proj1.c:32
#define GV_LINES
#define GV_FACE
#define GV_POINTS
#define GV_FORMAT_NATIVE
Geometry data formats supported by lib Don't change GV_FORMAT_* values, this order is hardcoded in li...
Definition dig_defines.h:83
#define GV_KERNEL
#define TRUE
Definition gis.h:78
#define FALSE
Definition gis.h:82
#define _(str)
Definition glocale.h:10
float Box[8][3]
Vertices for box.
Definition gsd_objs.c:1455
double b
Definition r_raster.c:39
double t
Definition r_raster.c:39
Vector map info.
Bounding box.
Definition dig_structs.h:62