• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
bobird的学习笔记
博客园    首页    新随笔    联系   管理    订阅  订阅
C#用GDAL/OGR库创建与写Shape文件,测试通过[转载]

GDAL/OGR是非常著名的开源GIS库,GDAL是对栅格数据进行操作,而OGR是对矢量数据进行操作,它们相当于一个通用数据访问库。甚至ESRI的产品中都用了此库。

现在,GDAL/OGR也提供了对.NET的编译支持,具体的编译与使用过程大家GOOGLE一下,网上资料非常详尽。其官网上有一些C,C++,Python的示例代码。 但没有C#的示例代码,但程序之间大同小异,下面我试的一个C#创建Shape文件,并往其中添加Point的示例代码,希望对各位有用。

//注册Ogr库
           string pszDriverName = "ESRI Shapefile";
           OSGeo.OGR.Ogr.RegisterAll();

           //调用对Shape文件读写的Driver接口
           OSGeo.OGR.Driver poDriver = OSGeo.OGR.Ogr.GetDriverByName(pszDriverName);
           if (poDriver == null)
               MessageBox.Show("Driver Error");

          //用此Driver创建Shape文件
           OSGeo.OGR.DataSource poDS;
           poDS = poDriver.CreateDataSource("point_out.shp", null);
           if (poDS == null)
               MessageBox.Show("DataSource Creation Error");

           //创建层Layer
           OSGeo.OGR.Layer poLayer;
           poLayer = poDS.CreateLayer("point_out", null, OSGeo.OGR.wkbGeometryType.wkbPoint, null);
           if (poLayer == null)
               MessageBox.Show("Layer Creation Failed");
           
           //创建属性列两列
           OSGeo.OGR.FieldDefn oField = new OSGeo.OGR.FieldDefn("名称", OSGeo.OGR.FieldType.OFTString);
           oField.SetWidth(16);
           OSGeo.OGR.FieldDefn oField2 = new OSGeo.OGR.FieldDefn("高度", OSGeo.OGR.FieldType.OFTInteger);            
           poLayer.CreateField(oField, 1);
           poLayer.CreateField(oField2, 0);

           //创建一个Feature,一个Point
           OSGeo.OGR.Feature poFeature = new Feature(poLayer.GetLayerDefn());
           OSGeo.OGR.Geometry pt = new Geometry(OSGeo.OGR.wkbGeometryType.wkbPoint);
           //往创建的Shape中写入二十个点,
           for (int i = 100; i < 120; i++)
           {
               //属性一"名称"赋值
               poFeature.SetField(0, "point"+i.ToString());
               //属性二"高度"赋值
               poFeature.SetField(1, i);
               //添加坐标点
               pt.AddPoint(i, i, 0);
               poFeature.SetGeometry(pt);
               //将带有坐标及属性的Feature要素点写入Layer中
               poLayer.CreateFeature(poFeature);
           }

           //关闭文件读写
           poFeature.Dispose();
           poDS.Dispose();

这里还没有涉及到定义投影坐标系的问题,后面将会继续完善起来。

C#用GDAL/OGR库读取与写shape投影信息

今天花了一点点时间看了一下C#中OGR读取与写shape中的投影信息的方式.
读写矢量与属性信息见上一篇
C#用GDAL/OGR库创建与写Shape文件,测试通过[原创]
具体过程为
//投影实验区
OSGeo.OSR.SpatialReference ss;
            ss = orgLayer.GetSpatialRef();//orgLayer为OSGeo.OGR.layer类型实例
string ppss;
            ss.ExportToWkt(out ppss);//将读取文件的shape投影信息输出到格式化字符串ppss
            MessageBox.Show(ppss);
非常简单.
比如,输出的一个编码信息串为
GEOGCS["GCS_North_American_1927",DATUM["North_American_Datum_1927",SPHEROID["Clarke_1866",6378206.4,294.9786982]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]]
这个串就是OGR里面标准的wkt串

然后往新生成的shape里写投影信息的过程也比较简单.
string strwkt = "GEOGCS[\"GCS_North_American_1927\",DATUM[\"North_American_Datum_1927\",SPHEROID[\"Clarke_1866\",6378206.4,294.9786982]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.0174532925199433]]";
注意字符串中双引号表示为\"
OSGeo.OSR.SpatialReference srs = new OSGeo.OSR.SpatialReference(strwkt);
//然后在创建Layer的函数中,第二个参数就是//OSGeo.OSR.SpatialReference
此时
poLayer = poDS.CreateLayer("layername1", srs, OSGeo.OGR.wkbGeometryType.wkbPoint, null);

posted on 2013-07-30 13:06  bobird  阅读(1231)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3