Pages: 1
- Sujet précédent - Postgis : st_intersection / erreur GEOSIntersects: TopologyException - Sujet suivant
#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
Pages: 1
- Sujet précédent - Postgis : st_intersection / erreur GEOSIntersects: TopologyException - Sujet suivant