ThinkGeo.com    |     Documentation    |     Premium Support

Shape : Validate test

Hi, 


 
In my application I'm trying to test if a feature is valid or not.
So before recording the feature, I do that :  
 
Example : 
 Feature ee = new Feature(wpfMap1.EditOverlay.EditShapesLayer.InternalFeatures[0].GetShape());
ShapeValidationResult result = ee.GetShape().Validate(ShapeValidationMode.Advanced);      
 
The feature has the shape (ie. PolygonButterfly.png) and so the result of the test should be false because when you record this kind of shape in Sql server 2008, this geometry is not valid (Shape.STIsValid()). 
But the result of the test is true.
 
So my first question is what is the test behind "ShapeValidationMode.Advanced" ?
How to have an invalid result with a butterfly feature as PolygonButterfly.png
 

Thanks a lot.
 
Regards.
 
Steph.

 
?
 
 

Hi Steph,


In this case I would recommend using the .IsValid Method off of the Feature. In this case you will receive a 'False' response for the feature you have provided. You might also check out our new Microsoft.SQLServerTypes that can allow you to use these as an Unmanaged Geometry Library for the BaseShape Class.


You can find more information out about the new SQL Server Types that the following links: 

gis.thinkgeo.com/Support/Dis...fault.aspx



 Hi Ryan, 


 
Thanks for your answer.
I changed the dll (6.0.0.0) and I chose the dll of daily development build 6.0.135. 
The problem now, is when I move the points of the polygon to obtain a polygon butterfly on the edit mode, I have an error saying that my polygon is invalid but i can't intercept the exception (ie Message_20120926.txt)
 
I would like to authorize to the user to modify the feature (in the editOverlay), but it's when the user clicks the button "save polygon", then I test if the feature is valid and if it's not (like feature butterfly for example), the user can't save the new shape of the feature.
 
I hope my explanation is explicit ....
 
 
Example : On the Click on the button "edit" , I do this ; 



 wpfMap1.TrackOverlay.TrackMode = TrackMode.None;
 foreach (Feature feature in highlightLayer.InternalFeatures)
{
wpfMap1.EditOverlay.EditShapesLayer.InternalFeatures.Add(feature);
}



highlightLayer.InternalFeatures.Clear();
wpfMap1.EditOverlay.CalculateAllControlPoints();  
 
Regards.
 
Steph

Message_20120926.txt (4.85 KB)

Hi Steph,


I found a way to make the shape valid so that it is editable but the issue is that a shape in that form cannot be edited into an acceptable shape as its control points do not allow it.


Using the TrackAndEditShapes sample application as a base I setup the following for the edit button: 



case "btnTrackEdit":
                        wpfMap1.TrackOverlay.TrackMode = TrackMode.None;
                        foreach (Feature feature in wpfMap1.TrackOverlay.TrackShapeLayer.InternalFeatures)
                        {
                            Feature featureMadeValid = new Feature();
                            
                            if (feature.IsValid())
                            {
                                wpfMap1.EditOverlay.EditShapesLayer.InternalFeatures.Add(feature);
                            }
                            else
                                featureMadeValid = feature.MakeValid();
                                wpfMap1.EditOverlay.EditShapesLayer.InternalFeatures.Add(featureMadeValid);
                            
                            
                            //ShapeValidationResult result = feature.GetShape().Validate(ShapeValidationMode.Advanced);
                            
                        }

Once this code runs you get control points for the shape but you will find that the center control point where the lines of the polygon overlap will only allow you to move this center section, not resize it to make it a truly valid polygon. This is a bit of a difficult issue in that there are many reasons why a particular shape might be invalid and and depending on why the shape is invalid can determine what needs to be done with the shape. For this particular instance one could override the CalculateAllControlPoint() to find the shared point of the two polygons and perform some special logic to seperate the two polygons so that they could be manipulated seperately. Another idea is to use the following to create two seperate features so they each have Editing Control Points. 



 case "btnTrackEdit":
                        wpfMap1.TrackOverlay.TrackMode = TrackMode.None;
                        foreach (Feature feature in wpfMap1.TrackOverlay.TrackShapeLayer.InternalFeatures)
                        {
                            Feature featureMadeValid = new Feature();

                            if (feature.IsValid())
                            {
                                wpfMap1.EditOverlay.EditShapesLayer.InternalFeatures.Add(feature);
                            }
                            else
                            {
                                featureMadeValid = feature.MakeValid();
                                foreach (PolygonShape polygon in ((MultipolygonShape)featureMadeValid.GetShape()).Polygons)
                                {
                                    Feature seperateFeature = new Feature(polygon);
                                    wpfMap1.EditOverlay.EditShapesLayer.InternalFeatures.Add(seperateFeature);
                                }
                            }

                                //wpfMap1.EditOverlay.EditShapesLayer.InternalFeatures.Add(featureMadeValid);
                            
                            
                            //ShapeValidationResult result = feature.GetShape().Validate(ShapeValidationMode.Advanced);
                            
                        }
                        
                        wpfMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Clear();
                        wpfMap1.EditOverlay.CalculateAllControlPoints();
                        wpfMap1.Refresh(new Overlay[] { wpfMap1.EditOverlay, wpfMap1.TrackOverlay });
                        break;

Here are some screenshots showing the invalid feature, and the seperated features each with their own Controls: 




Hi Ryan,


Thanks a lot.


Regards.


Steph


 



You are welcome!