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