用户操作
[即时聊天] [发私信] [加为好友]
粟卫民ID:suen
141270次访问,排名564好友37人,关注者81
爱好技术,爱好开源,在华工学过计算机,在武测学过GIS,国家认证系统分析师,曾负责或参与中国科学院开放基金、国家基础测绘科技计划、国家自然科学基金、××市人防指挥地理信息系统、境界数据建库、地图网站等多个项目。因热心GIS技术传播而获得“CSDN地理信息专家”称号,虽然自己觉得离专家的差距还很大,但一直在努力,^-^。
suen的文章
原创 39 篇
翻译 5 篇
转载 41 篇
评论 65 篇
小粟的公告
终于完成GeoWeb开源社区(http://www.gisdev.cn)的搭建和初步测试,请大家注册用户,测试,并提出宝贵意见。
最近评论
douweibin:我也建了一个群 群号是 51824242 也做您的后备群用吧 呵呵
sparkwong3:#common22 发表于2008-08-07 15:54:58 IP: 119.40.19.*
不知道你注意到没有 百度地图其实用的是mapbar的图片引擎

对的
chenshengbj:你好!我想问一下,怎么用GDAL类库对栅格影像进行矢量化?GDAL提供矢量多边形的最小外包矩形的接口吗?我的邮箱是chenshengbj@163.com,希望给我好消息。我继续这几个功能。
xbt746:呵呵,为什么不用postgresql试试
xbt746:呵呵,为什么不用postgresql试试
文章分类
收藏
    相册
    我的照片
    GIS
    .NET开源GIS翻译WiKi
    GeoWeb开源社区
    GIS空间站
    GIS论坛
    中科院地理所
    国家测绘局
    我的旧BLOG归档
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 基于.NET 2.0的GIS开源项目SharpMap分析手记(七):GDAL C#接口库的编译与SharpMap(Change Set 21021)对影像的支持研究收藏

    新一篇: 基于.NET 2.0的GIS开源项目SharpMap分析手记(八):怎样对SharpMap进行扩展开发——从许可角度来谈 | 旧一篇: GOOGLE地球浏览器分析(四):基于Servlet的Google Earth之旅

     

    基于.NET 2.0GIS开源项目SharpMap分析手记(七):GDAL C#接口库的编译与SharpMapChange Set 21021)对影像的支持研究

    粟卫民 http://www.gisdev.cn/ http://blog.csdn.net/suen/ 日期:2007-5-22

    保留所有版权。如需转载,请在醒目位置注明出处

     

    411日发布的SharpMapChange Set 21021)源代码中,增加了对GEOTIFF等影像的支持,它是利用GDAL开源库来实现这一支持的。由于是Change Set版本,此源代码的编译和使用存在不少问题,应广大开源爱好者的要求,同时在他们的无私帮助下,我最终完成了一个同时支持矢量数据和影像的可编译运行的版本,当然还是存在不少问题,希望大家给我提出来。

    1 GDAL C#接口库的编译

    GDAL是一个操作各种栅格地理数据格式的库。包括读取、写入、转换、处理各种栅格数据格式(有些特定的格式对写入等不支持)。它跨平台,开源,功能强大,连大名鼎鼎的GOOGLE EARTH都使用它。在青岛糨糊特别是青岛村里的月光的帮助下,我成功地编译好了GDAL C#接口库(还有小小问题,不影响使用),下面是编译步骤:

    1)下载GDAL1.4.1,下面是下载地址:

    http://download.osgeo.org/gdal/gdal-1.4.1.tar.gz

    2)直接在.Net2005命令行下运行nmake E:\download\gdal141\gdal-1.4.1\makefile.vc

    文件换成你自己的路径就可以了;

    3)在.Net下使用这个库还要编译\swig\csharpmakefile.vc,然后这个目录下会生成8dll

    4)编译完成swig\csharp后生成的dll名字需要改一下,gdal_gdal_wrap.dll改成gdal_wrap.dll,因为程序中用到ImportDll时名字没有最前面的gdal_编译的时候可能默认配置文件问题都多加了这几个字母;

    5)编译完成swig\csharpdll是可以直接用的,随便拷贝到别的机器上都可以用,只需要机器安装.Net2005运行时。

    2 SharpMap读取及显示影像过程分析

    SharpMapChange Set 21021)中新增了一个DemoWinForm工程,此工程可以读取和显示矢量图层,我对其进行了扩展,使它能够读取和显示栅格图层。下面详细分析下读取和显示栅格图层的过程。

    2.1 点击工具条“AddLayer”按钮

    它的消息响应函数是:

    BeginInvoke((MethodInvoker)delegate() { loadLayer(); });

    这是对loadLayer()函数的异步调用,如果对BeginInvoke有疑问请参见利用辅助线程更新用户界面UI

    2.2 loadLayer()函数

    此函数采用工厂方法模式(Factory Method)来创建图层,如果对工厂方法模式不太熟悉的可参见“.NET设计模式(5):工厂方法模式(Factory Method”。DemoWinForm工程中采用Dictionary<string, ILayerFactory> _layerFactoryCatalog来储存GIS数据文件扩展名及其相应的ILayerFactory,并利用TryGetValue方法来得到某扩展名相应的ILayerFactory。最后调用ILayerFactoryCreate方法创建相应图层并使用addLayer函数来增加图层到地图。

    2.3 GdalRasterLayerFactory

    Create函数如下:

       GdalRasterLayer gdalRasterLayer = new GdalRasterLayer(layerName, connectionInfo);

       return gdalRasterLayer;

    2.4 GdalRasterLayer

    GdalRasterLayer类属于SharpMap.Extensions工程,它的构建函数中使用了GDAL库,构建函数代码如下:

    /// <summary>

    /// initialize a Gdal based raster layer

    /// </summary>

    /// <param name="strLayerName">Name of layer</param>

    /// <param name="imageFilename">location of image</param>

    public GdalRasterLayer(string strLayerName, string imageFilename)

    {

         this.LayerName = strLayerName;

         this.Filename = imageFilename;

         disposed = false;

     

         OSGeo.GDAL.gdal.AllRegister();

         try

         {

                         _GdalDataset = OSGeo.GDAL.gdal.Open(_Filename, OSGeo.GDAL.gdalconst.GA_ReadOnly);

                         imagesize = new Size(_GdalDataset.RasterXSize, _GdalDataset.RasterYSize);

                   

                         _Envelope = this.GetExtent();

          }

          catch (Exception ex) {

              _GdalDataset = null;

              throw new Exception("Couldn't load dataset. " + ex.Message + ex.InnerException);

          }

     }

     

    显示函数代码如下:

    /// <summary>

    /// Renders the layer

    /// </summary>

    /// <param name="g">Graphics object reference</param>

    /// <param name="map">Map which is rendered</param>

    public override void Render(Graphics g, Map map)

    {

         if (disposed)

              throw (new ApplicationException("Error: An attempt was made to render a disposed layer"));

       

        //if (this.Envelope.Intersects(map.Envelope))

        //{

            this.GetPreview(_GdalDataset, map.Size, g, map.Envelope);

        //}

        base.Render(g, map);

    }

     

    附:

    DemoWinForm工程代码:

    http://www.gisdev.cn/test/downloads/DemoWinForm.rar

    示例图像文件:

    http://www.gisdev.cn/test/downloads/RasterData.rar

     

    发表于 @ 2007年05月22日 11:30:00|评论(loading...)|编辑

    新一篇: 基于.NET 2.0的GIS开源项目SharpMap分析手记(八):怎样对SharpMap进行扩展开发——从许可角度来谈 | 旧一篇: GOOGLE地球浏览器分析(四):基于Servlet的Google Earth之旅

    评论

    #metaza 发表于2007-05-22 15:03:44  IP: 60.21.17.*
    专有名词太多,对于我这样感兴趣又没有基础的有难度的..
    #心帆 发表于2007-05-28 11:08:25  IP: 222.88.38.*
    非常重要,一直想找一个.net下操作大图像的库,看来gdal是很好的东西,以后多研究一下
    #冰峰孤骑 发表于2007-07-12 16:53:34  IP: 202.96.19.*
    兄弟,我对如何编译成C#的DLL有点问题,能请教你吗?我的MSN是zbevimage@hotmail.com
    #chenshengbj 发表于2008-08-29 16:03:17  IP: 123.113.32.*
    你好!我想问一下,怎么用GDAL类库对栅格影像进行矢量化?GDAL提供矢量多边形的最小外包矩形的接口吗?我的邮箱是chenshengbj@163.com,希望给我好消息。我继续这几个功能。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 小粟