[SCM] PostGIS branch master updated. 3.4.0rc1-1013-g1284f168d

git at osgeo.org git at osgeo.org
Wed Mar 13 05:02:17 PDT 2024


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "PostGIS".

The branch, master has been updated
       via  1284f168d7159c8585b46f9bdfd54c63927f8c9e (commit)
      from  d61d5114e7d031c622303669bb42378b44466e10 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 1284f168d7159c8585b46f9bdfd54c63927f8c9e
Author: Sandro Santilli <strk at kbt.io>
Date:   Wed Mar 13 12:19:47 2024 +0100

    Add TopoGeo_LoadGeometry function
    
    Includes regress test and documentation
    
    Closes #5667

diff --git a/NEWS b/NEWS
index a828e3583..878fc9099 100644
--- a/NEWS
+++ b/NEWS
@@ -35,6 +35,7 @@ To take advantage of all SFCGAL featurs, SFCGAL 1.5.0+ is needed.
 
 * New Features *
 
+  - #5667, TopoGeo_LoadGeometry (Sandro Santilli)
   - #5055, add explicit <> geometry operator to prevent non-unique
            error with <> and != (Paul Ramsey)
   - Add ST_HasZ/ST_HasM (Loïc Bartoletti)
diff --git a/doc/extras_topology.xml b/doc/extras_topology.xml
index bed44ad10..fd9012059 100644
--- a/doc/extras_topology.xml
+++ b/doc/extras_topology.xml
@@ -1388,7 +1388,12 @@ SELECT topology.AddTopoGeometryColumn('ri_topo', 'ri', 'roads', 'topo', 'LINE');
 			<!-- Optionally add a "See Also" section -->
 			<refsection>
 				<title>See Also</title>
-				<para><xref linkend="AddTopoGeometryColumn"/>, <xref linkend="CreateTopology"/>, <xref linkend="DropTopology"/></para>
+				<para>
+<xref linkend="TopoGeo_LoadGeometry"/>,
+<xref linkend="AddTopoGeometryColumn"/>,
+<xref linkend="CreateTopology"/>,
+<xref linkend="DropTopology"/>
+                </para>
 			</refsection>
 		</refentry>
 
@@ -1432,6 +1437,7 @@ An existing edge may be split by the snapped point.
 				<para>
 <xref linkend="TopoGeo_AddLineString"/>,
 <xref linkend="TopoGeo_AddPolygon"/>,
+<xref linkend="TopoGeo_LoadGeometry"/>,
 <xref linkend="AddNode"/>,
 <xref linkend="CreateTopology"/>
 </para>
@@ -1481,6 +1487,7 @@ up to caller, see <xref linkend="Topology_StatsManagement"/>.
 				<para>
 <xref linkend="TopoGeo_AddPoint"/>,
 <xref linkend="TopoGeo_AddPolygon"/>,
+<xref linkend="TopoGeo_LoadGeometry"/>,
 <xref linkend="AddEdge"/>,
 <xref linkend="CreateTopology"/>
 				</para>
@@ -1530,12 +1537,62 @@ up to caller, see <xref linkend="Topology_StatsManagement"/>.
 				<para>
 <xref linkend="TopoGeo_AddPoint"/>,
 <xref linkend="TopoGeo_AddLineString"/>,
+<xref linkend="TopoGeo_LoadGeometry"/>,
 <xref linkend="AddFace"/>,
 <xref linkend="CreateTopology"/>
 				</para>
 			</refsection>
 		</refentry>
 
+		<refentry xml:id="TopoGeo_LoadGeometry">
+			<refnamediv>
+				<refname>TopoGeo_LoadGeometry</refname>
+
+				<refpurpose>Load a geometry into an existing topology, snapping and splitting as needed.</refpurpose>
+			</refnamediv>
+
+			<refsynopsisdiv>
+				<funcsynopsis>
+					<funcprototype>
+						<funcdef>void <function>TopoGeo_LoadGeometry</function></funcdef>
+						<paramdef><type>varchar </type> <parameter>atopology</parameter></paramdef>
+						<paramdef><type>geometry </type> <parameter>ageom</parameter></paramdef>
+						<paramdef choice="opt"><type>float8 </type> <parameter>tolerance</parameter></paramdef>
+					</funcprototype>
+				</funcsynopsis>
+			</refsynopsisdiv>
+
+			<refsection>
+                <title>Description</title>
+
+                <para>
+Loads a geometry into an existing topology.
+The given geometry will snap to existing nodes or edges within given tolerance.
+Existing edges and faces may be split as a consequence of the load.
+                </para>
+
+                <note><para>
+Updating statistics about topologies being loaded via this function is
+up to caller, see <xref linkend="Topology_StatsManagement"/>.
+                </para></note>
+
+                <!-- use this format if new function -->
+                <para role="availability" conformance="3.5.0">Availability: 3.5.0</para>
+			</refsection>
+
+
+			<!-- Optionally add a "See Also" section -->
+			<refsection>
+				<title>See Also</title>
+				<para>
+<xref linkend="TopoGeo_AddPoint"/>,
+<xref linkend="TopoGeo_AddLineString"/>,
+<xref linkend="TopoGeo_AddPolygon"/>,
+<xref linkend="CreateTopology"/>
+				</para>
+			</refsection>
+		</refentry>
+
 
 	</section>
 
diff --git a/liblwgeom/topo/liblwgeom_topo.h b/liblwgeom/topo/liblwgeom_topo.h
index 276d9d7cf..f4ed175b5 100644
--- a/liblwgeom/topo/liblwgeom_topo.h
+++ b/liblwgeom/topo/liblwgeom_topo.h
@@ -1143,6 +1143,19 @@ int lwt_Polygonize(LWT_TOPOLOGY* topo);
 LWT_ELEMID* lwt_AddPolygon(LWT_TOPOLOGY* topo, LWPOLY* poly, double tol,
                         int* nfaces);
 
+/**
+ * Load a geometry into the topology
+ *
+ * The given geometry will snap to existing nodes or edges within given
+ * tolerance. Existing edges or faces may be split by the geometry.
+ *
+ * @param topo the topology to operate on
+ * @param geom the geometry to add
+ * @param tol snap tolerance, the topology tolerance will be used if 0
+ *
+ */
+void lwt_LoadGeometry(LWT_TOPOLOGY* topo, LWGEOM* geom, double tol);
+
 /*******************************************************************
  *
  * ISO signatures here
diff --git a/liblwgeom/topo/liblwgeom_topo_internal.h b/liblwgeom/topo/liblwgeom_topo_internal.h
index 39dec255f..bec421c26 100644
--- a/liblwgeom/topo/liblwgeom_topo_internal.h
+++ b/liblwgeom/topo/liblwgeom_topo_internal.h
@@ -76,7 +76,7 @@ LWT_BE_TOPOLOGY * lwt_be_loadTopologyByName(LWT_BE_IFACE *be, const char *name);
 int lwt_be_freeTopology(LWT_TOPOLOGY *topo);
 
 LWT_ISO_NODE *lwt_be_getNodeWithinDistance2D(LWT_TOPOLOGY *topo,
-					     LWPOINT *pt,
+					     const LWPOINT *pt,
 					     double dist,
 					     uint64_t *numelems,
 					     int fields,
@@ -92,10 +92,10 @@ void _lwt_release_edges(LWT_ISO_EDGE *edges, int num_edges);
 int lwt_be_updateEdgesById(LWT_TOPOLOGY* topo, const LWT_ISO_EDGE* edges, int numedges, int upd_fields);
 int lwt_be_insertFaces(LWT_TOPOLOGY *topo, LWT_ISO_FACE *face, uint64_t numelems);
 
-int lwt_be_ExistsCoincidentNode(LWT_TOPOLOGY* topo, LWPOINT* pt);
+int lwt_be_ExistsCoincidentNode(LWT_TOPOLOGY* topo, const LWPOINT* pt);
 int lwt_be_insertNodes(LWT_TOPOLOGY *topo, LWT_ISO_NODE *node, uint64_t numelems);
 
-int lwt_be_ExistsEdgeIntersectingPoint(LWT_TOPOLOGY* topo, LWPOINT* pt);
+int lwt_be_ExistsEdgeIntersectingPoint(LWT_TOPOLOGY* topo, const LWPOINT* pt);
 
 LWT_ELEMID lwt_be_getNextEdgeId(LWT_TOPOLOGY* topo);
 LWT_ISO_EDGE *lwt_be_getEdgeById(LWT_TOPOLOGY *topo, const LWT_ELEMID *ids, uint64_t *numelems, int fields);
diff --git a/liblwgeom/topo/lwgeom_topo.c b/liblwgeom/topo/lwgeom_topo.c
index 451701903..70e72c095 100644
--- a/liblwgeom/topo/lwgeom_topo.c
+++ b/liblwgeom/topo/lwgeom_topo.c
@@ -155,7 +155,7 @@ lwt_be_getNodeById(LWT_TOPOLOGY *topo, const LWT_ELEMID *ids, uint64_t *numelems
 
 LWT_ISO_NODE *
 lwt_be_getNodeWithinDistance2D(LWT_TOPOLOGY *topo,
-			       LWPOINT *pt,
+			       const LWPOINT *pt,
 			       double dist,
 			       uint64_t *numelems,
 			       int fields,
@@ -377,7 +377,7 @@ lwt_be_getRingEdges(LWT_TOPOLOGY *topo, LWT_ELEMID edge, uint64_t *numedges, uin
 }
 
 int
-lwt_be_ExistsCoincidentNode(LWT_TOPOLOGY* topo, LWPOINT* pt)
+lwt_be_ExistsCoincidentNode(LWT_TOPOLOGY* topo, const LWPOINT* pt)
 {
 	uint64_t exists = 0;
 	lwt_be_getNodeWithinDistance2D(topo, pt, 0, &exists, 0, -1);
@@ -390,7 +390,7 @@ lwt_be_ExistsCoincidentNode(LWT_TOPOLOGY* topo, LWPOINT* pt)
 }
 
 int
-lwt_be_ExistsEdgeIntersectingPoint(LWT_TOPOLOGY* topo, LWPOINT* pt)
+lwt_be_ExistsEdgeIntersectingPoint(LWT_TOPOLOGY* topo, const LWPOINT* pt)
 {
 	uint64_t exists = 0;
 	lwt_be_getEdgeWithinDistance2D(topo, pt, 0, &exists, 0, -1);
@@ -5987,10 +5987,45 @@ lwt_AddLineNoFace(LWT_TOPOLOGY* topo, LWLINE* line, double tol, int* nedges)
 	return _lwt_AddLine(topo, line, tol, nedges, 0);
 }
 
+static void
+lwt_LoadPoint(LWT_TOPOLOGY* topo, LWPOINT* point, double tol)
+{
+  _lwt_AddPoint(topo, point, tol, 1, NULL);
+}
+
+static void
+lwt_LoadLine(LWT_TOPOLOGY* topo, LWLINE* line, double tol)
+{
+  LWT_ELEMID* ids;
+  int nedges;
+
+  /* TODO: avoid allocating edge ids */
+  ids = lwt_AddLine(topo, line, tol, &nedges);
+  if ( nedges > 0 ) lwfree(ids);
+}
+
+static void
+lwt_LoadPolygon(LWT_TOPOLOGY* topo, const LWPOLY* poly, double tol)
+{
+  uint32_t i;
+
+  /* Add each ring as an edge */
+  for ( i=0; i<poly->nrings; ++i )
+  {
+    LWLINE *line;
+    POINTARRAY *pa;
+
+    /* TODO: avoid the clone here */
+    pa = ptarray_clone(poly->rings[i]);
+    line = lwline_construct(topo->srid, NULL, pa);
+    lwt_LoadLine(topo, line, tol);
+    lwline_free(line);
+  }
+}
+
 LWT_ELEMID*
 lwt_AddPolygon(LWT_TOPOLOGY* topo, LWPOLY* poly, double tol, int* nfaces)
 {
-  uint32_t i;
   *nfaces = -1; /* error condition, by default */
   int num;
   LWT_ISO_FACE *faces;
@@ -6005,26 +6040,7 @@ lwt_AddPolygon(LWT_TOPOLOGY* topo, LWPOLY* poly, double tol, int* nfaces)
   if ( ! tol ) tol = _LWT_MINTOLERANCE( topo, (LWGEOM*)poly );
   LWDEBUGF(1, "Working tolerance:%.15g", tol);
 
-  /* Add each ring as an edge */
-  for ( i=0; i<poly->nrings; ++i )
-  {
-    LWLINE *line;
-    POINTARRAY *pa;
-    LWT_ELEMID *eids;
-    int nedges;
-
-    pa = ptarray_clone(poly->rings[i]);
-    line = lwline_construct(topo->srid, NULL, pa);
-    eids = lwt_AddLine( topo, line, tol, &nedges );
-    if ( nedges < 0 ) {
-      /* probably too late as lwt_AddLine invoked lwerror */
-      lwline_free(line);
-      lwerror("Error adding ring %d of polygon", i);
-      return NULL;
-    }
-    lwline_free(line);
-    lwfree(eids);
-  }
+  lwt_LoadPolygon(topo, poly, tol);
 
   /*
   -- Find faces covered by input polygon
@@ -6465,3 +6481,49 @@ lwt_GetFaceContainingPoint(LWT_TOPOLOGY* topo, const LWPOINT* pt)
   _lwt_release_edges(closestEdge, 1);
   return containingFace;
 }
+
+void
+_lwt_LoadGeometryRecursive(LWT_TOPOLOGY* topo, LWGEOM* geom, double tol)
+{
+  switch (geom->type)
+  {
+    case POINTTYPE:
+      lwt_LoadPoint(topo, lwgeom_as_lwpoint(geom), tol);
+      return;
+
+    case LINETYPE:
+      lwt_LoadLine(topo, lwgeom_as_lwline(geom), tol);
+      return;
+
+    case POLYGONTYPE:
+      lwt_LoadPolygon(topo, lwgeom_as_lwpoly(geom), tol);
+      return;
+
+    case MULTILINETYPE:
+    case MULTIPOLYGONTYPE:
+    case MULTIPOINTTYPE:
+    case COLLECTIONTYPE:
+    {
+      LWCOLLECTION *coll;
+      uint32_t i;
+      coll = (LWCOLLECTION *)geom;
+      for (i=0; i<coll->ngeoms; i++)
+        _lwt_LoadGeometryRecursive(topo, coll->geoms[i], tol);
+      return;
+    }
+
+		default:
+		{
+			lwerror("%s: Unsupported geometry type: %s", __func__,
+			        lwtype_name(geom->type));
+			return;
+		}
+
+  }
+}
+
+void
+lwt_LoadGeometry(LWT_TOPOLOGY* topo, LWGEOM* geom, double tol)
+{
+	_lwt_LoadGeometryRecursive(topo, geom, tol);
+}
diff --git a/topology/postgis_topology.c b/topology/postgis_topology.c
index 0a49edba4..192fd7f9a 100644
--- a/topology/postgis_topology.c
+++ b/topology/postgis_topology.c
@@ -5137,7 +5137,7 @@ Datum TopoGeo_AddLinestring(PG_FUNCTION_ARGS)
 
     POSTGIS_DEBUG(1, "Calling lwt_AddLine");
     elems = lwt_AddLine(topo, ln, tol, &nelems);
-    POSTGIS_DEBUG(1, "lwt_AddLine* returned");
+    POSTGIS_DEBUG(1, "lwt_AddLine returned");
     lwgeom_free(lwgeom);
     PG_FREE_IF_COPY(geom, 1);
     lwt_FreeTopology(topo);
@@ -5618,3 +5618,59 @@ Datum RegisterMissingFaces(PG_FUNCTION_ARGS)
 
   PG_RETURN_NULL();
 }
+
+/*  TopoGeo_LoadGeometry(atopology, geom, tolerance) */
+Datum TopoGeo_LoadGeometry(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(TopoGeo_LoadGeometry);
+Datum TopoGeo_LoadGeometry(PG_FUNCTION_ARGS)
+{
+  text* toponame_text;
+  char* toponame;
+  double tol;
+  GSERIALIZED *geom;
+  LWGEOM *lwgeom;
+  LWT_TOPOLOGY *topo;
+
+  toponame_text = PG_GETARG_TEXT_P(0);
+  toponame = text_to_cstring(toponame_text);
+  PG_FREE_IF_COPY(toponame_text, 0);
+
+  geom = PG_GETARG_GSERIALIZED_P(1);
+  lwgeom = lwgeom_from_gserialized(geom);
+
+  tol = PG_GETARG_FLOAT8(2);
+  if ( tol < 0 )
+  {
+    PG_FREE_IF_COPY(geom, 1);
+    lwpgerror("Tolerance must be >=0");
+    PG_RETURN_NULL();
+  }
+
+  if ( SPI_OK_CONNECT != SPI_connect() )
+  {
+    lwpgerror("Could not connect to SPI");
+    PG_RETURN_NULL();
+  }
+
+  topo = lwt_LoadTopology(be_iface, toponame);
+  pfree(toponame);
+  if ( ! topo )
+  {
+    /* should never reach this point, as lwerror would raise an exception */
+    SPI_finish();
+    PG_RETURN_NULL();
+  }
+
+  POSTGIS_DEBUG(1, "Calling lwt_LoadGeometry");
+  lwt_LoadGeometry(topo, lwgeom, tol);
+  POSTGIS_DEBUG(1, "lwt_LoadGeometry returned");
+  lwgeom_free(lwgeom);
+  PG_FREE_IF_COPY(geom, 1);
+  lwt_FreeTopology(topo);
+
+  POSTGIS_DEBUG(1, "TopoGeo_LoadGeometry calling SPI_finish");
+
+  SPI_finish();
+
+  PG_RETURN_VOID();
+}
diff --git a/topology/sql/populate.sql.in b/topology/sql/populate.sql.in
index 96909066e..bd21a513e 100644
--- a/topology/sql/populate.sql.in
+++ b/topology/sql/populate.sql.in
@@ -721,6 +721,19 @@ CREATE OR REPLACE FUNCTION topology.TopoGeo_AddPolygon(atopology varchar, apoly
   LANGUAGE 'c' VOLATILE;
 --} TopoGeo_AddPolygon
 
+--{
+--  TopoGeo_LoadGeometry(toponame, geom, tolerance)
+--
+--  Load a Geometry into a topology
+--
+-- Availability: 3.5.0
+--
+CREATE OR REPLACE FUNCTION topology.TopoGeo_LoadGeometry(atopology varchar, ageom geometry, tolerance float8 DEFAULT 0)
+	RETURNS void AS
+	'MODULE_PATHNAME', 'TopoGeo_LoadGeometry'
+  LANGUAGE 'c' VOLATILE;
+--} TopoGeo_LoadGeometry
+
 --{
 --  TopoGeo_AddGeometry(toponame, geom, tolerance)
 --
@@ -731,7 +744,7 @@ CREATE OR REPLACE FUNCTION topology.TopoGeo_AddGeometry(atopology varchar, ageom
 $$
 DECLARE
 BEGIN
-	RAISE EXCEPTION 'TopoGeo_AddGeometry not implemented yet';
+	RAISE EXCEPTION 'TopoGeo_AddGeometry not implemented yet, use TopoGeo_LoadGeometry';
 END
 $$
 LANGUAGE 'plpgsql';
diff --git a/topology/test/regress/topogeo_loadgeometry.sql b/topology/test/regress/topogeo_loadgeometry.sql
new file mode 100644
index 000000000..dbb3db8d6
--- /dev/null
+++ b/topology/test/regress/topogeo_loadgeometry.sql
@@ -0,0 +1,108 @@
+SET client_min_messages TO WARNING;
+SELECT NULL FROM topology.CreateTopology('t');
+
+CREATE FUNCTION t.print_counts(lbl text) RETURNS TEXT
+AS $$
+  SELECT format('%s|%s nodes|%s edges|%s faces',
+    lbl,
+    ( SELECT count(*) FROM t.node ),
+    ( SELECT count(*) FROM t.edge ),
+    ( SELECT count(*) FROM t.face WHERE face_id != 0 )
+  );
+$$ LANGUAGE 'sql';
+
+--
+--
+--            o
+--
+SELECT topology.TopoGeo_LoadGeometry('t', 'POINT(0 0)');
+SELECT t.print_counts('point1');
+
+--
+--                      o {5,5}
+--
+--            o {0,0}
+--
+SELECT topology.TopoGeo_LoadGeometry('t', 'MULTIPOINT((0 0),(5 5))');
+SELECT t.print_counts('mpoint1');
+
+--
+--        {0,10}  {5,10}       {10,10}
+--            o----------o-----------o
+--                       |
+--                       |
+--                       |
+--                       |
+--                       |
+--                       o {5,5}
+--         {0,0}         |
+--            o          |
+--                       |
+--                       |
+--                       |
+--                       o {5,-10}
+--
+-- mline1|6 nodes|4 edges|0 faces
+--
+SELECT topology.TopoGeo_LoadGeometry('t', 'MULTILINESTRING((5 -10,5 10),(0 10,10 10))');
+SELECT t.print_counts('mline1');
+
+--     {-10,20}                              {10,20}
+--         .-------------------------------------.
+--         |                                     |
+--         |   .------.{0,16}                    |
+--         |   |      |                          |
+--         |   o------'                          |
+--         |  {-5,15}                            |
+--         |                                     |
+--         |     {0,10}  {5,10}           {10,10}|
+--         |          o---------o----------------o
+--         |                    |                |
+--         |                    |                |
+--         |                    o {5,5}          |
+--         |       {0,0}        |                |
+--         |          o         |                |
+--         |                    |                |
+--         o--------------------o----------------'
+--     {-10,-10}             {5,-10}          {10,-10}
+--
+--   mpoly1|8 nodes|8 edges|3 faces
+--
+SELECT topology.TopoGeo_LoadGeometry('t', 'MULTIPOLYGON(
+  ((-10 -10,10 -10,10 20,-10 20,-10 -10)),
+  ((-5 15,0 15,0 16,-5 16,-5 15))
+)');
+SELECT t.print_counts('mpoly1');
+
+
+--     {-10,20}                              {10,20}
+--         .-------------------------------------.
+--         |                                     |
+--         |   .------.{0,16}     {8,16} o-------o--------.
+--         |   |      |                  |       |        |
+--         |   o------'                  `-------o--------' {12,15}
+--         |  {-5,15}                            |
+--         |                                     |
+--         |     {0,10}  {5,10}           {10,10}|
+--         o----------o---------o----------------o
+--         |                    |                |
+--         |                    |                |
+--         |                    o {5,5}          |
+--         |       {0,0}        |                |
+--         |          o         |        o       |
+--         |                    |     {8,0}      |
+--         o--------------------o----------------'
+--     {-10,-10}             {5,-10}          {10,-10}
+--
+--   coll1|13 nodes|15 edges|6 faces
+--
+SELECT topology.TopoGeo_LoadGeometry('t', 'GEOMETRYCOLLECTION(
+  POLYGON((8 16,12 16,12 15,8 16,8 16)),
+  MULTIPOINT((8 0)),
+  LINESTRING(-10 10,0 10)
+)');
+SELECT t.print_counts('coll1');
+
+SELECT 'unexpected invalidity', * FROM topology.ValidateTopology('t');
+
+SELECT NULL FROM topology.DropTopology('t');
diff --git a/topology/test/regress/topogeo_loadgeometry_expected b/topology/test/regress/topogeo_loadgeometry_expected
new file mode 100644
index 000000000..1467fa7f6
--- /dev/null
+++ b/topology/test/regress/topogeo_loadgeometry_expected
@@ -0,0 +1,5 @@
+point1|1 nodes|0 edges|0 faces
+mpoint1|2 nodes|0 edges|0 faces
+mline1|6 nodes|4 edges|0 faces
+mpoly1|8 nodes|8 edges|3 faces
+coll1|13 nodes|15 edges|6 faces
diff --git a/topology/test/tests.mk b/topology/test/tests.mk
index 716fe291a..5f148a6ca 100644
--- a/topology/test/tests.mk
+++ b/topology/test/tests.mk
@@ -75,6 +75,7 @@ TESTS += \
 	$(top_srcdir)/topology/test/regress/topogeo_addlinestring.sql \
 	$(top_srcdir)/topology/test/regress/topogeo_addpoint.sql \
 	$(top_srcdir)/topology/test/regress/topogeo_addpolygon.sql \
+	$(top_srcdir)/topology/test/regress/topogeo_loadgeometry.sql \
 	$(top_srcdir)/topology/test/regress/topogeom_addtopogeom.sql \
 	$(top_srcdir)/topology/test/regress/topogeom_edit.sql \
 	$(top_srcdir)/topology/test/regress/topogeometry_srid.sql \

-----------------------------------------------------------------------

Summary of changes:
 NEWS                                               |   1 +
 doc/extras_topology.xml                            |  59 ++++++++++-
 liblwgeom/topo/liblwgeom_topo.h                    |  13 +++
 liblwgeom/topo/liblwgeom_topo_internal.h           |   6 +-
 liblwgeom/topo/lwgeom_topo.c                       | 110 ++++++++++++++++-----
 topology/postgis_topology.c                        |  58 ++++++++++-
 topology/sql/populate.sql.in                       |  15 ++-
 topology/test/regress/topogeo_loadgeometry.sql     | 108 ++++++++++++++++++++
 .../test/regress/topogeo_loadgeometry_expected     |   5 +
 topology/test/tests.mk                             |   1 +
 10 files changed, 346 insertions(+), 30 deletions(-)
 create mode 100644 topology/test/regress/topogeo_loadgeometry.sql
 create mode 100644 topology/test/regress/topogeo_loadgeometry_expected


hooks/post-receive
-- 
PostGIS


More information about the postgis-tickets mailing list