ITopologicalOperator2 pTopOp = pFeature.ShapeCopy as ITopologicalOperator2; IGeometry differenceGeometry = pTopOp.Difference(pSegment); pTopOp = differenceGeometry as ITopologicalOperator2; pTopOp.IsKnownSimple_2 = false; pTopOp.Simplify(); pFeature.Shape = pTopOp as IGeometry; pFeature.Store();[/INDENT]
IMxDocument itfMxDoc;
IMap pmap;
IFeatureCursor itfCursor1;
IFeatureCursor itfCursor2;
IFeature itfFeature1;
IFeature itfFeature2;
IFeatureLayer pflayer1;
IFeatureLayer pflayer2;
itfMxDoc = m_application.Document as IMxDocument;
pmap = itfMxDoc.FocusMap;
pflayer1 = GetLayerByName("Shp1");
IFeatureSelection pFlSelection = pflayer1 as IFeatureSelection;
// get index from selected feature
//but I will not select anything
IEnumIDs itfListId = pFlSelection.SelectionSet.IDs;
itfListId.Reset();
int Index = itfListId.Next();
itfFeature1 = pflayer1.FeatureClass.GetFeature(Index);
// get your buffer
ITopologicalOperator pTopo = itfFeature1.ShapeCopy as ITopologicalOperator;
IPolygon pPolygon = pTopo.Buffer(1) as IPolygon;
pflayer2 = GetLayerByName("Shp2");
ISpatialFilter itfFilter;
itfFilter = new SpatialFilter();
itfFilter.Geometry = pPolygon as IGeometry;
itfFilter.GeometryField = pflayer2.FeatureClass.ShapeFieldName;
itfFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelEnvelopeIntersects;
// get your points inside your buffer
itfCursor2 = pflayer2.FeatureClass.Search(itfFilter, false);
itfFeature2 = itfCursor2.NextFeature();
// Loop for each point in your buffer
while (itfFeature2 != null)
{
// Get feature id from each feature to select later.
itfFeature2 = itfCursor2.NextFeature();
}//before loop int equalFieldCount = 0; // in the loop bool equal = Object.Equal(pfeature1.getValue(i), pfeature2.getValue(i)) if(equal)[INDENT] equalFieldCount++; [/INDENT]// after loop bool allFieldsAreEqual = false; if(pfeature.fields.fieldsCount - "numberOfGeometryFields" == equalFieldCount)[INDENT] allFieldsAreEqual = true; [/INDENT]pSegment is any geometry object polygon, line, point.
public override void OnClick()
{
IFeatureLayer pflayer1;
IFeatureLayer pflayer2;
IFeature featureA;
IFeature featureB;
pflayer1 = GetLayerByName("Shape1");
IFeatureSelection p1FlSelection = pflayer1 as IFeatureSelection;
int[] idList = GetFidList(@"D:\ShapeFile1").ToArray();
IFeatureCursor feature1Cursor = pflayer1.FeatureClass.GetFeatures(idList, false);
featureA = feature1Cursor.NextFeature();
pflayer2 = GetLayerByName("Shape2");
int[] oidList = GetFidList(@"D:\ShapeFile1").ToArray();
IFeatureCursor feature2Cursor = pflayer2.FeatureClass.GetFeatures(oidList, false);
featureB = feature2Cursor.NextFeature();
List<int> fidList = new List<int>();
while (featureA != null)
{
while (featureB != null)
{
string risultato = FeaturesEqual(featureA, featureB);
if (!String.IsNullOrEmpty(risultato))
fidList.Add(Convert.ToInt32(risultato));
featureB = feature2Cursor.NextFeature();
}
feature2Cursor = pflayer2.FeatureClass.GetFeatures(oidList, false);
featureB = feature2Cursor.NextFeature();
feature1Cursor = pflayer1.FeatureClass.GetFeatures(idList, false);
featureA = feature1Cursor.NextFeature();
}
//At this point it stops and leaves
string elenco = String.Empty;
foreach (int numero in fidList)
{
elenco += numero + ",";
}
elenco = elenco.Trim(',');
IMap pMap = m_hookHelper.FocusMap;
IActiveView pActiveView = (IActiveView)m_hookHelper.FocusMap;
string where = "FID IN (" + elenco + ")";
SelectMapFeaturesByAttributeQuery(pActiveView, pflayer1, where);
}
//Compare Features
//temporarily I consider only attribute compare and not geometry
public string FeaturesEqual(IFeature pFeatureA, IFeature pFeatureB)
{
// attribute equal test
int diffCount = 0;
for (int i = 2; i < pFeatureA.Fields.FieldCount; i++)
{
string valore1 = pFeatureA.get_Value(i).ToString();
string valore2 = pFeatureB.get_Value(i).ToString();
bool equal = ESRI.ArcGIS.Geodatabase.Object.Equals(pFeatureA.get_Value(i), pFeatureB.get_Value(i));
if (!equal)
{
diffCount++;
}
if (diffCount > 0)
return pFeatureA.OID.ToString();
}
return String.Empty;
//// geometry equal test
//IArea pAreaA = pFeatureA.Shape as IArea;
//IArea pAreaB = pFeatureB.Shape as IArea;
//if (pAreaA.Area != pAreaB.Area)
//{
// diffCount++;
//}
//if (diffCount > 0)
//{
// return false;
//}
//return true;
}
public static List<int> GetFidList(string path)
{
List<int> fidList = new List<int>();
String shapefileStringTemplate =
"Provider=ESRI.GeoDB.OleDB.1;Data Source={0};" +
"Extended Properties=workspacetype=esriDataSourcesFile.ShapefileWorkspaceFactory.1;Geometry={1}";
String connectionString = String.Format(shapefileStringTemplate, path,
"Fabbricati");
OleDbConnection myOleDbConnection = new OleDbConnection(connectionString);
OleDbCommand command = myOleDbConnection.CreateCommand();
command.CommandType = CommandType.Text;
command.CommandText = String.Format(@"SELECT FID FROM FABBRICATI");
try
{
myOleDbConnection.Open();
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read() == true)
{
fidList.Add(
Convert.IsDBNull(reader["FID"]) ? 0 : Convert.ToInt32(reader["FID"])
);
}
reader.Close();
return fidList;
}
catch (Exception)
{
throw;
}
finally
{
if (myOleDbConnection.State != ConnectionState.Closed)
myOleDbConnection.Close();
}
}