ArcEngine新建几何网络_GeometricNetwork

来源:互联网 发布:引用,指针和数组的区别 编辑:程序博客网 时间:2024/05/22 13:04

前几天需要写两个方法,一个是需要构建网络数据集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是中文还是英文了~!

0 0