/// <summary>
/// 将inFeatureClass要素类中所有符合pQueryFilter的要素复制到saveFeatureClass中,仅复制不做任何修改
/// </summary>
/// <param name="inFeatureClass">源要素类</param>
/// <param name="saveFeatureClass">存储要素类</param>
/// <param name="pQueryFilter">过滤参数</param>
/// <returns></returns>
public bool LoadFeatureClass(IFeatureClass inFeatureClass, IFeatureClass saveFeatureClass, IQueryFilter pQueryFilter)
{
//生成两个要素类字段的对应表
Dictionary<int, int> pFieldsDict = new Dictionary<int, int>();
this.GetFCFieldsDirectory(inFeatureClass, saveFeatureClass, ref pFieldsDict);
IFeatureCursor pinFeatCursor = inFeatureClass.Search(pQueryFilter, false);
long nCount = inFeatureClass.FeatureCount(pQueryFilter);
IFeature pinFeat = pinFeatCursor.NextFeature();
IFeatureCursor psaveFeatCursor = saveFeatureClass.Insert(true);
//使用IFeatureBuffer在内存中产生缓存避免多次打开,关闭数据库
IFeatureBuffer psaveFeatBuf = null;
IFeature psaveFeat = null;
long n = 0;
while (pinFeat != null)
{
try
{
psaveFeatBuf = saveFeatureClass.CreateFeatureBuffer();
psaveFeat = psaveFeatBuf as IFeature;
if (inFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)
{
IAnnotationFeature pAF = (IAnnotationFeature)pinFeat;
IAnnotationFeature pNAF = (IAnnotationFeature)psaveFeat;
if (pAF.Annotation != null)
{
pNAF.Annotation = pAF.Annotation;
}
}
psaveFeat.Shape = pinFeat.Shape;
foreach (KeyValuePair<int, int> keyvalue in pFieldsDict)
{
if (pinFeat.get_Value(keyvalue.Key).ToString() == "")
{
if (psaveFeat.Fields.get_Field(keyvalue.Value).Type == esriFieldType.esriFieldTypeString)
{
psaveFeat.set_Value(keyvalue.Value, "");
}
else
{
psaveFeat.set_Value(keyvalue.Value, 0);
}
}
else
{
psaveFeat.set_Value(keyvalue.Value, pinFeat.get_Value(keyvalue.Key));
}
}
psaveFeatCursor.InsertFeature(psaveFeatBuf);
}
catch (Exception ex) { }
finally
{
psaveFeat = null;
n++;
if (n % 2000 == 0)
{
psaveFeatCursor.Flush();
}
pinFeat = pinFeatCursor.NextFeature();
}
}
psaveFeatCursor.Flush();
return true;
}
//生成两个要素类字段的对应表
private void GetFCFieldsDirectory(IFeatureClass pFCold, IFeatureClass pFCnew, ref Dictionary<int, int> FieldsDictionary)
{
for (int i = 0; i < pFCold.Fields.FieldCount; i++)
{
string tmpstrold = pFCold.Fields.get_Field(i).Name.ToUpper();
switch (tmpstrold)
{
case "OBJECTID":
case "SHAPE":
case "SHAPE_LENGTH":
case "SHAPE_AREA":
case "FID":
{
//以上字段由系统自动生成
break;
}
default:
{
for (int j = 0; j < pFCnew.Fields.FieldCount; j++)
{
string tmpstrnew = pFCnew.Fields.get_Field(j).Name.ToUpper();
if (tmpstrold == tmpstrnew)
{
FieldsDictionary.Add(i, j);
break;
}
}
break;
}
}
}
}