[postgis-users] Troubleshooting topology exception errors in large datasets
THX1138
ap.joseph at live.com
Thu Jul 19 17:29:01 PDT 2012
I have been trying to peform an ArcGIS-like erase in postgis (see example
query at end of post).
However when I try to union all features in one table in preparation for a
difference operation with another table I receive the following message of
doom and despair:
ERROR: GEOSUnaryUnion: TopologyException: found non-noded intersection
between LINESTRING (3.09895e+06 1.01068e+07, 3.09896e+06 1.01068e+07) and
LINESTRING (3.09896e+06 1.01068e+07, 3.09896e+06 1.01068e+07) at
3098955.3520329543 10106778.227583764
I have tested my geometry for invalid polygons, ran st_makevalid and even
tried the buffer 0 trick, but to no avail. If I do st_buffer(geom,.01) I
manage to get through the operation with no errors, but I have to alter all
of the geometries, not just the geometries in question -and I would rather
not even do the latter if at all possible so that I don't change my
geometries.
I would like to post a bug for this problem, but I know that the
exception-throwing features are required to diagnose the problem. However in
a dataset of 200,000 geometries it is impossible to know which features are
causing the issue as the aforementioned error message gives no indication.
I am wondering how I should go about capturing the geometries that cause the
error in order to file a bug so that this issue can hopefully be easily
resolved and I can move on with my work.
If this is not feasible, does anyone know of any work-arounds to pre-prepare
valid geometries so that they will not throw these types of errors?
My version of postgis is as follows:
POSTGIS="2.0.1SVN r9761" GEOS="3.3.5-CAPI-1.7.5" PROJ="Rel. 4.8.0, 6 March
2012" GDAL="GDAL 1.9.1, released 2012/05/15" LIBXML="2.7.8"
LIBJSON="UNKNOWN" TOPOLOGY RASTER
The geometries that fail are probably very tiny slivers if that helps with a
diagnosis.
Thanks,
THX1138
================================================================================
Example table structure:
CREATE TABLE features(
feature_id serial primary key,
feature_geom geometry(multipolygon,2277)
);
CREATE TABLE erase_features(
erase_id serial primary key,
feature_id integer,
erase_geom geometry(multipolygon,2277)
);
===================================query=========================================
SELECT st_multi(st_difference(a.feature_geom,b.unioned_erase_geom))
FROM
features a,
(SELECT
erase_id,
st_multi(st_union(erase_geom)) unioned_erase_geom
FROM
erase_features
GROUP BY erase_id) b
WHERE
(a.feature_id = b.feature_id) and
st_intersects(a.feature_geom,b.unioned_erase_geom)
--
View this message in context: http://postgis.17.n6.nabble.com/Troubleshooting-topology-exception-errors-in-large-datasets-tp4999035.html
Sent from the PostGIS - User mailing list archive at Nabble.com.
More information about the postgis-users
mailing list