慢慢来^_^*

导航

arc-gis网络分析代码

备份~~

 

        const string MEMORY_WORKSPACE = "WorkSpace_Data";
        const string LAYER_NAME = "Deports Layer";

        public static INALayer CreateRouteLayer(string mxdFileName, List<VO.Stop> stops)
        {

            INetworkDataset networkDataset = GetNetworkDataSet(mxdFileName);
            IFieldsEdit fieldEditor = new FieldsClass();
            //Create Layer in memory
            IFeatureLayer featureLayer = CreateLayerInMomeoy(MEMORY_WORKSPACE, LAYER_NAME, esriGeometryType.esriGeometryPoint, fieldEditor);
            IFeatureClass featureClass = featureLayer.FeatureClass;

            //insert deport points into memory layer
            IWorkspaceEdit workspaceEdit = ((IDataset)featureClass).Workspace as IWorkspaceEdit;
            workspaceEdit.StartEditing(false);
            workspaceEdit.StartEditOperation();
            IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
            IFeatureCursor featureCursor = featureClass.Insert(true);

            foreach (XmlRoute.VO.Stop stop in stops)
            {
                IPoint point = new PointClass();
                point.X = stop.X;
                point.Y = stop.Y;
                featureBuffer.Shape = point;
                featureCursor.InsertFeature(featureBuffer);
                System.Diagnostics.Debug.WriteLine(stop.X.ToString() + "," + stop.Y.ToString());
            }
            featureCursor.Flush();
            workspaceEdit.StopEditOperation();
            workspaceEdit.StopEditing(true);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);

            //Solve
            INAContext naContext = null;
            IGPMessages gpMessage = null;

            naContext = CreateSolverContext(networkDataset);
            LoadNANetworkLocations(ref naContext,"Stops", featureClass, 1000);
            SetSolverSettings(ref naContext,XmlRoute.Properties.Settings.Default.LengthField, false);

            gpMessage = (IGPMessages)(new GPMessagesClass());

            if (naContext.Solver.Solve(naContext, gpMessage, null))
            {

            }
            INALayer naLayer = naContext.Solver.CreateLayer(naContext);
            return naLayer;
        }
        private static INetworkDataset GetNetworkDataSet(string mxdFileName)
        {
            //Open the mxd file and get the network dataset
            IMapDocument pMapDocument = new MapDocumentClass();
            pMapDocument.Open(mxdFileName, "");
            INetworkDataset networkDataset = null;

            //iterate all the maps
            for (int cMap = 0; cMap < pMapDocument.MapCount; cMap++)
            {
                for (int cLayer = 0; cLayer < pMapDocument.get_Map(cMap).LayerCount; cLayer++)
                {
                    ILayer pLayer = pMapDocument.get_Map(cMap).get_Layer(cLayer);
                    //NA Layer
                    if (pLayer is INALayer)
                    {
                        INALayer pNALayer = pLayer as INALayer;
                        networkDataset = pNALayer.Context.NetworkDataset;
                        break;
                    }
                    //Composite Layer
                    if (pLayer is IGroupLayer)
                    {
                        ICompositeLayer pCompositeLayer = pLayer as ICompositeLayer;
                        for (int cContainLayer = 0; cContainLayer < pCompositeLayer.Count; cContainLayer++)
                        {
                            if (pCompositeLayer.get_Layer(cContainLayer) is INALayer)
                            {
                                INALayer pNALayer = pCompositeLayer.get_Layer(cContainLayer) as INALayer;
                                networkDataset = pNALayer.Context.NetworkDataset;
                                break;
                            }
                        }
                    }
                }
            }

            //Close the MXD Document
            pMapDocument.Close();
            ////judge get the net work data set or not
            if (networkDataset == null)
            {
                Exception ex = new Exception();
                ex.Data.Add(0, "无法打开网络数据集!");
                throw ex;
            }
            return networkDataset;
        }

        public static IFeatureLayer CreateLayerInMomeoy(string wsName, string layerName, esriGeometryType shapeType, IFieldsEdit allFields)
        {
            IWorkspaceName workspaceName = null;
            IWorkspaceFactory workspaceFactory = null;
            IFeatureWorkspace workspace = null;
            IFeatureClass featureClass = null;
            IFeatureLayer featureLayer = null;
            IFieldEdit fieldEdit = null;
            IGeometryDefEdit geometryDefEdit = null;
            ISpatialReference spatialRef = null;

            //Add Shapes Fields
            fieldEdit = new FieldClass();
            fieldEdit.Name_2 = "Shape";
            fieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
            fieldEdit.IsNullable_2 = true;
            fieldEdit.Required_2 = true;
            geometryDefEdit = new GeometryDefClass();
            geometryDefEdit.GeometryType_2 = shapeType;
            spatialRef = new UnknownCoordinateSystemClass();
            spatialRef.SetDomain(-180, 180, -180, 180);
            geometryDefEdit.SpatialReference_2 = spatialRef;
            fieldEdit.GeometryDef_2 = geometryDefEdit;
            allFields.AddField(fieldEdit);

            //Create memory layer
            workspaceFactory = new InMemoryWorkspaceFactoryClass();
            workspaceName = workspaceFactory.Create("", wsName, null, 0);
            workspace = ((IName)workspaceName).Open() as IFeatureWorkspace;
            featureClass = workspace.CreateFeatureClass(layerName, allFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
            featureLayer = new FeatureLayerClass();
            featureLayer.Name = layerName;
            featureLayer.FeatureClass = featureClass;

            return featureLayer;
        }

        public static void SetSolverSettings(ref INAContext naContext, string metersName, bool oneWay)
        {
            INASolver naSolver = naContext.Solver;
            INARouteSolver naRouteSolver = (INARouteSolver)naSolver;
            INASolverSettings solverSettings = null;
            IStringArray restrictions = null;
            INAAgent naAgent = null;

            naRouteSolver.OutputLines = esriNAOutputLineType.esriNAOutputLineTrueShapeWithMeasure;
            naRouteSolver.CreateTraversalResult = true;
            naRouteSolver.UseTimeWindows = false;
            naRouteSolver.FindBestSequence = false;
            naRouteSolver.PreserveFirstStop = true;
            naRouteSolver.PreserveLastStop = true;

            solverSettings = (INASolverSettings)naSolver;
            solverSettings.ImpedanceAttributeName = metersName;
            IStringArray accumulateAttributeNames = solverSettings.AccumulateAttributeNames;
            accumulateAttributeNames.Add(metersName);
            solverSettings.AccumulateAttributeNames = accumulateAttributeNames;
            solverSettings.IgnoreInvalidLocations = true;

            restrictions = solverSettings.RestrictionAttributeNames;
            restrictions.RemoveAll();

            if (oneWay)
                restrictions.Add("OneWay");

            solverSettings.RestrictionAttributeNames = restrictions;

            solverSettings.RestrictUTurns = esriNetworkForwardStarBacktrack.esriNFSBNoBacktrack;

            solverSettings.UseHierarchy = false;

            naSolver.UpdateContext(naContext, GetDENetworkDataset(naContext.NetworkDataset), null);

            naAgent = (INAAgent)naContext.Agents.get_ItemByName("StreetDirectionsAgent");
            naAgent.OnContextUpdated();
        }

        public static INAContext CreateSolverContext(INetworkDataset networkDataset)
        {
            IDENetworkDataset deNetworkDataset = null;
            INASolver naSolver = null;
            INAContextEdit naContextEdit = null;
            IGPMessages gpMsg = null;

            deNetworkDataset = GetDENetworkDataset(networkDataset);
            naSolver = new NARouteSolver();
            naContextEdit = (INAContextEdit)(naSolver.CreateContext(deNetworkDataset, "Route"));
            gpMsg = new GPMessagesClass();
            naContextEdit.Bind(networkDataset, gpMsg);

            return (INAContext)naContextEdit;
        }

        public static IDENetworkDataset GetDENetworkDataset(INetworkDataset networkDataset)
        {
            IDatasetComponent datasetComponent = null;
            datasetComponent = (IDatasetComponent)networkDataset;

            ///Get the Data Element
            IDENetworkDataset dataset = null;
            dataset = (IDENetworkDataset)datasetComponent.DataElement;
            return dataset;
        }

        public static void LoadNANetworkLocations(ref INAContext naContext, string naClassName, IFeatureClass inputFeatureClass, double snapTolerance)
        {
            INamedSet naClasses = null;
            INAClass naClass = null;
            INAClassLoader naLoader = null;
            INAClassFieldMap fieldMap = null;
            int rowsIn = 0;
            int rowsLocated = 0;

            naClasses = naContext.NAClasses;
            naClass = (INAClass)(naClasses.get_ItemByName(naClassName));

            naClass.DeleteAllRows();

            naLoader = new NAClassLoaderClass();
            naLoader.Locator = naContext.Locator;
            if (snapTolerance > 0)
            {
                naLoader.Locator.SnapTolerance = snapTolerance;
            }
            naLoader.NAClass = naClass;
            fieldMap = new NAClassFieldMapClass();
            fieldMap.CreateMapping(naClass.ClassDefinition, inputFeatureClass.Fields);
            naLoader.FieldMap = fieldMap;
            naLoader.Load((ICursor)(inputFeatureClass.Search(null, true)), null, ref rowsIn, ref rowsLocated);
            System.Diagnostics.Debug.WriteLine(rowsIn.ToString() + "," + rowsLocated.ToString());
        }
    }

posted on 2009-03-18 23:37  ^_^*  阅读(1071)  评论(0编辑  收藏  举报