ThinkGeo.com    |     Documentation    |     Premium Support

How to tell if a point is in a polygon?




I want to know if a user has clicked on a shape I created. The shape is a polygon that has been added to a InMemoryFeatureLayer. So I get the shape. Convert the mouse point to PointShape take the corrdinates then check it with bs.Intersects(FS) and 

I get an exception Topology Exception  --> side location conflict [ (3921.43070409655, -755.548243954933, NaN) ] 

HUH????


Here is a code snipet


// Get Shape

bs = InMem.InternalFeatures[zz].GetShape();


// Convert Mouse Point to world coordinates

Feature FS; 

ScreenPointF S = new ScreenPointF((float)pt.X, (float)pt.Y);

PointShape PS = ExtentHelper.ToWorldCoordinate(winformsMap1.CurrentExtent, S, winformsMap1.Width, winformsMap1.Height);


// make it a Feature so I can compare

string Point = "POINT(" + PS.X.ToString() + " " + PS.Y.ToString() + ")";

FS = new Feature(Point); 

 

//Do the compare Exception ???

if (bs.Intersects(FS))




I do something similar in my program and I think you want to use the Contains method instead of the Intersects method so something like 
  
 if( bs.Contains(FS) ) 
      // do stuff 
  
 hope this helps

Thanks Andy. I forgot to mention I tried Contains first.  Same thing.  
 Now I have to add that bs contains a mulipoint polygon with an inner and outer area.  Maybe that has something to do with it?

I suspect that the polygon is geometrically inconsistent. We allow drawing those polygons but if you try a geometric function, an exception will occur. Can you please send us the WKT expression of that polygon? Thank you.

Here ya go.  
 POINT(3495.67619587057 -775.916727113716) 
  
 MULTIPOLYGON(((3497.833284 -749.900146,3526.657773 -800.230542,3517.135247 -805.684144,3488.310759 -755.353748,3497.833284 -749.900146),(3497.583284 -750.150146,3488.060759 -755.603748,3516.885247 -805.934144,3526.407773 -800.480542,3497.583284 -750.150146)))

Bob,


Thanks for your input.
 
We found that the Multipolygon is not a standard polygon, the inner ring of the polygon exceed the boundary of the outer ring of the polygon, which seems not correct. Following screenshots shows you this.
 

 
Any more questions please feel free to let me know.
 
Thanks.


Yale

Thanks Yale that makes sense.  


Problem…  Far as I can tell this point is inside this polygon.  
 POINT 
 (3031.77373386707 -784.797580327142) 
  
 "MULTIPOLYGON(((3017.291636 -749.900149,3046.116124 -800.230545,3036.593598 -805.684147,3007.76911 -755.353751,3017.291636 -749.900149), 
 (3017.041636 -750.150149,3008.01911 -755.603751,3036.843598 -805.434147,3045.866124 -799.980545,3017.041636 -750.150149)))"  
 So I am a bit confused. The BaseShape which is this MULTIPOLYGON should contian the feature shape FS which is POINT(3031.77373386707 -784.797580327142) 
 So  
 if(bs.Conatains (FS)) 
 { 
  …  
 }   
 should return true ? 


Your MultipolygonShape is has two rings, one outer ring and one inner ring (the hole). So basically, it is like a doughnut shape. The point you are doing the spatial query on falls in the inner ring (the hole) as you can see in the screen shot. So the result is correct. Now, you may want to know if the point falls in the hole itself. If this is what you want , let us know and we will provide you a solution. But rest asure that the result is correct.




I get it… Not the answer I wanted but I get it.

Ok. Any other way we can help you, let us know.

Yeah get me a new brain…

Thanks for the help, Val!

I let everybody know that today we published a project, Inner Ring Containment, in the Code Community on that subject.


code.thinkgeo.com/projects/s...ontainment