1 /* Copyright (c) 2006 Roger Bivand
2 * Function using C API and based on v.in.ogr from GRASS by Radim Blazek
3 * to read OGR vector geometry features */
4
5 #include "ogr_api.h"
6
7 // R headers moved outside extern "C" 070808 RSB re. note from BDR
8 // #ifdef __cplusplus
9 // extern "C" {
10 // #endif
11 #include <R.h>
12 #include <Rinternals.h>
13 #include <Rdefines.h>
14 #include "rgdal.h"
15
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19
R_OGR_CAPI_features(SEXP dsn,SEXP layer,SEXP comments)20 SEXP R_OGR_CAPI_features(SEXP dsn, SEXP layer, SEXP comments)
21 {
22
23 OGRDataSourceH Ogr_ds;
24 OGRLayerH Ogr_layer;
25 OGRFeatureDefnH Ogr_featuredefn;
26 OGRFeatureH Ogr_feature;
27 OGRGeometryH Ogr_geometry;
28 OGRwkbGeometryType eType;
29 OGRGeometryH hRing, hRingM;
30
31 int navailable_layers;
32 int i, j, k, km, jcnt;
33 /* int iDriver;*/
34 int dim, with_z;
35 int np, nr, nm;
36 /* char *pszProj4 = NULL;*/
37
38 int pc=0;
39 int nf, mp_count, mp_count_k0;
40 int do_comments;
41 // SEXP Hole;
42
43 SEXP ans;
44 SEXP ansnames;
45
46 do_comments = INTEGER_POINTER(comments)[0];
47 // PROTECT(Hole = NEW_INTEGER(1)); pc++;
48
49 installErrorHandler();
50 Ogr_ds = OGROpen(CHAR(STRING_ELT(dsn, 0)), FALSE, NULL);
51 if (Ogr_ds == NULL) {
52 uninstallErrorHandlerAndTriggerError();
53 error("Cannot open data source");
54 }
55 uninstallErrorHandlerAndTriggerError();
56
57 installErrorHandler();
58 navailable_layers = OGR_DS_GetLayerCount(Ogr_ds);
59 uninstallErrorHandlerAndTriggerError();
60
61 j=-1;
62 installErrorHandler();
63 for (i = 0; i < navailable_layers; i++) {
64 Ogr_layer = OGR_DS_GetLayer( Ogr_ds, i );
65 Ogr_featuredefn = OGR_L_GetLayerDefn(Ogr_layer);
66 if (strcmp((char *)OGR_FD_GetName(Ogr_featuredefn),
67 CHAR(STRING_ELT(layer, 0))) == 0) j = i;
68 }
69 uninstallErrorHandlerAndTriggerError();
70
71 if (j < 0) error("Layer not found");
72
73 PROTECT(ans = NEW_LIST(8)); pc++;
74 PROTECT(ansnames = NEW_CHARACTER(8)); pc++;
75 SET_STRING_ELT(ansnames, 0, COPY_TO_USER_STRING("dsn"));
76 SET_STRING_ELT(ansnames, 1, COPY_TO_USER_STRING("layer"));
77 SET_STRING_ELT(ansnames, 2, COPY_TO_USER_STRING("proj4string"));
78 SET_STRING_ELT(ansnames, 3, COPY_TO_USER_STRING("geomTypes"));
79 SET_STRING_ELT(ansnames, 4, COPY_TO_USER_STRING("crdlist"));
80 SET_STRING_ELT(ansnames, 5, COPY_TO_USER_STRING("with_z"));
81 SET_STRING_ELT(ansnames, 6, COPY_TO_USER_STRING("isNULL"));
82 SET_STRING_ELT(ansnames, 7, COPY_TO_USER_STRING("polygonIntComments"));
83 setAttrib(ans, R_NamesSymbol, ansnames);
84
85 SET_VECTOR_ELT(ans, 0, NEW_CHARACTER(1));
86 // SET_VECTOR_ELT(VECTOR_ELT(ans, 0), 0,
87 installErrorHandler();
88 SET_STRING_ELT(VECTOR_ELT(ans, 0), 0,
89 COPY_TO_USER_STRING(OGR_DS_GetName(Ogr_ds)));
90 uninstallErrorHandlerAndTriggerError();
91
92 installErrorHandler();
93 Ogr_layer = OGR_DS_GetLayer(Ogr_ds, j);
94 Ogr_featuredefn = OGR_L_GetLayerDefn(Ogr_layer);
95 uninstallErrorHandlerAndTriggerError();
96
97 SET_VECTOR_ELT(ans, 1, NEW_CHARACTER(1));
98 // SET_VECTOR_ELT(VECTOR_ELT(ans, 1), 0,
99 installErrorHandler();
100 SET_STRING_ELT(VECTOR_ELT(ans, 1), 0,
101 COPY_TO_USER_STRING((char *)OGR_FD_GetName(Ogr_featuredefn)));
102 uninstallErrorHandlerAndTriggerError();
103 SET_VECTOR_ELT(ans, 2, NEW_INTEGER(1));
104
105 /* was projection */
106
107 installErrorHandler();
108 #ifdef GDALV2
109 GIntBig nFIDs64 = OGR_L_GetFeatureCount(Ogr_layer, 1);
110 nf = (nFIDs64 > INT_MAX) ? INT_MAX :
111 (nFIDs64 < INT_MIN) ? INT_MIN : (int) nFIDs64;
112 if ((GIntBig) nf != nFIDs64){
113 uninstallErrorHandlerAndTriggerError();
114 error("R_OGR_CAPI_features: feature count overflow");
115 }
116 #else
117 nf = OGR_L_GetFeatureCount(Ogr_layer, 1);
118 #endif
119 uninstallErrorHandlerAndTriggerError();
120 if (nf == -1) {
121 i=0;
122 installErrorHandler();
123 while( ((Ogr_feature = OGR_L_GetNextFeature(Ogr_layer)) != NULL) && i <= INT_MAX){
124 i++;
125 OGR_F_Destroy(Ogr_feature);
126 // delete poFeature;
127 }
128 uninstallErrorHandlerAndTriggerError();
129 if (i == INT_MAX) {
130 error("ogrFIDs: feature count overflow");
131 } else {
132 nf = i;
133 }
134 installErrorHandler();
135 OGR_L_ResetReading(Ogr_layer);
136 uninstallErrorHandlerAndTriggerError();
137 }
138 //Rprintf("nf: %d\n", nf);
139 SET_VECTOR_ELT(ans, 3, NEW_INTEGER(nf));
140 SET_VECTOR_ELT(ans, 4, NEW_LIST(nf));
141 SET_VECTOR_ELT(ans, 5, NEW_INTEGER(nf));
142 SET_VECTOR_ELT(ans, 6, NEW_INTEGER(nf));
143 SET_VECTOR_ELT(ans, 7, NEW_LIST(nf));
144
145 i=0;
146 installErrorHandler();
147 while( (Ogr_feature = OGR_L_GetNextFeature(Ogr_layer)) != NULL ) {
148 /* Geometry */
149 Ogr_geometry = OGR_F_GetGeometryRef(Ogr_feature);
150 with_z = 0;
151 /* TODO fix NULL reading */
152 if ( Ogr_geometry == NULL ||
153 wkbFlatten(OGR_G_GetGeometryType(Ogr_geometry)) == 0) {
154 /* error("NULL geometry found"); */
155 INTEGER_POINTER(VECTOR_ELT(ans, 6))[i] = 1;
156 } else {
157 INTEGER_POINTER(VECTOR_ELT(ans, 6))[i] = 0;
158 dim = OGR_G_GetCoordinateDimension(Ogr_geometry);
159 if (dim > 2)
160 with_z = 1;
161 eType = wkbFlatten(OGR_G_GetGeometryType(Ogr_geometry));
162
163 INTEGER_POINTER(VECTOR_ELT(ans, 3))[i] = (int) eType;
164 INTEGER_POINTER(VECTOR_ELT(ans, 5))[i] = with_z;
165
166 if (eType == wkbPoint) {
167 SET_VECTOR_ELT(VECTOR_ELT(ans, 4), i, NEW_LIST(1));
168 if (with_z == 0)
169 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i), 0,
170 NEW_LIST(2));
171 else SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i), 0,
172 NEW_LIST(3));
173
174 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i), 0), 0,
175 NEW_NUMERIC(1));
176 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i), 0), 1,
177 NEW_NUMERIC(1));
178 NUMERIC_POINTER(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans,
179 4), i), 0), 0))[0] = OGR_G_GetX(Ogr_geometry, 0);
180 NUMERIC_POINTER(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans,
181 4), i), 0), 1))[0] = OGR_G_GetY(Ogr_geometry, 0);
182
183 if (with_z > 0) {
184 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans,
185 4), i), 0), 2, NEW_NUMERIC(1));
186 NUMERIC_POINTER(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(
187 ans, 4), i), 0), 2))[0] = OGR_G_GetZ(Ogr_geometry, 0);
188 }
189 } else if (eType == wkbLineString) {
190 np = OGR_G_GetPointCount(Ogr_geometry);
191 if (np > 0) {
192 SET_VECTOR_ELT(VECTOR_ELT(ans, 4), i, NEW_LIST(1));
193 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i), 0,
194 NEW_LIST(2));
195
196 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i), 0), 0,
197 NEW_NUMERIC(np));
198 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i), 0), 1,
199 NEW_NUMERIC(np));
200 for( j = 0; j < np; j++ ) {
201 NUMERIC_POINTER(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(
202 ans, 4), i), 0), 0))[j] = OGR_G_GetX(Ogr_geometry, j);
203 NUMERIC_POINTER(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(
204 ans, 4), i), 0), 1))[j] = OGR_G_GetY(Ogr_geometry, j);
205 }
206 } else INTEGER_POINTER(VECTOR_ELT(ans, 6))[i] = 1;
207 } else if (eType == wkbPolygon) {
208 nr = OGR_G_GetGeometryCount(Ogr_geometry);
209 if (nr > 0) {
210 SET_VECTOR_ELT(VECTOR_ELT(ans, 4), i, NEW_LIST(nr));
211 jcnt = 0;
212 for (j=0; j < nr; j++) {
213 hRing = OGR_G_GetGeometryRef(Ogr_geometry, j);
214 np = OGR_G_GetPointCount(hRing);
215 if (np > 0) {
216 jcnt++;
217 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i), j,
218 NEW_LIST(2));
219 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i),
220 j), 0, NEW_NUMERIC(np));
221 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i),
222 j), 1, NEW_NUMERIC(np));
223 // added hole reporting since #0 is defined exterior, rest interior
224 // if (j == 0) INTEGER_POINTER(Hole)[0] = 0;
225 // else INTEGER_POINTER(Hole)[0] = 1;
226 // if (!do_comments) INTEGER_POINTER(Hole)[0] = NA_INTEGER;
227 // setAttrib(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i), j),
228 // install("hole"), Hole);
229 //if (i == 1L) Rprintf("wkbPolygon i %d j %d Hole %d\n", i, j, INTEGER_POINTER(Hole)[0]);
230 // Hole = getAttrib(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4),
231 // i), j), install("hole"));
232 // appear to need to retrieve Hole attribute 121016
233 for(k = 0; k < np; k++) {
234 NUMERIC_POINTER(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(
235 ans, 4), i), j), 0))[k] = OGR_G_GetX(hRing, k);
236 NUMERIC_POINTER(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(
237 ans, 4), i), j), 1))[k] = OGR_G_GetY(hRing, k);
238 }
239 }
240 }
241 if (jcnt == 0) INTEGER_POINTER(VECTOR_ELT(ans, 6))[i] = 1;
242 // added comment since #0 is defined exterior, rest interior
243 if (jcnt > 0 && do_comments) {
244 SET_VECTOR_ELT(VECTOR_ELT(ans, 7), i, NEW_INTEGER(nr));
245 INTEGER_POINTER(VECTOR_ELT(VECTOR_ELT(ans, 7), i))[0] = 0;
246 for (j=1; j<nr; j++)
247 INTEGER_POINTER(VECTOR_ELT(VECTOR_ELT(ans, 7), i))[j] = ROFFSET;
248 }
249 } else INTEGER_POINTER(VECTOR_ELT(ans, 6))[i] = 1;
250 } else if (eType == wkbMultiLineString) {
251 nm = OGR_G_GetGeometryCount(Ogr_geometry);
252 if (nm > 0) {
253 SET_VECTOR_ELT(VECTOR_ELT(ans, 4), i, NEW_LIST(nm));
254 jcnt = 0;
255 for(j = 0; j < nm; j++) {
256 hRingM = OGR_G_GetGeometryRef(Ogr_geometry, j);
257 np = OGR_G_GetPointCount(hRingM);
258 if (np > 0) {
259 jcnt++;
260 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i), j,
261 NEW_LIST(2));
262 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i),
263 j), 0, NEW_NUMERIC(np));
264 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i),
265 j), 1, NEW_NUMERIC(np));
266 for(k = 0; k < np; k++) {
267 NUMERIC_POINTER(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(
268 ans, 4), i), j), 0))[k] = OGR_G_GetX(hRingM, k);
269 NUMERIC_POINTER(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(
270 ans, 4), i), j), 1))[k] = OGR_G_GetY(hRingM, k);
271 }
272 }
273 }
274 if (jcnt == 0) INTEGER_POINTER(VECTOR_ELT(ans, 6))[i] = 1;
275 } else INTEGER_POINTER(VECTOR_ELT(ans, 6))[i] = 1;
276 } else if (eType == wkbMultiPolygon) {
277 nm = OGR_G_GetGeometryCount(Ogr_geometry);
278 if (nm > 0) {
279 for(j = 0, mp_count = 0; j < nm; j++) {
280 hRingM = OGR_G_GetGeometryRef(Ogr_geometry, j);
281 nr = OGR_G_GetGeometryCount(hRingM);
282 mp_count += nr;
283 }
284 SET_VECTOR_ELT(VECTOR_ELT(ans, 4), i, NEW_LIST(mp_count));
285 // added comment since #0 is defined exterior, rest interior
286 if (do_comments)
287 SET_VECTOR_ELT(VECTOR_ELT(ans, 7), i, NEW_INTEGER(mp_count));
288 mp_count = 0;
289 jcnt = 0;
290 for(j = 0; j < nm; j++) {
291 hRingM = OGR_G_GetGeometryRef(Ogr_geometry, j);
292 nr = OGR_G_GetGeometryCount(hRingM);
293 if (nr > 0) {
294 for (k=0; k < nr; k++) {
295 hRing = OGR_G_GetGeometryRef(hRingM, k);
296 np = OGR_G_GetPointCount(hRing);
297 if (np > 0) {
298 jcnt++;
299 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4), i),
300 mp_count, NEW_LIST(2));
301 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4),
302 i), mp_count), 0, NEW_NUMERIC(np));
303 SET_VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4),
304 i), mp_count), 1, NEW_NUMERIC(np));
305 for(km = 0; km < np; km++) {
306 NUMERIC_POINTER(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(
307 VECTOR_ELT(ans, 4), i), mp_count), 0))[km] =
308 OGR_G_GetX(hRing, km);
309 NUMERIC_POINTER(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(
310 VECTOR_ELT(ans, 4), i), mp_count), 1))[km] =
311 OGR_G_GetY(hRing, km);
312 }
313 // added hole reporting since #0 is defined exterior, rest interior
314 // if (k == 0) INTEGER_POINTER(Hole)[0] = 0;
315 // else INTEGER_POINTER(Hole)[0] = 1;
316 // if (!do_comments) INTEGER_POINTER(Hole)[0] = NA_INTEGER;
317 // setAttrib(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans, 4),
318 // i), mp_count), install("hole"), Hole);
319 // Hole = getAttrib(VECTOR_ELT(VECTOR_ELT(VECTOR_ELT(ans,
320 // 4), i), mp_count), install("hole"));
321 // appear to need to retrieve Hole attribute 121016
322 if (k == 0) mp_count_k0 = mp_count;
323 // added comment since #0 is defined exterior, rest interior
324 if (do_comments) {
325 if (k == 0)
326 INTEGER_POINTER(VECTOR_ELT(VECTOR_ELT(ans,
327 7), i))[mp_count] = 0;
328 else INTEGER_POINTER(VECTOR_ELT(VECTOR_ELT(ans,
329 7), i))[mp_count] = mp_count_k0 + ROFFSET;
330 }
331 mp_count++;
332 }
333 }
334 }
335 }
336 if (jcnt == 0) INTEGER_POINTER(VECTOR_ELT(ans, 6))[i] = 1;
337 } else INTEGER_POINTER(VECTOR_ELT(ans, 6))[i] = 1;
338 } else warning("eType not chosen");
339 }
340 OGR_F_Destroy(Ogr_feature);
341 i++;
342 }
343 uninstallErrorHandlerAndTriggerError();
344 installErrorHandler();
345 OGR_DS_Destroy(Ogr_ds);
346 uninstallErrorHandlerAndTriggerError();
347 UNPROTECT(pc);
348
349 return(ans);
350 }
351
R_OGR_types(SEXP dsn,SEXP layer)352 SEXP R_OGR_types(SEXP dsn, SEXP layer)
353 {
354
355 OGRDataSourceH Ogr_ds;
356 OGRLayerH Ogr_layer;
357 OGRFeatureDefnH Ogr_featuredefn;
358 OGRFeatureH Ogr_feature;
359 OGRGeometryH Ogr_geometry;
360 OGRwkbGeometryType eType;
361
362 int navailable_layers;
363 int i, j;
364 /* int iDriver;*/
365 int dim, with_z, isNULL;
366 /* char *pszProj4 = NULL;*/
367
368 int pc=0;
369 int nf;
370
371 SEXP ans;
372 SEXP ansnames;
373
374 installErrorHandler();
375 Ogr_ds = OGROpen(CHAR(STRING_ELT(dsn, 0)), FALSE, NULL);
376 if (Ogr_ds == NULL) {
377 uninstallErrorHandlerAndTriggerError();
378 error("Cannot open data source");
379 }
380 uninstallErrorHandlerAndTriggerError();
381
382 installErrorHandler();
383 navailable_layers = OGR_DS_GetLayerCount(Ogr_ds);
384 uninstallErrorHandlerAndTriggerError();
385
386 j=-1;
387 installErrorHandler();
388 for (i = 0; i < navailable_layers; i++) {
389 Ogr_layer = OGR_DS_GetLayer( Ogr_ds, i );
390 Ogr_featuredefn = OGR_L_GetLayerDefn(Ogr_layer);
391 if (strcmp((char *)OGR_FD_GetName(Ogr_featuredefn),
392 CHAR(STRING_ELT(layer, 0))) == 0) j = i;
393 }
394 uninstallErrorHandlerAndTriggerError();
395
396 if (j < 0) error("Layer not found");
397
398 PROTECT(ans = NEW_LIST(6)); pc++;
399 PROTECT(ansnames = NEW_CHARACTER(6)); pc++;
400 SET_STRING_ELT(ansnames, 0, COPY_TO_USER_STRING("dsn"));
401 SET_STRING_ELT(ansnames, 1, COPY_TO_USER_STRING("layer"));
402 SET_STRING_ELT(ansnames, 2, COPY_TO_USER_STRING("proj4string"));
403 SET_STRING_ELT(ansnames, 3, COPY_TO_USER_STRING("geomTypes"));
404 SET_STRING_ELT(ansnames, 4, COPY_TO_USER_STRING("with_z"));
405 SET_STRING_ELT(ansnames, 5, COPY_TO_USER_STRING("isNULL"));
406 setAttrib(ans, R_NamesSymbol, ansnames);
407
408 SET_VECTOR_ELT(ans, 0, NEW_CHARACTER(1));
409 // SET_VECTOR_ELT(VECTOR_ELT(ans, 0), 0,
410 installErrorHandler();
411 SET_STRING_ELT(VECTOR_ELT(ans, 0), 0,
412 COPY_TO_USER_STRING(OGR_DS_GetName(Ogr_ds)));
413 uninstallErrorHandlerAndTriggerError();
414
415 installErrorHandler();
416 Ogr_layer = OGR_DS_GetLayer(Ogr_ds, j);
417 Ogr_featuredefn = OGR_L_GetLayerDefn(Ogr_layer);
418 uninstallErrorHandlerAndTriggerError();
419
420 SET_VECTOR_ELT(ans, 1, NEW_CHARACTER(1));
421 // SET_VECTOR_ELT(VECTOR_ELT(ans, 1), 0,
422 installErrorHandler();
423 SET_STRING_ELT(VECTOR_ELT(ans, 1), 0,
424 COPY_TO_USER_STRING((char *)OGR_FD_GetName(Ogr_featuredefn)));
425 uninstallErrorHandlerAndTriggerError();
426 SET_VECTOR_ELT(ans, 2, NEW_INTEGER(1));
427
428 /* was projection */
429
430 installErrorHandler();
431 #ifdef GDALV2
432 GIntBig nFIDs64 = OGR_L_GetFeatureCount(Ogr_layer, 1);
433 nf = (nFIDs64 > INT_MAX) ? INT_MAX :
434 (nFIDs64 < INT_MIN) ? INT_MIN : (int) nFIDs64;
435 if ((GIntBig) nf != nFIDs64){
436 uninstallErrorHandlerAndTriggerError();
437 error("R_OGR_types: feature count overflow");
438 }
439 #else
440 nf = OGR_L_GetFeatureCount(Ogr_layer, 1);
441 #endif
442 uninstallErrorHandlerAndTriggerError();
443
444 if (nf == -1) {
445 i=0;
446 installErrorHandler();
447 while( ((Ogr_feature = OGR_L_GetNextFeature(Ogr_layer)) != NULL) && i <= INT_MAX){
448 i++;
449 OGR_F_Destroy(Ogr_feature);
450 // delete poFeature;
451 }
452 uninstallErrorHandlerAndTriggerError();
453 if (i == INT_MAX) {
454 error("ogrFIDs: feature count overflow");
455 } else {
456 nf = i;
457 }
458 installErrorHandler();
459 OGR_L_ResetReading(Ogr_layer);
460 uninstallErrorHandlerAndTriggerError();
461 }
462
463
464 SET_VECTOR_ELT(ans, 3, NEW_INTEGER(nf));
465 SET_VECTOR_ELT(ans, 4, NEW_INTEGER(nf));
466 SET_VECTOR_ELT(ans, 5, NEW_INTEGER(nf));
467
468 i=0;
469 installErrorHandler();
470 while( (Ogr_feature = OGR_L_GetNextFeature(Ogr_layer)) != NULL ) {
471 /* Geometry */
472 Ogr_geometry = OGR_F_GetGeometryRef(Ogr_feature);
473 with_z = 0;
474 isNULL = 0;
475 eType = wkbUnknown;
476 if (Ogr_geometry == NULL) {
477 /* error("NULL geometry found"); */
478 isNULL = 1;
479 } else {
480 dim = OGR_G_GetCoordinateDimension(Ogr_geometry);
481 if (dim > 2) with_z = 1;
482 eType = wkbFlatten(OGR_G_GetGeometryType(Ogr_geometry));
483 }
484 /* ogrInfo("/home/rsb/tmp/bigshape", "parcel_mast_20050802") */
485 /* mast <- readOGR("/home/rsb/tmp/bigshape", "parcel_mast_20050802") */
486
487 if (eType == wkbUnknown || eType == wkbNone) isNULL = 1;
488
489 INTEGER_POINTER(VECTOR_ELT(ans, 3))[i] = (int) eType;
490 INTEGER_POINTER(VECTOR_ELT(ans, 4))[i] = with_z;
491 INTEGER_POINTER(VECTOR_ELT(ans, 5))[i] = isNULL;
492
493 OGR_F_Destroy(Ogr_feature);
494 i++;
495
496 }
497 uninstallErrorHandlerAndTriggerError();
498 installErrorHandler();
499 OGR_DS_Destroy(Ogr_ds);
500 uninstallErrorHandlerAndTriggerError();
501 UNPROTECT(pc);
502
503 return(ans);
504 }
505
506 #ifdef __cplusplus
507 }
508 #endif
509
510
511