[postgis-users] error: by topology.topogeometry
Sandro Santilli
strk at kbt.io
Wed Mar 27 07:16:59 PDT 2019
On Tue, Mar 26, 2019 at 02:07:55PM +0000, paul.malm at lfv.se wrote:
> UPDATE merged SET topo_geom = topology.toTopoGeom(the_geom, 'roads_topo', 1, 0.001);
[...]
> I get the following error:
> ERROR: Error: SQL/MM Spatial exception - geometry crosses edge 8618 CONTEXT: PL/pgSQL-function topology.totopogeom(geometry,topology.topogeometry,double precision) line 112 at FOR over SELECT-rows PL/pgSQL-function topology.totopogeom(geometry,character varying,integer,double precision) line 88 at assignment
>
> The error appears at different edges when changing the tolerance on CreateTopology and toTopoGeom.
> I added the ST_makeValid function call on the input data without any success.
> Does anyone know what I can do?
My suggestion is to do the topology loading in chunks rather
than all a once, like:
ALTER TABLE merged ADD id serial PRIMARY KEY;
UPDATE merged
SET topo_geom = topology.toTopoGeom(the_geom, 'roads_topo', 1)
WHERE id >= 0 AND id < 100;
UPDATE merged
SET topo_geom = topology.toTopoGeom(the_geom, 'roads_topo', 1)
WHERE id >= 100 AND id < 200;
...
Note I've removed the tolerance parameter, don't use it unless the
chunk fails and you're trying to move things a little bit.
Another thing to do, if a chunk fails, is to cleanup what you have
in the topology already, before trying again to move on.
My preferred method would be to use a wrapper function catching
exceptions and moving on if toTopoGeom fails. Often you'll find
that other geometries will get converted fine, so at the end
of the UPDATE call you'd have a number of "topo_geom" values
begin NULL (for the imports that failed) and a number of valid
ones, then you could try again to import the geometries after
some cleaning (and some times you don't even need a new cleaning
as the presence of more geometries would be enough to attract
vertices for snaps..)
--strk;
More information about the postgis-users
mailing list