C# GDAL基础使用之矢量处理1 ogrinfo(信息读取)

31 篇文章 9 订阅
using System;
using OSGeo.OGR;
using OSGeo.OSR;



/// <summary>
/// A C# based sample to dump information from a data source.
/// </summary>

class OGRInfo {

	public static void usage()

	{
		Console.WriteLine("usage: ogrinfo {data source name}");
		System.Environment.Exit(-1);
	}

	public static void Main(string[] args) {

		if (args.Length != 1) usage();

        // Using early initialization of System.Console
        Console.WriteLine("");

		/* -------------------------------------------------------------------- */
		/*      Register format(s).                                             */
		/* -------------------------------------------------------------------- */
		Ogr.RegisterAll();

		/* -------------------------------------------------------------------- */
		/*      Open data source.                                               */
		/* -------------------------------------------------------------------- */
		DataSource ds = Ogr.Open( args[0], 0 );

		if (ds == null) {
			Console.WriteLine("Can't open " + args[0]);
			System.Environment.Exit(-1);
		}

		/* -------------------------------------------------------------------- */
		/*      Get driver                                                      */
		/* -------------------------------------------------------------------- */
		Driver drv = ds.GetDriver();

		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);

		/* -------------------------------------------------------------------- */
		/*      Iterating through the layers                                    */
		/* -------------------------------------------------------------------- */

		for( int iLayer = 0; iLayer < ds.GetLayerCount(); iLayer++ )
		{
			Layer layer = ds.GetLayerByIndex(iLayer);

			if( layer == null )
			{
				Console.WriteLine( "FAILURE: Couldn't fetch advertised layer " + iLayer );
				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                                   */
		/* -------------------------------------------------------------------- */
		OSGeo.OSR.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 ) )
            {
                if (fdef.GetFieldType() == FieldType.OFTStringList)
                {
                    string[] sList = feat.GetFieldAsStringList(iField);
                    foreach (string s in sList)
                    {
                        Console.Write("\"" + s + "\" ");
                    }
                    Console.WriteLine();
                }
                else if (fdef.GetFieldType() == FieldType.OFTIntegerList)
                {
                    int count;
                    int[] iList = feat.GetFieldAsIntegerList(iField, out count);
                    for (int i = 0; i < count; i++)
                    {
                        Console.Write(iList[i] + " ");
                    }
                    Console.WriteLine();
                }
                else if (fdef.GetFieldType() == FieldType.OFTRealList)
                {
                    int count;
                    double[] iList = feat.GetFieldAsDoubleList(iField, out count);
                    for (int i = 0; i < count; i++)
                    {
                        Console.Write(iList[i].ToString() + " ");
                    }
                    Console.WriteLine();
                }
                else
                    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() + ")" );
			Geometry sub_geom;
			for (int i = 0; i < geom.GetGeometryCount(); i++)
			{
				sub_geom = geom.GetGeometryRef(i);
				if ( sub_geom != null )
				{
					Console.WriteLine( "  subgeom" + i + ": " + sub_geom.GetGeometryName() +
						"(" + sub_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( "" );
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值