예제 #1
0
파일: shapefile.cpp 프로젝트: iamcal/clustr
    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.");
            }
        }
    }
예제 #2
0
/*!
   \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
}