[mapguide-commits] r9467 - trunk/MgDev/Common/Geometry

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Fri Jan 25 06:32:58 PST 2019


Author: jng
Date: 2019-01-25 06:32:58 -0800 (Fri, 25 Jan 2019)
New Revision: 9467

Modified:
   trunk/MgDev/Common/Geometry/GeosUtil.cpp
Log:
#2791: Refactor GeosUtil to use smart pointers more and to make it easier to #ifdef out C++ API incompatibilities in newer versions of GEOS

Modified: trunk/MgDev/Common/Geometry/GeosUtil.cpp
===================================================================
--- trunk/MgDev/Common/Geometry/GeosUtil.cpp	2019-01-25 12:53:04 UTC (rev 9466)
+++ trunk/MgDev/Common/Geometry/GeosUtil.cpp	2019-01-25 14:32:58 UTC (rev 9467)
@@ -46,20 +46,39 @@
 
 static CInitGeos s_InitGeos;
 
+class GeosWktReader
+{
+public:
+    GeosWktReader() : m_pm(NULL), m_reader(NULL), m_gf(NULL)
+    {
+        m_pm = new PrecisionModel();
+        m_gf = new GeometryFactory(m_pm, 10);
+        m_reader = new WKTReader(m_gf);
+    }
+    ~GeosWktReader()
+    {
+        delete m_reader;
+        delete m_gf;
+        delete m_pm;
+    }
+    Geometry* Read(CREFSTRING wkt)
+    {
+        return m_reader->read(MgUtil::WideCharToMultiByte(wkt));
+    }
 
+private:
+    PrecisionModel* m_pm;
+    WKTReader* m_reader;
+    GeometryFactory* m_gf;
+};
+
 bool MgGeosUtil::Contains(MgGeometry* geom1, MgGeometry* geom2)
 {
     bool contains = false;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -67,20 +86,13 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
 
-    contains = g1->contains(g2);
+    contains = g1->contains(g2.get());
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Contains")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Contains")
 
-    delete g1;
-    delete g2;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return contains;
 }
 
@@ -87,16 +99,10 @@
 bool MgGeosUtil::Intersects(MgGeometry* geom1, MgGeometry* geom2)
 {
     bool intersects = false;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -104,20 +110,13 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
 
-    intersects = g1->intersects(g2);
+    intersects = g1->intersects(g2.get());
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Intersects")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Intersects")
 
-    delete g1;
-    delete g2;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return intersects;
 }
 
@@ -124,16 +123,10 @@
 bool MgGeosUtil::Crosses(MgGeometry* geom1, MgGeometry* geom2)
 {
     bool crosses = false;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -141,20 +134,13 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
 
-    crosses = g1->crosses(g2);
+    crosses = g1->crosses(g2.get());
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Crosses")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Crosses")
 
-    delete g1;
-    delete g2;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return crosses;
 }
 
@@ -161,16 +147,10 @@
 bool MgGeosUtil::Disjoint(MgGeometry* geom1, MgGeometry* geom2)
 {
     bool disjoint = false;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -178,20 +158,13 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
 
-    disjoint = g1->disjoint(g2);
+    disjoint = g1->disjoint(g2.get());
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Disjoint")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Disjoint")
 
-    delete g1;
-    delete g2;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return disjoint;
 }
 
@@ -198,16 +171,10 @@
 bool MgGeosUtil::Equals(MgGeometry* geom1, MgGeometry* geom2)
 {
     bool equals = false;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -215,20 +182,13 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
 
-    equals = g1->equals(g2);
+    equals = g1->equals(g2.get());
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Equals")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Equals")
 
-    delete g1;
-    delete g2;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return equals;
 }
 
@@ -235,16 +195,10 @@
 bool MgGeosUtil::Overlaps(MgGeometry* geom1, MgGeometry* geom2)
 {
     bool overlaps = false;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -252,20 +206,13 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
 
-    overlaps = g1->overlaps(g2);
+    overlaps = g1->overlaps(g2.get());
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Overlaps")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Overlaps")
 
-    delete g1;
-    delete g2;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return overlaps;
 }
 
@@ -272,16 +219,10 @@
 bool MgGeosUtil::Touches(MgGeometry* geom1, MgGeometry* geom2)
 {
     bool touches = false;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -289,20 +230,13 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
 
-    touches = g1->touches(g2);
+    touches = g1->touches(g2.get());
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Touches")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Touches")
 
-    delete g1;
-    delete g2;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return touches;
 }
 
@@ -309,16 +243,10 @@
 bool MgGeosUtil::Within(MgGeometry* geom1, MgGeometry* geom2)
 {
     bool within = false;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -326,20 +254,13 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
 
-    within = g1->within(g2);
+    within = g1->within(g2.get());
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Within")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Within")
 
-    delete g1;
-    delete g2;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return within;
 }
 
@@ -346,25 +267,19 @@
 MgGeometry* MgGeosUtil::Boundary(MgGeometry* geom1)
 {
     Ptr<MgGeometry> bndGeom;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g3 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     STRING wktGeom1 = tGeom1->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g3 = g1->getBoundary();
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g3(g1->getBoundary());
 
     WKTWriter writer;
-    string bndWkt = writer.write(g3);
+    string bndWkt = writer.write(g3.get());
 
     if (bndWkt.find("EMPTY", 0) == string::npos)
     {
@@ -372,15 +287,8 @@
         bndGeom = rdrWrt.Read(MgUtil::MultiByteToWideChar(bndWkt));
     }
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Boundary")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Boundary")
 
-    delete g1;
-    delete g3;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return SAFE_ADDREF((MgGeometry*)bndGeom);
 }
 
@@ -387,25 +295,19 @@
 MgGeometry* MgGeosUtil::ConvexHull(MgGeometry* geom1)
 {
     Ptr<MgGeometry> convexHull;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g3 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     STRING wktGeom1 = tGeom1->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g3 = g1->convexHull();
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g3(g1->convexHull());
 
     WKTWriter writer;
-    string convexHullWkt = writer.write(g3);
+    string convexHullWkt = writer.write(g3.get());
 
     if (convexHullWkt.find("EMPTY", 0) == string::npos)
     {
@@ -413,15 +315,8 @@
         convexHull = rdrWrt.Read(MgUtil::MultiByteToWideChar(convexHullWkt));
     }
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.ConvexHull")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.ConvexHull")
 
-    delete g1;
-    delete g3;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return SAFE_ADDREF((MgGeometry*)convexHull);
 }
 
@@ -428,17 +323,10 @@
 MgGeometry* MgGeosUtil::Difference(MgGeometry* geom1, MgGeometry* geom2)
 {
     Ptr<MgGeometry> difference;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
-    Geometry* g3 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -446,12 +334,12 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
-    g3 = g1->difference(g2);
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
+    std::auto_ptr<Geometry> g3(g1->difference(g2.get()));
 
     WKTWriter writer;
-    string differenceWkt = writer.write(g3);
+    string differenceWkt = writer.write(g3.get());
 
     if (differenceWkt.find("EMPTY", 0) == string::npos)
     {
@@ -459,16 +347,8 @@
         difference = rdrWrt.Read(MgUtil::MultiByteToWideChar(differenceWkt));
     }
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Difference")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Difference")
 
-    delete g1;
-    delete g2;
-    delete g3;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return SAFE_ADDREF((MgGeometry*)difference);
 }
 
@@ -476,16 +356,10 @@
 double MgGeosUtil::Distance(MgGeometry* geom1, MgGeometry* geom2)
 {
     double distance = 0.0;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -493,20 +367,13 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
 
-    distance = g1->distance(g2);
+    distance = g1->distance(g2.get());
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Distance")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Distance")
 
-    delete g1;
-    delete g2;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return distance;
 }
 
@@ -513,17 +380,10 @@
 MgGeometry* MgGeosUtil::Intersection(MgGeometry* geom1, MgGeometry* geom2)
 {
     Ptr<MgGeometry> intersection;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
-    Geometry* g3 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -531,12 +391,12 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
-    g3 = g1->intersection(g2);
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
+    std::auto_ptr<Geometry> g3(g1->intersection(g2.get()));
 
     WKTWriter writer;
-    string intersectionWkt = writer.write(g3);
+    string intersectionWkt = writer.write(g3.get());
 
     if (intersectionWkt.find("EMPTY", 0) == string::npos)
     {
@@ -544,16 +404,8 @@
         intersection = rdrWrt.Read(MgUtil::MultiByteToWideChar(intersectionWkt));
     }
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Intersection")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Intersection")
 
-    delete g1;
-    delete g2;
-    delete g3;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return SAFE_ADDREF((MgGeometry*)intersection);
 }
 
@@ -560,17 +412,10 @@
 MgGeometry* MgGeosUtil::SymetricDifference(MgGeometry* geom1, MgGeometry* geom2)
 {
     Ptr<MgGeometry> symetricDifference;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
-    Geometry* g3 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -578,12 +423,12 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
-    g3 = g1->symDifference(g2);
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
+    std::auto_ptr<Geometry> g3(g1->symDifference(g2.get()));
 
     WKTWriter writer;
-    string symetricDifferenceWkt = writer.write(g3);
+    string symetricDifferenceWkt = writer.write(g3.get());
 
     if (symetricDifferenceWkt.find("EMPTY", 0) == string::npos)
     {
@@ -591,16 +436,8 @@
         symetricDifference = rdrWrt.Read(MgUtil::MultiByteToWideChar(symetricDifferenceWkt));
     }
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.SymetricDifference")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.SymetricDifference")
 
-    delete g1;
-    delete g2;
-    delete g3;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return SAFE_ADDREF((MgGeometry*)symetricDifference);
 }
 
@@ -607,17 +444,10 @@
 MgGeometry* MgGeosUtil::Union(MgGeometry* geom1, MgGeometry* geom2)
 {
     Ptr<MgGeometry> unionGeom;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Geometry* g2 = NULL;
-    Geometry* g3 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     Ptr<MgGeometry> tGeom1 = MgSpatialUtility::TesselateCurve(geom1);
     Ptr<MgGeometry> tGeom2 = MgSpatialUtility::TesselateCurve(geom2);
@@ -625,12 +455,12 @@
     STRING wktGeom1 = tGeom1->ToAwkt(true);
     STRING wktGeom2 = tGeom2->ToAwkt(true);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = r.read(MgUtil::WideCharToMultiByte(wktGeom2));
-    g3 = g1->Union(g2);
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Geometry> g2(r.Read(wktGeom2));
+    std::auto_ptr<Geometry> g3(g1->Union(g2.get()));
 
     WKTWriter writer;
-    string unionGeomWkt = writer.write(g3);
+    string unionGeomWkt = writer.write(g3.get());
 
     if (unionGeomWkt.find("EMPTY", 0) == string::npos)
     {
@@ -638,16 +468,8 @@
         unionGeom = rdrWrt.Read(MgUtil::MultiByteToWideChar(unionGeomWkt));
     }
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Union")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Union")
 
-    delete g1;
-    delete g2;
-    delete g3;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return SAFE_ADDREF((MgGeometry*)unionGeom);
 }
 
@@ -654,29 +476,18 @@
 bool MgGeosUtil::IsValid(MgGeometricEntity* geom1)
 {
     bool isValid = false;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     STRING wktGeom1 = ToAwkt(geom1);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
     isValid = g1->isValid();
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.IsValid")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.IsValid")
 
-    delete g1;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return isValid;
 }
 
@@ -683,29 +494,18 @@
 bool MgGeosUtil::IsSimple(MgGeometricEntity* geom1)
 {
     bool isSimple = false;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     STRING wktGeom1 = ToAwkt(geom1);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
     isSimple = g1->isSimple();
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.IsSimple")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.IsSimple")
 
-    delete g1;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return isSimple;
 }
 
@@ -712,29 +512,18 @@
 bool MgGeosUtil::IsEmpty(MgGeometricEntity* geom1)
 {
     bool isEmpty = false;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     STRING wktGeom1 = ToAwkt(geom1);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
     isEmpty = g1->isEmpty();
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.IsEmpty")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.IsEmpty")
 
-    delete g1;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return isEmpty;
 }
 
@@ -741,29 +530,18 @@
 bool MgGeosUtil::IsClosed(MgGeometricEntity* geom1)
 {
     bool isClosed = false;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     STRING wktGeom1 = ToAwkt(geom1);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    // isClosed = g1->isClosed();
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    //isClosed = g1->isClosed();
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.IsClosed")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.IsClosed")
 
-    delete g1;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return isClosed;
 }
 
@@ -770,29 +548,18 @@
 double MgGeosUtil::Area(MgGeometricEntity* geom1)
 {
     double area = 0.0;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     STRING wktGeom1 = ToAwkt(geom1);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
     area = g1->getArea();
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Area")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Area")
 
-    delete g1;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return area;
 }
 
@@ -799,29 +566,18 @@
 double MgGeosUtil::Length(MgGeometricEntity* geom1)
 {
     double length = 0.0;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     STRING wktGeom1 = ToAwkt(geom1);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
     length = g1->getLength();
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Length")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Length")
 
-    delete g1;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return length;
 }
 
@@ -828,21 +584,15 @@
 MgPoint* MgGeosUtil::Centroid(MgGeometricEntity* geom1)
 {
     Ptr<MgPoint> point;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Point* g2 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     STRING wktGeom1 = ToAwkt(geom1);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = g1->getCentroid();
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Point> g2(g1->getCentroid());
 
     double x = g2->getX();
     double y = g2->getY();
@@ -851,15 +601,8 @@
     Ptr<MgCoordinate> coord = geomFactory.CreateCoordinateXY(x,y);
     point = geomFactory.CreatePoint(coord);
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.Centroid")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.Centroid")
 
-    delete g1;
-    delete g2;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return SAFE_ADDREF((MgPoint*)point);
 }
 
@@ -866,38 +609,25 @@
 MgPoint*  MgGeosUtil::GetPointInRegion(MgGeometry* geom1)
 {
     Ptr<MgPoint> point;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Point* g2 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
     STRING wktGeom1 = ToAwkt(geom1);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = g1->getInteriorPoint();
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Point> g2(g1->getInteriorPoint());
 
     double x = g2->getX();
     double y = g2->getY();
 
     MgGeometryFactory geomFactory;
-    Ptr<MgCoordinate> coord = geomFactory.CreateCoordinateXY(x,y);
+    Ptr<MgCoordinate> coord = geomFactory.CreateCoordinateXY(x, y);
     point = geomFactory.CreatePoint(coord);
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.GetInteriorPoint")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.GetInteriorPoint")
 
-    delete g1;
-    delete g2;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return SAFE_ADDREF((MgPoint*)point);
 }
 
@@ -904,21 +634,15 @@
 MgPoint*  MgGeosUtil::GetPointInRing(MgGeometryComponent* geom1)
 {
     Ptr<MgPoint> point;
-    PrecisionModel* pm = NULL;
-    GeometryFactory* gf = NULL;
-    Geometry* g1 = NULL;
-    Point* g2 = NULL;
 
     MG_GEOMETRY_TRY()
 
-    pm = new PrecisionModel();
-    gf = new GeometryFactory(pm, 10);
-    WKTReader r(gf);
+    GeosWktReader r;
 
-    STRING wktGeom1 = geom1->ToAwkt(true);
+    STRING wktGeom1 = ToAwkt(geom1);
 
-    g1 = r.read(MgUtil::WideCharToMultiByte(wktGeom1));
-    g2 = g1->getInteriorPoint();
+    std::auto_ptr<Geometry> g1(r.Read(wktGeom1));
+    std::auto_ptr<Point> g2(g1->getInteriorPoint());
 
     double x = g2->getX();
     double y = g2->getY();
@@ -927,15 +651,8 @@
     Ptr<MgCoordinate> coord = geomFactory.CreateCoordinateXY(x,y);
     point = geomFactory.CreatePoint(coord);
 
-    MG_GEOMETRY_CATCH(L"MgGeosUtil.GetInteriorPoint")
+    MG_GEOMETRY_CATCH_AND_THROW(L"MgGeosUtil.GetInteriorPoint")
 
-    delete g1;
-    delete g2;
-    delete gf;
-    delete pm;
-
-    MG_GEOMETRY_THROW()
-
     return SAFE_ADDREF((MgPoint*)point);
 }
 



More information about the mapguide-commits mailing list