创建网络数据集就得有各种数据和参数,这篇文章很长,慎入。

网络分析依赖于网络数据集的质量,这句话就在这里得到了验证:复杂、精确定义。

本节目录如下:

  • 1. INetworkDataset与IDENetworkDataset对比
  • 1.1 什么是INetworkDataset
  • 1.2 两者对比
  • 2. 如何设置数据元素网络数据集(IDENetworkDataset)的属性以创建网络数据集
  • 2.1 涉及的接口、类、枚举
  • 2.2 创建数据元素网络数据集(IDENetworkDataset)对象
  • 2.3 添加网络源
  • 2.4 添加网络属性
  • 2.5 添加导航/方向
  • 2.6 为数据元素网络数据集赋值并构建网络数据集(INetworkDataset)

 

挑简单的先说,INetworkDataset与IDENetworkDataset的对比。

1.1 先说说INetworkDataset是个什么东西

网络数据集是一个拥有网络关系的要素类的容器。每个要素类都有自己的拓扑规则,每个网络有可能有多个同样拓扑规则的要素类。一个要素数据集可能有多个网络数据集,但是一个要素类只能属于一个网络数据集或一个几何网络。一个属于网络数据集的要素类被称为:网络数据源,网络数据集还拥有多个网络属性,这些属性被用作解决网络分析问题。

IDatasetContainer2接口用于创建或打开网络数据集。INetworkBuild接口用作添加或删除一个网络数据集中的网络数据源、网络属性,或者被用于构建网络数据集。

再上一张INetworkDataset的属性图:

ArcGIS 网络分析[8.3] 设置IDENetworkDataset的属性及INetworkDataset的对比/创建网络数据集

这些属性全部都是只允许访问的(都是get属性)。

INetworkDataset更合适在分析部分解释,它与INAContext有关。

1.2 二者对比

很容易与上一节的IDENetworkDataset做出对比,INetworkDataset更专注于处理与属性、数据源的存取,而IDENetworkDataset更专注于数据的组织。

后者是数据的集合,是真正的网络数据源、网络属性等的容器,而前者更合适称为“分析对象”,它专注于网络属性和网络数据源的访问。

因为后者名中的“DE”就是DataElement的简称,所以IDENetworkDataset是“数据元素网络数据集”。

2. 如何设置数据元素网络数据集(IDENetworkDataset)的属性以创建网络数据集

再贴一张IDENetworkDataset的属性图(就上篇文章):

 ArcGIS 网络分析[8.3] 设置IDENetworkDataset的属性及INetworkDataset的对比/创建网络数据集

重点需要设置的属性是:Attributes、Directions、Sources

这对应了桌面创建网络数据集的三个重要步骤:网络属性、导航设置、网络数据源。

其中网络数据源又可分为三种:线要素、点要素、转弯要素。

其他需要注意的属性是:Buildable;

2.1 涉及的接口、类、枚举

 

在接下来的介绍中,会用到的核心接口和类、枚举先列出:

涉及的接口:共计18个

IDENetworkDataset、INetworkDataset、INetworkSource、INetworkAttribute、INetworkDirection、IEvaluatedNetworkAttribute、

INetworkSourceDirections、IStreetNameFields、IEdgeFeatureSource、INetworkFieldEvaluator、INetworkEvaluator、INetworkConstantEvaluator

IArray

INetworkBuild、IDEDataset、IDatasetContainer、IFeatureDatasetExtension、IFeatureDatasetExtensionContainer

涉及到的类:共计9个

DENetworkDatasetClass、StreetNameFieldsClass、NetworkSourceDirectionsClass

TurnFeatureSourceClass、EdgeFeatureSourceClass(INetworkSource的实现类)

EvaluatedNetworkAttributeClass、NetworkFieldEvaluatorClass、NetworkConstantEvaluatorClass

ArrayClass

涉及到的枚举:共计6个

esriNetworkElementType、esriNetworkAttributeUnits、esriNetworkEdgeDirection、esriNetworkAttributeDataType、esriNetworkAttributeUsageType、esriNetworkEdgeConnectivityPolicy

别害怕,我会逐一解释这些类对应桌面创建网络数据集时,分别是什么。

2.2 创建一个IDENetworkDataset对象

为了创建一个装着网络数据集所有素材的“数据元素网络数据集”,我们需要的东西是:一个IFeatureDataset(即桌面上的要素数据集)对象,网络数据集的名称。

我们创建一个这样的方法:

public IDENetworkDataset CreateDENetworkDataset(IFeatureDataset featureDataset, string networkName)
{
    IDENetworkDataset deNetworkDataset = new DENetworkDatasetClass();
// ...设置数据要素网络数据集的必须参数

return deNetworkDataset;
}

注意,这个时候并不需要这个要素数据集中有要素数据。而在桌面软件中基于要素数据集创建网络数据集,是要求要素数据集中存在最基本的点线要素的。

那是因为,在AO中,要创建数据元素网络数据集,只需要获取IFeatureDataset即可,至于网络数据集中的点、线、转弯,则是下一步添加Sources(网络数据源)的事情。

我直接给出数据元素网络数据集必须设置的属性,和分别来自哪些接口:

ArcGIS 网络分析[8.3] 设置IDENetworkDataset的属性及INetworkDataset的对比/创建网络数据集

从上图可以看出为了创建DENetworkDataset这个类的实例,默认使用IDENetworkDataset接口来定义变量。

需要给的默认属性有:

IDENetworkDataset接口下的Buildable属性、NetworkType属性

IDEGeoDataset接口下的Extent属性、SpatialReference属性

IDataElement接口下的Name属性

其中,Buildable设置为true,表示可以构建;

NetworkType设置为枚举值esriNetworkDatasetType.esriNDTGeodatabase,表示是基于数据库的网络数据集;

Extent和SpatialReference属性表示网络数据集的地理外接矩形和空间参考系,可以从传入的要素数据集的父级接口IGeoDataset中获取。

Name表示网络数据集的名称,由传入参数给定。

完整的方法如下:

/// <summary>
/// 创建IDENetworkDataset(数据元素网络数据集)对象
/// </summary>
/// <param name="featureDataset">传入:要素数据集</param>
/// <param name="NetworkName">传入:网络数据集名称</param>
/// <returns>返回:数据元素网络数据集</returns>
public IDENetworkDataset CreateDENetworkDataset(IFeatureDataset featureDataset, string NetworkName)
{
    //判断传入参数是否为空
    if (string.IsNullOrEmpty(NetworkName) || null == featureDataset)
    {
        return null;
    }

    // 若传入参数不为空,实例化数据元素网络数据集对象
    IDENetworkDataset deNetworkDataset = new DENetworkDatasetClass();
    // 设置数据集类型、可以被构建
    deNetworkDataset.Buildable = true;
    deNetworkDataset.NetworkType = esriNetworkDatasetType.esriNDTGeodatabase;

    // 设置数据集的空间参考、空间范围
    IDEGeoDataset deGeoDataset = deNetworkDataset as IDEGeoDataset;
    IGeoDataset geoDataset = featureDataset as IGeoDataset;
    deGeoDataset.Extent = geoDataset.Extent;
    deGeoDataset.SpatialReference = geoDataset.SpatialReference;

    // 设置名称
    IDataElement dataElement = deNetworkDataset as IDataElement;
    dataElement.Name = NetworkName;

    return deNetworkDataset;
}
创建IDENetworkDataset(数据元素网络数据集)对象

相关文章:

  • 2021-12-26
  • 2022-01-01
  • 2022-02-18
  • 2022-02-01
  • 2022-12-23
  • 2021-10-21
  • 2022-02-07
  • 2022-12-23
猜你喜欢
  • 2021-05-28
  • 2021-12-14
  • 2022-01-03
  • 2021-10-10
  • 2022-02-07
  • 2022-02-08
相关资源
相似解决方案