ArcEngine将shp文件导入GDB的代码实现

用过ArcGIS的同志应该很清楚,将一个shp文件导入GDB大体上分两种情况,一是直接导入GDB中,二是导入GDB的要素数据集中,下面就介绍一下利用ArcEngine实现的方法,代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Output;
using ESRI.ArcGIS.SystemUI;

namespace WindowsFormsApplication1
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        // 导入数据
        private void button1_Click(object sender, EventArgs e)
        {
            // 属性过滤器
            IQueryFilter pQueryFilter = new QueryFilter();
            pQueryFilter.AddField("FID");
            pQueryFilter.WhereClause = "FID>=0 and FID<=4";

            // 导入数据
            IFeatureClass pFeatureClass = GetShapefile(@"C:\Users\DSF\Desktop\shp\point.shp");
            bool ok = Import(pFeatureClass, pQueryFilter, @"C:\Users\DSF\Desktop\test.gdb", "ds", "aaa");

            // 提示用户信息
            if (ok)
            {
                MessageBox.Show("导入成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
            else
            {
                MessageBox.Show("导入失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 获取shp文件
        /// </summary>
        /// <param name="filePath">shp文件路径</param>
        /// <returns>要素类</returns>
        private IFeatureClass GetShapefile(string filePath)
        {
            IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
            IWorkspaceFactoryLockControl pWorkspaceFactoryLockControl = pWorkspaceFactory as IWorkspaceFactoryLockControl;
            if (pWorkspaceFactoryLockControl.SchemaLockingEnabled)
            {
                pWorkspaceFactoryLockControl.DisableSchemaLocking();
            }
            IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(filePath), 0);
            IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
            IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(System.IO.Path.GetFileName(filePath));
            return pFeatureClass;
        }

        /// <summary>
        /// shp导入数据GDB
        /// </summary>
        /// <param name="pSourceFeatureClass">shp要素类</param>
        /// <param name="pQueryFilter">过滤器</param>
        /// <param name="directory">GDB路径</param>
        /// <param name="datasetName">要素数据集名称</param>
        /// <param name="className">要素类名称</param>
        /// <returns>导入是否成功</returns>
        private bool Import(IFeatureClass pSourceFeatureClass, IQueryFilter pQueryFilter, string directory, string datasetName, string className)
        {
            // 源数据工作空间(SHP)
            IDataset pSourceDataset = pSourceFeatureClass as IDataset;
            IFeatureClassName pSourceFeatureClassName = pSourceDataset.FullName as IFeatureClassName;
            IWorkspace pSourceWorkspace = pSourceDataset.Workspace;

            // 目标数据工作空间(GDB)
            IWorkspaceFactory pTargetWorkspaceFactory = new FileGDBWorkspaceFactory();
            IWorkspace pTargetWorkspace = pTargetWorkspaceFactory.OpenFromFile(directory, 0);
            IFeatureWorkspace pTargetFeatureWorkspace = pTargetWorkspace as IFeatureWorkspace;

            // 若要素数据集名称不为空,则获取该数据集
            IFeatureDatasetName pTargetFeatureDatasetName = null;
            if (!string.IsNullOrWhiteSpace(datasetName))
            {
                pTargetFeatureDatasetName = pTargetFeatureWorkspace.OpenFeatureDataset(datasetName).FullName as IFeatureDatasetName;
            }

            // 设置目标数据属性
            IDataset pTargetDataSet = pTargetWorkspace as IDataset;
            IWorkspaceName pTargetWorkspaceName = pTargetDataSet.FullName as IWorkspaceName;
            IFeatureClassName pTargetFeatureClassName = new FeatureClassName() as IFeatureClassName;
            IDatasetName pTargetDatasetName = pTargetFeatureClassName as IDatasetName;
            pTargetDatasetName.WorkspaceName = pTargetWorkspaceName;
            pTargetDatasetName.Name = className;

            // 检查字段
            IFieldChecker pFieldChecker = new FieldChecker();
            pFieldChecker.InputWorkspace = pSourceWorkspace;
            pFieldChecker.ValidateWorkspace = pTargetWorkspace;

            // 字段转换
            IFields pSourceFields = pSourceFeatureClass.Fields;
            IFields pTargetFields = null;
            IEnumFieldError pEnumFieldError = null;
            pFieldChecker.Validate(pSourceFields, out pEnumFieldError, out pTargetFields);

            // 数据转换
            IFeatureDataConverter pFeatureDataConverter = new FeatureDataConverter();
            try
            {
                pFeatureDataConverter.ConvertFeatureClass(pSourceFeatureClassName, pQueryFilter, pTargetFeatureDatasetName, pTargetFeatureClassName, null, pTargetFields, "", 1000, 0);
                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}

上面代码的含义如下:首先获取一个名称为point.shp的文件,利用属性过滤器获取其第0~4条数据,最后导入GDB中的要素数据集ds中,导入后的要素类名称为aaa。如果你想直接导入GDB,只需要把datasetName参数设置为空字符串或者null即可。其运行结果如下:
在这里插入图片描述

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java将Shapefile(.shp)数据导入到PostgreSQL数据库,通常需要借助一些第三方库如JTS Topology Suite(处理几何数据)和PostGIS(PostgreSQL的空间扩展)。以下是简单的步骤: 1. **添加依赖**: - 首先,你需要在项目添加JTS和PostGIS的依赖。如果你使用Maven,可以在`pom.xml`加入: ```xml <dependency> <groupId>org.locationtech.jts</groupId> <artifactId>jts-core</artifactId> <version>1.18.0</version> </dependency> <dependency> <groupId>org.postgis</groupId> <artifactId>postgis-jdbc</artifactId> <version>2.4.6</version> </dependency> ``` 2. **读取Shapefile**: 使用JTS库可以读取Shapefile数据,例如: ```java ShapeFileReader reader = new ShapeFileReader(new File("path_to_your_shp_file.shp")); GeometryFactory geometryFactory = new GeometryFactory(); List<Feature> features = reader.getFeatures(geometryFactory); ``` 3. **转换为PostGIS能理解的数据结构**: 将JTS的Geometry对象转换为PostGIS的WKB(Well-Known Binary)格式。 4. **插入到数据库**: 使用PostGIS JDBC驱动,创建连接并执行SQL插入语句: ```java Connection conn = DriverManager.getConnection( "jdbc:postgresql://localhost:5432/your_database", "username", "password" ); PreparedStatement stmt = conn.prepareStatement( "INSERT INTO your_table (geom_column) VALUES (%s)" ); for (Feature feature : features) { WkbPoint geom = (WkbPoint) feature.getDefaultGeometry().getGeometry(); stmt.setBytes(1, geom.wkb()); stmt.execute(); } conn.close(); ``` 5. **注意错误处理**: 在实际操作,记得处理可能出现的文件加载错误、数据库连接错误以及数据插入失败等异常情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值