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.

Exposing JTS's MinimumBoundingCircle functionality

Sunday September 11 2011 at 07:55

KeywordsJTS ST_MinimumBoundingCircle
Summary

This article exposes Jts’s MinimumBoundingCircle for Oracle sdo_geometry users.

Today I decided to expose the Java Topology Suite’s (JTS) MinimumBoundingCircle functionality via the JTS installer and package.

The MinimumBoundingCircle PL/SQL wrappers I have created are:

  1.   /**
  2.   * ST_MinimumBoundingCircle
  3.   * Computes the Minimum Bounding Circle (MBC) for the points in a Geometry.
  4.   * The MBC is the smallest circle which contains all the input points (this
  5.   * is sometimes known as the Smallest Enclosing Circle). This is equivalent
  6.   * to computing the Maximum Diameter of the input point set.
  7.   * @param p_geom      : sdo_geometry : first geometry subject to MBC calculation
  8.   * @param p_precision : int : number of decimal places of precision
  9.   * @return  circle    : sdo_geometry : Result of MBC calculation
  10.   * @author Martin Davis, JTS 1.12
  11.   * @history Simon Greener, September 2011, Original Coding of wrapper
  12.   * @copyright  : Licensed under a Creative Commons Attribution-Share Alike 2.5 Australia License.
  13.   *               http://creativecommons.org/licenses/by-sa/2.5/au/
  14.   **/
  15.   FUNCTION ST_MinimumBoundingCircle(p_geom      IN mdsys.sdo_geometry,
  16.                                     p_precision IN NUMBER)
  17.     RETURN mdsys.sdo_geometry deterministic;
  18. .
  19.   /**
  20.   * ST_MinimumBoundingCircle
  21.   * Computes the Minimum Bounding Circle (MBC) for the points in a Geometry.
  22.   * The MBC is the smallest circle which contains all the input points (this
  23.   * is sometimes known as the Smallest Enclosing Circle). This is equivalent
  24.   * to computing the Maximum Diameter of the input point set.
  25.   * @param p_geom      : sdo_geometry : first geometry subject to MBC calculation
  26.   * @param p_precision : int : number of decimal places of precision
  27.   * @param p_srid      : int : SRID of projected space in which actual overlay occurs before
  28.   *                            being projected back to p_geom1.sdo_srid.
  29.   * @return  circle    : sdo_geometry : Result of MBC calculation
  30.   * @author Martin Davis, JTS 1.12
  31.   * @history Simon Greener, September 2011, Original Coding of wrapper
  32.   * @copyright  : Licensed under a Creative Commons Attribution-Share Alike 2.5 Australia License.
  33.   *               http://creativecommons.org/licenses/by-sa/2.5/au/
  34.   **/
  35.   FUNCTION ST_MinimumBoundingCircle(p_geom      IN mdsys.sdo_geometry,
  36.                                     p_precision IN NUMBER,
  37.                                     p_srid      IN NUMBER )
  38.     RETURN mdsys.sdo_geometry deterministic;

Here are some examples.

  1. -- Point is returned as is
  2. SELECT JTS.ST_MinimumBoundingCircle(sdo_geometry(2001,NULL,sdo_point_type(1,1,NULL),NULL,NULL),2) AS mbc FROM dual;
  3. .
  4. MBC
  5. ----------------------------------------------------------------------
  6. MDSYS.SDO_GEOMETRY(2001,NULL,MDSYS.SDO_POINT_TYPE(1,1,NULL),NULL,NULL)
  7. .
  8. -- Straight line defined by two points
  9. SELECT JTS.ST_MinimumBoundingCircle(sdo_geometry('MULTIPOINT ((10 10), (20 20))',0),2) AS mbc  FROM dual;
  10. .
  11. MBC
  12. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  13. MDSYS.SDO_GEOMETRY(2003,NULL,MDSYS.SDO_POINT_TYPE(15,15,7.07106781186548),MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),MDSYS.SDO_ORDINATE_ARRAY(7.92893218813452,15,22.07106781186548,15,15,22.07106781186548))
  14. .
  15. -- Three Points In Line
  16. SELECT JTS.ST_MinimumBoundingCircle(sdo_geometry('MULTIPOINT ((10 10), (20 20), (30 30))',0),2) AS mbc  FROM dual;
  17. .
  18. MBC
  19. -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  20. MDSYS.SDO_GEOMETRY(2003,NULL,MDSYS.SDO_POINT_TYPE(20,20,14.142135623731),MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),MDSYS.SDO_ORDINATE_ARRAY(5.857864376269,20,34.142135623731,20,20,34.142135623731))
  21. .
  22. -- three points
  23. SELECT JTS.ST_MinimumBoundingCircle(sdo_geometry('MULTIPOINT ((10 10), (20 20), (10 20))',0),2) AS mbc  FROM dual;
  24. .
  25. MBC
  26. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  27. MDSYS.SDO_GEOMETRY(2003,NULL,MDSYS.SDO_POINT_TYPE(15,15,7.07106781186548),MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),MDSYS.SDO_ORDINATE_ARRAY(7.92893218813452,15,22.07106781186548,15,15,22.07106781186548))
  28. .
  29. -- Triangle With Middle Point
  30. SELECT JTS.ST_MinimumBoundingCircle(sdo_geometry('MULTIPOINT ((10 10), (20 20), (10 20), (15 19))',0),2) AS mbc  FROM dual;
  31. .
  32. MBC
  33. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  34. MDSYS.SDO_GEOMETRY(2003,NULL,MDSYS.SDO_POINT_TYPE(15,15,7.07106781186548),MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),MDSYS.SDO_ORDINATE_ARRAY(7.92893218813452,15,22.07106781186548,15,15,22.07106781186548))
  35. </pre></code>
  36. Now let's test and visualise some lines and circles.
  37. <code id="SourceCode"><pre>
  38. with line as (
  39. select sdo_geometry('LINESTRING(0 0, 10 10, 10 0, 20 10)',0) as line from dual
  40. )
  41. select JTS.ST_MinimumBoundingCircle(line,2) as dGeom from line;
  42. .
  43. DGEOM
  44. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  45. MDSYS.SDO_GEOMETRY(2003,NULL,MDSYS.SDO_POINT_TYPE(10,5,11.1803398874989),MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),MDSYS.SDO_ORDINATE_ARRAY(-1.1803398874989,5,21.1803398874989,5,10,16.1803398874989))
  46. .
  47. -- Optimized Rectangle
  48. with rect as (
  49. select sdo_geometry(2003,null,null,sdo_elem_info_array(1,1003,3),sdo_ordinate_array(1,1,10,10)) as rect from dual
  50. )
  51. select JTS.ST_MinimumBoundingCircle(rect,2) as dGeom from rect;
  52. .
  53. DGEOM
  54. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  55. MDSYS.SDO_GEOMETRY(2003,NULL,MDSYS.SDO_POINT_TYPE(5.5,5.5,6.36396103067893),MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),MDSYS.SDO_ORDINATE_ARRAY(-0.86396103067893,5.5,11.86396103067893,5.5,5.5,11.86396103067893))
Which look like: *1. Line* !http://www.spatialdbadvisor.com/images/134.png! *2. Rectangle* !http://www.spatialdbadvisor.com/images/135.png! I hope this helps someone.

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 [2]

What an interesting concept!

Now to find a use for it :)

— Thomas · 13 September 2011, 00:31 · #

Thomas,

Well, it is a part of JTS, and even has its own Wikipedia page, called Smallest circle problem so it must be useful!

I suspect its main area of application is in spatial statistics.

regards
Simon

Simon Greener · 13 September 2011, 06:12 · #