zoukankan      html  css  js  c++  java
  • 加载矢量数据的代码优化

    深入来看,依据ESRI公司数据浏览架构,数据打开需要经历以下流程

    首先利用新建工作空间工厂的方法打开工作空间;然后强制转换为要素工作空间或者栅格工作空间;最后使用要素工作空间或者栅格工作空间的方法打开(要素/矢量或栅格)数据。

    对于ShapeFile来说,工作空间就是它所在的文件夹,打开工作空间需要使用对应的工作空间工厂,即ShapeFileWorkspaceFactoryClass,然后调用IWorkspaceFactory的OpenFromFile方法,就可以得到一个工作空间,这也是设计模式中工厂方法的体现。工作空间工厂的打开方法返回的是一般意义的工作空间,根据具体数据还需要进行接口转换。因为ShapeFile是矢量数据,所以把工作空间接口跳转到IFeatureWorkspace,从而读取其中的要素类。

    这一点对于多种格式的数据(如Coverage、GeoDatabase、ArcSDE数据格式)都是一样。

    对比代码:

    最简单的ArcGIS Engine应用程序(上)

    private void menuAddShp_Click(object sender, EventArgs e)
    {
        IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
        IWorkspace pWorkspace1 = pWorkspaceFactory.OpenFromFile(@"D:data", 0);
        IFeatureWorkspace pFeatureWorkspce = pWorkspace1 as IFeatureWorkspace;
        IFeatureClass pFC = pFeatureWorkspce.OpenFeatureClass("华东地区.shp");
        IFeatureLayer pFLayer = new FeatureLayerClass();
        pFLayer.FeatureClass = pFC;
        pFLayer.Name = pFC.AliasName;
        ILayer pLayer = pFLayer as ILayer;
        IMap pMap = axMapControl1.Map;
        pMap.AddLayer(pLayer);
        axMapControl1.ActiveView.Refresh();
    }

    介绍ArcGIS中各种数据的打开方法——shp(矢量文件)

    private void addShapeFile2()
    {
        ... //省略
        IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
        IFeatureWorkspace pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(filePath,0) as IFeatureWorkspace;
        IFeatureLayer pFLayer = new FeatureLayerClass();
        pFLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(fileName);
        pFLayer.Name = pFLayer.FeatureClass.AliasName;
        this.axMapControl1.AddLayer(pFLayer as ILayer);
        this.axMapControl1.Refresh();
    }

    第二处的代码明显要少于第一处的代码,但是在理解上第一处的代码更加容易让人读。(所以需要结合一下)

    经过测试

    1、

    IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();

    可以写为(推荐使用):

    IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();

    2、

    (推荐使用)

    IWorkspace pWorkspace1 = pWorkspaceFactory.OpenFromFile(@"D:data", 0);
    IFeatureWorkspace pFeatureWorkspce = pWorkspace1 as IFeatureWorkspace;

    可以写为:

    IFeatureWorkspace pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(@"D:data", 0)  as IFeatureWorkspace;

    3、

    相同

    IFeatureLayer pFLayer = new FeatureLayerClass();

    4、

    (推荐使用)

    IFeatureClass pFC = pFeatureWorkspce.OpenFeatureClass("华东地区.shp");
    pFLayer.FeatureClass = pFC;

    可以写为:

    pFLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(fileName); 

    5、

    (推荐使用)

    pFLayer.Name = pFC.AliasName;

    可以写为:

    pFLayer.Name = pFLayer.FeatureClass.AliasName;

    5、

    ILayer pLayer = pFLayer as ILayer;
    IMap pMap = axMapControl1.Map;
    pMap.AddLayer(pLayer);

    可以写为:

    this.axMapControl1.AddLayer(pFLayer as ILayer);

    或者可以写为(推荐使用)

    this.axMapControl1.AddLayer(pFLayer);

    7、

    axMapControl1.ActiveView.Refresh();

    可以写为(推荐使用)

    this.axMapControl1.Refresh();

    像其他数据的加载基本上都是大同小异的,以下列出的是加载矢量数据的代码。

    个人推荐使用的总结代码:

    IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
    IWorkspace pWorkspace1 = pWorkspaceFactory.OpenFromFile(@"D:data", 0); 
    IFeatureWorkspace pFeatureWorkspce = pWorkspace1 as IFeatureWorkspace;
    IFeatureClass pFC = pFeatureWorkspce.OpenFeatureClass("华东地区.shp");
    IFeatureLayer pFLayer = new FeatureLayerClass();
    pFLayer.FeatureClass = pFC;
    pFLayer.Name = pFC.AliasName;
    this.axMapControl1.AddLayer(pFLayer);
    this.axMapControl1.Refresh();

    图解代码:

    谢谢观看!本人初学GIS二次开发,如果有不对的地方,请多多包涵!

  • 相关阅读:
    Mac系统访问Windows共享文件的详细步骤
    登录名 '***' 拥有一个或多个数据库。在删除该登录名之前,请更改相应数据库的所有者。 (Microsoft SQL Server,错误: 15174)
    窗口中文乱码,永久解决方法
    Delphi 快捷键列表
    Delphi代码规范
    hpwin10重置系统
    记:lr请求响应中文乱码转码方法!
    VMware NAT和桥接
    记:grafana不展示仪表盘数据解决方法
    性能的几个常见指标
  • 原文地址:https://www.cnblogs.com/edcoder/p/11722420.html
Copyright © 2011-2022 走看看