ThinkGeo.com    |     Documentation    |     Premium Support

Side location conflict exception

Hi,


I'm receiving the following exception when I try to do a Spatial Query using the GetFeaturesContaining Method.  Below is the line of code and the exception and stack trace that is occurring.  Any ideas?


 


selectedFeatures = Policy_Layer.QueryTools.GetFeaturesContaining(e.Position, New String() {"MapFeatureID", "FieldName", "FSANumber", "Tract", "FieldNumber", "FSAAcres", "CalcAcres"})

 


{"side location conflict [ (-88.857531661291, 38.0894246955232, NaN) ]"}
 
Stack Trace:    at GisSharpBlog.NetTopologySuite.GeometriesGraph.EdgeEndStar.PropagateSideLabels(Int32 geomIndex)
   at GisSharpBlog.NetTopologySuite.GeometriesGraph.EdgeEndStar.ComputeLabelling(GeometryGraph[] geom)
   at GisSharpBlog.NetTopologySuite.Operation.Relate.RelateComputer.LabelNodeEdges()
   at GisSharpBlog.NetTopologySuite.Operation.Relate.RelateComputer.ComputeIM()
   at GisSharpBlog.NetTopologySuite.Operation.Relate.RelateOp.Relate(IGeometry a, IGeometry b)
   at GisSharpBlog.NetTopologySuite.Geometries.Geometry.Relate(IGeometry g)
   at GisSharpBlog.NetTopologySuite.Geometries.Geometry.Contains(IGeometry g)
   at ThinkGeo.MapSuite.Core.BaseShape.ContainsCore(BaseShape targetShape)
   at ThinkGeo.MapSuite.Core.FeatureSource.x50350872fb80508b(BaseShape xb513c0b05488b8ed, IEnumerable`1 x8ad42fcdfcf2a001)
   at ThinkGeo.MapSuite.Core.FeatureSource.SpatialQueryCore(BaseShape targetShape, QueryType queryType, IEnumerable`1 returningColumnNames)
   at ThinkGeo.MapSuite.Core.FeatureSource.SpatialQuery(BaseShape targetShape, QueryType queryType, IEnumerable`1 returningColumnNames)
   at ThinkGeo.MapSuite.Core.QueryTools.GetFeaturesContaining(BaseShape targetShape, IEnumerable`1 returningColumnNames)
   at Agriculture.Mapping_Policy.Map1_Click(Object sender, MapClickedEventArgs e) in C:\Inetpub\wwwroot\DsTEST\AgAdvantage\Mapping\Mapping_Policy.aspx.vb:line 5189
   at ThinkGeo.MapSuite.WebEdition.Map.OnClick(MapClickedEventArgs e)
   at ThinkGeo.MapSuite.WebEdition.Map.x3296715cc7992de2(String x055cc4f8164153bb)
   at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
 

Clint, 
  
 I think that’s because some features in Policy_Layer can not pass some NTS robustness test. Can you send that Policy_Layer data to us or can you loop through every features in Policy_Layer, call every shape’s Contains() method, and send us the WKT of that shape which failed? The code will be like this: 
   
 
                Policy_Layer.Open();
                Collection<Feature> features = Policy_Layer.QueryTools.GetAllFeatures(ReturningColumnsType.NoColumns);
                foreach (Feature feature in features)
                {
                    try
                    {
                        feature.GetShape().Contains(e.Position);
                    }
                    catch
                    {
                        // Get the WKT of that feature and send to us
                    }
                }
 
  
 Also, please let us know the NTS version (or the Map Suite version) you are using. 
  
 Thanks, 
  
 Ben 


Thanks Ben,


Attached is a spread sheet that contains all the WKT for the shapes in the Policy_Layer.  I'm currenlty using the last public release of the webedition (not the one that was released today :))

 


You may be right that I have some invalid shapes, because in my application I do some polygon splitting, the only seems to occur after I have done some splits and then select a shape by clicking on it. The clicking on the shape is when the spatial query happens and the error occurs.  In case it helps I have included my spliting logic below.


 


Try
                UserDrawnPolygon = DirectCast(Map1.EditOverlay.Features(0).GetShape(), PolygonShape)
                boolPolygon = True
            Catch ex As Exception
                Map1_SetToNormal()
                lblEditMessage.Text = "Cannot process a line. Must be a polygon shape or circle."
                If boolRecord_Events Then Credentials = New UserAuth("Mapping_Policy-Split-Error splitting field-not polygon shape")
                Return 'cannot process a non polygon shape
            End Try
            Dim MapFeature_New As New Entities.Map_FeatureEntity()
            
                Dim OriginalFeature As New Feature()
                OriginalFeature = varLayer.InternalFeatures(MapFeatureID.ToString())
 
                Dim Original_Polygon As New PolygonShape()
                Dim Original_MSPolygon As New MultipolygonShape()
                
    Dim featureType_Original As WellKnownType = OriginalFeature.GetWellKnownType
                If featureType_Original = WellKnownType.Multipolygon Then
                    Original_MSPolygon = DirectCast(OriginalFeature.GetShape(), MultipolygonShape)
                    Try
                        New_MultiPoliygonShape = Original_MSPolygon.GetIntersection(UserDrawnPolygon) ' split off portion
                    Catch ex As Exception
                        Map1_SetToNormal()
                        lblEditMessage.Text = "Cannot split off a polygon: " & ex.Message
                        Return 'cannot split off a polygon that does not intersect
                    End Try
                    If Not Classes.Utility_Class.My_IsNull(New_MultiPoliygonShape) Then 'no intersection between the shapes
                        Try
                            ModifiedPolygon = Original_MSPolygon.GetDifference(New_MultiPoliygonShape) ' original shape less split off shape
                        Catch ex As Exception
                            Map1_SetToNormal()
                            lblEditMessage.Text = "Cannot split off a polygon: " & ex.Message
                            Return 'cannot split off a polygon that does not intersect
                        End Try
                    Else
                        Map1_SetToNormal()
                        lblEditMessage.Text = "Cannot split off a polygon that does not intersect with selected field."
                        Return 'cannot split off a polygon that does not intersect
                    End If

 


 



The discussion forum wouldn't allow me to upload a spread sheet so I have put it in a text file instead and attached it here.


Thanks


 



707-PolicyShapes.txt (5.24 KB)

Clint,


We checked the shapes and found one of them causes this exception.


Here is the code:

shape.Contains(new PointShape(-88.8642985763325, 38.094278050185949));


And here is the WKT of that shape

MULTIPOLYGON(((-88.8574667110748 38.0960798813525,-88.8574519487482 38.0950027495679,-88.8574408709309 38.0941945199645,-88.8574403628712 38.094156886488,-88.8574325327938 38.0935854667012,-88.857531661291 38.0894246955232,-88.8619254406233 38.0893780284863,-88.8619229929768 38.0914384825302,-88.8619226054518 38.0917696563867,-88.8619218846035 38.0923766178324,-88.862976767988 38.0923669315016,-88.8642259080969 38.0923554597991,-88.8650882659444 38.0923475299523,-88.8651926298372 38.0925002778122,-88.8655836552002 38.0928873801234,-88.8659209228984 38.0932418568538,-88.8661876914829 38.093530505349,-88.86638140595 38.0936529504132,-88.8664800757217 38.0937027128046,-88.8665168340544 38.0959991318969,-88.8574667110748 38.0960798813525),(-88.857531661291 38.0894246955232,-88.8574732524388 38.0918763201884,-88.8603686351632 38.0893945635675,-88.857531661291 38.0894246955232)))


The shape is a polygon with one outer ring and one inner ring. As in the following graph, red part is the outer ring and the blue one is the inner ring.   You can see the inner ring and outer ring are sharing some edges and the point is within the polygon.



I'm not sure why NTS cannot deal with this kind of polygon, we will report it as a bug to NTS guys and see if it's a bug. Thanks for letting us know this problem and we will let you know if we get some result.


Thanks,


Ben



Ben,


Did you ever get a response or information regarding NTS and this issue? I have just encountered this issue with some of the TigerLine data (IN105ctycu.shp recieved in data provided by ThinkGeo). I have ArcGIS 10 but am not familiar enough to understand how I would fix this as it displays fine in my application and in ArcMap.


Can you provide any help?


Thanks.


David



David, 
  
 As the Ben mentioned the problem is from the NTS calculation, but I would like to ask you about the multipolygon shape, it seems the polygon shape is incorrect and the NTS cannot deal with an incorrect polygon shape, the inner ring and outer ring shared some common edges, if I removed the inner ring from your shape file and process the Contains operation, it worked fine! 
  
 Please make sure your polygon shape has the correct format and try again, 
  
 Thanks, 
  
 Scott,

Scott, 
 I understand that there is an incorrect polygon shape. How would I correct this? Is there a way to programatically detect and remove the inner ring causing the problem, or is that something I have to do manually - and if so, how? 
  
 Thanks, 
 David

David,


Sorry for the inconvenient, as so far we don't have a simple way to detect the inner ring that caused the problem, for your application, you can use the following code to remove the incorrect inner ring and deal with the contains operation correctly:


 



   MultipolygonShape multiPoly = new MultipolygonShape();
            try
            {
                multiPoly = new MultipolygonShape("MULTIPOLYGON(((-88.8574667110748 38.0960798813525,-88.8574519487482 38.0950027495679,-88.8574408709309 38.0941945199645,-88.8574403628712 38.094156886488,-88.8574325327938 38.0935854667012,-88.857531661291 38.0894246955232,-88.8619254406233 38.0893780284863,-88.8619229929768 38.0914384825302,-88.8619226054518 38.0917696563867,-88.8619218846035 38.0923766178324,-88.862976767988 38.0923669315016,-88.8642259080969 38.0923554597991,-88.8650882659444 38.0923475299523,-88.8651926298372 38.0925002778122,-88.8655836552002 38.0928873801234,-88.8659209228984 38.0932418568538,-88.8661876914829 38.093530505349,-88.86638140595 38.0936529504132,-88.8664800757217 38.0937027128046,-88.8665168340544 38.0959991318969,-88.8574667110748 38.0960798813525),(-88.857531661291 38.0894246955232,-88.8574732524388 38.0918763201884,-88.8603686351632 38.0893945635675,-88.857531661291 38.0894246955232)))");
                multiPoly.Contains(new PointShape(-88.8642985763325, 38.094278050185949));
            }
            catch
            {
                foreach (PolygonShape polygon in multiPoly.Polygons)
                {
                    if (polygon.InnerRings.Count > 0)
                    {
                        polygon.InnerRings.Remove(polygon.InnerRings[0]);
                    }
                }
            }
            finally
            {
                multiPoly.Contains(new PointShape(-88.8642985763325, 38.094278050185949));
            }
I have tested it, the code above can be used as a workaround in your application, If you still have any other questions please let us know,


Thanks,


Scott,



Scott, 
 Thank you. That is exactly the help I needed. I’ve been able to adapt this and it works great. 
  
 David

David, 
  
 You are welcome, if you still have any other questions please let me know again, 
  
 Thanks, 
  
 Scott,