I have an ArcObjects project. In this project, FeatureClass Source (termed as fc_Source here) is compared with FeatureClass Target (termed as fc_Target). The general logic is described below:
1) Loop through fc_Source, get a feature, termed featureS.
2) Check if the featureS. exists (or overlaps with a feature in fc_Target.
3) If the return is true on 2), set featureS as fc_Source.NextFeature. If the return is false in 2), featureS will be inserted into fc_Target, and then set featureS as fc_Source.NextFeature till all of the features in fc_Sourceare looped through.
In 3)'s Inserting a feature into fc_Target, I got such problem: the feature inserted does carry the featureS values but NOT its right geometry. The inserted one's geometry is actually the NextFeature of fc_Source. The simplified related code is below.
What is wrong in my code? I do wish someone can point out. Thanks a LOT.
// Loop though fc_Source
featCursor = fc_Source.Search(qfQuery, true);
IFeature featureS = featCursor.NextFeature();
// Loop featureS though fc_Target. If found featureT != null; else Not Fount, featureT = null;
IFeature featureT = getFeature_GeometryCompare(featureS, fc_Target);
while ( featureS != null) {
if (featureT != null) {
...
} else {
featureT = Assign_TargetFeature(featureS, fc_Target);
featureT.Store();
}
featureS = featCursor.NextFeature();
}
// "Assign Geometry & Values"
IFeature Assign_TargetFeature(IFeature f_Source, IFeatureClass fc_Target) {
IFeature f_Target = fc_Target.CreateFeature();
f_Target.Shape = f_Source.Shape;
// Assign values
......
return f_Target;
}
I have solved this problem. The trick is that the .Store() CANNOT be used. The proper solution is using feature.Insert(true). My code is below:
IFeature InsertFeature(IFeature f_Source, IFeatureClass fc_Target) {
IFeature f = Assign_TargetFeature(f_Source, fc_Target ); // Assign values only
IFeatureBuffer pFeatureBuffer = (IFeatureBuffer )f;
IFeatureCursor pFeatureCursor = fc_Target.Insert(true);
pFeatureBuffer.Shape = f_Source.Shape;
pFeatureCursor.InsertFeature(pFeatureBuffer);
return (IFeature)pFeatureBuffer;
}
Thanks for your review.