banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Fri 25 August 2023 09:09

image95
Participant assidu
Date d'inscription: 6 Sep 2014
Messages: 257

Postgis : st_intersection / erreur GEOSIntersects: TopologyException

Bonjour,
Avec postgis, je souhaite générer une nouvelle table étant le résultat de l'intersection d'une table de geometries mixtes et de ma couche cadastre polygonales. Voici ma tentative. En toute modestie, je pense que cette requête est bonne. Mais j'ai une erreur en lien à la topologie.


Code:

create TABLE schema.resultat as 
select
gid, suivi,ouvrage_type, source,code,dr,convention,
t2.parcelle, t2.section,
st_intersection(t1.geom, t2.geom ) as geom
from schema.t1
join schema.t2
on st_intersects (t1.geom,t2.geom)

Code:

ERROR: ERREUR:  GEOSIntersects: TopologyException: side location conflict at 872675.09999999998 6823686.2999999998


SQL state: XX000

J'ai fait des tests avec ST_MakeValid(geom); Mais je ne trouve pas de solution.
Une personne saurait elle m'éclairer ? Un grand merci.

Dernière modification par image95 (Fri 25 August 2023 09:11)

Hors ligne

 

#2 Fri 25 August 2023 10:58

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Postgis : st_intersection / erreur GEOSIntersects: TopologyException

Bonjour,

Vous travaillez avec quelle version de Postgis (select postgis_full_version(); ) ? Les dernieres versions de geos (3.10+) règlent pas mal de problèmes de topologie.

Pour corriger ces problèmes de topologie, on peut tenter de modifier légèrement les coord des géométries avec st_snapToGrid, ou st_reducePrecision (nouvelle fonction, plus puissante je crois) et d'utiliser les nouvelles variantes de st_intersection, st_union, st_difference, st_symDifference qui prennent un paramètre de précision (le meme qu'on utilisera pour st_reducePrecision)

La premiere étape est de corriger les géométries invalides dans les tables sources:

Code:

update matable set geom = st_makeValid(geom)
where not st_isvalid(geom);

Puis de tester si l'utilsation de st_reducePrecision sur les geom corrige le pb, directement dans la requete:

Code:

select gid, suivi,ouvrage_type, source,code,dr,convention,
         t2.parcelle, t2.section, st_intersection(st_reducePrecision(t1.geom, 0.01), st_reducePrecision(t2.geom, 0.01) ) as geom
from schema.t1 join schema.t2 on st_intersects (t1.geom,t2.geom);

Si c'est le cas, on peut mettre à jour les geom des tables si nécessaire (ou juste appliquer le reducePrecision dans la requete de calcul d'intersection)

Nicolas

Dernière modification par Nicolas Ribot (Fri 25 August 2023 10:59)

Hors ligne

 

#3 Fri 25 August 2023 11:04

image95
Participant assidu
Date d'inscription: 6 Sep 2014
Messages: 257

Re: Postgis : st_intersection / erreur GEOSIntersects: TopologyException

Bonjour Nicolas,
Merci. Avant de tester votre proposition, je réponds à votre question concernant la version de postgis :

Code:

POSTGIS="3.1.0 3.1.0" [EXTENSION] PGSQL="130" GEOS="3.9.0-CAPI-1.14.1" PROJ="7.1.1" GDAL="GDAL 3.2.0, released 2020/10/26" LIBXML="2.9.9" LIBJSON="0.12" LIBPROTOBUF="1.2.1" WAGYU="0.5.0 (Internal)" TOPOLOGY RASTER

Hors ligne

 

#4 Fri 25 August 2023 11:22

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Postgis : st_intersection / erreur GEOSIntersects: TopologyException

Ok merci,

Ca peut valoir le coup de tester sur une version récente de postgis/geos (postgis 3.3 ou 3.4, geos 3.11 ou plus)

(vous pouvez facilement installer une ou plusieurs versions de pg/postgis sur votre machine (https://www.postgresql.org/download/) pour tester

Nicolas

Hors ligne

 

#5 Fri 25 August 2023 13:43

image95
Participant assidu
Date d'inscription: 6 Sep 2014
Messages: 257

Re: Postgis : st_intersection / erreur GEOSIntersects: TopologyException

Merci. POur info, lorsque je tente votre proposition avec st_makevalid et l'utilisation de st_reducePrecision :

Code:

ERROR: ERREUR:  lwgeom_reduceprecision: GEOS Error: TopologyException: unable to assign free hole to a shell at 877338.90000000002 6835526.5


SQL state: XX000

Je vais en attendant essayer de faire un test d'upgrade de postgis.

Hors ligne

 

#6 Fri 25 August 2023 17:24

image95
Participant assidu
Date d'inscription: 6 Sep 2014
Messages: 257

Re: Postgis : st_intersection / erreur GEOSIntersects: TopologyException

Je viens de faire un test avec une nouvelle version de postgres et postgis.

Code:

select PostGIS_Full_Version();

Code:

POSTGIS="3.4.0 3.4.0" [EXTENSION] PGSQL="150" GEOS="3.12.0-CAPI-1.18.0" PROJ="8.2.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=C:\Windows\ServiceProfiles\NetworkService\AppData\Local/proj" LIBXML="2.9.14" LIBJSON="0.12" LIBPROTOBUF="1.2.1" WAGYU="0.5.0 (Internal)"

Puis

Code:

create TABLE schema.resultat as 
select
gid, suivi,ouvrage_type, source,code,dr,convention,
t2.parcelle, t2.section,
st_intersection(t1.geom, t2.geom ) as geom
from schema.t1
join schema.t2
on st_intersects (t1.geom,t2.geom)

Code:

ERROR: lwgeom_intersection_prec: GEOS Error: TopologyException: side location conflict at 875253.84683544014 6826777.4367088638. This can occur if the input geometry is invalid. ERREUR: lwgeom_intersection_prec: GEOS Error: TopologyException: side location conflict at 875253.84683544014 6826777.4367088638. This can occur if the input geometry is invalid. SQL state: XX000
---
update andra_humain."Cigeo_CadastreUF_Po" set geom = st_makeValid(geom)
where not st_isvalid(geom);

Puis,

Code:

update matable set geom = st_makeValid(geom)
where not st_isvalid(geom);

Code:

NOTICE: Self-intersection at or near point 845991.14978354971 6839069.5350649348 NOTICE: Self-intersection at or near point 846524.08181817865 6837960.9654545467 NOTICE: Self-intersection at or near point 882943.5153532261 6830835.5559041062 NOTICE: Hole lies outside shell at or near point 884955.69999999995 6831733.5999999996 NOTICE: Too few points in geometry component at or near point 883230.09999999998 6829270.4000000004 ERROR: Geometry type (MultiLineString) does not match column type (MultiPolygon) ERREUR: Geometry type (MultiLineString) does not match column type (MultiPolygon) SQL state: 22023

Et ,

Code:

select gid, suivi,ouvrage_type, source,code,dr,convention,
         t2.parcelle, t2.section, st_intersection(st_reducePrecision(t1.geom, 0.01), st_reducePrecision(t2.geom, 0.01) ) as geom
from schema.t1 join schema.t2 on st_intersects (t1.geom,t2.geom);

Code:

ERROR: lwgeom_reduceprecision: GEOS Error: TopologyException: unable to assign free hole to a shell at 877338.90000000002 6835526.5 ERREUR: lwgeom_reduceprecision: GEOS Error: TopologyException: unable to assign free hole to a shell at 877338.90000000002 6835526.5 SQL state: XX000

Dernière modification par image95 (Fri 25 August 2023 17:25)

Hors ligne

 

#7 Fri 25 August 2023 19:43

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Postgis : st_intersection / erreur GEOSIntersects: TopologyException

Bonsoir,

Peut etre utiliser st_snapToGrid ?
Sinon regarder l'endroit ou ca plante (le message d'erreur donne les coord) et corriger les data.

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB