Shapefile导入数据库 c#
来源:互联网 发布:nginx 多域名别名 编辑:程序博客网 时间:2024/05/17 05:10
研究了一天shape图层导入数据库,现将实现代码及注意事项整理如下:
//引用
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Geometry;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.Controls;
//调用方法
public void ShapefileImportDB()
{
//将要导入数据库的shape图层添加到mapControl
string filePath = System.AppDomain.CurrentDomain.BaseDirectory + @"data\Intersect";
m_mapControl.AddShapeFile(filePath, "intersect.shp");
//设置数据库连接字符串(此处采用的是Oracle数据库,其他数据库大同小异,未加以验证)
IPropertySet pPropertySet = new PropertySet();
pPropertySet.SetProperty("Data Source", "192.168.34.54\\orcl");
pPropertySet.SetProperty("User ID", "zsdz");
pPropertySet.SetProperty("Password", "Zs123456");
//pPropertySet.SetProperty("version", "SDE.DEFAULT");
IFeatureLayer m_featureLayer = m_mapControl.get_Layer(0) as IFeatureLayer;
IFeatureClass m_featureClass = m_featureLayer.FeatureClass;
IWorkspaceFactory pWorkspaceFactory = new SdeWorkspaceFactory();
IWorkspace pWorkspace = pWorkspaceFactory.Open(pPropertySet, 1);
int code = getSpatialReferenceCode(m_featureClass);//
string datasetName = m_featureClass.AliasName;
//删除数据库中原有的相同的要素类(因为我的写程序要定时将新生成的shape图层更新到数据库,所以要先对数据库原有的要输类进行删除)
DeleteFeatureDataset(pWorkspace, "ZSQYFJ_PY");
//根据名称获取要素集(若数据库中存在该名称的要素集,则获取;若无,新建)
IFeatureDataset pFeatureDataset = getFeatureDataset(pWorkspace, "QYFJ");
if (pFeatureDataset == null)
{
pFeatureDataset = CreateFeatureClass(pWorkspace, code, "QYFJ");
}
//得到数据集后,将要素类导入数据库
importToDB(m_featureClass, pWorkspace, pFeatureDataset, "ZSQYFJ_PY");
}
//获取数据库中的要素集
private IFeatureDataset getFeatureDataset(IWorkspace pWorkspace, string datasetName)
{
IFeatureDataset pFeatureDataset = null;
IEnumDataset pEnumDataset=pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);
pEnumDataset.Reset();
IDataset pDataset = pEnumDataset.Next();
while (pDataset != null)
{
if (pDataset.Type == esriDatasetType.esriDTFeatureDataset)
{
if (pDataset.Name == "ZSDZ." + datasetName)
{
pFeatureDataset = pDataset as IFeatureDataset;
}
pDataset = pEnumDataset.Next();
}
}
return pFeatureDataset;
}
//获取参照投影的代号
private int getSpatialReferenceCode(IFeatureClass pFeatureClass)
{
IDataset dataset = pFeatureClass as IDataset;
IGeoDataset geoDataset = (IGeoDataset)dataset;
int code = geoDataset.SpatialReference.FactoryCode;
return code;
}
//数据库中无想要要素集情况下新建要素集
private IFeatureDataset CreateFeatureClass(IWorkspace workspace, int code, string datasetName)
{
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
//创建一个要素创建一个投影
ISpatialReferenceFactory spatialRefFactory = new SpatialReferenceEnvironment();
ISpatialReference spatialReference = spatialRefFactory.CreateProjectedCoordinateSystem(code);
//确定是否支持高精度存储空间
Boolean supportsHighPrecision = false;
IWorkspaceProperties workspaceProperties = (IWorkspaceProperties)workspace;
IWorkspaceProperty workspaceProperty = workspaceProperties.get_Property
(esriWorkspacePropertyGroupType.esriWorkspacePropertyGroup,
(int)esriWorkspacePropertyType.esriWorkspacePropSupportsHighPrecisionStorage);
if (workspaceProperty.IsSupported)
{
supportsHighPrecision = Convert.ToBoolean(workspaceProperty.PropertyValue);
}
//设置投影精度
IControlPrecision2 controlPrecision = (IControlPrecision2)spatialReference;
controlPrecision.IsHighPrecision = supportsHighPrecision;
//设置容差
ISpatialReferenceResolution spatialRefResolution = (ISpatialReferenceResolution)spatialReference;
spatialRefResolution.ConstructFromHorizon();
spatialRefResolution.SetDefaultXYResolution();
ISpatialReferenceTolerance spatialRefTolerance = (ISpatialReferenceTolerance)spatialReference;
spatialRefTolerance.SetDefaultXYTolerance();
//创建要素集
IFeatureDataset featureDataset = featureWorkspace.CreateFeatureDataset(datasetName, spatialReference);
return featureDataset;
}
//shapefile导入数据库
private void importToDB(IFeatureClass pFeaClass, IWorkspace pWorkspace, IFeatureDataset tFeatureClass, string SHPName)
{
IFeatureClassDescription featureClassDescription = new FeatureClassDescriptionClass();
IObjectClassDescription objectClassDescription = featureClassDescription as IObjectClassDescription;
IFields pFields = pFeaClass.Fields;
IFieldChecker pFieldChecker = new FieldCheckerClass();
IEnumFieldError pEnumFieldError = null;
IFields vFields = null;
pFieldChecker.ValidateWorkspace = pWorkspace as IWorkspace;
pFieldChecker.Validate(pFields, out pEnumFieldError, out vFields);
IFeatureWorkspace featureWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureClass sdeFeatureClass = null;
if (sdeFeatureClass == null)
{
sdeFeatureClass = tFeatureClass.CreateFeatureClass(SHPName, vFields,
objectClassDescription.InstanceCLSID, objectClassDescription.ClassExtensionCLSID,
pFeaClass.FeatureType, pFeaClass.ShapeFieldName, "");
IFeatureCursor featureCursor = pFeaClass.Search(null, true);
IFeature feature = featureCursor.NextFeature();
IFeatureCursor sdeFeatureCursor = sdeFeatureClass.Insert(true);
IFeatureBuffer sdeFeatureBuffer;
while (feature != null)
{
sdeFeatureBuffer = sdeFeatureClass.CreateFeatureBuffer();
IField shpField = new FieldClass();
IFields shpFields = feature.Fields;
for (int i = 0; i < shpFields.FieldCount; i++)
{
shpField = shpFields.get_Field(i);
//此处忽略掉“DZHJTJ”字段,因为shape图层的这个字段存在null值,导入数据库会出错
//此处忽略掉“DZHJTJ”字段,因为shape图层的这个字段存在null值,导入数据库会出错
if (shpField.Name.Contains("DZHJTJ")) continue;
int index = sdeFeatureBuffer.Fields.FindField(shpField.Name);
if (index != -1)
{
sdeFeatureBuffer.set_Value(index, feature.get_Value(i));
}
}
sdeFeatureCursor.InsertFeature(sdeFeatureBuffer);
sdeFeatureCursor.Flush();
feature = featureCursor.NextFeature();
}
featureCursor.Flush();
//Marshal.ReleaseComObject(feature);
Marshal.ReleaseComObject(featureCursor);
}
}
//删除要素集
public static bool DeleteFeatureDataset(IWorkspace ws, string name)
{
if (ws == null || string.IsNullOrEmpty(name))
{
return false;
}
IFeatureDataset pFeaDataSet;
IEnumDatasetName pEnumDatasetName;
IFeatureWorkspace pFeaWorkspace;
IDatasetName pDatasetName;
try
{
pFeaWorkspace = ws as IFeatureWorkspace;
pEnumDatasetName = ws.get_DatasetNames(esriDatasetType.esriDTFeatureClass ^ esriDatasetType.esriDTFeatureDataset);
pEnumDatasetName.Reset();
pDatasetName = pEnumDatasetName.Next();
while (pDatasetName != null)
{
if (pDatasetName.Type == esriDatasetType.esriDTFeatureDataset)
{
//
IEnumDatasetName pEnumFcName = (pDatasetName as IFeatureDatasetName).FeatureClassNames;
IDatasetName pFcName = pEnumFcName.Next();
while (pFcName != null)
{
if (pFcName.Name.IndexOf(name) >= 0)
{
DeleteByName(pFeaWorkspace, pFcName);
return true;
}
pFcName = pEnumFcName.Next();
}
}
else
{
if (pDatasetName.Name.IndexOf(name) >= 0)
{
DeleteByName(pFeaWorkspace, pDatasetName);
return true;
}
}
pDatasetName = pEnumDatasetName.Next();
}
return false;
}
catch (Exception ex)
{
//ErrMsg = ex.Message;
return false;
}
}
private static void DeleteByName(IFeatureWorkspace pFeaWorkspace, IDatasetName pDatasetName)
{
IFeatureWorkspaceManage pWorkspaceManager = pFeaWorkspace as IFeatureWorkspaceManage;
pWorkspaceManager.DeleteByName(pDatasetName);
}
注意:①LisenceControl一定要勾选ArcGIS Engine Enterprise Geo…
②IWorkspaceFactory接口的Open方法:
public IWorkspace Open (IPropertySet ConnectionProperties, int hWnd);
两个参数:前者即数据库连接方法,后者我也没搞太懂,经过多次测试似乎是数据库连接弹窗的样式,当hWnd=0时,程序运行是弹窗,只有点击ok后程序继续运行;若hWnd=1,则不会弹窗,程序默认ok后继续进行。
本程序实现结果就是ArcMap向数据库导入单个要素类
阅读全文
1 0
- Shapefile导入数据库 c#
- AE(C#)Shapefile导入mdb数据库
- 获取shapefile并将其导入数据库的方法
- 如何将shapefile文件导入到oracle数据库(转载)
- shp2pgsql shapefile导入postgis
- MongoDB导入Shapefile数据
- postgis安装及shapefile导入
- EXCAL导入数据库 C#
- shapefile文件导入mysql的办法
- ShapeFile数据到mongodb的导入
- ShapeFile数据到mongodb的导入
- PostGIS导入导出ESRI Shapefile数据
- R语言----导入shapefile的方法
- C# 导入csv到数据库
- C# Excel导入SQL数据库
- C# DataTable 快速导入数据库
- C# CSV文件导入数据库
- C#将excel导入数据库
- slice splice split
- LINQ语句
- CentOS Linux Various Versions Meaning
- 你所不知的 CSS ::before 和 ::after 伪元素用法
- Python把对应格式的csv文件转换成字典类型存储脚本
- Shapefile导入数据库 c#
- Qt打开图片,维持原宽高比,适应窗口
- Java中try{return} finally中return 和finally的执行顺序
- oracle对没有主键表的新增主键修改表数据操作(没有主键字段,则新增一个主键字段,然后赋值,然后再添加主键)
- C++基类与派生类的函数调用情况
- 欢迎使用CSDN-markdown编辑器
- HEVC函数入门(10)——HM软件手册software-manual(GOP,RPS,POC)
- 用js判断页面是否加载完成
- Tomcat Port 8009 与AJP13协议