[SCM] PostGIS branch master updated. 3.4.0rc1-1070-gd5ba6b71c
git at osgeo.org
git at osgeo.org
Mon Mar 25 12:55:44 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 d5ba6b71cf08baaf67d9646a7ca52d0dfb5c3e9c (commit)
from 9c2efa9175a5c2c1ca5a42974c07a05506aabc7b (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 d5ba6b71cf08baaf67d9646a7ca52d0dfb5c3e9c
Author: Sandro Santilli <strk at kbt.io>
Date: Mon Mar 25 18:37:15 2024 +0100
Have _lwt_CheckEdgeCrossing check for interior-boundary intersections
So far only interior-interior intersections have been checked by
the function, missing an important kind of invalid edge addition.
References #5699
diff --git a/liblwgeom/topo/lwgeom_topo.c b/liblwgeom/topo/lwgeom_topo.c
index 55184436c..a0e262b03 100644
--- a/liblwgeom/topo/lwgeom_topo.c
+++ b/liblwgeom/topo/lwgeom_topo.c
@@ -588,7 +588,9 @@ lwt_AddIsoNode( LWT_TOPOLOGY* topo, LWT_ELEMID face,
return _lwt_AddIsoNode( topo, face, pt, skipISOChecks, 1 );
}
-/* Check that an edge does not cross an existing node or edge
+/*
+ * Check that an edge does not cross an existing node and
+ * does not have non-boundary intersection with existing edge
*
* @param myself the id of an edge to skip, if any
* (for ChangeEdgeGeom). Can use 0 for none.
@@ -682,7 +684,7 @@ _lwt_CheckEdgeCrossing( LWT_TOPOLOGY* topo,
LWDEBUGF(2, "Edge %d converted to GEOS", edge_id);
- /* check if the edge crosses our edge (not boundary-boundary) */
+ /* check if the edge has a non-boundary-boundary intersection with our edge */
relate = GEOSRelateBoundaryNodeRule(eegg, edgegg, 2);
if ( ! relate ) {
@@ -695,7 +697,7 @@ _lwt_CheckEdgeCrossing( LWT_TOPOLOGY* topo,
LWDEBUGF(2, "Edge %d relate pattern is %s", edge_id, relate);
- match = GEOSRelatePatternMatch(relate, "F********");
+ match = GEOSRelatePatternMatch(relate, "FF*F*****");
if ( match ) {
/* error or no interior intersection */
GEOSGeom_destroy(eegg);
@@ -754,12 +756,42 @@ _lwt_CheckEdgeCrossing( LWT_TOPOLOGY* topo,
return -1;
}
+ match = GEOSRelatePatternMatch(relate, "*T*******");
+ if ( match ) {
+ _lwt_release_edges(edges, num_edges);
+ GEOSGeom_destroy(edgegg);
+ GEOSGeom_destroy(eegg);
+ GEOSFree(relate);
+ if ( match == 2 ) {
+ lwerror("GEOSRelatePatternMatch error: %s", lwgeom_geos_errmsg);
+ } else {
+ lwerror("Spatial exception - geometry boundary touches interior of edge %"
+ LWTFMT_ELEMID, edge_id);
+ }
+ return -1;
+ }
+
+ match = GEOSRelatePatternMatch(relate, "***T*****");
+ if ( match ) {
+ _lwt_release_edges(edges, num_edges);
+ GEOSGeom_destroy(edgegg);
+ GEOSGeom_destroy(eegg);
+ GEOSFree(relate);
+ if ( match == 2 ) {
+ lwerror("GEOSRelatePatternMatch error: %s", lwgeom_geos_errmsg);
+ } else {
+ lwerror("Spatial exception - boundary of edge % touches interior of geometry"
+ LWTFMT_ELEMID, edge_id);
+ }
+ return -1;
+ }
+
LWDEBUGF(2, "Edge %d analisys completed, it does no harm", edge_id);
GEOSFree(relate);
GEOSGeom_destroy(eegg);
}
- LWDEBUGF(1, "No edge crossing detected amongh the %d candidate edges", num_edges);
+ LWDEBUGF(1, "No edge crossing detected among the %d candidate edges", num_edges);
if ( edges ) _lwt_release_edges(edges, num_edges);
/* would be NULL if num_edges was 0 */
-----------------------------------------------------------------------
Summary of changes:
liblwgeom/topo/lwgeom_topo.c | 40 ++++++++++++++++++++++++++++++++++++----
1 file changed, 36 insertions(+), 4 deletions(-)
hooks/post-receive
--
PostGIS
More information about the postgis-tickets
mailing list