ThinkGeo.com    |     Documentation    |     Premium Support

MultipolygonShape.Contains()

Hi there.


I've been having a play with the Desktop Eval Version 3.0, and for the life of me can't get this (seemingly simple) thing to work.


I have a MultiPolygonShape object which may contain 1 or more PolygonShape objects.


Now, I'm trying to look through a collection of PointShape's (2500 of them), and identify which fall within the MultiPolygonShape region.


 


The function MultiPolygonShape.Contains(PointShape) seems like the obvious thing to use, but I can't get it to return anything at all. It's meant to return a bool, but I'm not getting true/false back. Same goes for some other functions I've tried (IsWithin(), Crosses(), Intersects(), etc).


I've confirmed that correct values are in each shape object, and I don't seem to get any error messages.


My first thought was that maybe the eval version limits this? But from looking around on the web it seems this isn't the case.


 


Any ideas what may be causing this?


 


Thanks in advance!



Michael,


Thanks for your post.


I am not sure why you don't want to use bool to check if a polygon contains a pointShape, but I think it's a good way to do it.


Collection<PointShape> result = new Collection<PointShape>();
            foreach (PointShape pointShape in pointShapes)
            {
                if (pointShape.IsWithin(multipolygonShape))
                {
                    result.Add(pointShape);
                }
            }

There is another way maybe look like more professional way but actual not good:


InMemoryFeatureLayer layer = new InMemoryFeatureLayer();
            foreach (PointShape pointShape in pointShapes)
            {
                layer.InternalFeatures.Add(new Feature(pointShape));
            }
            Collection<Feature> features = layer.QueryTools.GetFeaturesWithin(multipolygonShape, ReturningColumnsType.NoColumns);
            foreach (Feature feature in features)
            {
                result.Add((PointShape)feature.GetShape());
            }

Please let me know if you misundestand.


Thanks


James



Micheal, 
  
 If you still can not solve your problem, please provide the sample data to us. The MultiPolygonShape and just one of PointShapes which will stop to cause your problem. The best way is send the wellknown text to us, you can call GetWellKnownText() method of any shapes. 
  
 Thanks 
 James

Hi James,


Thanks for the quick reply.


The issue isn't that I don't want to use bool, it's that I don't seem to be able to. The functions that I'm trying to use (Contains(), IsWithin(), Crosses(), Intersects(), etc) just don't seem to return anything, which doesn't make sense to me!


The first method that you posted is the one I've been trying, with no success.


I'll give the second method a shot shortly and let you know how it goes. If still no luck I'll post the shapes and hopefully we can see what's going on.


Thanks again.



Michael,


You need to define a bool variable and equal to IsWithin(), such like code below:

bool result = pointShape.IsWithin(multipolygonShape);
the result variable is the return value, if you think the value of it is default, not return from IsWithin(), you can define a object myObject, the default value set to null, and after call method it will fill things.

Object myObject = null;
            myObject = pointShape.IsWithin(multipolygonShape);
            if (myObject == null)
            {
                Debug.WriteLine("don't return anything");
            }
            else
            {
                Debug.WriteLine("return something");
            }

thanks

James



Hi James,


Thanks, storing the result in a temporary Object seems to let me view the return result. Now the issue is that all my results seem to be false when doing:


MultipolygonShape.Contains(PointShape);


 


 


Here is an example of the MultiPolygonShape:


MULTIPOLYGON(((142.8662109375 -36.65087890625,142.8662109375 -36.15087890625,142.8662109375 -35.65087890625,142.8662109375 -35.15087890625,142.8662109375 -34.65087890625,143.3662109375 -34.65087890625,143.8662109375 -34.65087890625,144.3662109375 -34.65087890625,144.8662109375 -34.65087890625,145.3662109375 -34.65087890625,145.8662109375 -34.65087890625,146.3662109375 -34.65087890625,146.8662109375 -34.65087890625,147.3662109375 -34.65087890625,147.8662109375 -34.65087890625,148.3662109375 -34.65087890625,148.8662109375 -34.65087890625,148.8662109375 -35.15087890625,148.8662109375 -35.65087890625,148.8662109375 -36.15087890625,148.8662109375 -36.65087890625,148.8662109375 -37.15087890625,148.3662109375 -37.15087890625,147.8662109375 -37.15087890625,147.3662109375 -37.15087890625,146.8662109375 -37.15087890625,146.3662109375 -37.15087890625,145.8662109375 -37.15087890625,145.3662109375 -37.15087890625,144.8662109375 -37.15087890625,144.3662109375 -37.15087890625,143.8662109375 -37.15087890625,143.3662109375 -37.15087890625,142.8662109375 -37.15087890625,142.8662109375 -36.65087890625)))


 


and a point that I know should lie within that region:


POINT(146.89999 -36.1 )


Any ideas?


Thanks for the help so far!


 


 



Oh dear, I figured it out :x


For some reason a large portion of PointShape's had their longitude/latitude reversed. All fixed now!


 


Thanks for the help James!



Michael, 
  
 I am glad you solve your problem, I also just want to let you know the test result is true. 
             BaseShape shape = BaseShape.CreateShapeFromWellKnownData("MULTIPOLYGON(((142.8662109375 -36.65087890625,142.8662109375 -36.15087890625,142.8662109375 -35.65087890625,142.8662109375 -35.15087890625,142.8662109375 -34.65087890625,143.3662109375 -34.65087890625,143.8662109375 -34.65087890625,144.3662109375 -34.65087890625,144.8662109375 -34.65087890625,145.3662109375 -34.65087890625,145.8662109375 -34.65087890625,146.3662109375 -34.65087890625,146.8662109375 -34.65087890625,147.3662109375 -34.65087890625,147.8662109375 -34.65087890625,148.3662109375 -34.65087890625,148.8662109375 -34.65087890625,148.8662109375 -35.15087890625,148.8662109375 -35.65087890625,148.8662109375 -36.15087890625,148.8662109375 -36.65087890625,148.8662109375 -37.15087890625,148.3662109375 -37.15087890625,147.8662109375 -37.15087890625,147.3662109375 -37.15087890625,146.8662109375 -37.15087890625,146.3662109375 -37.15087890625,145.8662109375 -37.15087890625,145.3662109375 -37.15087890625,144.8662109375 -37.15087890625,144.3662109375 -37.15087890625,143.8662109375 -37.15087890625,143.3662109375 -37.15087890625,142.8662109375 -37.15087890625,142.8662109375 -36.65087890625)))"); 
             BaseShape shape1 = BaseShape.CreateShapeFromWellKnownData("POINT(146.89999 -36.1 )"); 
             bool result = shape.Contains(shape1); 
  
 Let me know when you have more questions. 
 James