Ejemplo n.º 1
0
    void init_ogr(const std::string& outfile) {
        OGRRegisterAll();

        const char* driver_name = "SQLite";
        OGRSFDriver* driver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(driver_name);
        if (driver == NULL) {
            std::cerr << driver_name << " driver not available.\n";
            exit(1);
        }

        CPLSetConfigOption("OGR_SQLITE_SYNCHRONOUS", "FALSE");
        const char* options[] = { "SPATIALITE=TRUE", NULL };

        m_data_source = driver->CreateDataSource(outfile.c_str(), const_cast<char**>(options));
        if (m_data_source == NULL) {
            std::cerr << "Creation of output file failed.\n";
            exit(1);
        }

        m_layer_point   = init_layer("planet_osm_point",   m_fields_nodes, wkbPoint);
        m_layer_line    = init_layer("planet_osm_line",    m_fields_ways,  wkbLineString);
        m_layer_polygon = init_layer("planet_osm_polygon", m_fields_areas, wkbMultiPolygon);

        stringv fields_roads;
        fields_roads.push_back("railway");
        fields_roads.push_back("highway");
        fields_roads.push_back("boundary");
        m_layer_roads = init_layer("planet_osm_roads", fields_roads, wkbLineString);
    }
Ejemplo n.º 2
0
Handle<Value> GDALDrivers::getNames(const Arguments& args)
{
	HandleScope scope;
	int gdal_count = GetGDALDriverManager()->GetDriverCount();
	int i, ogr_count = 0;
	std::string name;

	#if GDAL_VERSION_MAJOR < 2
		ogr_count = OGRSFDriverRegistrar::GetRegistrar()->GetDriverCount();
	#endif

	int n = gdal_count + ogr_count;

	Local<Array> driver_names = Array::New(n);

	for (i = 0; i < gdal_count; ++i) {
		GDALDriver *driver = GetGDALDriverManager()->GetDriver(i);
		name = driver->GetDescription();
		#if GDAL_VERSION_MAJOR < 2
		if(name == "VRT") name = "VRT:raster";
		#endif
		driver_names->Set(i, SafeString::New(name.c_str()));
	}

	for (; i < n; ++i) {
		OGRSFDriver *driver = OGRSFDriverRegistrar::GetRegistrar()->GetDriver(i - gdal_count);
		name = driver->GetName();
		#if GDAL_VERSION_MAJOR < 2
		if(name == "VRT") name = "VRT:vector";
		#endif
		driver_names->Set(i, SafeString::New(name.c_str()));
	}
	return scope.Close(driver_names);
}
Ejemplo n.º 3
0
void RegisterOGRGeoconcept()

{
    OGRSFDriver* poDriver = new OGRGeoconceptDriver;
    poDriver->SetMetadataItem( GDAL_DMD_EXTENSIONS, "gxt txt" );

    poDriver->SetMetadataItem( GDAL_DMD_CREATIONOPTIONLIST,
"<CreationOptionList>"
"  <Option name='EXTENSION' type='string-select' description='indicates the "
"GeoConcept export file extension. TXT was used by earlier releases of "
"GeoConcept. GXT is currently used.' default='GXT'>"
"    <Value>GXT</Value>"
"    <Value>TXT</Value>"
"  </Option>"
"  <Option name='CONFIG' type='string' description='path to the GCT file that "
"describes the GeoConcept types definitions.'/>"
"</CreationOptionList>");

    poDriver->SetMetadataItem( GDAL_DS_LAYER_CREATIONOPTIONLIST,
"<LayerCreationOptionList>"
"  <Option name='FEATURETYPE' type='string' description='TYPE.SUBTYPE : "
"defines the feature to be created. The TYPE corresponds to one of the Name "
"found in the GCT file for a type section. The SUBTYPE corresponds to one of "
"the Name found in the GCT file for a sub-type section within the previous "
"type section'/>"
"</LayerCreationOptionList>" );
    poDriver->SetMetadataItem( GDAL_DCAP_VIRTUALIO, "YES" );

    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( poDriver );
}
Ejemplo n.º 4
0
//---------------------------------------------------------
CSG_String COGR_Driver::Get_Description(int iDriver)
{
	OGRSFDriver	*pDriver	= m_pManager->GetDriver(iDriver);
	CSG_String	s;

	s	+= pDriver->TestCapability(ODrCCreateDataSource)	? SG_T("\n[x] ") : SG_T("\n[ ] ");
	s	+= _TL("create data source");

	s	+= pDriver->TestCapability(ODrCDeleteDataSource)	? SG_T("\n[x] ") : SG_T("\n[ ] ");
	s	+= _TL("delete data source");

/*	s	+= pDriver->TestCapability(ODsCCreateLayer)			? SG_T("\n[x]") : SG_T("\n[ ]");
	s	+= _TL("create layer");

	s	+= pDriver->TestCapability(ODsCDeleteLayer)			? SG_T("\n[x]") : SG_T("\n[ ]");
	s	+= _TL("delete layer");

	s	+= pDriver->TestCapability(OLCDeleteFeature)		? SG_T("\n[x]") : SG_T("\n[ ]");
	s	+= _TL("delete feature");

	s	+= pDriver->TestCapability(OLCRandomRead)			? SG_T("\n[x]") : SG_T("\n[ ]");
	s	+= _TL("random read");

	s	+= pDriver->TestCapability(OLCRandomWrite)			? SG_T("\n[x]") : SG_T("\n[ ]");
	s	+= _TL("random write");

	s	+= pDriver->TestCapability(OLCSequentialWrite)		? SG_T("\n[x]") : SG_T("\n[ ]");
	s	+= _TL("sequential write");
/**/

	return( SG_STR_MBTOSG(s) );
}
Ejemplo n.º 5
0
shared_ptr<OGRDataSource> OgrUtilities::createDataSource(QString url)
{
  const char* driverName = NULL;
  int i = 0;
  while (extensions[i][0] != NULL)
  {
    if (url.endsWith(extensions[i][0]))
    {
      driverName = extensions[i][1];
    }
    i++;
  }
  i = 0;
  while (beginName[i][0] != NULL)
  {
    if (url.startsWith(beginName[i][0]))
    {
      driverName = beginName[i][1];
    }
    i++;
  }
  if (driverName == NULL)
  {
    throw HootException("No driver found for: " + url);
  }

  OGRSFDriver* driver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(driverName);
  if (driver == 0)
  {
    throw HootException("Error getting driver by name: " + QString(driverName));
  }

  // if the user specifies a shapefile then crop off the .shp and create a directory.
  if (url.toLower().endsWith(".shp"))
  {
    url = url.mid(0, url.length() - 4);
  }

  shared_ptr<OGRDataSource> result(driver->CreateDataSource(url.toAscii()));
  if (result == NULL)
  {
    throw HootException("Unable to create data source: " + url +
                        " (" + QString(CPLGetLastErrorMsg()) + ")");
  }
  result->SetDriver(driver);

  if (QString(driverName) == "FileGDB")
  {
    long v = GDAL_VERSION_MAJOR * 1000000 + GDAL_VERSION_MINOR * 1000 + GDAL_VERSION_REV;
    long lowest = 1 * 1000000 + 10 * 1000 + 1;
    if (v < lowest)
    {
      LOG_WARN("Writing to FileGDB with GDAL v" << GDAL_RELEASE_NAME << ". FileGDB with a GDAL "
               "v1.9.0 is known to create files that can't be read by ArcMap 10.2. "
               "GDAL v1.10.1 is known to work.");
    }
  }

  return result;
}
Ejemplo n.º 6
0
void RegisterOGRCouchDB()

{
    OGRSFDriver* poDriver = new OGRCouchDBDriver;
    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME, "CouchDB / GeoCouch" );
    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( poDriver );
}
Ejemplo n.º 7
0
OGRDataSourceH OGR_Dr_CreateDataSource( OGRSFDriverH hDriver,
                                        const char *pszName, 
                                        char ** papszOptions )

{
    VALIDATE_POINTER1( hDriver, "OGR_Dr_CreateDataSource", NULL );

    OGRSFDriver* poDriver = (OGRSFDriver *) hDriver;
    CPLAssert( NULL != poDriver );

    OGRDataSource* poDS = NULL;
    poDS = poDriver->CreateDataSource( pszName, papszOptions );

    /* This fix is explained in Ticket #1223 */
    if( NULL != poDS )
    {
        poDS->SetDriver( poDriver );
        CPLAssert( NULL != poDS->GetDriver() );
    }
    else
    {
        CPLDebug( "OGR", "CreateDataSource operation failed. NULL pointer returned." );
    }

    return (OGRDataSourceH) poDS;
}
Ejemplo n.º 8
0
int OGRGPSBabelWriteDataSource::Create( const char * pszName,
                                        char **papszOptions )
{
    OGRSFDriver* poGPXDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName("GPX");
    if (poGPXDriver == NULL)
    {
        CPLError(CE_Failure, CPLE_AppDefined, "GPX driver is necessary for GPSBabel write support");
        return FALSE;
    }

    if (!EQUALN(pszName, "GPSBABEL:", 9))
    {
        const char* pszOptionGPSBabelDriverName =
                CSLFetchNameValue(papszOptions, "GPSBABEL_DRIVER");
        if (pszOptionGPSBabelDriverName != NULL)
            pszGPSBabelDriverName = CPLStrdup(pszOptionGPSBabelDriverName);
        else
        {
            CPLError(CE_Failure, CPLE_AppDefined, "GPSBABEL_DRIVER dataset creation option expected");
            return FALSE;
        }

        pszFilename = CPLStrdup(pszName);
    }
    else
    {
        const char* pszSep = strchr(pszName + 9, ':');
        if (pszSep == NULL)
        {
            CPLError(CE_Failure, CPLE_AppDefined,
                    "Wrong syntax. Expected GPSBabel:driver_name[,options]*:file_name");
            return FALSE;
        }

        pszGPSBabelDriverName = CPLStrdup(pszName + 9);
        *(strchr(pszGPSBabelDriverName, ':')) = '\0';

        pszFilename = CPLStrdup(pszSep+1);
    }

    /* A bit of validation to avoid command line injection */
    if (!OGRGPSBabelDataSource::IsValidDriverName(pszGPSBabelDriverName))
        return FALSE;

    const char* pszOptionUseTempFile = CSLFetchNameValue(papszOptions, "USE_TEMPFILE");
    if (pszOptionUseTempFile == NULL)
        pszOptionUseTempFile = CPLGetConfigOption("USE_TEMPFILE", NULL);
    if (pszOptionUseTempFile && CSLTestBoolean(pszOptionUseTempFile))
        osTmpFileName = CPLGenerateTempFilename(NULL);
    else
        osTmpFileName.Printf("/vsimem/ogrgpsbabeldatasource_%p", this);

    poGPXDS = poGPXDriver->CreateDataSource(osTmpFileName.c_str(), papszOptions);
    if (poGPXDS == NULL)
        return FALSE;

    this->pszName = CPLStrdup(pszName);

    return TRUE;
}
Ejemplo n.º 9
0
void CShapefileLayer::OpenShapefile(const std::string& filename)
{
	m_FileName_ = filename;
	OGRRegisterAll();
	std::string pszDriverName = "ESRI Shapefile";
	//CPLSetConfigOption("SHAPE_ENCODING", "");				//支持中文

	OGRSFDriver* poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName.c_str());
	m_pDataSource_ = poDriver->Open(m_FileName_.c_str(), false);				//打开shapefile文件,获取数据源
	if(m_pDataSource_ == NULL)
	{
		m_bExistFile_ = false;
		return;
	}
	m_pLayer_ = m_pDataSource_->GetLayer(0);						//获取shapefile第0层
	if(m_pLayer_ == NULL)
	{
		m_bExistFile_ = false;
		return ;
	}
	int theFeatureCount = m_pLayer_->GetFeatureCount();				//层里面的数据数量
    OGRFeature *poFeature = NULL;									//读取的数据指针
	m_pLayer_->ResetReading();										//重新读取
	m_ShapefileType_ = m_pLayer_->GetLayerDefn()->GetGeomType();	//类型
	m_bExistFile_ = true;
}
Ejemplo n.º 10
0
void Usage()
{
	OGRSFDriverRegistrar * poR = OGRSFDriverRegistrar::GetRegistrar();
	printf(
	    "Usage: txt2shp -i <input directory>\n"
	    "               -o <output directory>\n"
	    "              [-f <output file format_name>]\n\n"

	    "Note :\n"
	    " You can not put any file except you data files in the input directory."
	    " And the output directory must be empty directory.\n\n"
	);

	printf("Advanced options :\n");
	printf(" -f format_name: output file format name, possible values are:\n");

	for (int iDriver = 0; iDriver < poR->GetDriverCount(); iDriver++)
	{
		OGRSFDriver * poDriver = poR->GetDriver(iDriver);

		if (poDriver->TestCapability(ODrCCreateDataSource))
			printf("     -f \"%s\"\n", poDriver->GetName());
	}

	printf(
	    "\nExample :\n"
	    " txt2shp -i you_dir -o you_dir -f \"ESRI Shapefile\"\n\n"
	);
	exit(1);
}
Ejemplo n.º 11
0
void RegisterOGRGFT()

{
    OGRSFDriver* poDriver = new OGRGFTDriver;
    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME, "Google Fusion Tables" );
    poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC, "drv_gft.html" );
    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver(poDriver);
}
Ejemplo n.º 12
0
void RegisterOGRMEM()

{
    OGRSFDriver* poDriver = new OGRMemDriver;
    
    poDriver->SetMetadataItem( GDAL_DMD_CREATIONFIELDDATATYPES, "Integer Integer64 Real String Date DateTime Time IntegerList Integer64List RealList StringList Binary" );

    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( poDriver );
}
Ejemplo n.º 13
0
void RegisterOGRIdrisi()

{
    OGRSFDriver* poDriver = new OGRIdrisiDriver;
    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME, "Idrisi Vector (.vct)" );
    poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "vct" );
    poDriver->SetMetadataItem( GDAL_DCAP_VIRTUALIO, "YES" );
    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver(poDriver);
}
Ejemplo n.º 14
0
void TeOGRDriver::getDriversNames(std::vector<std::string>& dnames)
{
	int ndrivers = OGRSFDriverRegistrar::GetRegistrar()->GetDriverCount();
	for(int i = 0; i < ndrivers; ++i)
	{
		OGRSFDriver* driver = OGRSFDriverRegistrar::GetRegistrar()->GetDriver(i);
		dnames.push_back(driver->GetName());
	}
}
Ejemplo n.º 15
0
void RegisterOGRGeomedia()

{
    OGRSFDriver* poDriver = new OGRGeomediaDriver;
    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME, "Geomedia .mdb" );
    poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "mdb" );
    poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC, "drv_geomedia.html" );
    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver(poDriver);
}
Ejemplo n.º 16
0
void RegisterOGRSXF()
{
    OGRSFDriver* poDriver = new OGRSXFDriver;
    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME,
                                "Storage and eXchange Format" );
    poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC,
                                "drv_sxf.html" );
    poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "sxf" );
    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver(poDriver);
}
Ejemplo n.º 17
0
void RegisterOGRGME()

{
    OGRSFDriver* poDriver = new OGRGMEDriver;
    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME,
                                   "Google Maps Engine" );
    poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC,
                                   "http://trac.osgeo.org/gdal/wiki/GMEDriver" );
    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver(poDriver);
}
Ejemplo n.º 18
0
void RegisterOGRPGeo()

{
    OGRSFDriver* poDriver = new OGRPGeoDriver;

    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME, "ESRI Personal GeoDatabase" );
    poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "mdb" );
    poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC, "drv_pgeo.html" );

    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( poDriver );
}
Ejemplo n.º 19
0
void RegisterOGRXLS()

{
    OGRSFDriver* poDriver = new OGRXLSDriver;
    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME,
                                "MS Excel format" );
    poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "xls" );
    poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC,
                                "drv_xls.html" );
    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver(poDriver);
}
Ejemplo n.º 20
0
void RegisterOGRDWG()

{
    OGRSFDriver* poDriver = new OGRDWGDriver;
    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME,
                                "AutoCAD DWG" );
    poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "dwg" );
    poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC,
                                "drv_dwg.html" );
    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( poDriver );
}
Ejemplo n.º 21
0
void RegisterOGROGDI()

{
    if (! GDAL_CHECK_VERSION("OGR/OGDI driver"))
        return;
    OGRSFDriver* poDriver = new OGROGDIDriver;
    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME,
                                "OGDI Vectors (VPF, VMAP, DCW)" );
    poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC,
                                "drv_ogdi.html" );
    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver(poDriver);
}
Ejemplo n.º 22
0
void RegisterOGRXPlane()

{
    OGRSFDriver* poDriver = new OGRXPlaneDriver;
    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME,
                                "X-Plane/Flightgear aeronautical data" );
    poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "dat" );
    poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC,
                                "drv_xplane.html" );
    poDriver->SetMetadataItem( GDAL_DCAP_VIRTUALIO, "YES" );
    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver(poDriver);
}
Ejemplo n.º 23
0
JNIEXPORT jint JNICALL Java_es_gva_cit_jogr_OGRSFDriver_deleteDataSourceNat
  (JNIEnv *env, jobject obj, jlong cPtr, jstring pszName){
  	
  	OGRSFDriver 			*drv = (OGRSFDriver *) 0 ;
  	drv = *(OGRSFDriver **)&cPtr;
  	int						ogrerr;
  	
  	const char *name = env->GetStringUTFChars( pszName, 0);
	ogrerr = drv->DeleteDataSource(name);
  	env->ReleaseStringUTFChars( pszName, name);
  	return ogrerr;
  }
Ejemplo n.º 24
0
void RegisterOGRWAsP()

{
    OGRSFDriver* poDriver = new OGRWAsPDriver;
    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME,
                                "WAsP .map format" );
    poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "map" );
    poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC,
                                "drv_wasp.html" );

    poDriver->SetMetadataItem( GDAL_DCAP_VIRTUALIO, "YES" );
    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver(poDriver);
}
Ejemplo n.º 25
0
JNIEXPORT jint JNICALL Java_es_gva_cit_jogr_OGRSFDriver_testCapabilityNat
  (JNIEnv *env, jobject obj, jlong cPtr, jstring cap){
  	
  	OGRSFDriver 			*drv = (OGRSFDriver *) 0 ;
  	drv = *(OGRSFDriver **)&cPtr;
  	int res=-1;
  	
  	const char *testcap = env->GetStringUTFChars( cap, 0);
  	res = drv->TestCapability(testcap);
  	env->ReleaseStringUTFChars( cap, testcap);
  	return res;
  	
  }
Ejemplo n.º 26
0
bool COGR_DataSource::Create(const CSG_String &File, const CSG_String &DriverName)
{
	OGRSFDriver	*pDriver;

	Destroy();

	if( (pDriver = g_OGR_Driver.Get_Driver(DriverName)) != NULL )
	{
		m_pDataSource	= pDriver->CreateDataSource(SG_STR_SGTOMB(File), NULL);
	}

	return( m_pDataSource != NULL );
}
Ejemplo n.º 27
0
OGRDataSource * VectorCreate( const char * pszFormat, const char * pszFilename, char ** papszOptions/*=NULL*/ )
{
	OGRSFDriver * poDriver = GetVectorDriver(pszFormat);
	OGRDataSource * poOGRDataSource =
	    poDriver->CreateDataSource(pszFilename, papszOptions);

#ifdef TRACEON
	//测试时使用文件型数据库,没有图层时打开有问题,因此在这里放一个图层
	//这样才能打开,不用测试可以关闭,在release中没有
	poOGRDataSource->CreateLayer("TEMP", NULL, wkbUnknown, NULL);
#endif

	return poOGRDataSource;
}
Ejemplo n.º 28
0
OGRDataSource *AoIIntersection::buildIntersectionDataSource ( const char *outFmt )
{
  // get driver registrar
  OGRSFDriverRegistrar *reg = OGRSFDriverRegistrar::GetRegistrar();

  // create an OGRDataSource
  OGRSFDriver *driverToUse = reg->GetDriverByName( outFmt );

  if ( driverToUse )
  {
      return( driverToUse->CreateDataSource( "C:\\Minerva\\Data\\intersection.mem", NULL ) );
  }
  
  return 0;
}
Ejemplo n.º 29
0
 JNIEXPORT jstring JNICALL Java_es_gva_cit_jogr_OGRSFDriver_getNameNat
  (JNIEnv *env, jobject obj, jlong cPtr){
  	
  	OGRSFDriver 			*drv = (OGRSFDriver *) 0 ;
  	jstring					nom_drv;
  	
  	drv = *(OGRSFDriver **)&cPtr;
  	const char *name = drv->GetName();
  	
  	if(name!=NULL)
	  	nom_drv = env->NewStringUTF(name);
  	else return NULL;
  	  	
  	return nom_drv;
  }
Ejemplo n.º 30
0
void RegisterOGRMSSQLSpatial()

{
    if (! GDAL_CHECK_VERSION("OGR/MSSQLSpatial driver"))
        return;

    OGRSFDriver* poDriver = new OGRMSSQLSpatialDriver;

    poDriver->SetMetadataItem( GDAL_DMD_LONGNAME,
                               "Microsoft SQL Server Spatial Database"
#ifdef MSSQL_BCP_SUPPORTED
                               " (BCP)"
#endif
                               );
    poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC, "drv_mssqlspatial.html" );
    poDriver->SetMetadataItem( GDAL_DMD_CREATIONOPTIONLIST,
                               "<CreationOptionList/>");

    poDriver->SetMetadataItem( GDAL_DS_LAYER_CREATIONOPTIONLIST,
"<LayerCreationOptionList>"
"  <Option name='GEOM_TYPE' type='string-select' description='Format of geometry columns' default='geometry'>"
"    <Value>geometry</Value>"
"    <Value>geography</Value>"
"  </Option>"
"  <Option name='OVERWRITE' type='boolean' description='Whether to overwrite an existing table with the layer name to be created' default='NO'/>"
"  <Option name='LAUNDER' type='boolean' description='Whether layer and field names will be laundered' default='YES'/>"
"  <Option name='PRECISION' type='boolean' description='Whether fields created should keep the width and precision' default='YES'/>"
"  <Option name='DIM' type='integer' description='Set to 2 to force the geometries to be 2D, or 3 to be 2.5D'/>"
"  <Option name='GEOMETRY_NAME' type='string' description='Name of geometry column.' default='ogr_geometry' deprecated_alias='GEOM_NAME'/>"
"  <Option name='SCHEMA' type='string' description='Name of schema into which to create the new table' default='dbo'/>"
"  <Option name='SRID' type='int' description='Forced SRID of the layer'/>"
"  <Option name='SPATIAL_INDEX' type='boolean' description='Whether to create a spatial index' default='YES'/>"
"  <Option name='UPLOAD_GEOM_FORMAT' type='string-select' description='Geometry format when creating or modifying features' default='wkb'>"
"    <Value>wkb</Value>"
"    <Value>wkt</Value>"
"  </Option>"
"  <Option name='FID' type='string' description='Name of the FID column to create' default='ogr_fid'/>"
"  <Option name='FID64' type='boolean' description='Whether to create the FID column with bigint type to handle 64bit wide ids' default='NO'/>"
"  <Option name='GEOMETRY_NULLABLE' type='boolean' description='Whether the values of the geometry column can be NULL' default='YES'/>"
"  <Option name='EXTRACT_SCHEMA_FROM_LAYER_NAME' type='boolean' description='Whether a dot in a layer name should be considered as the separator for the schema and table name' default='YES'/>"
"</LayerCreationOptionList>");

    poDriver->SetMetadataItem( GDAL_DMD_CONNECTION_PREFIX, "MSSQL:");

    poDriver->SetMetadataItem( GDAL_DMD_CREATIONFIELDDATATYPES,
                               "Integer Integer64 Real String Date Time "
                               "DateTime Binary" );
    poDriver->SetMetadataItem( GDAL_DCAP_NOTNULL_FIELDS, "YES" );
    poDriver->SetMetadataItem( GDAL_DCAP_DEFAULT_FIELDS, "YES" );
    poDriver->SetMetadataItem( GDAL_DCAP_NOTNULL_GEOMFIELDS, "YES" );

    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver(poDriver);
}