Ejemplo n.º 1
0
        /// <summary>
        /// 从指定路径(或连接字符串)中获取要素类
        /// <para>①shp路径:返回该shp存储的要素类;</para>
        /// <para>②mdb路径:返回该mdb数据库第一个要素类;</para>
        /// <para>③dwg路径:返回该dwg数据集第一个要素类;</para>
        /// <para>④shp目录:返回目录下第一个shp文件存储的要素类;</para>
        /// <para>⑤gdb目录:返回gdb数据库第一个要素类;</para>
        /// <para>⑥mdb文件路径[\DatasetName]\FeatureClassName:返回mdb数据库中指定名称或别名的要素类;</para>
        /// <para>⑦gdb目录[\DatasetName]\FeatureClassName:返回gdb数据库中指定名称或别名的要素类;</para>
        /// <para>⑧sde或oleDb或sql连接字符串:返回数据库中的第一个要素类;</para>
        /// </summary>
        /// <param name="connStrOrPath">路径或连接字符串</param>
        /// <param name="autoAddExtension">是否自动在路径末尾增加.shp/.mdb/.dwg后缀,以再次查找要素类</param>
        /// <returns></returns>
        public static IFeatureClass FromPath(string connStrOrPath, bool autoAddExtension = false)
        {
            if (WorkspaceEx.IsConnectionString(connStrOrPath))
            {
                return(FirstFromConnString(connStrOrPath));
            }

            if (Directory.Exists(connStrOrPath))
            {
                return(FirstFormDir(connStrOrPath));
            }

            if (File.Exists(connStrOrPath))
            {
                return(FirstFormFile(connStrOrPath));
            }

            var featureClass = FirstFromFullPath(connStrOrPath);

            if (autoAddExtension && featureClass == null)
            {
                foreach (var extension in new[] { ".shp", ".dwg", ".mdb" })
                {
                    if (File.Exists(connStrOrPath + extension))
                    {
                        return(FirstFormFile(connStrOrPath + extension));
                    }
                }
            }
            return(featureClass);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 获取指定shp文件存储的要素类
        /// </summary>
        /// <param name="shpPath"></param>
        /// <returns></returns>
        private static IFeatureClass FromShpFile(string shpPath)
        {
            var dir      = Path.GetDirectoryName(shpPath);
            var fileName = Path.GetFileNameWithoutExtension(shpPath);

            return(WorkspaceEx.GetWorkSpace(dir, EWorkspaceType.ShapeFile).GetFeatureClassByName(fileName));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 创建要素类,该要素类仅存储在内存中
        /// </summary>
        /// <param name="name">要素类名称</param>
        /// <param name="fields">要创建的字段集(必须包含SHAPE字段和OID字段),可参考<see cref="FieldOpt.CreateBaseFields"/>等方法创建字段集</param>
        /// <param name="strWorkspaceName">内存工作空间的名称</param>
        /// <returns></returns>
        public static IFeatureClass CreateInMemory(string name, IFields fields, string strWorkspaceName = "InMemoryWorkspace")
        {
            var workspace = WorkspaceEx.NewInMemoryWorkspace(strWorkspaceName);
            IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;

            return(featureWorkspace.CreateFeatureClass(name, fields, null, null, esriFeatureType.esriFTSimple, "SHAPE", ""));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 获取指定CAD的dwg数据集存储的要素类
        /// </summary>
        /// <param name="dwgPath">CAD的dwg数据集路径</param>
        /// <returns></returns>
        private static List <IFeatureClass> FromDwgFile(string dwgPath)
        {
            var dir         = Path.GetDirectoryName(dwgPath);
            var dataSetName = Path.GetFileNameWithoutExtension(dwgPath);

            return(WorkspaceEx.GetWorkSpace(dir, EWorkspaceType.CAD).GetFeatureDataset(dataSetName).GetFeatureClasses());
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 相交分析,返回相交部分的要素(注意输入要素类和叠加要素类不能有空几何等问题)
        /// </summary>
        /// <param name="inClass">输入的要素类</param>
        /// <param name="overlayClass">叠加的要素类</param>
        /// <param name="outPath">保存分析结果的工作空间路径</param>
        /// <param name="outName">保存分析结果的要素类名称</param>
        /// <returns></returns>
        public static IFeatureClass Intersect(this IFeatureClass inClass, IFeatureClass overlayClass, string outPath, string outName)
        {
            var workspaceType = WorkspaceEx.GetDefaultWorkspaceType(outPath);

            if (workspaceType == EWorkspaceType.Default)
            {
                throw new Exception($"工作空间路径(outPath)不存在!{outPath} 该路径必须是已存在的mdb文件路径,或shp所在文件夹路径,或gdb文件夹路径,或sde连接字符串");
            }

            IFeatureClassName outClassName = new FeatureClassNameClass
            {
                ShapeType      = inClass.ShapeType,
                ShapeFieldName = inClass.ShapeFieldName,
                FeatureType    = esriFeatureType.esriFTSimple
            };
            IWorkspaceName workspaceName = new WorkspaceNameClass
            {
                WorkspaceFactoryProgID = workspaceType.GetDescription(1),
                PathName = outPath
            };
            IDatasetName datasetName = (IDatasetName)outClassName;

            datasetName.Name          = outName;
            datasetName.WorkspaceName = workspaceName;

            return(new BasicGeoprocessorClass().Intersect((ITable)inClass, false, (ITable)overlayClass, false, 0.01, outClassName));
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 获取指定连接字符串对应数据库存储的第一个要素类
        /// </summary>
        /// <param name="connString">连接字符串</param>
        /// <returns></returns>
        private static IFeatureClass FirstFromConnString(string connString)
        {
            var workspace    = WorkspaceEx.GetWorkSpace(connString);
            var featureClass = workspace.GetFirstFeatureClass();

            Marshal.ReleaseComObject(workspace);
            return(featureClass);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 获取指定全路径下的要素类,全路径形式为:“工作空间路径[\要素集名称][\要素类名称]”
        /// </summary>
        /// <param name="fullPath">格式为“工作空间路径[\要素集名称][\要素类名称]”的路径</param>
        /// <returns></returns>
        private static List <IFeatureClass> FromFullPath(string fullPath)
        {
            fullPath = fullPath.ToLower();
            string workspacePath = null;

            foreach (var extension in new[] { ".gdb", ".mdb" })
            {
                int index;
                if ((index = fullPath.LastIndexOf(extension, StringComparison.OrdinalIgnoreCase)) > -1)
                {
                    workspacePath = fullPath.Substring(0, index + 4);
                    break;
                }
            }

            var           classes      = new List <IFeatureClass>();
            IFeatureClass featureClass = null;

            if (!string.IsNullOrWhiteSpace(workspacePath))//按照"\"或者"/"分割子路径,获得要素集名称、要素类名称
            {
                var workspace = WorkspaceEx.GetWorkSpace(workspacePath);
                if (workspace == null)
                {
                    throw new Exception($"无法按照指定路径或连接字符串“{workspacePath}”打开工作空间!");
                }

                var subPath = fullPath.Replace(workspacePath, "");
                var names   = subPath.Split(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries);
                if (names.Length == 1)
                {
                    var dataset = workspace.GetFeatureDataset(names[0]);
                    if (dataset != null)
                    {
                        classes.AddRange(dataset.GetFeatureClasses());
                    }
                    else if ((featureClass = workspace.GetFeatureClassByName(names[0])) != null)
                    {
                        classes.Add(featureClass);
                    }
                }
                if (names.Length == 2)
                {
                    featureClass = workspace.GetFeatureDataset(names[0])?.GetFeatureClassByName(names[1]);
                    classes.Add(featureClass);
                }
            }

            if (fullPath.Contains(".dwg") &&
                (featureClass = FromDwgFullPath(fullPath)) != null)
            {
                classes.Add(featureClass);
            }

            return(classes);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 设置图层数据源
        /// </summary>
        /// <param name="layer">设置数据源的图层</param>
        /// <param name="workspacePath">工作空间路径</param>
        /// <param name="dataSetName">数据集名称,数据源不在数据集中则应为null</param>
        /// <param name="objectName">图层关联对象的名称,即要素类名称或栅格数据集名称</param>
        public static void SetSourcePath(this ILayer layer, string workspacePath, string dataSetName, string objectName)
        {
            if (!WorkspaceEx.IsWorkspacePath(workspacePath) &&
                !WorkspaceEx.IsConnectionString(workspacePath))
            {
                throw new ArgumentException($"找不到数据源({workspacePath}),请指定正确的数据源!");
            }

            switch (layer)
            {
            case IFeatureLayer featureLayer:
                if (featureLayer is IDataLayer dataLayer)
                {
                    IDatasetName   datasetName    = (IDatasetName)dataLayer.DataSourceName;
                    EWorkspaceType eWorkspaceType = WorkspaceEx.GetDefaultWorkspaceType(workspacePath);
                    datasetName.WorkspaceName.WorkspaceFactoryProgID = eWorkspaceType.GetDescription(1);
                    datasetName.WorkspaceName.PathName = workspacePath;
                    //TODO:
                    if (!string.IsNullOrWhiteSpace(dataSetName))
                    {
                        datasetName.Category = dataSetName;
                    }
                    if (!string.IsNullOrWhiteSpace(objectName))
                    {
                        datasetName.Name = objectName;
                    }
                }
                break;

            case IRasterLayer rasterLayer:
                objectName = string.IsNullOrWhiteSpace(objectName)
                        ? ((rasterLayer as IDataLayer)?.DataSourceName as IDatasetName)?.Name
                        : objectName;
                if (objectName == null)
                {
                    throw new Exception($"指定数据源名称(参数{nameof(objectName)})不能为空!");
                }
                rasterLayer.CreateFromFilePath(!string.IsNullOrWhiteSpace(dataSetName)
                        ? Path.Combine(workspacePath, dataSetName, objectName)
                        : Path.Combine(workspacePath, objectName));
                break;

            case IGroupLayer groupLayer:
                throw new Exception("该图层对象为图层组(IGroupLayer),无法设置图层组的数据源,请指定到具体的图层");

            default:
                throw new NotImplementedException(
                          "图层不是要素图层(IFeatureLayer),也不是栅格图层(IRasterLayer),未实现其他类型图层的数据源设置");
            }
        }
Ejemplo n.º 9
0
        private void Test()
        {
            double sumRiverLength = 0.0;

            FeatureClassEx.FromPath(@"c:\River.shp").QueryFeatures(@"XZQDM = '440000'",
                                                                   feature => sumRiverLength += feature.ToDouble("RiverLength"));

            var workspace = WorkspaceEx.GetWorkSpace(@"c:\World.mdb");

            FeatureClassEx.FromPath(@"c:\World.mdb\river").CopyStruct(workspace, "NewRiver", "河流");

            var connString = DbHelper.Dbf_OleDb4(@"c:\River.dbf");
            var dbHelper   = DbHelper.GetOleDbHelper(connString).ExcNonQuery(@"update River set Name = 'Pearl River' where RiverCode ='003'");
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 打开栅格数据集(bmp/tif/jpg/img)
        /// </summary>
        /// <param name="rasterPath">栅格数据文件的路径(bmp/tif/jpg/img)</param>
        /// <returns></returns>
        public static IRasterDataset GetRasterDataset(string rasterPath)
        {
            var dir  = System.IO.Path.GetDirectoryName(rasterPath);   //获取文件路径
            var name = System.IO.Path.GetFileName(rasterPath);        //获取栅格文件名

            var workspace       = WorkspaceEx.GetWorkSpace(dir, EWorkspaceType.Raster);
            var rasterWorkspace = workspace as IRasterWorkspace;

            if (rasterWorkspace == null)
            {
                throw new Exception($"指定的工作空间“{dir}”不是栅格数据集工作空间!");
            }

            return(rasterWorkspace.OpenRasterDataset(name));
        }
Ejemplo n.º 11
0
        /// <summary>
        /// 获取指定路径或连接字符串对应数据库下,以数据库(工作空间)名为根节点,要素集或要素类为子节点的树结构信息
        /// <para>在返回的<see cref="TreeNode"/>各级节点中,Tag属性为1代表要素类,0为要素数据集,-1为工作空间</para>
        /// </summary>
        /// <param name="strConnOrPath">路径或连接字符串,可以是gdb文件夹路径、shp所在目录、mdb文件路径或sde数据库连接字符串</param>
        /// <returns></returns>
        public static TreeNode DbToTreeNodes(string strConnOrPath)
        {
            SplitPath(strConnOrPath, out var workspacePath, out _, out _);
            var workspaceName = Directory.Exists(workspacePath) ? new DirectoryInfo(workspacePath).Name : Path.GetFileNameWithoutExtension(workspacePath);
            var rootNode      = new TreeNode(workspaceName)
            {
                Tag = -1
            };
            var workspace = WorkspaceEx.GetWorkSpace(strConnOrPath);

            //不放到dataset的要素数据
            var           dataset = workspace.Datasets[esriDatasetType.esriDTFeatureClass];
            IFeatureClass featureClass;

            while ((featureClass = dataset.Next() as IFeatureClass) != null)
            {
                rootNode.Nodes.Add(new TreeNode(featureClass.AliasName)
                {
                    Tag = 1
                });
            }

            //放到dataset里的要素
            var             enumDataset = workspace.Datasets[esriDatasetType.esriDTFeatureDataset];
            IFeatureDataset featureDataset;

            while ((featureDataset = enumDataset.Next() as IFeatureDataset) != null)//遍历数据集
            {
                var dataSetNode = new TreeNode(featureDataset.Name)
                {
                    Tag = 0
                };
                var enumFeatureClass = ((IFeatureClassContainer)featureDataset).Classes;
                while ((featureClass = enumFeatureClass.Next()) != null)//在每一个数据集中遍历数据层IFeatureClass
                {
                    dataSetNode.Nodes.Add(new TreeNode(featureClass.AliasName)
                    {
                        Tag = 1
                    });
                }
                rootNode.Nodes.Add(dataSetNode);
            }
            return(rootNode);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// 从指定路径(或连接字符串)中获取全部要素类
        /// <para>①shp路径:返回该shp存储的要素类;</para>
        /// <para>②mdb路径:返回该mdb数据库的全部要素类;</para>
        /// <para>③dwg路径:返回该dwg数据集的全部要素类;</para>
        /// <para>④普通目录:返回目录下的全部shp和dwg要素类;</para>
        /// <para>⑤gdb目录:返回gdb数据库的全部要素类;</para>
        /// <para>⑥mdb文件路径[\DatasetName][\FeatureClassName]:返回mdb数据库中指定要素类,或指定数据集下的全部要素类;</para>
        /// <para>⑦gdb目录[\DatasetName][\FeatureClassName]:返回gdb数据库中指定要素类,或指定数据集下的全部要素类;</para>
        /// <para>⑧sde或oleDb或sql连接字符串:返回数据库的全部要素类;</para>
        /// </summary>
        /// <param name="connStrOrPath"></param>
        /// <returns></returns>
        public static List <IFeatureClass> AllFromPath(string connStrOrPath)
        {
            if (WorkspaceEx.IsConnectionString(connStrOrPath))
            {
                return(FromConnString(connStrOrPath));
            }

            if (Directory.Exists(connStrOrPath))
            {
                return(FromDir(connStrOrPath));
            }

            if (File.Exists(connStrOrPath))
            {
                return(FromFile(connStrOrPath));
            }

            return(FromFullPath(connStrOrPath));
        }
Ejemplo n.º 13
0
        /// <summary>
        /// 获取指定路径或连接字符串对应数据库下,以数据库名为根节点,要素集或要素类为子节点的树结构信息
        /// (如果节点为要素类则它的Tag属性为1,否则为0)
        /// </summary>
        /// <param name="strConnOrPath">路径或连接字符串,可以是gdb文件夹路径、shp所在目录、mdb文件路径或sde数据库连接字符串</param>
        /// <returns></returns>
        public static TreeNode GetDbSourceTreeNodes(string strConnOrPath)
        {
            var fileName = System.IO.Path.GetFileNameWithoutExtension(strConnOrPath);
            var rootNode = new TreeNode(fileName)
            {
                Tag = 0
            };
            var workspace = WorkspaceEx.GetWorkSpace(strConnOrPath);

            //不放到DataSet的要素数据
            var           dataset = workspace.Datasets[esriDatasetType.esriDTFeatureClass];
            IFeatureClass featureClass;

            while ((featureClass = dataset.Next() as IFeatureClass) != null)
            {
                rootNode.Nodes.Add(new TreeNode(featureClass.AliasName)
                {
                    Tag = 1
                });
            }

            //放到Dataset里的要素
            var             enumDataset = workspace.Datasets[esriDatasetType.esriDTFeatureDataset];
            IFeatureDataset featureDataset;

            while ((featureDataset = enumDataset.Next() as IFeatureDataset) != null)//遍历数据集
            {
                var dataSetNode = new TreeNode(featureDataset.Name)
                {
                    Tag = 0
                };
                var enumFeatureClass = ((IFeatureClassContainer)featureDataset).Classes;
                while ((featureClass = enumFeatureClass.Next()) != null)//在每一个数据集中遍历数据层IFeatureClass
                {
                    dataSetNode.Nodes.Add(new TreeNode(featureClass.AliasName)
                    {
                        Tag = 1
                    });
                }
                rootNode.Nodes.Add(dataSetNode);
            }
            return(rootNode);
        }
Ejemplo n.º 14
0
        /// <summary>
        /// 在指定目录(shp目录)或地理数据库(mdb/gdb/sde/sql)中创建新的要素类,并返回该要素类(注意路径中不能存在同名要素类)
        /// </summary>
        /// <param name="geoDbPath">mdb文件路径,或shp所在文件夹路径,或gdb文件夹路径,或sde/sql数据库连接字符串</param>
        /// <param name="datasetName">要素数据集名称,若赋值为null则直接在数据库下创建要素类,否则在该要素数据集(不存在则创建)下创建要素类</param>
        /// <param name="className">需要创建的要素类名称</param>
        /// <param name="fields">字段集合(应包含OID和Shape字段)</param>
        /// <returns></returns>
        public static IFeatureClass CreateToDb(string geoDbPath, string datasetName, string className, IFields fields)
        {
            var           workspace  = WorkspaceEx.GetWorkSpace(geoDbPath);
            var           spatialRef = fields.GetSpatialRef();
            IFeatureClass featureClass;

            if (!string.IsNullOrEmpty(datasetName))
            {
                var featureDataset = workspace.GetFeatureDataset(datasetName) ?? workspace.CreateFeatureDataset(datasetName, spatialRef);
                featureClass = featureDataset.CreateFeatureClass(className, fields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
                Marshal.ReleaseComObject(featureDataset);
            }
            else
            {
                featureClass = (workspace as IFeatureWorkspace)?.CreateFeatureClass(className, fields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
            }
            Marshal.ReleaseComObject(workspace);
            return(featureClass);
        }
Ejemplo n.º 15
0
        /// <summary>
        /// 在指定目录(shp目录)或地理数据库(shp/mdb/gdb/sde/sql)中创建新的要素类,并返回该要素类(注意路径中不能存在同名要素类)
        /// </summary>
        /// <param name="geoDbPath">mdb文件路径,或shp所在文件夹路径,或gdb文件夹路径,或sde/sql数据库连接字符串</param>
        /// <param name="datasetName">要素数据集名称,若赋值为null则直接在数据库下创建要素类,否则在该要素数据集(不存在则创建)下创建要素类</param>
        /// <param name="className">需要创建的要素类名称</param>
        /// <param name="geoType">要素类的几何类型</param>
        /// <param name="spatialRef">空间参考(坐标系),创建方法参考<see cref="SpatialRefOpt.CreateSpatialRef(int, ESrType)"/>及该方法的重载</param>
        /// <param name="otherFields">除了OID和SHAPE字段的其他字段</param>
        /// <returns></returns>
        public static IFeatureClass CreateToDb(string geoDbPath, string datasetName, string className, esriGeometryType geoType,
                                               ISpatialReference spatialRef, IEnumerable <IField> otherFields = null)
        {
            var           fields    = FieldOpt.CreateFields(geoType, spatialRef, otherFields);
            var           workspace = WorkspaceEx.GetWorkSpace(geoDbPath);
            IFeatureClass featureClass;

            if (!string.IsNullOrEmpty(datasetName))
            {
                var featureDataset = workspace.GetFeatureDataset(datasetName) ?? workspace.CreateFeatureDataset(datasetName, spatialRef);
                featureClass = featureDataset.CreateFeatureClass(className, fields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
                Marshal.ReleaseComObject(featureDataset);
            }
            else
            {
                featureClass = Create(workspace, className, spatialRef, geoType, fields);
            }
            Marshal.ReleaseComObject(workspace);
            return(featureClass);
        }
Ejemplo n.º 16
0
        /// <summary>
        /// 获取指定CAD的dwg数据集存储的第一个要素类
        /// </summary>
        /// <param name="dwgLayerPath">指向dwg图层的完整路径:dwg文件路径\图层名</param>
        /// <returns></returns>
        private static IFeatureClass FromDwgFullPath(string dwgLayerPath)
        {
            var index = dwgLayerPath.LastIndexOf(dwgLayerPath, StringComparison.OrdinalIgnoreCase);

            if (index < 0)
            {
                throw new Exception($"获取CAD要素类失败,“{dwgLayerPath}”不是有效的dwg数据路径!");
            }

            var dwgPath = dwgLayerPath.Substring(0, index + 4);

            if (!File.Exists(dwgPath))
            {
                throw new Exception("获取要素类失败,找不到指定路径:" + dwgPath);
            }

            var dwgDir      = Path.GetDirectoryName(dwgPath);
            var dataSetName = Path.GetFileNameWithoutExtension(dwgPath);
            var layerName   = dwgLayerPath.Replace(dwgPath, "");

            return(WorkspaceEx.GetWorkSpace(dwgDir, EWorkspaceType.CAD).GetFeatureDataset(dataSetName).GetFeatureClassByName(layerName));
        }
Ejemplo n.º 17
0
        /// <summary>
        /// 获取指定路径或连接字符串对应数据库下,以数据库(工作空间)名为根节点,要素集或要素类为子节点的树结构信息
        /// <para>在返回的<see cref="NodeObject"/>对象中,NodeTag属性为1代表要素类,0为要素数据集,-1为工作空间</para>
        /// </summary>
        /// <param name="strConnOrPath">路径或连接字符串,可以是gdb文件夹路径、shp所在目录、mdb文件路径或sde数据库连接字符串</param>
        /// <param name="getTopNode">是否获取顶层节点,即工作空间节点</param>
        /// <returns></returns>
        public static List <NodeObject> DbToNodeObjects(string strConnOrPath, bool getTopNode = true)
        {
            var nodes = new List <NodeObject>();

            int id = 0;

            if (getTopNode)
            {
                SplitPath(strConnOrPath, out var workspacePath, out _, out _);
                var workspaceName = Directory.Exists(workspacePath) ? new DirectoryInfo(workspacePath).Name : Path.GetFileNameWithoutExtension(workspacePath);
                nodes.Add(new NodeObject(id++, -1, workspaceName, 0, -1, workspaceName));
            }
            var workspace = WorkspaceEx.GetWorkSpace(strConnOrPath);

            //不放到dataset的要素数据
            var           dataset = workspace.Datasets[esriDatasetType.esriDTFeatureClass];
            IFeatureClass featureClass;

            while ((featureClass = dataset.Next() as IFeatureClass) != null)
            {
                nodes.Add(new NodeObject(id++, 0, featureClass.AliasName, 0, 1, featureClass.GetName()));
            }

            //放到dataset里的要素
            var             enumDataset = workspace.Datasets[esriDatasetType.esriDTFeatureDataset];
            IFeatureDataset featureDataset;

            while ((featureDataset = enumDataset.Next() as IFeatureDataset) != null)//遍历数据集
            {
                int datasetId = id;
                nodes.Add(new NodeObject(datasetId, 0, featureDataset.Name, 0, 0, featureClass.GetName()));
                var enumFeatureClass = ((IFeatureClassContainer)featureDataset).Classes;
                while ((featureClass = enumFeatureClass.Next()) != null)//在每一个数据集中遍历数据层IFeatureClass
                {
                    nodes.Add(new NodeObject(id++, datasetId, featureClass.AliasName, 0, 1, featureClass.GetName()));
                }
            }
            return(nodes);
        }
Ejemplo n.º 18
0
        /// <summary>
        /// 在指定路径(shp/mdb/gdb)中创建新的要素类,并返回该要素类(注意路径中不能存在同名要素类)
        /// </summary>
        /// <param name="fullPath">
        /// 要素类的完整保存路径,包含以下情况:
        /// ①shp文件路径,创建shp文件;若shp文件所在目录不存在则自动创建;
        /// ②mdb文件路径[\DatasetName]\FeatureClassName,在mdb中或mdb的指定要素集中,创建指定名称的图层;若mdb或要素集不存在则自动创建;
        /// ③gdb目录[\DatasetName]\FeatureClassName,在gdb中或gdb的指定要素集中,创建指定名称的图层;若gdb或要素集不存在则自动创建;
        /// </param>
        /// <param name="fields">要创建的字段集,必须包含OID和SHAPE字段,创建字段集可参考<see cref="FieldOpt.CreateBaseFields"/>等方法</param>
        /// <returns></returns>
        public static IFeatureClass CreateToPath(string fullPath, IFields fields)
        {
            const string _shp = ".shp", _mdb = ".mdb", _gdb = ".gdb";
            var          chars = Path.GetInvalidPathChars();

            foreach (var c in chars)
            {
                if (fullPath.Contains(c))
                {
                    throw new Exception("路径不符合规范,文件路径不能包含以下字符串:" + string.Concat(chars));
                }
            }

            fullPath = fullPath.ToLower();
            if (fullPath.EndsWith(_shp))
            {
                var dir = Path.GetDirectoryName(fullPath);
                if (dir != null)
                {
                    Directory.CreateDirectory(dir);
                    return(CreateToDb(Path.GetDirectoryName(fullPath), Path.GetFileNameWithoutExtension(fullPath), null, fields));
                }
            }
            else if (fullPath.Contains(_mdb))
            {
                var dbPath = fullPath.Substring(0, fullPath.IndexOf(_mdb, StringComparison.OrdinalIgnoreCase));
                if (!File.Exists(dbPath))
                {
                    var workspace = WorkspaceEx.NewWorkspace(EWorkspaceType.Access, Path.GetDirectoryName(dbPath), Path.GetFileNameWithoutExtension(dbPath));
                    Marshal.ReleaseComObject(workspace);
                }

                var names = fullPath.Replace(dbPath, "").Split(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries);
                if (names.Length == 1)
                {
                    return(CreateToDb(dbPath, null, names[0], fields));
                }
                if (names.Length == 2)
                {
                    return(CreateToDb(dbPath, names[0], names[1], fields));
                }
            }
            else if (fullPath.Contains(_gdb))
            {
                var dbPath = fullPath.Substring(0, fullPath.IndexOf(_gdb, StringComparison.OrdinalIgnoreCase));
                if (!Directory.Exists(dbPath))
                {
                    var dirInfo = new DirectoryInfo(dbPath);
                    if (dirInfo.Parent == null)
                    {
                        throw new Exception($"路径“{dbPath}”不是有效的文件地理数据库路径!");
                    }
                    var workspace = WorkspaceEx.NewWorkspace(EWorkspaceType.FileGDB, dirInfo.Parent.FullName, dirInfo.Name);
                    Marshal.ReleaseComObject(workspace);
                }
                var names = fullPath.Replace(dbPath, "").Split(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries);
                if (names.Length == 1)
                {
                    return(CreateToDb(dbPath, null, names[0], fields));
                }
                if (names.Length == 2)
                {
                    return(CreateToDb(dbPath, names[0], names[1], fields));
                }
            }
            return(null);
        }
Ejemplo n.º 19
0
 /// <summary>
 /// 获取指定连接字符串对应数据库存储的第一个要素类
 /// </summary>
 /// <param name="connString">连接字符串</param>
 /// <returns></returns>
 private static IFeatureClass FirstFromConnString(string connString)
 {
     return(WorkspaceEx.GetWorkSpace(connString).GetFirstFeatureClass());
 }
Ejemplo n.º 20
0
        /// <summary>
        /// 将工作空间的所有要素类加载到地图控件中,图层名使用要素类别名
        /// </summary>
        /// <param name="mapControl">地图控件</param>
        /// <param name="strConOrPath">工作空间的路径,或者是sde的连接字符串</param>
        /// <param name="zoomToClass">指定要素类名称或别名,地图将缩放到此要素类的显示范围</param>
        public static void LoadAllFeatureLayers(this AxMapControl mapControl, string strConOrPath, string zoomToClass = null)
        {
            var workspace = WorkspaceEx.GetWorkSpace(strConOrPath);

            LoadAllFeatureLayers(mapControl, workspace, zoomToClass);
        }
Ejemplo n.º 21
0
 /// <summary>
 /// 获取指定CAD的dwg工作空间存储的第一个要素类
 /// </summary>
 /// <param name="dwgDir">CAD的dwg数据集路径</param>
 /// <returns></returns>
 private static IFeatureClass FirstFromDwgDir(string dwgDir)
 {
     return(WorkspaceEx.GetWorkSpace(dwgDir, EWorkspaceType.CAD).GetFirstFeatureClass());
 }
Ejemplo n.º 22
0
 /// <summary>
 /// 获取指定shp目录存储的全部要素类
 /// </summary>
 /// <param name="shpDir"></param>
 /// <returns></returns>
 private static List <IFeatureClass> FromShpDir(string shpDir)
 {
     return(WorkspaceEx.GetWorkSpace(shpDir, EWorkspaceType.ShapeFile).GetFeatureClasses());
 }
Ejemplo n.º 23
0
 /// <summary>
 /// 获取指定连接字符串对应数据库存储的全部要素类
 /// </summary>
 /// <param name="connString">连接字符串</param>
 /// <returns></returns>
 private static List <IFeatureClass> FromConnString(string connString)
 {
     return(WorkspaceEx.GetWorkSpace(connString).GetFeatureClasses());
 }
Ejemplo n.º 24
0
 /// <summary>
 /// 获取指定目录下全部CAD的dwg数据集存储的要素类
 /// </summary>
 /// <param name="dwgDir">CAD的dwg数据集所在目录</param>
 /// <returns></returns>
 private static List <IFeatureClass> FromDwgDir(string dwgDir)
 {
     return(WorkspaceEx.GetWorkSpace(dwgDir, EWorkspaceType.CAD).GetFeatureClasses());
 }
Ejemplo n.º 25
0
 /// <summary>
 /// 获取指定mdb数据库存储的全部要素类
 /// </summary>
 /// <param name="mdbPath"></param>
 /// <returns></returns>
 private static List <IFeatureClass> FromMdb(string mdbPath)
 {
     return(WorkspaceEx.GetWorkSpace(mdbPath, EWorkspaceType.Access).GetFeatureClasses());
 }
Ejemplo n.º 26
0
 /// <summary>
 /// 获取指定gdb数据库存储的全部要素类
 /// </summary>
 /// <param name="gdbPath"></param>
 /// <returns></returns>
 private static List <IFeatureClass> FromGdb(string gdbPath)
 {
     return(WorkspaceEx.GetWorkSpace(gdbPath, EWorkspaceType.FileGDB).GetFeatureClasses());
 }