年度变更建库软件5.0版本
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

698 lines
26 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using ESRI.ArcGIS.ADF;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using System.Data;
namespace Kingo.RuleCheck.AEHelper
{
public class FeatureClassAPI : IFeatureClassAPI
{
private IFeatureClass _CurrentFeatureClass;
public FeatureClassAPI(IFeatureClass pFeatureClass)
{
this._CurrentFeatureClass = pFeatureClass;
}
/// <summary>
/// 当前要素类
/// </summary>
public ESRI.ArcGIS.Geodatabase.IFeatureClass FeatureClass
{
get
{
return _CurrentFeatureClass;
}
}
/// <summary>
/// 关闭/释放当前要素类
/// </summary>
public bool CloseFeatureClass()
{
try
{
if (this._CurrentFeatureClass != null)
{
//while (Marshal.ReleaseComObject(this._CurrentFeatureClass) > 0) { }
Marshal.ReleaseComObject(this._CurrentFeatureClass);
}
return true;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 条件过滤筛选要素
/// </summary>
/// <param name="pQueryFilter"></param>
/// <returns></returns>
public List<ESRI.ArcGIS.Geodatabase.IFeature> QueryFeatures(IQueryFilter pQueryFilter)
{
List<IFeature> result = new List<IFeature>();
try
{
if (this.FeatureClass != null)
{
//IFeatureCursor cursor = this.FeatureClass.Search(pQueryFilter, true);
//IFeature feature = null;
//while ((feature = cursor.NextFeature()) != null)
//{
// result.Add(feature);
//}
//Marshal.ReleaseComObject(cursor);
IList<IFeature> lstFeature = new List<IFeature>();
//查询条件
IFeatureCursor pFeatureCursor = FeatureClass.Search(pQueryFilter, false);
IFeature pFeature = pFeatureCursor.NextFeature();
//将要素放到集合中
while (pFeature != null)
{
result.Add(pFeature);
pFeature = pFeatureCursor.NextFeature();
}
Marshal.ReleaseComObject(pFeatureCursor);
//return lstFeature;
}
return result;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 空间过滤筛选要素,压盖查询
/// </summary>
/// <param name="pFilter"></param>
/// <returns></returns>
public List<IFeature> SpatialFilterQueryFeatures(ISpatialFilter pFilter, bool IsCut = false)
{
List<IFeature> result = new List<IFeature>();
try
{
if (this.FeatureClass != null)
{
ITopologicalOperator pTopologicalOperator = pFilter.Geometry as ITopologicalOperator;
IFeatureCursor cursor = this.FeatureClass.Search(pFilter, false);
IFeature pFeature = cursor.NextFeature();
while (pFeature != null)
{
if (IsCut && pTopologicalOperator != null)
{
//IFeature feature = FeatureAPI.FeatureCopy(pFeature);
pFeature.Shape = pTopologicalOperator.Intersect(pFeature.ShapeCopy, pFeature.ShapeCopy.Dimension);
result.Add(pFeature);
}
else
{
result.Add(pFeature);
}
//Marshal.ReleaseComObject(pFeature);
pFeature = cursor.NextFeature();
}
Marshal.ReleaseComObject(cursor);
}
return result;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 根据筛选条件查询要素到DataTable
/// </summary>
/// <param name="pQueryFilter">筛选条件</param>
/// <returns></returns>
public int QueryFeaturesToDataTable(IQueryFilter pQueryFilter, int pQueryCount, out DataTable pResult)
{
int DataCount = 0;
try
{
pResult = new DataTable();
if (this.FeatureClass != null)
{
#region 将IField转化为DataColumn
for (int i = 0; i < FeatureClass.Fields.FieldCount; i++)
{
IField field = FeatureClass.Fields.get_Field(i);
if (field.Name.ToUpper().Contains("SHAPE"))
continue;
DataColumn col = new DataColumn();
col.ExtendedProperties.Add("index", i);
col.ColumnName = field.Name;
col.Caption = field.AliasName;
switch (field.Type)
{
case esriFieldType.esriFieldTypeSmallInteger:
col.DataType = typeof(Int16);
break;
case esriFieldType.esriFieldTypeInteger:
col.DataType = typeof(Int32);
break;
case esriFieldType.esriFieldTypeSingle:
break;
case esriFieldType.esriFieldTypeDouble:
col.DataType = typeof(double);
break;
case esriFieldType.esriFieldTypeString:
col.DataType = typeof(string);
break;
case esriFieldType.esriFieldTypeDate:
col.DataType = typeof(DateTime);
break;
case esriFieldType.esriFieldTypeOID:
col.DataType = typeof(Int32);
break;
case esriFieldType.esriFieldTypeGeometry:
break;
case esriFieldType.esriFieldTypeBlob:
break;
case esriFieldType.esriFieldTypeRaster:
break;
case esriFieldType.esriFieldTypeGUID:
break;
case esriFieldType.esriFieldTypeGlobalID:
break;
case esriFieldType.esriFieldTypeXML:
break;
default:
break;
}
//if (field.Name.Equals("TBBH", StringComparison.CurrentCultureIgnoreCase))
//{
// col.DataType = typeof(Int32);
//}
col.ReadOnly = !field.Editable;//编辑状态启用默认是否可以编辑
pResult.Columns.Add(col);
System.Runtime.InteropServices.Marshal.ReleaseComObject(field);
}
#endregion
IList<IFeature> lstFeature = new List<IFeature>();
//查询条件
IFeatureCursor pFeatureCursor = FeatureClass.Search(pQueryFilter, false);
IFeature pFeature = null;
//将要素放到集合中
while ((pFeature = pFeatureCursor.NextFeature()) != null)
{
DataCount++;
using (ComReleaser releaser = new ComReleaser())
{
releaser.ManageLifetime(pFeature);
DataRow dr = pResult.NewRow();
for (int i = 0; i < pResult.Columns.Count; i++)
{
object obj = pFeature.get_Value((int)pResult.Columns[i].ExtendedProperties["index"]);
if (obj == null)
{
continue;
}
else
{
if ((obj.ToString()).Contains("1899/12/30 0:00:00"))
{
obj = System.DBNull.Value;
}
}
//字符串时,去空格,对应bug10473
if (obj is string)
{
obj = obj.ToString().Trim();
}
if ((pResult.Columns[i] as DataColumn).DataType == typeof(Int32) && !(obj is Int32))
{
int TBBH;
if (int.TryParse(obj.ToString(), out TBBH))
{
dr[i] = obj;
}
}
else
{
dr[i] = obj;
}
}
pResult.Rows.Add(dr);
}
}
Marshal.ReleaseComObject(pFeatureCursor);
}
return DataCount;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 从当前的要素类中获取指定的要素对象
/// </summary>
/// <param name="OID">OID</param>
public ESRI.ArcGIS.Geodatabase.IFeature GetFeature(int OID)
{
return FeatureClass.GetFeature(OID);
}
/// <summary>
/// 添加要素到当前要素类
/// </summary>
/// <param name="pFeature">要素</param>
public bool AddFeature(ESRI.ArcGIS.Geodatabase.IFeature pFeature)
{
bool result = false;
IFeatureCursor cursor = null;
try
{
if (this.FeatureClass != null)
{
using (ComReleaser comReleaser = new ComReleaser())
{
IFeatureBuffer newFeature = this.FeatureClass.CreateFeatureBuffer();
comReleaser.ManageLifetime(newFeature);
IGeometry geo = pFeature.ShapeCopy;
//ITopologicalOperator2 topo = geo as ITopologicalOperator2;
//if (!topo.IsSimple)
// topo.Simplify();
newFeature.Shape = geo;// pFeature.ShapeCopy;
for (int i = 0; i < newFeature.Fields.FieldCount; i++)
{
IField field = newFeature.Fields.get_Field(i);
if (!field.Editable)
continue;
if (field.Name.ToUpper() == "SHAPE")
continue;
int index = pFeature.Fields.FindField(field.Name);
if (index == -1)
continue;
if (pFeature.Fields.get_Field(index).Type == field.Type)
{
newFeature.set_Value(i, pFeature.get_Value(index));
}
}
cursor = this.FeatureClass.Insert(true);
comReleaser.ManageLifetime(cursor);
object obj = cursor.InsertFeature(newFeature);
pFeature = newFeature as IFeature;
cursor.Flush();
//newFeature.Store();
result = true;
}
}
}
catch (Exception ex)
{
throw ex;
}
return result;
}
/// <summary>
/// 添加要素到当前要素类
/// </summary>
/// <param name="pFeature">要素</param>
public IFeature AddFeatureAndReturn(ESRI.ArcGIS.Geodatabase.IFeature pFeature)
{
IFeature result = null;
IFeatureCursor cursor = null;
try
{
if (this.FeatureClass != null)
{
IFeatureBuffer newFeature = this.FeatureClass.CreateFeatureBuffer();
IGeometry geo = pFeature.ShapeCopy;
ITopologicalOperator2 topo = geo as ITopologicalOperator2;
//if (!topo.IsSimple)
topo.Simplify();
newFeature.Shape = geo;// pFeature.ShapeCopy;
for (int i = 0; i < newFeature.Fields.FieldCount; i++)
{
IField field = newFeature.Fields.get_Field(i);
if (!field.Editable)
continue;
if (field.Name.ToUpper() == "SHAPE")
continue;
int index = pFeature.Fields.FindField(field.Name);
if (index == -1)
continue;
if (pFeature.Fields.get_Field(index).Type == field.Type)
{
newFeature.set_Value(i, pFeature.get_Value(index));
}
}
cursor = this.FeatureClass.Insert(true);
object obj = cursor.InsertFeature(newFeature);
cursor.Flush();
Marshal.ReleaseComObject(newFeature);
result = this.FeatureClass.GetFeature(Convert.ToInt32(obj));
//newFeature.Store();
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (cursor != null)
{
Marshal.ReleaseComObject(cursor);
}
}
return result;
}
/// <summary>
/// 添加要素到当前要素类
/// </summary>
/// <param name="pFeature">要素</param>
public bool AddFeature(List<K_Field> pDicData)
{
bool result = false;
IFeatureCursor cursor = null;
try
{
if (this.FeatureClass != null)
{
IFeatureBuffer newFeature = this.FeatureClass.CreateFeatureBuffer();
for (int i = 0; i < newFeature.Fields.FieldCount; i++)
{
IField field = newFeature.Fields.get_Field(i);
if (!field.Editable)
continue;
K_Field dicField = pDicData.FirstOrDefault(e => e.Name.ToUpper() == field.Name.ToUpper());
if (dicField != null)
{
if (dicField.Type == field.Type && !(dicField.Value is DBNull))
{
newFeature.set_Value(i, dicField.Value);
}
}
}
cursor = this.FeatureClass.Insert(true);
cursor.InsertFeature(newFeature);
cursor.Flush();
result = true;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (cursor != null)
{
Marshal.ReleaseComObject(cursor);
}
}
return result;
}
/// <summary>
/// 获取所有字段
/// </summary>
/// <returns></returns>
public List<K_Field> GetFields()
{
List<K_Field> result = new List<K_Field>();
try
{
if (this.FeatureClass != null)
{
for (int i = 0; i < this.FeatureClass.Fields.FieldCount; i++)
{
K_Field field = new K_Field() { Name = this.FeatureClass.Fields.get_Field(i).Name, AliasName = this.FeatureClass.Fields.get_Field(i).AliasName, Type = this.FeatureClass.Fields.get_Field(i).Type };
result.Add(field);
}
}
}
catch (Exception ex)
{
throw ex;
}
return result;
}
/// <summary>
/// 更新要素
/// </summary>
/// <param name="pFeature"></param>
/// <returns></returns>
public bool UpdateFeature(ESRI.ArcGIS.Geodatabase.IFeature pFeature)
{
bool result = false;
try
{
if (this.FeatureClass != null && pFeature != null && this.FeatureClass == pFeature.Class)
{
IFeature feature = GetFeature(pFeature.OID);
feature.Shape = pFeature.ShapeCopy;
for (int i = 0; i < feature.Fields.FieldCount; i++)
{
IField field = feature.Fields.get_Field(i);
if (field.Name.ToUpper() == "SHAPE")
continue;
int index = pFeature.Fields.FindField(field.Name);
if (index == -1)
continue;
if (pFeature.Fields.get_Field(index).Type == field.Type)
{
feature.set_Value(i, pFeature.get_Value(index));
}
}
feature.Store();
result = true;
}
}
catch (Exception ex)
{
throw ex;
}
return result;
}
/// <summary>
/// 从当前的要素类中删除指定的要素对象
/// </summary>
/// <param name="OID">OID</param>
public bool DelFeatures(int OID)
{
bool result = false;
try
{
if (this.FeatureClass != null)
{
IFeature feature = this.FeatureClass.GetFeature(OID);
feature.Delete();
feature.Store();
result = true;
}
return result;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 向当前要素类添加字段
/// </summary>
/// <param name="pFieldName">字段</param>
public bool AddField(ESRI.ArcGIS.Geodatabase.IField pField)
{
ISchemaLock pSchemaLock = FeatureClass as ISchemaLock;
try
{
if (pSchemaLock == null)
{
return false;
}
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
if (FeatureClass.Fields.FindField(pField.Name) == -1)
FeatureClass.AddField(pField);
return true;
}
catch (Exception ex)
{
throw ex;
}
finally
{
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
}
}
/// <summary>
/// 向当前要素类添加字段
/// </summary>
/// <param name="pFieldName">字段</param>
public bool AddField(string pFieldName, esriFieldType pFieldType, string pAliasName)
{
ISchemaLock pSchemaLock = FeatureClass as ISchemaLock;
try
{
if (pSchemaLock == null || string.IsNullOrWhiteSpace(pFieldName))
{
return false;
}
if (FeatureClass.Fields.FindField(pFieldName) == -1)
{
IFieldEdit field = new FieldClass();
field.Name_2 = pFieldName;
field.AliasName_2 = pAliasName;
field.Type_2 = pFieldType;
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
FeatureClass.AddField(field);
}
return true;
}
catch (Exception ex)
{
throw ex;
}
finally
{
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
}
}
/// <summary>
/// 重命名要素类
/// </summary>
/// <param name="newName">修改后的要素类名称</param>
public bool RenameFeatureClass(string newName)
{
bool renameResult = false;
ISchemaLock pSchemaLock = null;
try
{
if (this.FeatureClass == null)
{
return renameResult;
}
IDataset dataSet = (FeatureClass as IDataset);
if (dataSet != null && dataSet.CanRename())
{
pSchemaLock = FeatureClass as ISchemaLock;
if (pSchemaLock != null)
{
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
}
dataSet.Rename(newName);
return true;
}
return renameResult;
}
catch (Exception ex)
{
throw new Exception("重命名要素类(" + (FeatureClass as FeatureClass).BrowseName + "-" + newName + ")失败:" + ex.Message);
}
finally
{
if (pSchemaLock != null)
{
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
}
}
}
/// <summary>
/// 从当前要素类中删除指定的字段
/// </summary>
/// <param name="pFieldName">字段名称</param>
public bool DeleteField(string pFieldName)
{
ISchemaLock pSchemaLock = FeatureClass as ISchemaLock;
try
{
if (pSchemaLock == null)
return false;
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
int index = FeatureClass.FindField(pFieldName);
if (index == -1)
return true;
FeatureClass.DeleteField(FeatureClass.Fields.get_Field(index));
return true;
}
catch (Exception ex)
{
throw ex;
}
finally
{
pSchemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
}
}
/// <summary>
/// 将数据拷贝到目标要素类中
/// </summary>
/// <param name="pFc">目标要素类</param>
/// <param name="pFilter">过滤条件</param>
/// <param name="pIsCut">是否裁剪</param>
public bool FcToFc(IFeatureClass pFc, IQueryFilter pFilter, bool pIsCut)
{
IFeatureCursor S_Cursor = null;
IFeatureCursor T_Cursor = null;
try
{
if (FeatureClass == null || pFc == null) return false;
Dictionary<int, int> dicField = new Dictionary<int, int>();
for (int i = 0; i < pFc.Fields.FieldCount; i++)
{
IField field = pFc.Fields.Field[i];
if (field.Name == pFc.ShapeFieldName || field.Name.Contains(pFc.ShapeFieldName) || field.Name == pFc.OIDFieldName || !field.Editable) continue;
int index = FeatureClass.Fields.FindField(field.Name);
if (index == -1)
index = FeatureClass.Fields.FindFieldByAliasName(field.AliasName);
if (index == -1)
continue;
dicField.Add(i, index);
}
S_Cursor = FeatureClass.Search(pFilter, true);
IFeature f = null;
IFeatureBuffer buffer = pFc.CreateFeatureBuffer();
T_Cursor = pFc.Insert(true);
while ((f = S_Cursor.NextFeature()) != null)
{
buffer.Shape = f.ShapeCopy;
if (pFilter is ISpatialFilter && pIsCut)
{
if (FeatureAPI.IsInterSect((pFilter as ISpatialFilter).Geometry, f.ShapeCopy))
{
buffer.Shape = FeatureAPI.InterSect(f.ShapeCopy, (pFilter as SpatialFilterClass).Geometry);
}
else
{
continue;
}
}
foreach (int item in dicField.Keys)
{
buffer.Value[item] = f.Value[dicField[item]];
}
T_Cursor.InsertFeature(buffer);
}
T_Cursor.Flush();
return true;
}
catch (Exception)
{
throw;
}
}
}
}