在C#中使用GDAL創建Shape文件


這幾天在項目中考慮使用GDAL,由於10年沒有用過VC了,就在網上搜了下怎么樣在C# 中使用GDAL,看到了http://blog.csdn.net/liminlu0314/article/details/8828940這邊文章。拿過來測試了一下,可以用,把自己的測試代碼貼上來,以便日后參考。

         // 為了支持中文路徑,請添加下面這句代碼
            OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
            // 為了使屬性表字段支持中文,請添加下面這句
            OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "");

            string strVectorFile = "E:\\TestPolygon.shp";

            // 注冊所有的驅動
            Ogr.RegisterAll();

            //創建數據,這里以創建ESRI的shp文件為例
            string strDriverName = "ESRI Shapefile";
            int count = Ogr.GetDriverCount();
            Driver oDriver = Ogr.GetDriverByName(strDriverName);
            if (oDriver == null)
            {
                Console.WriteLine("%s 驅動不可用!\n", strVectorFile);
                return;
            }

            // 創建數據源
            DataSource oDS = oDriver.CreateDataSource(strVectorFile, null);
            if (oDS == null)
            {
                Console.WriteLine("創建矢量文件【%s】失敗!\n", strVectorFile);
                return;
            }

            // 創建圖層,創建一個多邊形圖層,這里沒有指定空間參考,如果需要的話,需要在這里進行指定
            Layer oLayer = oDS.CreateLayer("TestPolygon", null, wkbGeometryType.wkbPolygon, null);
            if (oLayer == null)
            {
                Console.WriteLine("圖層創建失敗!\n");
                return;
            }

            // 下面創建屬性表
            // 先創建一個叫FieldID的整型屬性
            FieldDefn oFieldID = new FieldDefn("FieldID", FieldType.OFTInteger);
            oLayer.CreateField(oFieldID, 1);

            // 再創建一個叫FeatureName的字符型屬性,字符長度為50
            FieldDefn oFieldName = new FieldDefn("FieldName", FieldType.OFTString);
            oFieldName.SetWidth(100);
            oLayer.CreateField(oFieldName, 1);

            FeatureDefn oDefn = oLayer.GetLayerDefn();

            // 創建三角形要素
            Feature oFeatureTriangle = new Feature(oDefn);
            oFeatureTriangle.SetField(0, 0);
            oFeatureTriangle.SetField(1, "三角形");
            Geometry geomTriangle = Geometry.CreateFromWkt("POLYGON ((0 0,20 0,10 15,0 0))");
            oFeatureTriangle.SetGeometry(geomTriangle);

            oLayer.CreateFeature(oFeatureTriangle);

            // 創建矩形要素
            Feature oFeatureRectangle = new Feature(oDefn);
            oFeatureRectangle.SetField(0, 1);
            oFeatureRectangle.SetField(1, "矩形");
            Geometry geomRectangle = Geometry.CreateFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))");
            oFeatureRectangle.SetGeometry(geomRectangle);

            oLayer.CreateFeature(oFeatureRectangle);

            // 創建島要素
            Feature oFeatureHole= new Feature(oDefn);
            oFeatureHole.SetField(0, 1);
            oFeatureHole.SetField(1, "環島測試");
            //Geometry geomWYX = Geometry.CreateFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))"); 
            OSGeo.OGR.Geometry outGeo = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing);
            outGeo.AddPoint(40, -30, 0);
            outGeo.AddPoint(60, -30, 0);
            outGeo.AddPoint(60, -10, 0);
            outGeo.AddPoint(40, -10, 0);

            OSGeo.OGR.Geometry inGeo = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing);
            inGeo.AddPoint(45, -25, 0);
            inGeo.AddPoint(55, -25, 0);
            inGeo.AddPoint(55, -15, 0);
            inGeo.AddPoint(45, -15, 0);

            OSGeo.OGR.Geometry geo = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPolygon);
            geo.AddGeometryDirectly(outGeo);
            geo.AddGeometryDirectly(inGeo);
            oFeatureHole.SetGeometry(geo);
            oLayer.CreateFeature(oFeatureHole);

            // 創建Multi要素
            Feature oFeatureMulty = new Feature(oDefn);
            oFeatureMulty.SetField(0, 1);
            oFeatureMulty.SetField(1, "MultyPart測試");
            OSGeo.OGR.Geometry geo1 = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing);
            geo1.AddPoint(25, -10, 0);
            geo1.AddPoint(5, -10, 0);
            geo1.AddPoint(5, -30, 0);
            geo1.AddPoint(25, -30, 0);
            OSGeo.OGR.Geometry poly1 = new Geometry(wkbGeometryType.wkbPolygon);
            poly1.AddGeometryDirectly(geo1);

            OSGeo.OGR.Geometry geo2 = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing);
            geo2.AddPoint(0, -15, 0);
            geo2.AddPoint(-5, -15, 0);
            geo2.AddPoint(-5, -20, 0);
            geo2.AddPoint(0, -20, 0);

            OSGeo.OGR.Geometry poly2 = new Geometry(wkbGeometryType.wkbPolygon);
            poly2.AddGeometryDirectly(geo2);

            OSGeo.OGR.Geometry geoMulty = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbMultiPolygon);
            geoMulty.AddGeometryDirectly(poly1);
            geoMulty.AddGeometryDirectly(poly2);
            oFeatureMulty.SetGeometry(geoMulty);

            oLayer.CreateFeature(oFeatureMulty);
            
          );

          
            Console.WriteLine("\n數據集創建完成!\n");
        }

  

  特別說明:

  在GDAL中,MultiPolygon由多個Polygon組成;而Polygon由LinearRing組成,像環要素就是有一個外部LinearRing和若干個內部LinearRing組成的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM