Hi everyone,I am writing an stand alone C# application and I am having a performance issue. The following code was converted from VBA literally line by line. I am doing a spatial query between two layers. The VBA code runs in between 10 and 15 minutes. The C# code below takes just over 3 hours to do the same query on the same layers as the VBA code. The code below doesn't even start ArcMap, just accesses things directly. I also tried changing the code a bit to start ArcMap in code and then run the code but it still takes the same amount of time.Obviously, I am missing something/doing something wrong but I can't figure it out. Anyone have any ideas?Thanks,Carlospublic static void AppsInBoundary()
{
try
{
IFeatureLayer pAppLayer = null;
IFeatureLayer pEnsLayer = null;
IFeatureCursor pEvgCursor = null;
IFeatureCursor pAppCursor = null;
IFeature pAppFeature = null;
IFeature pEnsFeature = null;
IArea pFeatureArea;
int featureCount = 0;
int appFieldIndex = 0;
string geometryFieldName = string.Empty;
//Get a reference to the two layers involved in the query.
pAppLayer = GetLayerReference("FILEGDB", "App_Merge", Scratch_Local + "temp.gdb", null) as IFeatureLayer;
pEnsLayer = GetLayerReference("SDE", "RIM.HYHDB_BSN_EVRGLDS_AREA", null, "gerrpsde") as IFeatureLayer;
//Make sure layers being queried have the same projection.
//Otherwise, topological operations later in the code (DetermineOverlapArea) fail.
SpatialReferenceCheck(pAppLayer, pEnsLayer);
//Find index of app no field in app_merge layer so query can run faster.
appFieldIndex = pAppLayer.FeatureClass.FindField("APP_NO");
//Select only polygons that have a basin name.
IQueryFilter pEnsQueryFilter = new QueryFilterClass();
pEnsQueryFilter.WhereClause = "basin_name <> ' '";
pEvgCursor = pEnsLayer.Search(pEnsQueryFilter, true);
pEnsFeature = pEvgCursor.NextFeature();
ISpatialFilter pAppSpatialFilter = new SpatialFilterClass();
while (pEnsFeature != null)
{
m_Label = pEnsFeature.get_Value(pEnsFeature.Fields.FindField("BASIN_NAME")).ToString();
pAppSpatialFilter.Geometry = pEnsFeature.Shape;
pAppSpatialFilter.GeometryField = "Shape";
pAppSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
pAppCursor = pAppLayer.Search(pAppSpatialFilter, true);
pAppFeature = pAppCursor.NextFeature();
while (pAppFeature != null)
{
if (pAppFeature.get_Value(appFieldIndex) != DBNull.Value)
{
m_AppNo = Convert.ToString(pAppFeature.get_Value(appFieldIndex));
pFeatureArea = pAppFeature.Shape as IArea;
m_AppArea = pFeatureArea.Area;
//Set relation type, in or adjacent.
if (DetermineOverlapArea(pAppFeature, pEnsFeature) == true)
m_Relation = "AI"; //Application In
else
m_Relation = "AA"; //Application Adjacent
//If app_no is not null, proceed, otherwise skip it.
if (m_AppNo != "")
{
//Check if app status is "no response", if it is not, proceed.
if (AppStatusCheck(m_AppNo) == true)
{
GetAppInfo(m_AppNo);
PopAppCmgenTables(m_AppNo, m_Relation);
}
}
pAppFeature = pAppCursor.NextFeature();
//Clear values.
m_AppNo = string.Empty;
m_AppArea = 0;
} //APP_NO != DBNull.Value
} //pAppFeature != null
pEnsFeature = pEvgCursor.NextFeature();
//Clear values.
m_AppNo = string.Empty;
m_Relation = string.Empty;
m_Label = string.Empty;
} //pEnsFeature != null
}
catch (Exception ex)
{
LogError(ex.StackTrace, ex.Message, "AppsInBoundary", null);
}
}
internal static ILayer GetLayerReference(string layerType, string featureClassName, string path, string serverName)
{
try
{
IWorkspaceFactory pWorkspaceFactory = null;
IFeatureWorkspace pFeatureWorkspace = null;
IFeatureClass pFeatureClass = null;
if (layerType == "SDE")
{
IPropertySet pPropertySet = new PropertySetClass();
pPropertySet = GetSdePropertySet(serverName, null);
pWorkspaceFactory = new SdeWorkspaceFactoryClass();
pFeatureWorkspace = pWorkspaceFactory.Open(pPropertySet, 0) as IFeatureWorkspace;
}
else if (layerType == "FILEGDB")
{
pWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(path, 0) as IFeatureWorkspace;
}
else if (layerType == "PGDB")
{
pWorkspaceFactory = new AccessWorkspaceFactoryClass();
pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(path, 0) as IFeatureWorkspace;
}
pFeatureClass = pFeatureWorkspace.OpenFeatureClass(featureClassName);
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureClass;
return pFeatureLayer;
}
catch (Exception ex)
{
LogError(ex.StackTrace, ex.Message, "GetGroupLayer", null);
return null;
}
}