Go to content Go to navigation and search

Home

Current Oracle Spatial Blog Articles


Search

Browse

RSS / Atom

Email me

textpattern

Creative Commons License
All Blog Articles, Data Models and Free Source Code by Simon Greener, The SpatialDB Advisor is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

Using JTS's Comparison Functions - HausdorffSimilarityMeasure & AreaSimilarityMeasure with SDO_GEOMETRY

Saturday September 10 2011 at 21:25

There is often a need to compare SDO_GEOMETRYs to see if a geometry has changed or not. The SDO_GEOM.RELATE function is useful in this regards where two geometries are EQUAL but it is not fine-grained enough to help understand how different two things are. The Java Topology Suite (JTS) has two very useful match algorithms in its com.vividsolutions.jts.algorithm.match package.

I have extended my JTS package and installer to expose the two methods JTS makes available:

  • HausdorffSimilarityMeasure (Supports lines and polygons)
  • AreaSimilarityMeasure (Supports only areas)

Martin Davis has a good article on the HausdorffSimilarityMeasure on his website.

Here are some examples.

1. Call to both functions using two identical area sdo_geometry

  1. WITH myGeoms AS (
  2.   SELECT MDSYS.SDO_GEOMETRY(2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3), MDSYS.SDO_ORDINATE_ARRAY(100.0, 100.0, 500.0, 500.0)) AS area1,
  3.          geom.rectangle2polygon(MDSYS.SDO_GEOMETRY(2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3), MDSYS.SDO_ORDINATE_ARRAY(100.0, 100.0, 500.0, 500.0))) AS area2
  4.     FROM dual
  5. )
  6. SELECT JTS.ST_HausdorffSimilarityMeasure(area1,area2,3) AS HSM,
  7.        JTS.ST_AreaSimilarityMeasure(area1,area2,3)      AS ASM
  8.   FROM myGeoms;
  9. .
  10. HSM ASM
  11. --- ---
  12. 1   1

2. Call to both functions using two slightly different area sdo_geometrys

  1. WITH myGeoms AS (
  2.   SELECT MDSYS.SDO_GEOMETRY(2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3), MDSYS.SDO_ORDINATE_ARRAY(100.0, 100.0, 500.0,  500.0)) AS area1,
  3.          geom.rectangle2polygon(MDSYS.SDO_GEOMETRY(2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3), MDSYS.SDO_ORDINATE_ARRAY(100.0, 100.0, 500.01, 500.01))) AS area2
  4.     FROM dual
  5. )
  6. SELECT JTS.ST_HausdorffSimilarityMeasure(area1,area2,3) AS HSM,
  7.        JTS.ST_AreaSimilarityMeasure(area1,area2,3)      AS ASM
  8.   FROM myGeoms;
  9. .
  10. HSM               ASM
  11. ----------------- -----------------
  12. 0.999975000624984 0.999950001874937

3. Call to HausdorffSimilarityMeasure function only using two slightly different line sdo_geometrys

  1. WITH myGeoms AS (
  2.   SELECT MDSYS.SDO_GEOMETRY(2002, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1,2,1), MDSYS.SDO_ORDINATE_ARRAY(0,0, 10,10, 20,0, 30,30)) AS line1,
  3.          MDSYS.SDO_GEOMETRY(2002, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1,2,1), MDSYS.SDO_ORDINATE_ARRAY(0,0, 10.01,10, 20,0.1, 30,30.07)) AS line2
  4.     FROM dual
  5. )
  6. SELECT JTS.ST_HausdorffSimilarityMeasure(line1,line2,3) AS HSM
  7.   FROM myGeoms;
  8. .
  9. HSM
  10. ---------------
  11. 0.9976457256498

See my JTS package header description for the call signatures for these functions.

Creative Commons License

post this at del.icio.uspost this at Diggpost this at Technoratipost this at Redditpost this at Farkpost this at Yahoo! my webpost this at Windows Livepost this at Google Bookmarkspost this to Twitter

Comment