GRASS Programmer's Manual  6.4.1(2011)
open_ogr.c
Go to the documentation of this file.
00001 
00021 #include <unistd.h>
00022 #include <string.h>
00023 #include <sys/types.h>
00024 #include <sys/stat.h>
00025 
00026 #include <grass/Vect.h>
00027 #include <grass/gis.h>
00028 #include <grass/glocale.h>
00029 
00030 #ifdef HAVE_OGR
00031 #include <ogr_api.h>
00032 
00045 int V1_open_old_ogr(struct Map_info *Map, int update)
00046 {
00047     int i, layer, nLayers;
00048     OGRDataSourceH Ogr_ds;
00049     OGRLayerH Ogr_layer = NULL;
00050     OGRFeatureDefnH Ogr_featuredefn;
00051 
00052     if (update) {
00053         G_warning(_("OGR format cannot be updated"));
00054         return -1;
00055     }
00056 
00057     G_debug(2, "V1_open_old_ogr(): dsn = %s layer = %s", Map->fInfo.ogr.dsn,
00058             Map->fInfo.ogr.layer_name);
00059 
00060     OGRRegisterAll();
00061 
00062     /*Data source handle */
00063     Ogr_ds = OGROpen(Map->fInfo.ogr.dsn, FALSE, NULL);
00064     if (Ogr_ds == NULL)
00065         G_fatal_error(_("Unable to open OGR data source '%s'"),
00066                       Map->fInfo.ogr.dsn);
00067     Map->fInfo.ogr.ds = Ogr_ds;
00068 
00069     /* Layer number */
00070     layer = -1;
00071     nLayers = OGR_DS_GetLayerCount(Ogr_ds);
00072     G_debug(2, "%d layers found in data source", nLayers);
00073 
00074     for (i = 0; i < nLayers; i++) {
00075         Ogr_layer = OGR_DS_GetLayer(Ogr_ds, i);
00076         Ogr_featuredefn = OGR_L_GetLayerDefn(Ogr_layer);
00077         if (strcmp(OGR_FD_GetName(Ogr_featuredefn), Map->fInfo.ogr.layer_name)
00078             == 0) {
00079             layer = i;
00080             break;
00081         }
00082     }
00083     if (layer == -1) {
00084         OGR_DS_Destroy(Ogr_ds);
00085         G_fatal_error(_("Unable to open layer <%s>"),
00086                       Map->fInfo.ogr.layer_name);
00087     }
00088     G_debug(2, "OGR layer %d opened", layer);
00089 
00090     Map->fInfo.ogr.layer = Ogr_layer;
00091 
00092     Map->fInfo.ogr.lines = NULL;
00093     Map->fInfo.ogr.lines_types = NULL;
00094     Map->fInfo.ogr.lines_alloc = 0;
00095     Map->fInfo.ogr.lines_num = 0;
00096     Map->fInfo.ogr.lines_next = 0;
00097 
00098     Map->head.with_z = WITHOUT_Z;       /* TODO: 3D */
00099 
00100     Map->fInfo.ogr.feature_cache = NULL;
00101     Map->fInfo.ogr.feature_cache_id = -1;       /* FID >= 0 */
00102 
00103     return (0);
00104 }
00105 
00114 int V2_open_old_ogr(struct Map_info *Map)
00115 {
00116     char elem[GPATH_MAX];
00117     char buf[5];                /* used for format version */
00118     long length;
00119     GVFILE fp;
00120     struct Port_info port;
00121     int Version_Major, Version_Minor, Back_Major, Back_Minor, byte_order;
00122 
00123     G_debug(3, "V2_open_old_ogr()");
00124 
00125     sprintf(elem, "%s/%s", GRASS_VECT_DIRECTORY, Map->name);
00126     dig_file_init(&fp);
00127     fp.file = G_fopen_old(elem, "fidx", Map->mapset);
00128     if (fp.file == NULL) {
00129         G_warning(_("Unable to open fidx file for vector map <%s@%s>"),
00130                   Map->name, Map->mapset);
00131         return -1;
00132     }
00133 
00134     /* Header */
00135     if (0 >= dig__fread_port_C(buf, 5, &fp))
00136         return (-1);
00137     Version_Major = buf[0];
00138     Version_Minor = buf[1];
00139     Back_Major = buf[2];
00140     Back_Minor = buf[3];
00141     byte_order = buf[4];
00142 
00143 
00144     /* check version numbers */
00145     if (Version_Major > 5 || Version_Minor > 0) {
00146         if (Back_Major > 5 || Back_Minor > 0) {
00147             G_fatal_error(_("Feature index format version %d.%d is not supported by this release."
00148                            " Try to rebuild topology or upgrade GRASS."),
00149                           Version_Major, Version_Minor);
00150             return (-1);
00151         }
00152         G_warning(_("Your GRASS version does not fully support feature index format %d.%d of the vector."
00153                    " Consider to rebuild topology or upgrade GRASS."),
00154                   Version_Major, Version_Minor);
00155     }
00156 
00157     dig_init_portable(&port, byte_order);
00158     dig_set_cur_port(&port);
00159 
00160     /* Body */
00161     /* bytes 6 - 9 : header size */
00162     if (0 >= dig__fread_port_L(&length, 1, &fp))
00163         return (-1);
00164     G_debug(3, "  header size %ld", length);
00165 
00166     fseek(fp.file, length, SEEK_SET);
00167 
00168     /* number of records  */
00169     if (0 >= dig__fread_port_I(&(Map->fInfo.ogr.offset_num), 1, &fp))
00170         return (-1);
00171 
00172     /* alloc space */
00173     Map->fInfo.ogr.offset =
00174         (int *)G_malloc(Map->fInfo.ogr.offset_num * sizeof(int));
00175     Map->fInfo.ogr.offset_alloc = Map->fInfo.ogr.offset_num;
00176 
00177     /* offsets */
00178     if (0 >= dig__fread_port_I(Map->fInfo.ogr.offset,
00179                                Map->fInfo.ogr.offset_num, &fp))
00180         return (-1);
00181 
00182     fclose(fp.file);
00183 
00184     G_debug(3, "%d records read from fidx", Map->fInfo.ogr.offset_num);
00185 
00186 
00187     Map->fInfo.ogr.next_line = 1;
00188 
00189     return 0;
00190 }
00191 
00192 #endif
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines