Shapefile::Shapefile (string const filename, GeometryType layer_type, bool append) { name = filename.substr(0, filename.find_last_of('.')); geom_type = layer_type; layer = NULL; OGRRegisterAll(); driver = OGRGetDriverByName(driver_name.c_str()); if( driver == NULL ) { throw runtime_error( driver_name + " driver not available." ); } ds = OGR_Dr_Open(driver, filename.c_str(), NULL); if (ds != NULL && !append) { OGR_DS_Destroy(ds); unlink(filename.c_str()); } if (ds == NULL || !append) { ds = OGR_Dr_CreateDataSource(driver, filename.c_str(), NULL); if( ds == NULL ) { throw runtime_error(filename + " datasource creation failed."); } } layer = OGR_DS_GetLayer(ds, 0); if (layer != NULL && !append) { if (OGR_DS_DeleteLayer(ds, 0) != OGRERR_NONE) { throw runtime_error(filename + " existing layer can't be deleted."); } } if (layer == NULL) { layer = OGR_DS_CreateLayer(ds, name.c_str(), NULL, layer_type, NULL); if( layer == NULL ) { throw runtime_error(filename + " layer creation failed."); } } }
/*! \brief Prepare OGR datasource for creating new OGR layer (level 1) New OGR layer is created when writing features by Vect_wrile_line(). \param[out] Map pointer to Map_info structure \param name name of OGR layer to create \param with_z WITH_Z for 3D vector data otherwise WITHOUT_Z \return 0 success \return -1 error */ int V1_open_new_ogr(struct Map_info *Map, const char *name, int with_z) { #ifdef HAVE_OGR int i, nlayers; struct Format_info_ogr *ogr_info; OGRSFDriverH Ogr_driver; OGRDataSourceH Ogr_ds; OGRLayerH Ogr_layer; OGRFeatureDefnH Ogr_featuredefn; OGRRegisterAll(); ogr_info = &(Map->fInfo.ogr); G_debug(1, "V1_open_new_ogr(): name = %s with_z = %d", name, with_z); Ogr_driver = OGRGetDriverByName(ogr_info->driver_name); if (!Ogr_driver) { G_warning(_("Unable to get OGR driver <%s>"), ogr_info->driver_name); return -1; } ogr_info->driver = Ogr_driver; /* TODO: creation options */ Ogr_ds = OGR_Dr_CreateDataSource(Ogr_driver, ogr_info->dsn, NULL); if (!Ogr_ds) { G_warning(_("Unable to create OGR data source '%s'"), ogr_info->dsn); return -1; } ogr_info->ds = Ogr_ds; nlayers = OGR_DS_GetLayerCount(Ogr_ds); for (i = 0; i < nlayers; i++) { Ogr_layer = OGR_DS_GetLayer(Ogr_ds, i); Ogr_featuredefn = OGR_L_GetLayerDefn(Ogr_layer); if (strcmp(OGR_FD_GetName(Ogr_featuredefn), name) == 0) { if (G_get_overwrite()) { G_warning(_("OGR layer <%s> already exists and will be overwritten"), ogr_info->layer_name); if (OGR_DS_DeleteLayer(Ogr_ds, i) != OGRERR_NONE) { G_warning(_("Unable to delete OGR layer <%s>"), ogr_info->layer_name); return -1; } } else { G_fatal_error(_("OGR layer <%s> already exists in datasource '%s'"), ogr_info->layer_name, ogr_info->dsn); } ogr_info->layer = NULL; break; } } return 0; #else G_fatal_error(_("GRASS is not compiled with OGR support")); return -1; #endif }