Right now I am working on searching a layer by layers. I have 3 different searches I need to implement.
1. Search 2 layers to see if any features on the second layer are within a feature on the first layer. For example: How many points from layer 2 are within a polygon on layer 1
2, Search 2 layers to see if any features on the second layer are within a given distance of the border of a feature on layer 1. For example: How many points from layer 2 are within 5 feet inside or out of the parameter of a polygon from layer 1
3. Search 2 layers so see if any features on the second layer are outside a feature on the first layer within a certain distance. For example: How many points from layer 2 are outside the selected polygon on layer 1 up to 20 feet.
I have the first one working, see the code below. But I cannot get the second or third queries to work. When I change the selected feature to use esriLayerSelectWithinADistance it will crash when using a polygon layer as the from layer and a point layer as the by layer. Any ideas how I could implement this?
public static ICollection<int> SelectCompletelyContains([NotNull] ILayer fromLayer,
[NotNull] IEnumerable<ILayer> byLayers,
[CanBeNull] IGeometry spatialFilterGeometry)
IFeatureLayer fromFeatureLayer = (IFeatureLayer)fromLayer;
// Set up the query by layer ...
IQueryByLayer queryByLayer = new QueryByLayerClass();
queryByLayer.FromLayer = fromFeatureLayer;
queryByLayer.LayerSelectionMethod = esriLayerSelectionMethod.esriLayerSelectCompletelyWithin;
queryByLayer.UseSelectedFeatures = (null != spatialFilterGeometry);
queryByLayer.ResultType = esriSelectionResultEnum.esriSelectionResultNew;
ISelectionSet selectionSet = null;
HashSet<int> objectIds = new HashSet<int>();
foreach (ILayer byLayer in byLayers)
IFeatureLayer byFeatureLayer = (IFeatureLayer)byLayer;
// Save the current selection set for the by feature layer, so it can be restored later ...
IFeatureSelection byFeatureSelection = (IFeatureSelection)byFeatureLayer;
ISelectionSet savedByFeatureSelectionSet = byFeatureSelection.SelectionSet;
// Clear any selected features prior to performing the spatial query on the by feature layer ...
if (null != spatialFilterGeometry)
// Perform a spatial query on the by feature layer to obtain features in the view extent ...
byFeatureSelection = ApplySpatialFilter(byFeatureLayer, spatialFilterGeometry);
// Set up the query by layer to use the current by feature layer ...
queryByLayer.ByLayer = byFeatureLayer;
ISelectionSet tempSelectionSet = queryByLayer.Select();
if (null == selectionSet)
// First time ...
selectionSet = tempSelectionSet;
queryByLayer.ResultType = esriSelectionResultEnum.esriSelectionResultAdd;
selectionSet.Combine(tempSelectionSet, esriSetOperation.esriSetUnion, out resultSet);
selectionSet = resultSet;
// Restore previous selection set for the by feature layer.
if (savedByFeatureSelectionSet != null)
byFeatureSelection.SelectionSet = savedByFeatureSelectionSet;
IEnumIDs enumIDs = selectionSet.IDs;
while ((id = enumIDs.Next()) != -1)
Thank you in advance for your time.