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

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

    转载自:http://www.cnblogs.com/webgis8/archive/2009/07/19/giswei.html

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

     转载自:http://www.cnblogs.com/webgis8/archive/2009/08/05/1539305.html

    OSGeo.OGR.Ogr.RegisterAll();为什么老执行不过去?报“OSGeo.OGR.Ogr”的类型初始值设定项引发异常这样的问题

    这个问题是dll不全造成的,除了要引用的4个dll外,还有5个dll也要放到Debug目录下。
    在编译C#下的gdal时,总共生成了9个dll,在编译的本机上,程序是通过环境变量path找到另外的几个dll的。
    在没有编译过gdal的电脑上,反正就把这9个编译后的dll放到debug下面就一切Ok了

    附GDAL的C#版类库下载GDAL类库C#版

  • 相关阅读:
    Cesium视角
    Cesium删除特定的实体
    cesium之CLAMPED
    JavaScript:使用setAttribute()改变网页中标签的onclick属性
    atoi()函数及其实现
    寻找数组中的第二大数
    字符串函数之strcpy
    互换两个变量(不使用中间变量)
    寻找兄弟单词(2012.5.6百度实习)
    大数据量的存储分表常见算法(转)
  • 原文地址:https://www.cnblogs.com/wuhenke/p/1971151.html
Copyright © 2020-2023  润新知