前几天需要写两个方法,一个是需要构建网络数据集NetowrkDataset
,一个是需要构建几何网络GeometricNetwork
;
代码在AE的帮助文档中都是有的;如果你找不到的话直接百度也是有的,不过建议有些基础的还是直接看文档比较好~如果不知道在哪,直接百度**
How to create geometric networks within a geodatabase**
ArcGIS Engine 10.1 EN
Win7 64位
VS2010
本文说说在写的过程中遇到的问题;首先这篇主要是介绍几何网络的构建,后面将会讲到网络数据集;
**下面的代码方法是直接从文档中拷贝过来我修改的,修改依据是在ArcCatalog中
在Dataset中右键新建几何网络的默认设置流程,所以下面的有些代码我会进行删改;**
我会在代码中直接加注释进行解释,重点内容还会在末尾解释!~
public void CreateGeometricNetwork(IWorkspace workspace, IFeatureDatasetName
featureDatasetName)//这里的参数不要告诉我你不会写代码得到~
{
// Create a network loader.//创建一个网络加载器
INetworkLoader2 networkLoader2 = new NetworkLoaderClass();
// Set the network name.//给加载器命名--此名称一定不能为中文!
networkLoader2.NetworkName = "Water_Net";
// Set the network type.//类型,效用网络就是几何网络
networkLoader2.NetworkType = esriNetworkType.esriNTUtilityNetwork;
// Set the containing feature dataset.//设置关联的数据集IName
networkLoader2.FeatureDatasetName = (IDatasetName)featureDatasetName;
//添加featureclass到网络中,这里的featureclassname一定不能是中文!!!
// Add the two classes to the network.
if (networkLoader2.CanUseFeatureClass("featureclassname") ==
esriNetworkLoaderFeatureClassCheck.esriNLFCCValid)
{
networkLoader2.AddFeatureClass("featureclassname",
esriFeatureType.esriFTComplexEdge, null, false);
}
//由于只有一个线图层,所以这个示例代码中的线图层就不用判断了
//if (networkLoader2.CanUseFeatureClass("Tanks") == esriNetworkLoaderFeatureClassCheck.esriNLFCCValid)
//{
//networkLoader2.AddFeatureClass("Tanks",esriFeatureType.esriFTSimpleJunction, null, false);
//}
// Set the enabled field for the distribmains class.//这个可以直接注释掉,也可以根据线图层做修改,这里直接注释
//INetworkLoaderProps networkLoaderProps = (INetworkLoaderProps)networkLoader2;
//String defaultEnabledFieldName = networkLoaderProps.DefaultEnabledField;
//esriNetworkLoaderFieldCheck enabledFieldCheck =
// networkLoader2.CheckEnabledDisabledField("Tanks", defaultEnabledFieldName);
//switch (enabledFieldCheck)
//{
// case esriNetworkLoaderFieldCheck.esriNLFCValid:
// case esriNetworkLoaderFieldCheck.esriNLFCNotFound:
// networkLoader2.PutEnabledDisabledFieldName("Tanks",
// defaultEnabledFieldName);
// break;
// default:
// Console.WriteLine(
// "The field {0} could not be used as an enabled/disabled field.",
// defaultEnabledFieldName);
// break;
//}
//networkLoader2.PreserveEnabledValues = true;
//这个是设置源和汇的,主要针对点图层,这里不需要就注释掉
// Set the ancillary role field for the tanks class.
//String defaultAncillaryRoleFieldName =
// networkLoaderProps.DefaultAncillaryRoleField;
//esriNetworkLoaderFieldCheck ancillaryRoleFieldCheck =
// networkLoader2.CheckAncillaryRoleField("Tanks",
// defaultAncillaryRoleFieldName);
//switch (ancillaryRoleFieldCheck)
//{
// case esriNetworkLoaderFieldCheck.esriNLFCValid:
// case esriNetworkLoaderFieldCheck.esriNLFCNotFound:
// networkLoader2.PutAncillaryRole("Tanks",
// esriNetworkClassAncillaryRole.esriNCARSourceSink,
// defaultAncillaryRoleFieldName);
// break;
// default:
// Console.WriteLine(
// "The field {0} could not be used as an ancillary role field.",
// defaultAncillaryRoleFieldName);
// break;
//}
//这里针对的是GDB,不是SDE,所以也注释掉
// If the geodatabase is an SDE GDB, set the configuration keyword.
//if (workspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
//{
// networkLoader2.ConfigurationKeyword = "Network_Defaults";
//}
//这里我们不设置Snap
// Set the snap tolerance for the network.
//networkLoader2.SnapTolerance = networkLoader2.MinSnapTolerance;
((INetworkLoader3)networkLoader2).UseXYsForSnapping = false;
//不设置权重
//// Add a weight with a double type to the network.
//networkLoader2.AddWeight("MainWeight", esriWeightType.esriWTDouble, 0);
//// For weights of type esriWTBitGate, the BitGateSize parameter should be set:
//networkLoader2.AddWeight("WTBitGateEx", esriWeightType.esriWTBitGate, 5);
//// Associate the MainWeight weight with the DIAMETER field of Distribmains.
//networkLoader2.AddWeightAssociation("MainWeight", "Distribmains", "DIAMETER");
//构建几何网络
// Load the network.
networkLoader2.LoadNetwork();
//不管ErrorTable
// Get the name of the network's error table.
//String errorTableName = networkLoader2.ErrorTableName;
//// Display the number of invalid features in the Distribmains class.
//int numInvalidFeatures = networkLoader2.get_NumInvalidFeatures("Distribmains")
// ;
//Console.WriteLine("Distribmains contains {0} invalid features.",
// numInvalidFeatures);
//// Display the number of invalid features in the network.
//int totalNumInvalidFeatures = networkLoader2.TotalNumInvalidFeatures;
//Console.WriteLine("The network contains {0} invalid features.",
// totalNumInvalidFeatures);
}
上面的代码除了//networkLoader2.PreserveEnabledValues = true;
其他我是根据全部默认设置进行修改的,大家有其他需求可以自己修改;
尤其需要大家注意的是两个地方,一个是NetworkName
这个属性,就是网络数据集的名称一定不能为中文;另一个就是我们需要创建网络数据集的featureclass的名称;二者如果有一个存在中文,那么在最后构建几何网络的时候都会出现各种乱七八糟的异常;包括The Table was not found
、此版本的地理数据库不支持表格附件。
等,异常信息主要是看你的ArcGIS是中文还是英文了~!