This is an automated email from the git hooks/post-receive script. sebastic pushed a commit to branch master in repository librttopo.
commit fb1f9c93f45b9e3b631f718774dedfb546d9aead Author: Bas Couwenberg <sebas...@xs4all.nl> Date: Thu Jan 25 10:08:34 2018 +0100 New upstream version 1.1.0~rc1 --- HOWTO_RELEASE | 4 +- NEWS.md | 3 + README.md | 4 +- configure.ac | 21 ++- headers/librttopo.h | 17 +- headers/librttopo_geom.h.in | 2 +- src/Makefile.am | 4 +- src/box2d.c | 3 +- src/bytebuffer.c | 3 +- src/bytebuffer.h | 2 +- src/g_box.c | 3 +- src/g_serialized.c | 3 +- src/g_util.c | 3 +- src/librttopo_geom_internal.h | 3 +- src/librttopo_internal.h | 3 +- src/measures.c | 3 +- src/measures.h | 4 +- src/measures3d.c | 5 +- src/measures3d.h | 2 +- src/ptarray.c | 2 +- src/rtalgorithm.c | 3 +- src/rtcircstring.c | 3 +- src/rtcollection.c | 3 +- src/rtcompound.c | 3 +- src/rtcurvepoly.c | 3 +- src/rtgeodetic.c | 3 +- src/rtgeodetic.h | 2 +- src/rtgeom.c | 3 +- src/rtgeom_api.c | 10 +- src/rtgeom_debug.c | 3 +- src/rtgeom_geos.c | 74 +-------- src/rtgeom_geos.h | 2 +- src/rtgeom_geos_clean.c | 4 +- src/rtgeom_geos_node.c | 5 +- src/rtgeom_geos_split.c | 3 +- src/rtgeom_log.h | 2 +- src/rtgeom_topo.c | 68 ++++---- src/rthomogenize.c | 3 +- src/rtin_geojson.c | 2 +- src/rtin_twkb.c | 3 +- src/rtin_wkb.c | 2 +- src/rtiterator.c | 3 +- src/rtline.c | 3 +- src/rtlinearreferencing.c | 3 +- src/rtmcurve.c | 3 +- src/rtmline.c | 3 +- src/rtmpoint.c | 3 +- src/rtmpoly.c | 3 +- src/rtmsurface.c | 3 +- src/rtout_encoded_polyline.c | 3 +- src/rtout_geojson.c | 3 +- src/rtout_gml.c | 3 +- src/rtout_kml.c | 3 +- src/rtout_svg.c | 3 +- src/rtout_twkb.c | 3 +- src/rtout_twkb.h | 4 +- src/rtout_wkb.c | 3 +- src/rtout_wkt.c | 3 +- src/rtout_x3d.c | 3 +- src/rtpoint.c | 2 +- src/rtpoly.c | 3 +- src/rtprint.c | 3 +- src/rtpsurface.c | 3 +- src/rtspheroid.c | 3 +- src/rtstroke.c | 3 +- src/rtt_tpsnap.c | 350 ++++++++++++++++++++---------------------- src/rttin.c | 3 +- src/rttree.c | 3 +- src/rttree.h | 2 +- src/rttriangle.c | 3 +- src/rtutil.c | 102 ++++++------ src/stringbuffer.c | 3 +- src/stringbuffer.h | 2 +- src/varint.c | 3 +- src/varint.h | 2 +- 75 files changed, 420 insertions(+), 423 deletions(-) diff --git a/HOWTO_RELEASE b/HOWTO_RELEASE index f203112..c59f9d0 100644 --- a/HOWTO_RELEASE +++ b/HOWTO_RELEASE @@ -1,9 +1,7 @@ - Set version in configure.ac - Tweak -version-info in src/Makefile.am - Run make distcheck, fix if needed -- Commit all of the above -- Regenerate ChangeLog (make cl) and commit again -- Commit and push to repository, confirm bots are all happy +- Commit all of the above, confirm bots are all happy - Add annotated tag: git tag -sa librttopo-<version> - Push annotated tag to repository: git push <remote> librttopo-<version> - Create release artifacts: make dist diff --git a/NEWS.md b/NEWS.md index 952fdd7..5f515dc 100644 --- a/NEWS.md +++ b/NEWS.md @@ -6,6 +6,9 @@ YYYY-MM-DD - Support for tolerance/precision=0 added, -1 is the new value for automatic computation of minimal tolerance. + - The getEdgeWithinBox2D backend callback needs to support a NULL + value as BBOX pointer (to return all edges) + # New Features - Function `rtt_AddLineNoFace`, to add lines w/out determining new diff --git a/README.md b/README.md index ba94315..8e1d562 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ RT Topology Library | OSGeo | GitLab | |:--- |:--- | -| [![Build Status](https://drone.osgeo.kbt.io/api/badges/rttopo/librttopo/status.svg)] (https://drone.osgeo.kbt.io/rttopo/librttopo) | [![Gitlab-CI](https://gitlab.com/rttopo/rttopo/badges/master/build.svg)] (https://gitlab.com/rttopo/rttopo/commits/master) | +| [![Build Status](https://drone.osgeo.org/api/badges/rttopo/librttopo/status.svg)] (https://drone.osgeo.org/rttopo/librttopo) | [![Gitlab-CI](https://gitlab.com/rttopo/rttopo/badges/master/build.svg)] (https://gitlab.com/rttopo/rttopo/commits/master) | ## About @@ -23,7 +23,7 @@ The RT Topology Library was funded by "Regione Toscana - SITA" (CIG: 6445512CC1), which also funded many improvements in the originating liblwgeom. -Official code repository is https://git.osgeo.org/gogs/rttopo/librttopo. +Official code repository is https://git.osgeo.org/gitea/rttopo/librttopo. A mirror exists at https://gitlab.com/rttopo/rttopo, automatically updated on every push to the official repository. diff --git a/configure.ac b/configure.ac index 1ba5764..1a02c7d 100644 --- a/configure.ac +++ b/configure.ac @@ -20,10 +20,23 @@ AC_DEFINE_UNQUOTED([LIBRTGEOM_VERSION], ["$VERSION"], [rtgeom version]) AC_SUBST([LIBRTGEOM_VERSION]) AH_TEMPLATE([RTGEOM_GEOS_VERSION], [RTTOPO GEOS version.]) -AH_TEMPLATE([RTGEOM_DEBUG_LEVEL], - [RTGEOM Debug Level.]) -AC_DEFINE(RTGEOM_DEBUG_LEVEL) -AC_DEFINE_UNQUOTED([RTGEOM_DEBUG_LEVEL], [0], [debug level]) + +AC_ARG_ENABLE([debug], AC_HELP_STRING([--enable-debug@<:@=LEVEL@:>@], + [Enable debugging messages up to LEVEL (4 if omitted)]), + [ +if test "$enableval" = "no"; then + RTGEOM_DEBUG_LEVEL=0; +else + if test "$enableval" = "yes"; then + RTGEOM_DEBUG_LEVEL=4; + else + RTGEOM_DEBUG_LEVEL=$enableval; + fi; +fi + ], + [RTGEOM_DEBUG_LEVEL=0]) +AC_DEFINE_UNQUOTED([RTGEOM_DEBUG_LEVEL], [$RTGEOM_DEBUG_LEVEL], [RTGEOM Debug level]) + # Checks for header files. AC_CHECK_HEADERS(stdlib.h,, [AC_MSG_ERROR([cannot find stdlib.h, bailing out])]) diff --git a/headers/librttopo.h b/headers/librttopo.h index 6c77f34..15ba384 100644 --- a/headers/librttopo.h +++ b/headers/librttopo.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -458,7 +458,7 @@ typedef struct RTT_BE_CALLBACKS_T { * Get edges whose bounding box overlaps a given 2D bounding box * * @param topo the topology to act upon - * @param box the query box + * @param box the query box, to be considered infinite if NULL * @param numelems output parameter, gets number of elements found * if the return is not null, otherwise see @return * section for semantic. @@ -1418,21 +1418,22 @@ RTGEOM* rtt_GetFaceGeometry(RTT_TOPOLOGY* topo, RTT_ELEMID face); /* * rtt_tpsnap - snap geometry to topology * - * Uses Trevisani-Peri algorithm version 7 as reported here: - * https://git.osgeo.org/gogs/rttopo/librttopo/wiki/SnapToTopo-algorithm + * Uses Trevisani-Peri algorithm version 13 as reported here: + * https://git.osgeo.org/gitea/rttopo/librttopo/wiki/SnapToTopo-algorithm * * @param topo the reference topology * @param gin the input geometry - * @param tssnap snap tolerance + * @param tolerance_snap snap tolerance + * @param tolerance_removal removal tolerance (use -1 to skip removal phase) * @param iterate if non zero, allows snapping to more than a single vertex, * iteratively - * @param remove_vertices if non zero, makes an initial pass removing - * vertices within tolerance * * @return a new geometry, or NULL on error * */ RTGEOM* rtt_tpsnap(RTT_TOPOLOGY *topo, const RTGEOM *gin, - double tssnap, int iterate, int remove_vertices); + double tolerance_snap, + double tolerance_removal, + int iterate); #endif /* LIBRTGEOM_TOPO_H */ diff --git a/headers/librttopo_geom.h.in b/headers/librttopo_geom.h.in index d27c32f..6aaa840 100644 --- a/headers/librttopo_geom.h.in +++ b/headers/librttopo_geom.h.in @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/Makefile.am b/src/Makefile.am index dd4ff3f..9085cda 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ -AM_CPPFLAGS = -I$(top_srcdir)/src -AM_CPPFLAGS += -I$(top_srcdir)/headers +AM_CPPFLAGS = -I$(top_builddir)/src +AM_CPPFLAGS += -I$(top_builddir)/headers -I$(top_srcdir)/headers lib_LTLIBRARIES = librttopo.la diff --git a/src/box2d.c b/src/box2d.c index 4548091..188bb4d 100644 --- a/src/box2d.c +++ b/src/box2d.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ **********************************************************************/ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/bytebuffer.c b/src/bytebuffer.c index 2f6e318..fef9f1e 100644 --- a/src/bytebuffer.c +++ b/src/bytebuffer.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include "bytebuffer.h" diff --git a/src/bytebuffer.h b/src/bytebuffer.h index 321f971..0c230fa 100644 --- a/src/bytebuffer.h +++ b/src/bytebuffer.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/g_box.c b/src/g_box.c index 69e35a7..de4e1fe 100644 --- a/src/g_box.c +++ b/src/g_box.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,6 +27,7 @@ #if !HAVE_ISFINITE #endif +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include "rtgeom_log.h" #include <stdlib.h> diff --git a/src/g_serialized.c b/src/g_serialized.c index 1d6da56..2b4ce9a 100644 --- a/src/g_serialized.c +++ b/src/g_serialized.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include "rtgeom_log.h" diff --git a/src/g_util.c b/src/g_util.c index 85cbca9..3dcf39d 100644 --- a/src/g_util.c +++ b/src/g_util.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <ctype.h> #include "librttopo_geom_internal.h" diff --git a/src/librttopo_geom_internal.h b/src/librttopo_geom_internal.h index 6e44182..c0a6c77 100644 --- a/src/librttopo_geom_internal.h +++ b/src/librttopo_geom_internal.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,7 +30,6 @@ #ifndef _LIBRTGEOM_INTERNAL_H #define _LIBRTGEOM_INTERNAL_H 1 -#include "rttopo_config.h" #include "librttopo_geom.h" #include "rtgeom_log.h" diff --git a/src/librttopo_internal.h b/src/librttopo_internal.h index 82dd854..8ac77a5 100644 --- a/src/librttopo_internal.h +++ b/src/librttopo_internal.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,7 +27,6 @@ #ifndef LIBRTGEOM_TOPO_INTERNAL_H #define LIBRTGEOM_TOPO_INTERNAL_H 1 -#include "rttopo_config.h" #include "geos_c.h" #include "librttopo_geom.h" diff --git a/src/measures.c b/src/measures.c index 7176084..6d6a2a6 100644 --- a/src/measures.c +++ b/src/measures.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +26,7 @@ +#include "rttopo_config.h" #include <string.h> #include <stdlib.h> diff --git a/src/measures.h b/src/measures.h index 1f3e278..9325ca6 100644 --- a/src/measures.h +++ b/src/measures.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * Copyright 2010 Nicklas Avén * * This is free software; you can redistribute and/or modify it under diff --git a/src/measures3d.c b/src/measures3d.c index 550624d..454f830 100644 --- a/src/measures3d.c +++ b/src/measures3d.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * Copyright 2011 Nicklas Avén * * This is free software; you can redistribute and/or modify it under @@ -36,6 +36,7 @@ * **********************************************************************/ +#include "rttopo_config.h" #include <string.h> #include <stdlib.h> diff --git a/src/measures3d.h b/src/measures3d.h index 0dc8e6e..cb149ac 100644 --- a/src/measures3d.h +++ b/src/measures3d.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/ptarray.c b/src/ptarray.c index 2e082e2..6531695 100644 --- a/src/ptarray.c +++ b/src/ptarray.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/rtalgorithm.c b/src/rtalgorithm.c index 2eb2563..b710d9f 100644 --- a/src/rtalgorithm.c +++ b/src/rtalgorithm.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include "rtgeom_log.h" #include <ctype.h> /* for tolower */ diff --git a/src/rtcircstring.c b/src/rtcircstring.c index 67bd9e3..e3f1888 100644 --- a/src/rtcircstring.c +++ b/src/rtcircstring.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +26,7 @@ /* basic RTCIRCSTRING functions */ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtcollection.c b/src/rtcollection.c index 7ac1c80..58cec05 100644 --- a/src/rtcollection.c +++ b/src/rtcollection.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtcompound.c b/src/rtcompound.c index 85fe19a..3b1711c 100644 --- a/src/rtcompound.c +++ b/src/rtcompound.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtcurvepoly.c b/src/rtcurvepoly.c index 8288757..bef192d 100644 --- a/src/rtcurvepoly.c +++ b/src/rtcurvepoly.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +26,7 @@ /* basic RTCURVEPOLY manipulation */ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtgeodetic.c b/src/rtgeodetic.c index 6a7ef7d..49074a5 100644 --- a/src/rtgeodetic.c +++ b/src/rtgeodetic.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include "rtgeodetic.h" #include "rtgeom_log.h" diff --git a/src/rtgeodetic.h b/src/rtgeodetic.h index cdb654e..d8ae714 100644 --- a/src/rtgeodetic.h +++ b/src/rtgeodetic.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/rtgeom.c b/src/rtgeom.c index e1f2386..9034df6 100644 --- a/src/rtgeom.c +++ b/src/rtgeom.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <stdarg.h> diff --git a/src/rtgeom_api.c b/src/rtgeom_api.c index c698ee1..bb78928 100644 --- a/src/rtgeom_api.c +++ b/src/rtgeom_api.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,9 +22,7 @@ * **********************************************************************/ - - - +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include "rtgeom_log.h" @@ -240,6 +238,8 @@ rt_getPoint4d(const RTCTX *ctx, const RTPOINTARRAY *pa, int n) * will set point's m=NO_M_VALUE if pa is 3d or 2d * * NOTE: this will modify the point4d pointed to by 'point'. + * + * @return 0 on error, 1 on success */ int rt_getPoint4d_p(const RTCTX *ctx, const RTPOINTARRAY *pa, int n, RTPOINT4D *op) @@ -253,6 +253,7 @@ rt_getPoint4d_p(const RTCTX *ctx, const RTPOINTARRAY *pa, int n, RTPOINT4D *op) if ( (n<0) || (n>=pa->npoints)) { rterror(ctx, "rt_getPoint4d_p: point offset out of range"); + return 0; } #endif @@ -289,6 +290,7 @@ rt_getPoint4d_p(const RTCTX *ctx, const RTPOINTARRAY *pa, int n, RTPOINT4D *op) default: rterror(ctx, "Unknown ZM flag ??"); + return 0; } return 1; diff --git a/src/rtgeom_debug.c b/src/rtgeom_debug.c index e3bfe5f..9ddd2ab 100644 --- a/src/rtgeom_debug.c +++ b/src/rtgeom_debug.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include "rtgeom_log.h" #include "librttopo_geom.h" diff --git a/src/rtgeom_geos.c b/src/rtgeom_geos.c index 4e66082..0afaf96 100644 --- a/src/rtgeom_geos.c +++ b/src/rtgeom_geos.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,8 +22,7 @@ * **********************************************************************/ - - +#include "rttopo_config.h" #include "rtgeom_geos.h" #include "librttopo_geom.h" #include "librttopo_geom_internal.h" @@ -237,7 +236,10 @@ ptarray_to_GEOSCoordSeq(const RTCTX *ctx, const RTPOINTARRAY *pa) dims = 3; if ( ! (sq = GEOSCoordSeq_create_r(ctx->gctx, pa->npoints, dims)) ) + { rterror(ctx, "Error creating GEOS Coordinate Sequence"); + return NULL; + } for ( i=0; i < pa->npoints; i++ ) { @@ -253,15 +255,6 @@ ptarray_to_GEOSCoordSeq(const RTCTX *ctx, const RTPOINTARRAY *pa) RTDEBUGF(ctx, 4, "Point: %g,%g", p2d->x, p2d->y); } -#if RTGEOM_GEOS_VERSION < 33 - /* Make sure we don't pass any infinite values down into GEOS */ - /* GEOS 3.3+ is supposed to handle this stuff OK */ - if ( isinf(p2d->x) || isinf(p2d->y) || (dims == 3 && isinf(p3d->z)) ) - rterror(ctx, "Infinite coordinate value found in geometry."); - if ( isnan(p2d->x) || isnan(p2d->y) || (dims == 3 && isnan(p3d->z)) ) - rterror(ctx, "NaN coordinate value found in geometry."); -#endif - GEOSCoordSeq_setX_r(ctx->gctx, sq, i, p2d->x); GEOSCoordSeq_setY_r(ctx->gctx, sq, i, p2d->y); @@ -375,23 +368,13 @@ RTGEOM2GEOS(const RTCTX *ctx, const RTGEOM *rtgeom, int autofix) RTPOLY *rtpoly = NULL; RTLINE *rtl = NULL; RTCOLLECTION *rtc = NULL; -#if RTGEOM_GEOS_VERSION < 33 - RTPOINTARRAY *pa = NULL; -#endif case RTPOINTTYPE: rtp = (RTPOINT *)rtgeom; if ( rtgeom_is_empty(ctx, rtgeom) ) { -#if RTGEOM_GEOS_VERSION < 33 - pa = ptarray_construct_empty(ctx, rtgeom_has_z(ctx, rtgeom), rtgeom_has_m(ctx, rtgeom), 2); - sq = ptarray_to_GEOSCoordSeq(ctx, pa); - shell = GEOSGeom_createLinearRing_r(ctx->gctx, sq); - g = GEOSGeom_createPolygon_r(ctx->gctx, shell, NULL, 0); -#else g = GEOSGeom_createEmptyPolygon_r(ctx->gctx); -#endif } else { @@ -427,14 +410,7 @@ RTGEOM2GEOS(const RTCTX *ctx, const RTGEOM *rtgeom, int autofix) rtpoly = (RTPOLY *)rtgeom; if ( rtgeom_is_empty(ctx, rtgeom) ) { -#if RTGEOM_GEOS_VERSION < 33 - RTPOINTARRAY *pa = ptarray_construct_empty(ctx, rtgeom_has_z(ctx, rtgeom), rtgeom_has_m(ctx, rtgeom), 2); - sq = ptarray_to_GEOSCoordSeq(ctx, pa); - shell = GEOSGeom_createLinearRing_r(ctx->gctx, sq); - g = GEOSGeom_createPolygon_r(ctx->gctx, shell, NULL, 0); -#else g = GEOSGeom_createEmptyPolygon_r(ctx->gctx); -#endif } else { @@ -1439,14 +1415,6 @@ rtgeom_geos_noop(const RTCTX *ctx, const RTGEOM* geom_in) RTGEOM* rtgeom_snap(const RTCTX *ctx, const RTGEOM* geom1, const RTGEOM* geom2, double tolerance) { -#if RTGEOM_GEOS_VERSION < 33 - rterror(ctx, "The GEOS version this rtgeom library " - "was compiled against (%d) doesn't support " - "'Snap' function (3.3.0+ required)", - RTGEOM_GEOS_VERSION); - return NULL; -#else /* RTGEOM_GEOS_VERSION >= 33 */ - int srid, is3d; GEOSGeometry *g1, *g2, *g3; RTGEOM* out; @@ -1496,20 +1464,11 @@ rtgeom_snap(const RTCTX *ctx, const RTGEOM* geom1, const RTGEOM* geom2, double t GEOSGeom_destroy_r(ctx->gctx, g3); return out; - -#endif /* RTGEOM_GEOS_VERSION >= 33 */ } RTGEOM* rtgeom_sharedpaths(const RTCTX *ctx, const RTGEOM* geom1, const RTGEOM* geom2) { -#if RTGEOM_GEOS_VERSION < 33 - rterror(ctx, "The GEOS version this postgis binary " - "was compiled against (%d) doesn't support " - "'SharedPaths' function (3.3.0+ required)", - RTGEOM_GEOS_VERSION); - return NULL; -#else /* RTGEOM_GEOS_VERSION >= 33 */ GEOSGeometry *g1, *g2, *g3; RTGEOM *out; int is3d, srid; @@ -1558,15 +1517,11 @@ rtgeom_sharedpaths(const RTCTX *ctx, const RTGEOM* geom1, const RTGEOM* geom2) } return out; -#endif /* RTGEOM_GEOS_VERSION >= 33 */ } RTGEOM* rtgeom_offsetcurve(const RTCTX *ctx, const RTLINE *rtline, double size, int quadsegs, int joinStyle, double mitreLimit) { -#if RTGEOM_GEOS_VERSION < 32 - rterror(ctx, "rtgeom_offsetcurve: GEOS 3.2 or higher required"); -#else GEOSGeometry *g1, *g3; RTGEOM *rtgeom_result; RTGEOM *rtgeom_in = rtline_as_rtgeom(ctx, rtline); @@ -1580,14 +1535,7 @@ rtgeom_offsetcurve(const RTCTX *ctx, const RTLINE *rtline, double size, int quad return NULL; } -#if RTGEOM_GEOS_VERSION < 33 - /* Size is artays positive for GEOSSingleSidedBuffer, and a flag determines left/right */ - g3 = GEOSSingleSidedBuffer_r(ctx->gctx, g1, size < 0 ? -size : size, - quadsegs, joinStyle, mitreLimit, - size < 0 ? 0 : 1); -#else g3 = GEOSOffsetCurve_r(ctx->gctx, g1, size, quadsegs, joinStyle, mitreLimit); -#endif /* Don't need input geometry anymore */ GEOSGeom_destroy_r(ctx->gctx, g1); @@ -1610,8 +1558,6 @@ rtgeom_offsetcurve(const RTCTX *ctx, const RTLINE *rtline, double size, int quad } return rtgeom_result; - -#endif /* RTGEOM_GEOS_VERSION < 32 */ } RTTIN * rttin_from_geos(const RTCTX *ctx, const GEOSGeometry *geom, int want3d) { @@ -1679,11 +1625,9 @@ RTTIN * rttin_from_geos(const RTCTX *ctx, const GEOSGeometry *geom, int want3d) /* * output = 1 for edges, 2 for TIN, 0 for polygons */ -RTGEOM* rtgeom_delaunay_triangulation(const RTCTX *ctx, const RTGEOM *rtgeom_in, double tolerance, int output) { -#if RTGEOM_GEOS_VERSION < 34 - rterror(ctx, "rtgeom_delaunay_triangulation: GEOS 3.4 or higher required"); - return NULL; -#else +RTGEOM* +rtgeom_delaunay_triangulation(const RTCTX *ctx, const RTGEOM *rtgeom_in, double tolerance, int output) +{ GEOSGeometry *g1, *g3; RTGEOM *rtgeom_result; @@ -1735,6 +1679,4 @@ RTGEOM* rtgeom_delaunay_triangulation(const RTCTX *ctx, const RTGEOM *rtgeom_in, } return rtgeom_result; - -#endif /* RTGEOM_GEOS_VERSION < 34 */ } diff --git a/src/rtgeom_geos.h b/src/rtgeom_geos.h index d202cc8..ab7a53a 100644 --- a/src/rtgeom_geos.h +++ b/src/rtgeom_geos.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/rtgeom_geos_clean.c b/src/rtgeom_geos_clean.c index d352b1a..f5203dd 100644 --- a/src/rtgeom_geos_clean.c +++ b/src/rtgeom_geos_clean.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ * **********************************************************************/ - +#include "rttopo_config.h" #include "librttopo_geom.h" #include "rtgeom_geos.h" diff --git a/src/rtgeom_geos_node.c b/src/rtgeom_geos_node.c index 777ac0a..5e9a22d 100644 --- a/src/rtgeom_geos_node.c +++ b/src/rtgeom_geos_node.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,8 +22,7 @@ * **********************************************************************/ - - +#include "rttopo_config.h" #include "rtgeom_geos.h" #include "librttopo_geom_internal.h" diff --git a/src/rtgeom_geos_split.c b/src/rtgeom_geos_split.c index 472b4ea..74eeab0 100644 --- a/src/rtgeom_geos_split.c +++ b/src/rtgeom_geos_split.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,6 +28,7 @@ +#include "rttopo_config.h" #include "rtgeom_geos.h" #include "librttopo_geom_internal.h" diff --git a/src/rtgeom_log.h b/src/rtgeom_log.h index c920395..e706936 100644 --- a/src/rtgeom_log.h +++ b/src/rtgeom_log.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/rtgeom_topo.c b/src/rtgeom_topo.c index 92e4687..7cc0e4b 100644 --- a/src/rtgeom_topo.c +++ b/src/rtgeom_topo.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1511,11 +1511,13 @@ _rtt_InitEdgeEndByLine(const RTCTX *ctx, edgeend *fee, edgeend *lee, RTLINE *edg return -1; } if ( ! azimuth_pt_pt(ctx, fp, &pt, &(fee->myaz)) ) { - rterror(ctx, "error computing azimuth of first edgeend [%g %g,%g %g]", + rterror(ctx, "error computing azimuth of first edgeend" + " [%.15g %.15g,%.15g %.15g]", fp->x, fp->y, pt.x, pt.y); return -2; } - RTDEBUGF(ctx, 1, "azimuth of first edge end [%g %g,%g %g] is %g", + RTDEBUGF(ctx, 1, "azimuth of first edge end" + " [%.15g %.15g,%.15g %.15g] is %.15g", fp->x, fp->y, pt.x, pt.y, fee->myaz); /* Compute azimuth of second edge end */ @@ -1526,11 +1528,13 @@ _rtt_InitEdgeEndByLine(const RTCTX *ctx, edgeend *fee, edgeend *lee, RTLINE *edg return -1; } if ( ! azimuth_pt_pt(ctx, lp, &pt, &(lee->myaz)) ) { - rterror(ctx, "error computing azimuth of last edgeend [%g %g,%g %g]", + rterror(ctx, "error computing azimuth of last segment" + " [%.15g %.15g,%.15g %.15g]", lp->x, lp->y, pt.x, pt.y); return -2; } - RTDEBUGF(ctx, 1, "azimuth of last edge end [%g %g,%g %g] is %g", + RTDEBUGF(ctx, 1, "azimuth of last edge end" + " [%.15g %.15g,%.15g %.15g] is %.15g", lp->x, lp->y, pt.x, pt.y, lee->myaz); return 0; @@ -1620,13 +1624,14 @@ _rtt_FindAdjacentEdges( RTT_TOPOLOGY* topo, RTT_ELEMID node, edgeend *data, rt_getPoint2d_p(iface->ctx, pa, 1, &p2); RTDEBUGF(iface->ctx, 1, "edge %" RTTFMT_ELEMID " starts on node %" RTTFMT_ELEMID - ", edgeend is %g,%g-%g,%g", + ", edgeend is %.15g %.15g,%.15g %.15g", edge->edge_id, node, p1.x, p1.y, p2.x, p2.y); if ( ! azimuth_pt_pt(iface->ctx, &p1, &p2, &az) ) {{ RTT_ELEMID id = edge->edge_id; rtt_release_edges(iface->ctx, edges, numedges); rtgeom_free(iface->ctx, cleangeom); - rterror(iface->ctx, "error computing azimuth of edge %d first edgeend [%g,%g-%g,%g]", + rterror(iface->ctx, "error computing azimuth of edge %d first segment" + " [%.15g %.15g,%.15g,%.15g]", id, p1.x, p1.y, p2.x, p2.y); return -1; }} @@ -1675,14 +1680,16 @@ _rtt_FindAdjacentEdges( RTT_TOPOLOGY* topo, RTT_ELEMID node, edgeend *data, if ( edge->end_node == node ) { rt_getPoint2d_p(iface->ctx, pa, pa->npoints-1, &p1); rt_getPoint2d_p(iface->ctx, pa, pa->npoints-2, &p2); - RTDEBUGF(iface->ctx, 1, "edge %" RTTFMT_ELEMID " ends on node %" RTTFMT_ELEMID - ", edgeend is %g,%g-%g,%g", + RTDEBUGF(iface->ctx, 1, "edge %" RTTFMT_ELEMID + " ends on node %" RTTFMT_ELEMID + ", edgeend is %.15g %.15g,%.15g %.15g", edge->edge_id, node, p1.x, p1.y, p2.x, p2.y); if ( ! azimuth_pt_pt(iface->ctx, &p1, &p2, &az) ) {{ RTT_ELEMID id = edge->edge_id; rtt_release_edges(iface->ctx, edges, numedges); rtgeom_free(iface->ctx, cleangeom); - rterror(iface->ctx, "error computing azimuth of edge %d last edgeend [%g,%g-%g,%g]", + rterror(iface->ctx, "error computing azimuth of edge %d last segment" + " [%.15g %.15g,%.15g %.15g]", id, p1.x, p1.y, p2.x, p2.y); return -1; }} @@ -2442,7 +2449,8 @@ _rtt_AddEdge( RTT_TOPOLOGY* topo, } if ( ! azimuth_pt_pt(iface->ctx, &p1, &pn, &span.myaz) ) { rtgeom_free(iface->ctx, cleangeom); - rterror(iface->ctx, "error computing azimuth of first edgeend [%g,%g-%g,%g]", + rterror(iface->ctx, "error computing azimuth of first segment" + " [%.15g %.15g,%.15g %.15g]", p1.x, p1.y, pn.x, pn.y); return -1; } @@ -2453,7 +2461,8 @@ _rtt_AddEdge( RTT_TOPOLOGY* topo, rt_getPoint2d_p(iface->ctx, pa, pa->npoints-2, &pn); rtgeom_free(iface->ctx, cleangeom); if ( ! azimuth_pt_pt(iface->ctx, &p2, &pn, &epan.myaz) ) { - rterror(iface->ctx, "error computing azimuth of last edgeend [%g,%g-%g,%g]", + rterror(iface->ctx, "error computing azimuth of last segment" + " [%.15g %.15g,%.15g %.15g]", p2.x, p2.y, pn.x, pn.y); return -1; } @@ -6005,7 +6014,7 @@ rtt_AddLineNoFace(RTT_TOPOLOGY* topo, RTLINE* line, double tol, int* nedges) /* Backend error, message should have been printed already */ return NULL; } - + return _rtt_AddLine(topo, line, tol, nedges, 0); } @@ -6183,6 +6192,7 @@ _rtt_getIsoEdgeById(RTT_ISO_EDGE_TABLE *tab, RTT_ELEMID id) typedef struct RTT_EDGERING_ELEM_T { /* externally owned */ RTT_ISO_EDGE *edge; + /* 0 if false, 1 if true */ int left; } RTT_EDGERING_ELEM; @@ -6349,12 +6359,9 @@ _rtt_FetchAllEdges(RTT_TOPOLOGY *topo, int *numedges) RTT_ISO_EDGE *edge; int fields = RTT_COL_EDGE_ALL; int nelems = 1; - RTGBOX qbox; const RTCTX *ctx = topo->be_iface->ctx; - qbox.xmin = qbox.ymin = -DBL_MAX; - qbox.xmax = qbox.ymax = DBL_MAX; - edge = rtt_be_getEdgeWithinBox2D( topo, &qbox, &nelems, fields, 0); + edge = rtt_be_getEdgeWithinBox2D( topo, NULL, &nelems, fields, 0); *numedges = nelems; if ( nelems == -1 ) { rterror(ctx, "Backend error: %s", rtt_be_lastErrorMessage(topo->be_iface)); @@ -6511,7 +6518,7 @@ _rtt_BuildEdgeRing(RTT_TOPOLOGY *topo, RTT_ISO_EDGE_TABLE *edges, } } while (cur != edge || curside != side); - RTDEBUGF(ctx, 1, "Ring for edge %d has %d elems", edge->edge_id, ring->size); + RTDEBUGF(ctx, 1, "Ring for edge %d has %d elems", edge->edge_id*side, ring->size); return ring; } @@ -6706,7 +6713,7 @@ _rtt_RegisterFaceOnEdgeSide(RTT_TOPOLOGY *topo, RTT_ISO_EDGE *edge, /* Create new face */ RTT_ISO_FACE newface; - RTDEBUGF(ctx, 1, "Ring of edge %d is a shell", sedge); + RTDEBUGF(ctx, 1, "Ring of edge %d is a shell (shell %d)", sedge, shells->size); newface.mbr = _rtt_EdgeRingGetBbox(ctx, ring); @@ -6742,7 +6749,7 @@ _rtt_RegisterFaceOnEdgeSide(RTT_TOPOLOGY *topo, RTT_ISO_EDGE *edge, } else /* cw, so is an hole */ { - RTDEBUGF(ctx, 1, "Ring of edge %d is a hole", sedge); + RTDEBUGF(ctx, 1, "Ring of edge %d is a hole (hole %d)", sedge, holes->size); *registered = placeholder_faceid; RTT_EDGERING_ARRAY_PUSH(ctx, holes, ring); } @@ -6835,8 +6842,8 @@ _rtt_FindFaceContainingRing(RTT_TOPOLOGY* topo, RTT_EDGERING *ring, accumulator.ctx = ctx; RTT_EDGERING_ARRAY_INIT(ctx, &candidates); GEOSSTRtree_query_r(ctx->gctx, shells->tree, ghole, &_rtt_AccumulateCanditates, &accumulator); - RTDEBUGF(ctx, 1, "Found %d candidate shells for containement of ring %d point", - candidates.size, ring->elems[0]->edge->edge_id); + RTDEBUGF(ctx, 1, "Found %d candidate shells containing first point of ring's originating edge %d", + candidates.size, ring->elems[0]->edge->edge_id * ( ring->elems[0]->left ? 1 : -1 ) ); /* TODO: sort candidates by bounding box size */ @@ -6848,15 +6855,24 @@ _rtt_FindFaceContainingRing(RTT_TOPOLOGY* topo, RTT_EDGERING *ring, if ( sring->elems[0]->edge->edge_id == ring->elems[0]->edge->edge_id ) { - RTDEBUGF(ctx, 1, "Shell %d is on other side of ring", _rtt_EdgeRingGetFace(sring)); + RTDEBUGF(ctx, 1, "Shell %d is on other side of ring", + _rtt_EdgeRingGetFace(sring)); + continue; + } + + /* The hole envelope cannot equal the shell envelope */ + if ( gbox_same(ctx, shellbox, testbox) ) + { + RTDEBUGF(ctx, 1, "Bbox of shell %d equals that of hole ring", + _rtt_EdgeRingGetFace(sring)); continue; } - /* Skip if test point is not in shellbox */ + /* Skip if ring box is not in shell box */ if ( ! gbox_contains_2d(ctx, shellbox, testbox) ) { - /* TODO: skip this, should never happen, as we're candidates! */ - RTDEBUGF(ctx, 1, "Bbox of shell %d does not contain bbox of ring point", _rtt_EdgeRingGetFace(sring)); + RTDEBUGF(ctx, 1, "Bbox of shell %d does not contain bbox of ring point", + _rtt_EdgeRingGetFace(sring)); continue; } diff --git a/src/rthomogenize.c b/src/rthomogenize.c index 773a8b7..f51cf54 100644 --- a/src/rthomogenize.c +++ b/src/rthomogenize.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <stdlib.h> #include "librttopo_geom_internal.h" #include "rtgeom_log.h" diff --git a/src/rtin_geojson.c b/src/rtin_geojson.c index 289127b..d0aa54b 100644 --- a/src/rtin_geojson.c +++ b/src/rtin_geojson.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/rtin_twkb.c b/src/rtin_twkb.c index bd48fc1..1b2a7ae 100644 --- a/src/rtin_twkb.c +++ b/src/rtin_twkb.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <math.h> #include "librttopo_geom_internal.h" #include "rtgeom_log.h" diff --git a/src/rtin_wkb.c b/src/rtin_wkb.c index a19228f..b2294d5 100644 --- a/src/rtin_wkb.c +++ b/src/rtin_wkb.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/rtiterator.c b/src/rtiterator.c index 447c14b..8f14336 100644 --- a/src/rtiterator.c +++ b/src/rtiterator.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include "librttopo_geom.h" #include "rtgeom_log.h" diff --git a/src/rtline.c b/src/rtline.c index 115a541..0d55ee3 100644 --- a/src/rtline.c +++ b/src/rtline.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,6 +27,7 @@ /* basic RTLINE functions */ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtlinearreferencing.c b/src/rtlinearreferencing.c index 4e45647..09a95f3 100644 --- a/src/rtlinearreferencing.c +++ b/src/rtlinearreferencing.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include "rtgeom_log.h" #include "measures3d.h" diff --git a/src/rtmcurve.c b/src/rtmcurve.c index 26c46c4..17f5043 100644 --- a/src/rtmcurve.c +++ b/src/rtmcurve.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtmline.c b/src/rtmline.c index 328fbb4..03f10f4 100644 --- a/src/rtmline.c +++ b/src/rtmline.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtmpoint.c b/src/rtmpoint.c index 47dbaeb..215d695 100644 --- a/src/rtmpoint.c +++ b/src/rtmpoint.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtmpoly.c b/src/rtmpoly.c index 2cf95bb..c73f31b 100644 --- a/src/rtmpoly.c +++ b/src/rtmpoly.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtmsurface.c b/src/rtmsurface.c index e959433..479c65d 100644 --- a/src/rtmsurface.c +++ b/src/rtmsurface.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtout_encoded_polyline.c b/src/rtout_encoded_polyline.c index 68883dd..4815f23 100644 --- a/src/rtout_encoded_polyline.c +++ b/src/rtout_encoded_polyline.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include "stringbuffer.h" #include "librttopo_geom_internal.h" diff --git a/src/rtout_geojson.c b/src/rtout_geojson.c index 4a545c6..45fe1b8 100644 --- a/src/rtout_geojson.c +++ b/src/rtout_geojson.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include <string.h> /* strlen */ #include <assert.h> diff --git a/src/rtout_gml.c b/src/rtout_gml.c index 40728af..811e2fc 100644 --- a/src/rtout_gml.c +++ b/src/rtout_gml.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,6 +32,7 @@ **********************************************************************/ +#include "rttopo_config.h" #include <string.h> #include "librttopo_geom_internal.h" diff --git a/src/rtout_kml.c b/src/rtout_kml.c index d3367f3..a290e9f 100644 --- a/src/rtout_kml.c +++ b/src/rtout_kml.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include "stringbuffer.h" diff --git a/src/rtout_svg.c b/src/rtout_svg.c index 3b87f1b..ea6e131 100644 --- a/src/rtout_svg.c +++ b/src/rtout_svg.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,6 +33,7 @@ * BNF SVG Path: <http://www.w3.org/TR/SVG/paths.html#PathDataBNF> **********************************************************************/ +#include "rttopo_config.h" #include "librttopo_geom_internal.h" static char * assvg_point(const RTCTX *ctx, const RTPOINT *point, int relative, int precision); diff --git a/src/rtout_twkb.c b/src/rtout_twkb.c index da48753..72bbef1 100644 --- a/src/rtout_twkb.c +++ b/src/rtout_twkb.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include "rtout_twkb.h" /* diff --git a/src/rtout_twkb.h b/src/rtout_twkb.h index 20f1029..29c147d 100644 --- a/src/rtout_twkb.h +++ b/src/rtout_twkb.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * Copyright 2013 Nicklas Avén * * This is free software; you can redistribute and/or modify it under diff --git a/src/rtout_wkb.c b/src/rtout_wkb.c index 34f8c82..7cfeda6 100644 --- a/src/rtout_wkb.c +++ b/src/rtout_wkb.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <math.h> #include "librttopo_geom_internal.h" diff --git a/src/rtout_wkt.c b/src/rtout_wkt.c index 014085a..fa1845b 100644 --- a/src/rtout_wkt.c +++ b/src/rtout_wkt.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include "rtgeom_log.h" #include "stringbuffer.h" diff --git a/src/rtout_x3d.c b/src/rtout_x3d.c index e03fbd0..3dad3ab 100644 --- a/src/rtout_x3d.c +++ b/src/rtout_x3d.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,6 +29,7 @@ **********************************************************************/ +#include "rttopo_config.h" #include <string.h> #include "librttopo_geom_internal.h" diff --git a/src/rtpoint.c b/src/rtpoint.c index 8291fd1..87da8fa 100644 --- a/src/rtpoint.c +++ b/src/rtpoint.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/rtpoly.c b/src/rtpoly.c index e4924e1..18a0e02 100644 --- a/src/rtpoly.c +++ b/src/rtpoly.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,6 +27,7 @@ /* basic RTPOLY manipulation */ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtprint.c b/src/rtprint.c index e160fe3..43e7dd3 100644 --- a/src/rtprint.c +++ b/src/rtprint.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ +#include "rttopo_config.h" #include <stdio.h> #include <string.h> #include "librttopo_geom_internal.h" diff --git a/src/rtpsurface.c b/src/rtpsurface.c index bd7751b..7e19ce9 100644 --- a/src/rtpsurface.c +++ b/src/rtpsurface.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtspheroid.c b/src/rtspheroid.c index 9c673fb..0d715a1 100644 --- a/src/rtspheroid.c +++ b/src/rtspheroid.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include "rtgeodetic.h" #include "rtgeom_log.h" diff --git a/src/rtstroke.c b/src/rtstroke.c index 06ff361..25fdf89 100644 --- a/src/rtstroke.c +++ b/src/rtstroke.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <stdarg.h> diff --git a/src/rtt_tpsnap.c b/src/rtt_tpsnap.c index 2bab00a..de02fe3 100644 --- a/src/rtt_tpsnap.c +++ b/src/rtt_tpsnap.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,7 +21,7 @@ * Implementation of Trevisani-Peri snap algoritm * * See - * https://git.osgeo.org/gogs/rttopo/librttopo/wiki/SnapToTopo-algorithm + * https://git.osgeo.org/gitea/rttopo/librttopo/wiki/SnapToTopo-algorithm * ********************************************************************** * @@ -31,7 +31,7 @@ #include "rttopo_config.h" -/*#define RTGEOM_DEBUG_LEVEL 1*/ +/*#define RTGEOM_DEBUG_LEVEL 4*/ #include "rtgeom_log.h" #include "librttopo_geom.h" @@ -86,48 +86,6 @@ typedef struct { (a)->pts[(a)->size++] = (r); \ } -/* A pair of points with their distance */ -typedef struct { - RTT_SNAPV *p1; - RTT_SNAPV *p2; - double totdist; /* sum of the two points distances */ - double segdist; /* between the two points */ -} RTT_VPAIR; - -/* An array of RTT_VPAIR structs */ -typedef struct { - RTT_VPAIR *pts; - int size; - int capacity; -} RTT_VPAIR_ARRAY; - -#define RTT_VPAIR_ARRAY_INIT(c, a) { \ - (a)->size = 0; \ - (a)->capacity = 1; \ - (a)->pts = rtalloc((c), sizeof(RTT_VPAIR) * (a)->capacity); \ -} - -#define RTT_VPAIR_ARRAY_CLEAN(c, a) { \ - rtfree((c), (a)->pts); \ - (a)->pts = NULL; \ - (a)->size = 0; \ - (a)->capacity = 0; \ -} - -#define RTT_VPAIR_ARRAY_INIT(c, a) { \ - (a)->size = 0; \ - (a)->capacity = 1; \ - (a)->pts = rtalloc((c), sizeof(RTT_VPAIR) * (a)->capacity); \ -} - -#define RTT_VPAIR_ARRAY_PUSH(c, a, r) { \ - if ( (a)->size + 1 > (a)->capacity ) { \ - (a)->capacity *= 2; \ - (a)->pts = rtrealloc((c), (a)->pts, sizeof(RTT_VPAIR) * (a)->capacity); \ - } \ - (a)->pts[(a)->size++] = (r); \ -} - typedef struct { @@ -135,15 +93,16 @@ typedef struct * Input parameters / configuration */ const RTT_TOPOLOGY *topo; - double tssnap; + double tolerance_snap; + double tolerance_removal; int iterate; - int remove_vertices; /* * Extent of the geometry being snapped, * will be updated as needed as snapping occurs */ RTGBOX workext; + RTGBOX expanded_workext; /* * Edges within workext, @@ -163,10 +122,8 @@ static const RTT_ISO_EDGE * rtgeom_tpsnap_state_get_edges(rtgeom_tpsnap_state *state, int *num_edges) { if ( ! state->workedges ) { - RTGBOX qbox = state->workext; - gbox_expand(state->topo->be_iface->ctx, &qbox, state->tssnap); state->workedges = rtt_be_getEdgeWithinBox2D(state->topo, - &qbox, + &state->expanded_workext, &state->num_workedges, RTT_COL_EDGE_ALL, 0); } @@ -176,8 +133,8 @@ rtgeom_tpsnap_state_get_edges(rtgeom_tpsnap_state *state, int *num_edges) } /* - * Write number of edges in *num_edges, -1 on error. - * @return edges, or NULL if none-or-error (look *num_edges to tell) + * Expand working extent to include new point. + * Resets working edges if new point expands the last used bounding box. */ static void rtgeom_tpsnap_state_expand_workext_to_include(rtgeom_tpsnap_state *state, @@ -194,6 +151,8 @@ rtgeom_tpsnap_state_expand_workext_to_include(rtgeom_tpsnap_state *state, p3d.z = 0.0; gbox_merge_point3d(ctx, &p3d, &state->workext); + state->expanded_workext = state->workext; + gbox_expand(ctx, &(state->expanded_workext), state->tolerance_snap); /* Reset workedges */ if ( state->workedges ) { @@ -228,12 +187,14 @@ _rt_find_closest_segment(const RTCTX *ctx, RTPOINT2D *pt, RTPOINTARRAY *pa, *segno = -1; *dist = FLT_MAX; + if ( pa->npoints < 2 ) return 0; + rt_dist2d_distpts_init(ctx, &dl, DIST_MIN); /* Find closest segment */ + rt_getPoint2d_p(ctx, pa, 0, &s0); for (j=0; j<pa->npoints-1; ++j) { - rt_getPoint2d_p(ctx, pa, j, &s0); rt_getPoint2d_p(ctx, pa, j+1, &s1); if ( rt_dist2d_pt_seg(ctx, pt, &s0, &s1, &dl) == RT_FALSE ) @@ -242,19 +203,21 @@ _rt_find_closest_segment(const RTCTX *ctx, RTPOINT2D *pt, RTPOINTARRAY *pa, return -1; } - /* Segment is too far, check next */ if ( dl.distance < *dist ) { + /* Segment is closest so far */ *segno = j; *dist = dl.distance; } + + s0 = s1; } return 0; } /* - * Extract from edge all vertices where distance from pa <= tssnap + * Extract from edge all vertices where distance from pa <= tolerance_snap * * @return -1 on error, 0 on success */ @@ -274,10 +237,20 @@ _rt_extract_vertices_within_dist(rtgeom_tpsnap_state *state, rt_getPoint2d_p(ctx, edge->points, i, &(vert.pt)); + /* skip if not covered by expanded_workext */ + if ( vert.pt.x < state->expanded_workext.xmin || + vert.pt.x > state->expanded_workext.xmax || + vert.pt.y < state->expanded_workext.ymin || + vert.pt.y > state->expanded_workext.ymax ) + { + RTDEBUGF(ctx, 3, "skip point %g,%g outside expanded workext %g,%g,%g,%g", vert.pt.x, vert.pt.y, state->expanded_workext.xmin,state->expanded_workext.ymin,state->expanded_workext.xmax,state->expanded_workext.ymax); + continue; + } + ret = _rt_find_closest_segment(ctx, &(vert.pt), pa, &vert.segno, &vert.dist); if ( ret == -1 ) return -1; - if ( vert.dist <= state->tssnap ) + if ( vert.dist <= state->tolerance_snap ) { /* push vert to array */ RTT_SNAPV_ARRAY_PUSH(ctx, vset, vert); @@ -290,7 +263,7 @@ _rt_extract_vertices_within_dist(rtgeom_tpsnap_state *state, /* * Find all topology edge vertices where distance from - * given pointarray <= tssnap + * given pointarray <= tolerance_snap * * @return -1 on error, 0 on success */ @@ -322,59 +295,25 @@ _rt_find_vertices_within_dist( } static int -compare_vpairs(const void *si1, const void *si2) +compare_snapv(const void *si1, const void *si2) { - RTT_VPAIR *a = (RTT_VPAIR *)si1; - RTT_VPAIR *b = (RTT_VPAIR *)si2; + RTT_SNAPV *a = (RTT_SNAPV *)si1; + RTT_SNAPV *b = (RTT_SNAPV *)si2; - if ( a->totdist < b->totdist ) + if ( a->dist < b->dist ) return -1; - else if ( a->totdist > b->totdist ) + else if ( a->dist > b->dist ) return 1; - if ( a->segdist < b->segdist ) + if ( a->pt.x < b->pt.x ) return -1; - else if ( a->segdist > b->segdist ) + else if ( a->pt.x > b->pt.x ) return 1; - return 0; -} - -/* - * Let *VPlist* be a list of all vertices pairs (*VP*) in *Vset* - * For each element *VP* in *VPlist*: - * Let *VP.TotDist* be the sum of the distances of each of the vertices in *VP* - * Let *VP.SegDist* be the distances between the two vertices in *VP* - * Order *VPlist* by growing *VP.TotDist*, *VP.SegDist* - * - * @return 0 on success, -1 on error. - * - */ -static int -_rt_make_sorted_vertices_pairs(const RTCTX *ctx, - RTT_SNAPV_ARRAY *vset, - RTT_VPAIR_ARRAY *vplist) -{ - int i, j, ret; - DISTPTS dl; - rt_dist2d_distpts_init(ctx, &dl, DIST_MIN); - for (i=0; i<vset->size; ++i) - { - for (j=i+1; j<vset->size; ++j) - { - RTT_VPAIR pair; - pair.p1 = &(vset->pts[i]); - pair.p2 = &(vset->pts[j]); - ret = rt_dist2d_pt_pt(ctx, &(pair.p1->pt), &(pair.p2->pt), &dl); - pair.segdist = dl.distance; - pair.totdist = pair.p1->dist + pair.p2->dist; - if ( ret == RT_FALSE ) return -1; - RTT_VPAIR_ARRAY_PUSH(ctx, vplist, pair); - } - } - - /* Now sort it */ - qsort(vplist->pts, vplist->size, sizeof(RTT_VPAIR), compare_vpairs); + if ( a->pt.y < b->pt.y ) + return -1; + else if ( a->pt.y > b->pt.y ) + return 1; return 0; } @@ -439,7 +378,10 @@ rtgeom_visit_lines(const RTCTX *ctx, RTGEOM *rtgeom, /* * Vertex removal phase * - * @return 0 on success, -1 on error. + * Remove internal vertices of `pa` that are within state.tolerance_snap + * distance from edges of state.topo topology. + * + * @return -1 on error, number of points removed on success */ static int _rtgeom_tpsnap_ptarray_remove(const RTCTX *ctx, RTPOINTARRAY *pa, @@ -448,6 +390,7 @@ _rtgeom_tpsnap_ptarray_remove(const RTCTX *ctx, RTPOINTARRAY *pa, int num_edges, i, j, ret; const RTT_ISO_EDGE *edges; const RTT_TOPOLOGY *topo = state->topo; + int removed = 0; /* Let *Eset* be the set of edges of *Topo-ref* * with distance from *Gcomp* <= *TSsnap* @@ -458,17 +401,24 @@ _rtgeom_tpsnap_ptarray_remove(const RTCTX *ctx, RTPOINTARRAY *pa, return -1; } + RTDEBUG(ctx, 1, "vertices removal phase starts"); + /* For each non-endpoint vertex *V* of *Gcomp* */ for (i=1; i<pa->npoints-1; ++i) { RTPOINT2D V; + RTLINE *closest_segment_edge = NULL; + int closest_segment_number; + double closest_segment_distance = state->tolerance_removal+1; + rt_getPoint2d_p(ctx, pa, i, &V); - /* For each edge *E* of *Eset* */ + RTDEBUGF(ctx, 2, "Analyzing internal vertex POINT(%.15g %.15g)", V.x, V.y); + + /* Find closest edge segment */ for (j=0; j<num_edges; ++j) { RTLINE *E = edges[j].geom; - RTPOINT4D p, sp1, sp2, proj; int segno; double dist; @@ -476,29 +426,57 @@ _rtgeom_tpsnap_ptarray_remove(const RTCTX *ctx, RTPOINTARRAY *pa, if ( ret < 0 ) return ret; /* error */ /* Edge is too far */ - if ( dist > state->tssnap ) continue; + if ( dist > state->tolerance_removal ) { + RTDEBUGF(ctx, 2, " Vertex is too far (%g) from edge %d", dist, edges[j].edge_id); + continue; + } + + RTDEBUGF(ctx, 2, " Vertex within distance from segment %d of edge %d", + segno, edges[j].edge_id); + + if ( dist < closest_segment_distance ) + { + closest_segment_edge = E; + closest_segment_number = segno; + closest_segment_distance = dist; + } + } + + if ( closest_segment_edge ) + {{ + RTPOINT4D V4d, Ep1, Ep2, proj; + RTPOINTARRAY *epa = closest_segment_edge->points; + + /* Let *Proj* be the closest point in *closest_segment_edge* to *V* */ + V4d.x = V.x; V4d.y = V.y; V4d.m = V4d.z = 0.0; + rt_getPoint4d_p(ctx, epa, closest_segment_number, &Ep1); + rt_getPoint4d_p(ctx, epa, closest_segment_number+1, &Ep2); + closest_point_on_segment(ctx, &V4d, &Ep1, &Ep2, &proj); - /* Let *Proj* be the closest point in *E* to *V* */ - p.x = V.x; p.y = V.y; p.m = p.z = 0.0; - rt_getPoint4d_p(ctx, pa, segno, &sp1); - rt_getPoint4d_p(ctx, pa, segno+1, &sp2); - closest_point_on_segment(ctx, &p, &sp1, &sp2, &proj); + RTDEBUGF(ctx, 2, " Closest point on edge segment LINESTRING(%.15g %.15g, %.15g %.15g) is POINT(%.15g %.15g)", + Ep1.x, Ep1.y, Ep2.x, Ep2.y, proj.x, proj.y); /* Closest point here matches segment endpoint */ - if ( p4d_same(ctx, &p, &sp1) || p4d_same(ctx, &p, &sp2) ) { + if ( p4d_same(ctx, &proj, &Ep1) || p4d_same(ctx, &proj, &Ep2) ) { + RTDEBUG(ctx, 2, " Closest point on edge matches segment endpoint"); continue; } /* Remove vertex *V* from *Gcomp* */ + RTDEBUGF(ctx, 1, " Removing internal point POINT(%.14g %.15g)", + V.x, V.y); ret = ptarray_remove_point(ctx, pa, i); if ( ret == RT_FAILURE ) return -1; /* rewind i */ --i; - break; - } + /* increment removed count */ + ++removed; + }} } - return 0; + RTDEBUGF(ctx, 1, "vertices removal phase ended (%d removed)", removed); + + return removed; } /* Return NULL on error, or a GEOSGeometry on success */ @@ -577,83 +555,70 @@ _rt_snap_to_valid_vertex(const RTCTX *ctx, RTPOINTARRAY *pa, { int ret; RTPOINT4D p, sp1, sp2, proj; + p.x = v->pt.x; p.y = v->pt.y; p.m = p.z = 0.0; rt_getPoint4d_p(ctx, pa, v->segno, &sp1); rt_getPoint4d_p(ctx, pa, v->segno+1, &sp2); + + RTDEBUGF(ctx, 2, "Analyzing snap vertex POINT(%.15g %.15g)", p.x, p.y); + RTDEBUGF(ctx, 2, " Closest segment %d is LINESTRING(%.15g %.15g, %.15g %.15g)", + v->segno, sp1.x, sp1.y, sp2.x, sp2.y); + closest_point_on_segment(ctx, &p, &sp1, &sp2, &proj); + RTDEBUGF(ctx, 2, " Closest point on segment is POINT(%.15g %.15g)", + proj.x, proj.y); + + /* Check if closest point matches segment endpoint (could be cached) */ - if ( p4d_same(ctx, &p, &sp1) || p4d_same(ctx, &p, &sp2) ) { + if ( p4d_same(ctx, &proj, &sp1) || p4d_same(ctx, &proj, &sp2) ) + { + RTDEBUG(ctx, 2, " Closest point matches a segment's endpoint"); return 0; } /* Skip if closest segment is covered by topo-ref */ ret = _rt_segment_covered(state, &sp1, &sp2); if ( ret == -1 ) return -1; - if ( ret == 1 ) { + if ( ret == 1 ) + { + RTDEBUG(ctx, 2, " Closest segment is covered by topo edges"); /* it is covered */ return 0; } /* Snap ! */ - ret = ptarray_insert_point(ctx, pa, &p, 0); + RTDEBUGF(ctx, 2, "Snapping input segment %d to POINT(%.15g %.15g)", + v->segno, p.x, p.y); + ret = ptarray_insert_point(ctx, pa, &p, v->segno+1); if ( ret == RT_FAILURE ) return -1; return 1; } -/* - * @return 0 if no valid snap was found, <0 on error, >0 if snapped - */ -static int -_rt_snap_to_valid_pair(const RTCTX *ctx, RTPOINTARRAY *pa, - RTT_VPAIR *pair, rtgeom_tpsnap_state *state) -{ - int snapCount = 0, ret; - - ret = _rt_snap_to_valid_vertex(ctx, pa, pair->p1, state); - if ( ret < 0 ) return ret; - snapCount += ret; - - if ( ret ) { - /* Expand working extent */ - rtgeom_tpsnap_state_expand_workext_to_include(state, - &(pair->p1->pt)); - - /* Recompute distance from second point, if first was snapped */ - ret = _rt_find_closest_segment(ctx, &(pair->p2->pt), pa, - &(pair->p2->segno), &(pair->p2->dist)); - if ( ret < 0 ) return ret; /* error */ - - } - - ret = _rt_snap_to_valid_vertex(ctx, pa, pair->p2, state); - if ( ret < 0 ) return ret; - snapCount += ret; - - if ( ret ) { - /* Expand working extent */ - rtgeom_tpsnap_state_expand_workext_to_include(state, - &(pair->p2->pt)); - } - - return snapCount; -} - /* @return 0 if no valid snap was found, <0 on error, >0 if snapped */ static int -_rt_snap_to_first_valid_pair(const RTCTX *ctx, RTPOINTARRAY *pa, - RTT_VPAIR_ARRAY *vplist, rtgeom_tpsnap_state *state) +_rt_snap_to_first_valid_vertex(const RTCTX *ctx, RTPOINTARRAY *pa, + RTT_SNAPV_ARRAY *vset, rtgeom_tpsnap_state *state) { int foundSnap = 0; int i; - for (i=0; i<vplist->size; ++i) + for (i=0; i<vset->size; ++i) { - RTT_VPAIR *pair = &(vplist->pts[i]); - foundSnap = _rt_snap_to_valid_pair(ctx, pa, pair, state); - if ( foundSnap ) break; + RTT_SNAPV *v = &(vset->pts[i]); + foundSnap = _rt_snap_to_valid_vertex(ctx, pa, v, state); + if ( foundSnap ) { + if ( foundSnap < 0 ) { + RTDEBUGF(ctx, 1, "vertex %d/%d triggered an error while snapping", + i, vset->size); + return -1; + } + RTDEBUGF(ctx, 1, "vertex %d/%d was a valid snap", + i, vset->size); + break; + } } return foundSnap; @@ -671,48 +636,40 @@ _rtgeom_tpsnap_ptarray_add(const RTCTX *ctx, RTPOINTARRAY *pa, { int ret; int lookingForSnap = 1; + + RTDEBUG(ctx, 1, "vertices addition phase starts"); while (lookingForSnap) { int foundSnap; RTT_SNAPV_ARRAY vset; - RTT_VPAIR_ARRAY vplist; lookingForSnap = 0; RTT_SNAPV_ARRAY_INIT(ctx, &vset); - RTT_VPAIR_ARRAY_INIT(ctx, &vplist); ret = _rt_find_vertices_within_dist(&vset, pa, state); if ( ret < 0 ) { RTT_SNAPV_ARRAY_CLEAN(ctx, &vset); - RTT_VPAIR_ARRAY_CLEAN(ctx, &vplist); return -1; } RTDEBUGF(ctx, 1, "vertices within dist: %d", vset.size); - if ( vset.size < 2 ) { + if ( vset.size < 1 ) { RTT_SNAPV_ARRAY_CLEAN(ctx, &vset); - RTT_VPAIR_ARRAY_CLEAN(ctx, &vplist); break; } - ret = _rt_make_sorted_vertices_pairs(ctx, &vset, &vplist); - if ( ret < 0 ) { - RTT_SNAPV_ARRAY_CLEAN(ctx, &vset); - RTT_VPAIR_ARRAY_CLEAN(ctx, &vplist); - return -1; - } - RTDEBUGF(ctx, 1, "vertices pairs: %d", vplist->size); + qsort(vset.pts, vset.size, sizeof(RTT_SNAPV), compare_snapv); - foundSnap = _rt_snap_to_first_valid_pair(ctx, pa, &vplist, state); + foundSnap = _rt_snap_to_first_valid_vertex(ctx, pa, &vset, state); RTDEBUGF(ctx, 1, "foundSnap: %d", foundSnap); RTT_SNAPV_ARRAY_CLEAN(ctx, &vset); - RTT_VPAIR_ARRAY_CLEAN(ctx, &vplist); if ( foundSnap < 0 ) return foundSnap; /* error */ if ( foundSnap && state->iterate ) { lookingForSnap = 1; } } + RTDEBUG(ctx, 1, "vertices addition phase ends"); return 0; } @@ -729,14 +686,27 @@ _rtgeom_tpsnap_ptarray(const RTCTX *ctx, RTPOINTARRAY *pa, int ret; rtgeom_tpsnap_state *state = udata; - if ( state->remove_vertices ) - { - ret = _rtgeom_tpsnap_ptarray_remove(ctx, pa, state); - if ( ret != 0 ) return ret; - } + /* Set work extent to that of the POINTARRAY bounding box */ + ptarray_calculate_gbox_cartesian(ctx, pa, &(state->workext)); + state->expanded_workext = state->workext; + gbox_expand(ctx, &(state->expanded_workext), state->tolerance_snap); - ret = _rtgeom_tpsnap_ptarray_add(ctx, pa, state); - return ret; + RTDEBUGF(ctx, 1, "Snapping pointarray with %d points", pa->npoints); + + do { + ret = _rtgeom_tpsnap_ptarray_add(ctx, pa, state); + if ( ret == -1 ) return -1; + + if ( state->tolerance_removal >= 0 ) + { + ret = _rtgeom_tpsnap_ptarray_remove(ctx, pa, state); + if ( ret == -1 ) return -1; + } + } while (ret && state->iterate); + + RTDEBUGF(ctx, 1, "Snapped pointarray has %d points", pa->npoints); + + return 0; } @@ -744,20 +714,26 @@ _rtgeom_tpsnap_ptarray(const RTCTX *ctx, RTPOINTARRAY *pa, /* public, exported */ RTGEOM * rtt_tpsnap(RTT_TOPOLOGY *topo, const RTGEOM *gin, - double tssnap, int iterate, int remove_vertices) + double tolerance_snap, + double tolerance_removal, + int iterate) { rtgeom_tpsnap_state state; const RTCTX *ctx = topo->be_iface->ctx; RTGEOM *gtmp = rtgeom_clone_deep(ctx, gin); int ret; + RTDEBUGF(ctx, 1, "snapping: tol %g, iterate %d, remove %d", + tolerance_snap, iterate, remove_vertices); + state.topo = topo; - state.tssnap = tssnap; + state.tolerance_snap = tolerance_snap; + state.tolerance_removal = tolerance_removal; state.iterate = iterate; - state.remove_vertices = remove_vertices; - state.workext = *rtgeom_get_bbox(ctx, gin); state.workedges = NULL; + rtgeom_geos_ensure_init(ctx); + ret = rtgeom_visit_lines(ctx, gtmp, _rtgeom_tpsnap_ptarray, &state); rtgeom_tpsnap_state_destroy(&state); diff --git a/src/rttin.c b/src/rttin.c index 961e4e0..4ff97bb 100644 --- a/src/rttin.c +++ b/src/rttin.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rttree.c b/src/rttree.c index 5ae38dc..ec9c3e4 100644 --- a/src/rttree.c +++ b/src/rttree.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ **********************************************************************/ +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include "rtgeom_log.h" #include "rttree.h" diff --git a/src/rttree.h b/src/rttree.h index 1b7dc31..6fe86a6 100644 --- a/src/rttree.h +++ b/src/rttree.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/rttriangle.c b/src/rttriangle.c index 20950eb..ec65fa8 100644 --- a/src/rttriangle.c +++ b/src/rttriangle.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +26,7 @@ /* basic RTTRIANGLE manipulation */ +#include "rttopo_config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> diff --git a/src/rtutil.c b/src/rtutil.c index 5137ca1..8fa7f7f 100644 --- a/src/rtutil.c +++ b/src/rtutil.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,11 +33,13 @@ #include <string.h> #include <ctype.h> /* for tolower */ -/* Global variables */ #include "rttopo_config.h" +/*#define RTGEOM_DEBUG_LEVEL 4*/ #include "librttopo_geom_internal.h" #include "rtgeom_log.h" +/* Global variables */ + /* Default allocators */ static void * default_allocator(size_t size); static void default_freeor(void *mem); @@ -66,53 +68,6 @@ static char *rtgeomTypeName[] = }; /* - * Default rtnotice/rterror handlers - * - * Since variadic functions cannot pass their parameters directly, we need - * wrappers for these functions to convert the arguments into a va_list - * structure. - */ - -void -rtnotice(const RTCTX *ctx, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - - /* Call the supplied function */ - (*ctx->notice_logger)(fmt, ap, ctx->notice_logger_arg); - - va_end(ap); -} - -void -rterror(const RTCTX *ctx, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - - /* Call the supplied function */ - (*ctx->error_logger)(fmt, ap, ctx->error_logger_arg); - - va_end(ap); -} - -void -rtdebug(const RTCTX *ctx, int level, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - - /* Call the supplied function */ - (*ctx->debug_logger)(level, fmt, ap, ctx->debug_logger_arg); - - va_end(ap); -} - -/* * Default allocators * * We include some default allocators that use malloc/free/realloc @@ -140,6 +95,14 @@ default_reallocator(void *mem, size_t size) return ret; } +/* + * Default rtnotice/rterror handlers + * + * Since variadic functions cannot pass their parameters directly, we need + * wrappers for these functions to convert the arguments into a va_list + * structure. + */ + static void default_noticereporter(const char *fmt, va_list ap, void *arg) { @@ -229,6 +192,47 @@ rtgeom_set_debug_logger(RTCTX *ctx, rtdebuglogger logger, void *arg) ctx->debug_logger_arg = arg; } +void +rtnotice(const RTCTX *ctx, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + + /* Call the supplied function */ + (*ctx->notice_logger)(fmt, ap, ctx->notice_logger_arg); + + va_end(ap); +} + +void +rterror(const RTCTX *ctx, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + + /* Call the supplied function */ + (*ctx->error_logger)(fmt, ap, ctx->error_logger_arg); + + va_end(ap); +} + +void +rtdebug(const RTCTX *ctx, int level, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + + /* Call the supplied function */ + (*ctx->debug_logger)(level, fmt, ap, ctx->debug_logger_arg); + + va_end(ap); +} + + + const char* rttype_name(const RTCTX *ctx, uint8_t type) { diff --git a/src/stringbuffer.c b/src/stringbuffer.c index 2571815..cafd10c 100644 --- a/src/stringbuffer.c +++ b/src/stringbuffer.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +26,7 @@ +#include "rttopo_config.h" #include "librttopo_geom_internal.h" #include "stringbuffer.h" diff --git a/src/stringbuffer.h b/src/stringbuffer.h index 1c1fa8f..bbafaed 100644 --- a/src/stringbuffer.h +++ b/src/stringbuffer.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/varint.c b/src/varint.c index dc465a3..185d0f9 100644 --- a/src/varint.c +++ b/src/varint.c @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ +#include "rttopo_config.h" #include "varint.h" #include "rtgeom_log.h" #include "librttopo_geom.h" diff --git a/src/varint.h b/src/varint.h index 1100d6e..4a2eef9 100644 --- a/src/varint.h +++ b/src/varint.h @@ -1,7 +1,7 @@ /********************************************************************** * * rttopo - topology library - * http://git.osgeo.org/gogs/rttopo/librttopo + * http://git.osgeo.org/gitea/rttopo/librttopo * * rttopo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/librttopo.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel