Пример #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);
        }
Пример #2
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),未实现其他类型图层的数据源设置");
            }
        }
Пример #3
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));
        }