ThinkGeo.com    |     Documentation    |     Premium Support

Validation geometry oracle

Hello


When we draw a geometry with the gis module and try to insert it into an oracle table, the geometry can be invalid because you don't respect the same validation on the geometry, I identify a case : 

    1) polygon boundary crosses itself (ora 13349)

    

I found a way to correct the problem 1 so that i make the polygon valid for an oracle used?



thanks for your help. 



 


Sebastien,
 
The issue, which is caused something wrong with Geometry, was not re-created using Oracle 11g. And the attached is the sample we used for test, please check if there are something different from your scenario or a demo appreciates.
 
 Thanks,
 

Johnny



1697-Insert_GeometryToOracleTable.zip (3.17 KB)

i can draw the folowing wkt in the gis module (geographic projection):

MULTIPOLYGON(((-91.2136459223594 37.8932454248312,-91.2089681498391 37.8932792917464,-91.2093543879426 37.8896893120599,-91.2144613138991 37.8900618652625,-91.2070369593489 37.8973770734558,-91.2152767054388 37.897207748151,-91.2136459223594 37.8932454248312)))



this polygon has a problem, when i test its validity with the below query, with an oracle function the result is 13349 [Element <1>] [Ring <1>][Edge <4>][Edge <1>], this is a ora 13349 problem which says that polygon boundary crosses itself. The polygon that i created can be inserted in oracle (i am using the 10g one) but we cant apply spatial function on it(for example we can not calculate the area and many more things...)



select SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(SDO_GEOMETRY('MULTIPOLYGON(((-91.2136459223594 37.8932454248312,-91.2089681498391 37.8932792917464,-91.2093543879426 37.8896893120599,-91.2144613138991 37.8900618652625,-91.2070369593489 37.8973770734558,-91.2152767054388 37.897207748151,-91.2136459223594 37.8932454248312)))

', 8307),0.000000000000001) from dual



I assume that oracle imposes this constraint, i would like to know if there is a way to correct the polygons created so that they are valid for an oracle use.



sebastien,


We recreated your issue, and please add some validations before inserting into the oracle. There are the steps:


1. Reference the GeoAPI.dll and NetTopologySuite.dll


2. Using namespaces GisSharpBlog.NetTopologySuite.Geometries and GisSharpBlog.NetTopologySuite.IO


3. Add the validate functions as below:



private bool IsValidByJts(BaseShape baseShape)

      {

         byte[] targetShapeByte = baseShape.GetWellKnownBinary();

         Geometry thisGeometry = (Geometry)new WKBReader().Read(targetShapeByte);

         return thisGeometry.IsValid;

   }


4. Use the validation like below:




Feature feature = new Feature("MULTIPOLYGON(((0 0,0 2,1 -1,1 1,0 0)))");

      //We can validate the feature before insert it to oracle table

   bool isValid = IsValidByJts(feature.GetShape());


 


Thanks,


Johnny.


 



Johnny, 
  
   I wonder if we should do this validation in the Oracle feature source on the commit transaction.  I will talk with the core team to get this added.  In this way we can trap this and let the user know on the commit transaction results. 
  
 David