using System;
using OGR;
/**
*
Title: GDAL C# createdata example.
* Description: A sample app to create a spatial data source and a layer.
* @author Tamas Szekeres (szekerest@gmail.com)
* @version 1.0
*/
///
/// A C# based sample to create a layer.
///
class CreateData {
public static void usage()
{
Console.WriteLine("usage: createdata {data source name} {layername}");
System.Environment.Exit(-1);
}
public static void Main(string[] args) {
if (args.Length != 2) usage();
// Using early initialization of System.Console
Console.WriteLine("");
/* -------------------------------------------------------------------- */
/* Register format(s). */
/* -------------------------------------------------------------------- */
ogr.RegisterAll();
/* -------------------------------------------------------------------- */
/* Get driver */
/* -------------------------------------------------------------------- */
Driver drv = ogr.GetDriverByName("ESRI Shapefile");
if (drv == null)
{
Console.WriteLine("Can't get driver.");
System.Environment.Exit(-1);
}
// TODO: drv.name is still unsafe with lazy initialization (Bug 1339)
Console.WriteLine("Using driver " + drv.name);
/* -------------------------------------------------------------------- */
/* Creating the datasource */
/* -------------------------------------------------------------------- */
DataSource ds = drv.CreateDataSource( args[0], new string[] {} );
if (drv == null)
{
Console.WriteLine("Can't create the datasource.");
System.Environment.Exit(-1);
}
/* -------------------------------------------------------------------- */
/* Creating the layer */
/* -------------------------------------------------------------------- */
Layer layer;
layer = ds.CreateLayer( args[1], null, ogr.wkbPoint, new string[] {} );
if( layer == null )
{
Console.WriteLine("Layer creation failed.");
System.Environment.Exit(-1);
}
/* -------------------------------------------------------------------- */
/* Adding attribute fields */
/* -------------------------------------------------------------------- */
FieldDefn fdefn = new FieldDefn( "Name", ogr.OFTString );
fdefn.SetWidth(32);
if( layer.CreateField( fdefn, 1 ) != 0 )
{
Console.WriteLine("Creating Name field failed.");
System.Environment.Exit(-1);
}
/* -------------------------------------------------------------------- */
/* Adding features */
/* -------------------------------------------------------------------- */
Feature feature = new Feature( layer.GetLayerDefn() );
feature.SetField( "Name", "value" );
Geometry geom = new Geometry(ogr.wkbUnknown, "POINT(47.0 19.2)", 0, null, null);
if( feature.SetGeometry( geom ) != 0 )
{
Console.WriteLine( "Failed add geometry to the feature" );
System.Environment.Exit(-1);
}
if( layer.CreateFeature( feature ) != 0 )
{
Console.WriteLine( "Failed to create feature in shapefile" );
System.Environment.Exit(-1);
}
ReportLayer(layer);
}
public static void ReportLayer(Layer layer)
{
FeatureDefn def = layer.GetLayerDefn();
Console.WriteLine( "Layer name: " + def.GetName() );
Console.WriteLine( "Feature Count: " + layer.GetFeatureCount(1) );
Envelope ext = new Envelope();
layer.GetExtent(ext, 1);
Console.WriteLine( "Extent: " + ext.MinX + "," + ext.MaxX + "," +
ext.MinY + "," + ext.MaxY);
/* -------------------------------------------------------------------- */
/* Reading the spatial reference */
/* -------------------------------------------------------------------- */
SpatialReference sr = layer.GetSpatialRef();
string srs_wkt;
if ( sr != null )
{
sr.ExportToPrettyWkt( out srs_wkt, 1 );
}
else
srs_wkt = "(unknown)";
Console.WriteLine( "Layer SRS WKT: " + srs_wkt );
/* -------------------------------------------------------------------- */
/* Reading the fields */
/* -------------------------------------------------------------------- */
Console.WriteLine("Field definition:");
for( int iAttr = 0; iAttr < def.GetFieldCount(); iAttr++ )
{
FieldDefn fdef = def.GetFieldDefn( iAttr );
Console.WriteLine( fdef.GetNameRef() + ": " +
fdef.GetFieldTypeName( fdef.GetFieldType() ) + " (" +
fdef.GetWidth() + "." +
fdef.GetPrecision() + ")");
}
/* -------------------------------------------------------------------- */
/* Reading the shapes */
/* -------------------------------------------------------------------- */
Console.WriteLine( "" );
Feature feat;
while( (feat = layer.GetNextFeature()) != null )
{
ReportFeature(feat, def);
feat.Dispose();
}
}
public static void ReportFeature(Feature feat, FeatureDefn def)
{
Console.WriteLine( "Feature(" + def.GetName() + "): " + feat.GetFID() );
for( int iField = 0; iField < feat.GetFieldCount(); iField++ )
{
FieldDefn fdef = def.GetFieldDefn( iField );
Console.Write( fdef.GetNameRef() + " (" +
fdef.GetFieldTypeName(fdef.GetFieldType()) + ") = ");
if( feat.IsFieldSet( iField ) )
Console.WriteLine( feat.GetFieldAsString( iField ) );
else
Console.WriteLine( "(null)" );
}
if( feat.GetStyleString() != null )
Console.WriteLine( " Style = " + feat.GetStyleString() );
Geometry geom = feat.GetGeometryRef();
if( geom != null )
Console.WriteLine( " " + geom.GetGeometryName() +
"(" + geom.GetGeometryType() + ")" );
Envelope env = new Envelope();
geom.GetEnvelope(env);
Console.WriteLine( " ENVELOPE: " + env.MinX + "," + env.MaxX + "," +
env.MinY + "," + env.MaxY);
string geom_wkt;
geom.ExportToWkt(out geom_wkt);
Console.WriteLine( " " + geom_wkt );
Console.WriteLine( "" );
}
}