0

I have a 2 layers enter image description here

I want to go through each red feature and test it against the blue layer(which will contain multiple features). The tests to carry out for each feature are:

  • Wholly Outside
  • Wholly outside but with a touching boundary
  • Crosses
  • Wholly inside but common boundary
  • Encloses
  • Wholly inside with no touching boundary

I have written the following code protected override void OnClick() {

        genericFunctions generic = new genericFunctions();
        IDataset StopUpDS = generic.getDatasets("suTest");
        IDataset HighwaysDS = generic.getDatasets("highwaysTest");


        //create featureclass for the stop up object
        IFeatureLayer StopUpFL = (IFeatureLayer)StopUpDS;
        IFeatureClass StopUpFC = StopUpFL.FeatureClass;

        //create featureclass for the highways object
        IFeatureLayer highwaysFL = (IFeatureLayer)HighwaysDS;
        IFeatureClass highwaysFC = highwaysFL.FeatureClass;


        IFeatureCursor StopUpCur = StopUpFC.Search(null, true);
        IFeature stopUpFeature = StopUpCur.NextFeature();


        while (stopUpFeature != null)
        {
            //zoom to feature
            IEnvelope env = stopUpFeature.Extent.Envelope;
            env.Expand(2.0, 2.0, true);
            mxdoc.ActiveView.Extent = env;
            mxdoc.ActiveView.Refresh();

            MessageBox.Show("");
            spatialVal(stopUpFeature, StopUpFC, highwaysFC, "****T****", "SHARES A BOUNDARY"); // SHARES A BOUNDARY

            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "F***F****", "WHOLLY OUTSIDE"); // WHOLLY OUTSIDE

            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "FFFFFFFF*", "WHOLLY OUTSIDE"); // WHOLLY OUTSIDE
            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "FF*FF****", "WHOLLY OUTSIDE"); // WHOLLY OUTSIDE
            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "F**F****", "DO NOT INTERSECT"); // DO NOT INTERSECT
            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "FFFTTTTTT", "WHOLLY OUTSIDE"); // WHOLLY OUTSIDE
            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "FFFFTFFF*", "WHOLLY OUTSIDE BUT COMMON BOUNDARY"); // WHOLLY OUTSIDE BUT COMMON BOUNDARY
            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "F***T****", "WHOLLY OUTSIDE BUT COMMON BOUNDARY"); // WHOLLY OUTSIDE BUT COMMON BOUNDARY
            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "TT*T*****", "CROSSES"); // CROSSES
            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "T***T****", "CROSSES"); // CROSSES
            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "T***T****", "WHOLLY INSIDE BUT COMMON BOUNDARY"); // WHOLLY INSIDE BUT COMMON BOUNDARY
            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "T***T****", "WHOLLY INSIDE BUT COMMON BOUNDARY"); // WHOLLY INSIDE BUT COMMON BOUNDARY
            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "T*T******","ENCLOSES" ); // ENCLOSES
            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "T*****T**", "WHAT WE NEED"); // WHAT WE NEED

            //spatialVal(stopUpFeature, StopUpFC, highwaysFC, "*********", "WHAT WE NEED"); // EVERYTHING SHOULD COME UP ONCE ONLY, WHICH IS DOES!!!!!



            stopUpFeature = StopUpCur.NextFeature();
        }

    }

    public void spatialVal(IFeature inFeature,IFeatureClass inFC,  IFeatureClass highwaysFC, string spatialDesc, string spatialTestType)
    {
        ISpatialFilter spaFil = new SpatialFilterClass();
        spaFil.Geometry = inFeature.Shape;
        spaFil.GeometryField =  highwaysFC.ShapeFieldName;
        spaFil.SpatialRel = esriSpatialRelEnum.esriSpatialRelRelation;
        //spaFil.SpatialRel = esriSpatialRelEnum.esriSpatialRelWithin;
        spaFil.SpatialRelDescription = spatialDesc;

        //query the results from the spatial filter

        IFeatureCursor geomCursor = inFC.Search(spaFil, true);
        IFeature geomFeat = geomCursor.NextFeature();
        while (geomFeat != null)
        {   
            DialogResult result = MessageBox.Show("WARNING! would you like to continue?", spatialTestType, MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
            if (result == DialogResult.No)
            {
                MessageBox.Show("You will need to fix the polygon before you can move it");
            }
            geomFeat = geomCursor.NextFeature();
        }
        mxdoc.ActiveView.Refresh();
    }

The problem that I am getting is that no matter what spatialDescription I am using, it always loops through each feature, for example using spatialVal(stopUpFeature, StopUpFC, highwaysFC, "****T****", "SHARES A BOUNDARY"); it will still show the warning message for the outer most polygon (the circle) even though it does not share a boundary with the blue layer it is also showing the warning message for the feature that is wholly in the blue area, but the boundary do not match.

I posted a similar'ish question as Spatial relationships that do not match, but i think this is a different problem, hence a new question.

1

Found the problem. I was not searching the correct layer with the spatialfilter. It should have been

IFeatureCursor geomCursor = highwaysFC.Search(spaFil, true);

not

IFeatureCursor geomCursor = inFC.Search(spaFil, true);`

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.