创建网络数据集

/// <summary>
/// 创建自定义网络数据集
/// </summary>
/// <param name="_pWsName"></param>
/// <param name="_pDatasetName"></param>
/// <param name="_pNetName"></param>
/// <param name="_pFtName"></param>

void CreateNetworkDataset(string _pWsName, string _pDatasetName,string _pNetName, string _pFtName)
{
  IDENetworkDataset pDENetworkDataset = new DENetworkDatasetClass();
  pDENetworkDataset.Buildable = true;
  IWorkspace pWs = GetWorkspace(_pWsName);
  IFeatureWorkspace pFtWs = pWs as IFeatureWorkspace;
  IFeatureDataset pFtDataset = pFtWs.OpenFeatureDataset(_pDatasetName);

  // 定义空间参考,负责会出错
  IDEGeoDataset pDEGeoDataset = (IDEGeoDataset)pDENetworkDataset;

  IGeoDataset pGeoDataset = pFtDataset as IGeoDataset;
  pDEGeoDataset.Extent = pGeoDataset.Extent;
  pDEGeoDataset.SpatialReference = pGeoDataset.SpatialReference;

  // 网络数据集的名称
  IDataElement pDataElement = (IDataElement)pDENetworkDataset;
  pDataElement.Name = _pNetName;

  // 参加建立网络数据集的要素类
  INetworkSource pEdgeNetworkSource = new EdgeFeatureSourceClass();
  pEdgeNetworkSource.Name = _pFtName;
  pEdgeNetworkSource.ElementType = esriNetworkElementType.esriNETEdge;

  // 要素类的连通性
  IEdgeFeatureSource pEdgeFeatureSource = (IEdgeFeatureSource)pEdgeNetworkSource;
  pEdgeFeatureSource.UsesSubtypes = false;
  pEdgeFeatureSource.ClassConnectivityGroup = 1;

  pEdgeFeatureSource.ClassConnectivityPolicy =esriNetworkEdgeConnectivityPolicy.esriNECPEndVertex;

  //不用转弯数据
  pDENetworkDataset.SupportsTurns = false;
  IArray pSourceArray = new ArrayClass();
  pSourceArray.Add(pEdgeNetworkSource);
  pDENetworkDataset.Sources = pSourceArray;

  //网络数据集的属性设置

  IArray pAttributeArray = new ArrayClass();

  // Initialize variables reused when creating attributes:
  IEvaluatedNetworkAttribute pEvalNetAttr;
  INetworkAttribute2 pNetAttr2;
  INetworkFieldEvaluator pNetFieldEval;
  INetworkConstantEvaluator pNetConstEval;

  pEvalNetAttr = new EvaluatedNetworkAttributeClass();
  pNetAttr2 = (INetworkAttribute2)pEvalNetAttr;
  pNetAttr2.Name ="Meters";
  pNetAttr2.UsageType = esriNetworkAttributeUsageType.esriNAUTCost;
  pNetAttr2.DataType = esriNetworkAttributeDataType.esriNADTDouble;
  pNetAttr2.Units = esriNetworkAttributeUnits.esriNAUMeters;
  pNetAttr2.UseByDefault = false;

  pNetFieldEval = new NetworkFieldEvaluatorClass();
  pNetFieldEval.Setexpression_r("[METERS]", "");
  //方向设置
  pEvalNetAttr.set_Evaluator(pEdgeNetworkSource,esriNetworkEdgeDirection.esriNEDAlongDigitized, (INetworkEvaluator)pNetFieldEval);
  pEvalNetAttr.set_Evaluator(pEdgeNetworkSource,esriNetworkEdgeDirection.esriNEDAgainstDigitized, (INetworkEvaluator)pNetFieldEval);

  pNetConstEval = new NetworkConstantEvaluatorClass();
  pNetConstEval.ConstantValue = 0;
  pEvalNetAttr.set_DefaultEvaluator(esriNetworkElementType.esriNETEdge,(INetworkEvaluator)pNetConstEval);
  pEvalNetAttr.set_DefaultEvaluator(esriNetworkElementType.esriNETJunction,(INetworkEvaluator)pNetConstEval);
  pEvalNetAttr.set_DefaultEvaluator(esriNetworkElementType.esriNETTurn,(INetworkEvaluator)pNetConstEval);

  // 一个网络数据集可以有多个属性,我只添加了一个
  pAttributeArray.Add(pEvalNetAttr);
  pDENetworkDataset.Attributes = pAttributeArray;

  // 创建网络数据集,注意在创建几何网络的时候会锁定相应的要素类,因此不要用ArcMap或者catalog等打开参相应的数据
  INetworkDataset pNetworkDataset = Create(pFtDataset, pDENetworkDataset);

  //建立网络
  INetworkBuild pNetworkBuild = (INetworkBuild)pNetworkDataset;
  pNetworkBuild.BuildNetwork(pGeoDataset.Extent);
}

/// <summary>
/// 创建无向网络
/// </summary>
/// <param name="_pFeatureDataset"></param>
/// <param name="_pDENetDataset"></param>
/// <returns></returns>
public INetworkDataset Create(IFeatureDataset _pFeatureDataset, IDENetworkDataset2  _pDENetDataset)
{
      IFeatureDatasetExtensionContainer pFeatureDatasetExtensionContainer = (IFeatureDatasetExtensionContainer) _pFeatureDataset;
      IFeatureDatasetExtension pFeatureDatasetExtension = pFeatureDatasetExtensionContainer.FindExtension (esriDatasetType.esriDTNetworkDataset);
      IDatasetContainer2 pDatasetContainer2 = (IDatasetContainer2)pFeatureDatasetExtension;
      IDEDataset pDENetDataset = (IDEDataset)_pDENetDataset;
      INetworkDataset pNetworkDataset = (INetworkDataset)pDatasetContainer2.CreateDataset(pDENetDataset);
   return pNetworkDataset

}

时间: 2024-08-26 08:55:48

创建网络数据集的相关文章

ArcGIS 网络分析[8.2] 资料2 使用IDatasetContainer2接口的CreateDataset方法创建网络数据集

上节提及如何使用IDatasetContainer2接口访问到网络数据集,上例可以封装为一个方法. 这节就使用IDatasetContainer2接口(Geodatabase类库)的CreateDataset()方法创建网络数据集. 涉及到的接口(全在Geodatabase类库中) IDatasetContainer2.IDataset.INetworkDataset.IDEDataset.IDENetworkDataset4(重点) 涉及到的枚举类型(全在Geodatabase类库中) esr

ArcGIS 网络分析[8.1] 资料1 使用AO打开或创建网络数据集之【打开】

为了创建或打开一个网络数据集,你必须使用NetworkDatasetFDExtension对象(文件地理数据库中的数据集)或NetworkDatasetWorkspaceExtension对象(对于Shp文件组成的网络数据集). 当你拥有了合适的对象后,就可以使用IDatasetContainer2接口去创建或者打开网络数据集了. 如果当前打开的Map对象中有网络数据集图层,那么就可以通过访问INetworkLayer接口的NetworkDataset字段来访问网络图层中的网络数据集. IDat

ArcGIS 网络分析[1.5] 使用点线数据一起创建网络数据集(如何避免孤立点/点与线的连通性组合结果表)

ArcGIS中最基本的三种矢量数据是什么?点线面. 网络中除了路网之外,还会有地物点. 如上图,我们在建立网络数据集的时候,作为实验,当然可以只是公路网.但是在大型的决策任务中,网络数据集就不只是公路网那么简单了. 在城市与城市之间,有高速公路,国道,高铁,普铁,甚至还有水路. 如此复杂的网络模型是如何连通的呢?他们之间的交点又有什么样的连通方式呢?在这里,我仍然卖个关子,在以后的连通性一章,会详细说明.在文末,就会看到点作为网络数据集中十分强大而关键的一员出现,其意义是多连通组的时候,作为媒介

ArcGIS教程:创建网络数据集(三)

现在,默认情况下 Network Analyst 不会穿过 RestrictedTurns 要素类中的任何转弯要素.这是对要避开的违法转弯或危险转弯进行建模的好方法.街道源的赋值器为空,因此当使用 RestrictedTurns 进行限制时,这些街道源仍然是可穿过的. 单击确定返回新建网络数据集 向导. 右键单击 Hierarchy 行,然后选择默认情况下使用.蓝色符号将从属性中移除.这意味着使用此网络数据集创建分析图层时不会默认使用等级. 单击下一步. 单击是设置方向. 单击方向. 将打开网络

ArcGIS教程:创建网络数据集(一)

在本练习中,您将使用地理数据库 San Francisco 中的街道要素和转弯要素创建一个网络数据集.您还可以加入历史交通流量数据,以便求解取决于时间的路径. 创建网络数据集 步骤: 单击开始 > 所有程序 > ArcGIS > ArcCatalog 10.1 启动 ArcCatalog. 启用 ArcGIS Network Analyst 扩展模块. 单击自定义 > 扩展模块. 将打开扩展模块 对话框. 选中 Network Analyst. 单击关闭. 在标准工具 工具条上,单

ArcGIS教程:创建网络数据集(二)

此数据集带高程字段,因此请确保选择使用高程字段选项. 网络数据集中的高程设置进一步定义了连通性.为了帮助理解,假设两条边在 x 和 y 空间内端点重合,但高程不同(一个端点高于另一个).此外,假设连通性策略设置为端点.如果忽略高程,两条边相连.但如果考虑高程,它们就不相连. 构建高程模型的方式有两种:使用几何中的实际高程值或使用高程字段中的逻辑高程值. Streets 要素类具有整数形式的逻辑高程值,存储在 F_ELEV 和 T_ELEV 字段中.例如,如果两个重合端点的字段高程值为 1,则边会

ArcGIS 网络分析[4] 网络数据集深入浅出之连通性、网络数据集的属性及转弯要素

前面介绍完了如何创建网络数据集.如何使用网络分析功能,当然还有的读者会迷惑于一些更深层次的问题,比如网络数据集的连通性问题等. 因为不可能面面俱到,我只能挑重点来阐述,我觉得网络数据集的连通性.属性和转弯是初学者中比较头疼.想不通的问题,我就再以此为起点,较为深入的探讨这三方面的二三事. 连通性 网络数据集的属性 转弯问题

【AO笔记】有关使用AO基于shp文件创建网络数据集的一个细节

前些日子,和群友交流时提及shp文件创建单一网络数据集的创建问题. 由于项目需求,用shp文件创建网络合适,所以不得不去找一些古老的代码资料... 以前的研究中,创建网络数据集是根据IDatasetContainer2.CreateDataset()方法创建的,参数是一个IDEDataset对象,返回一个IDataset引用. IDatasetContainer2可以根据IFeatureDataset接口(若为地理数据库要素数据集创建网络)或IWorkspace接口(若为shp文件创建单一网络)

以Network Dataset(网络数据集)方式实现的最短路径分析

转自原文 以Network Dataset(网络数据集)方式实现的最短路径分析 构建网络有两种方式,分别是网络数据集NetworkDataset和几何网络Geometric Network,这个网络结构数据的创建直接在Catalog中实现创建,进行最短路径分析,为了直接使用ArcGIS提供的功能,我选用的是NetworkDataset,主要记录下考虑单双行的最短路径的设计与实现(理想状态,不考虑转弯等要素).(A)对数据编辑的要求有一下几点:(1) 添加属性字段,名称为Oneway,类型Text