ThinkGeo.com    |     Documentation    |     Premium Support

Instance not valid exception thrown for GetFeaturesNearestTo

Hi


I'm getting an exception thrown when I call QueryTools.GetFeaturesNearestTo 


Details below. Running v6.0.178.0. 


If checked IsValid - returned True.


I tried MakeValid - still crashed.


 


Works OK when I zoom into the map using box zoom. Fails when I quickly zoom in using ChangeScale.


 


Any ideas?


 


Here is the code:



Collection<Feature> features = featureLayer.QueryTools.GetFeaturesNearestTo(feature.ShapeFeature, 


GeographyUnit.Meter, 1, ReturningColumnsType.AllColumns);


 


Here is the error message:



24144: This operation cannot be completed because the instance is not valid. Use MakeValid to convert the instance to a valid instance. Note that MakeValid may cause the points of a geometry instance to shift slightly.


 


Here is the stack Trace:



   at Microsoft.SqlServer.Types.SqlGeometry.ThrowIfInvalid()


   at Microsoft.SqlServer.Types.SqlGeometry.STIntersects(SqlGeometry other)


   at ThinkGeo.MapSuite.Core.BaseShape.IntersectsCore(BaseShape targetShape)


   at ThinkGeo.MapSuite.Core.BaseShape.Intersects(BaseShape targetShape)


   at ThinkGeo.MapSuite.Core.PolygonShape.GetDistanceToCore(BaseShape targetShape, GeographyUnit shapeUnit, DistanceUnit distanceUnit)


   at ThinkGeo.MapSuite.Core.BaseShape.GetDistanceTo(BaseShape targetShape, GeographyUnit shapeUnit, DistanceUnit distanceUnit)


   at ThinkGeo.MapSuite.Core.FeatureSource.IBQ=(Collection`1 IRQ=, BaseShape IhQ=, GeographyUnit IxQ=, Int32 JBQ=)


   at ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesNearestToCore(BaseShape targetShape, GeographyUnit unitOfData, Int32 maxItemsToFind, IEnumerable`1 returningColumnNames)


   at ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesNearestTo(BaseShape targetShape, GeographyUnit unitOfFeatureSource, Int32 maxItemsToFind, IEnumerable`1 returningColumnNames)


   at ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesNearestTo(Feature targetFeature, GeographyUnit unitOfData, Int32 maxItemsToFind, IEnumerable`1 returningColumnNames)


   at ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesNearestTo(Feature targetFeature, GeographyUnit unitOfData, Int32 maxItemsToFind, ReturningColumnsType returningColumnNamesType)


   at ThinkGeo.MapSuite.Core.QueryTools.GetFeaturesNearestTo(Feature targetFeature, GeographyUnit unitOfData, Int32 maxItemsToFind, ReturningColumnsType returningColumnNamesType)


 


Cheers


Steve


 



Hi Steve, 



Thanks for your post! 



There are a couple of ways we could move forward with this issue. The first option is to have you update to the latest daily Development Build as we did make some modifications to our implementation of the SqlServerSpatial110.dll back on the December 6th. Note that this dll did not change, just our implementation of it as it relates to the GeometryLibrary. As this is easy to change I would first recommend swapping in at least the 6.0.210.0 version. 



If you still encounter this issue we will need to take a closer look at your data and see if indeed there is an Invalid shape. 



Let me know how the later version of the WPFEdition.dll and MapSuiteCore.dll work out.


Edit: You can get the latest Development Build of the WPF Desktop Edition from helpdesk.thinkgeo.com.



Hi Ryan 
  
 I tried 6.0.210.0 and it behaved the same. 
  
 I inserted code to check if the shape IsValid and also to always call MakeValid but the exception was still thrown. 
  
 I don’t believe that it is due to an invalid shape. If I zoom in using a zoom box it all works well. It does not work when I zoom in quickly using change scale. I zoom in so quickly that the map does not have a chance to draw completely before I zoom in again. Could it be something to do with the rapid zooming? 
  
 It will be very difficult for me to send you code to replicate this as the map is part of a larger system. 
  
 Cheers 
  
 Steve 


Hi Ryan 
  
 I reverted back to v6.0.0.0 and all works fine. So definitely nothing to do with bad shape data. Must be something to do with new Microsoft.SqlServer.Types.dll use. 
  
 Cheers 
  
 Steve

Hi Steve, 
  
 We upgraded the topology engine to Microsoft.SqlServer.Types after version 6.0.37.0, this one is more restrict than the old one (NTS), so there must be some invalid feature through using the method, as your project is hard to send, could you please provide some info of the featureLayer and the feature you want to GetNearestTo? 
  
 Thanks, 
 Edgar

I am having the same problem. My map will not load now with the newest version of 6.0.222. I also updated the Microsoft.SqlServer.Types.dll. And it will work if I go back to version 6.0. Not sure what to do now.

Hello TIM, 
  
 Thanks for your post, what’s the situation looks like in your side? How many overlays you have added to the map? Are all overlays can’t display or just some of them? Can you try to set the DrawingExceptionMode to ThrowException and see if any exception throwing out? 
  
 If you can provide some sample that we can recreate the problem, we can track the root cause. 
  
 Sorry for the inconvenience, 
  
 Regards, 
  
 Gary

 We are getting a similar problem when trying to make a selection from a SHAPE file. Error shown below: -


 


System.ArgumentException: "24144: This operation cannot be completed because the instance is not valid. Use MakeValid to convert the instance to a valid instance. Note that MakeValid may cause the points of a geometry instance to shift slightly."


 


   at Microsoft.SqlServer.Types.SqlGeometry.ThrowIfInvalid()


   at Microsoft.SqlServer.Types.SqlGeometry.STWithin(SqlGeometry other)


 


I attach a link to a SHP file we are trying to load, this is for the SE of England, we are trying to cut the data around London when the exception is thrown.  This is a new issue since updating our build from v6.0.


SHAPE FILE LINK


yousendit.com/download/UW15ak8rZDVCSnJFdzhUQw



Hello Dan, 
  
 Thanks for your post, because we changed the default geometry engine from NTS to SqlType, but SqlType has more strict conditional, so this exception throws because some of your shapes can not pass the SqlType validate. 
  
 You can switch back to NTS by using BaseShape.GeometryLibrary = GeometryLibrary.Managed at the beginning of your code. 
  
 Sorry for the inconvenience, 
  
 Regards, 
  
 Gary

Hi Gary, 
  
 By changing between NTS and SqlType, what other differences should we expect? 
  
 Thanks, 
  
 Dan

Hello Dan, 
  
 There isn’t any big difference between NTS and SqlType result, just SqlType has more strict conditional, so we are considering using the SqlType at MapSuite 7.0 
  
 Regards, 
  
 Gary

Hi Gary 
  
 What do you mean by "more strict conditional" ? I have been trying to fix this issue for 5 months. My customers data triggers this issue with the new geometry engine along with at least 2 other people in this thread. What should I be telling my customer to check for? 
  
 Cheers 
  
 Steve

 Hi guys,


 
Sorry for the delay, to see the stack trace of your exceptions, it must be caused by the upgrade of the shapes core in our development branch. After the major release 6.0.0.0, we integrated the SqlTypes as our default shape core. (It is used to be NTS, NettopolygySuite.) SqlTypes has better performance for converting between well known binary and shapes. Also its topology calculation is more accurate and much faster and some other advantages. This change improves performance of the entire mapsuite product line. 
 
But it also takes downside on another hand. SqlTypes has more restrict rules than our origanl NTS when doing topology calculations. For example, when using NTS, if one shape is invalid for some reason, such as ring clockwise etc, it won't throw exception, but SqlTypes won't take it. It throws exceptions directly. So causes the exception you met. 
 
I have two suggestions to workaround it.

 
1, We won't integrate this change into our release branch (version number is like 6.0.0.*) until the next major release. But it has all bug fixed. So it is a stable version to use. Please have a try.

 
2, If the development branch is required in your system, we have two static properties to switch back to our old shape core: NTS. Please copy the following properties to the method when the application starts. For example:


public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        Feature.GeometryLibrary = GeometryLibrary.Managed;
        BaseShape.GeometryLibrary = GeometryLibrary.Managed;
    }
}

 
"Managed" means the NTS, while "Unmanaged" means SqlTypes. Please try this one.
 
We will keep testing this new feature and make it stable in the near future.
 
Thanks,
Howard